离散傅里叶变换实现给出与 OpenCV DFT 不同的结果
Discrete Fourier Transform implementation gives different result than OpenCV DFT
我们已经实现了 DFT 并想用 OpenCV 的实现来测试它。结果不一样。
- 我们的DFT的结果是从小到大排序的,而OpenCV的结果没有任何顺序。
- 两次计算的第一个(第 0 个)值相同,因为在这种情况下,复数部分为 0 (因为公式中的 e^0 = 1)。 其他值不同,例如OpenCV的结果包含负值,而我们的没有。
这是我们的 DFT 实现:
// complex number
std::complex<float> j;
j = -1;
j = std::sqrt(j);
std::complex<float> result;
std::vector<std::complex<float>> fourier; // output
// this->N = length of contour, 512 in our case
// foreach fourier descriptor
for (int n = 0; n < this->N; ++n)
{
// Summation in formula
for (int t = 0; t < this->N; ++t)
{
result += (this->centroidDistance[t] * std::exp((-j*PI2 *((float)n)*((float)t)) / ((float)N)));
}
fourier.push_back((1.0f / this->N) * result);
}
这就是我们使用 OpenCV 计算 DFT 的方式:
std::vector<std::complex<float>> fourierCV; // output
cv::dft(std::vector<float>(centroidDistance, centroidDistance + this->N), fourierCV, cv::DFT_SCALE | cv::DFT_COMPLEX_OUTPUT);
变量 centroidDistance 是在上一步计算的。
注意:请避免回答说使用 OpenCV 而不是您自己的实现。
您忘记为 n
的每次迭代初始化 result
:
for (int n = 0; n < this->N; ++n)
{
result = 0.0f; // initialise `result` to 0 here <<<
// Summation in formula
for (int t = 0; t < this->N; ++t)
{
result += (this->centroidDistance[t] * std::exp((-j*PI2 *((float)n)*((float)t)) / ((float)N)));
}
fourier.push_back((1.0f / this->N) * result);
}
我们已经实现了 DFT 并想用 OpenCV 的实现来测试它。结果不一样。
- 我们的DFT的结果是从小到大排序的,而OpenCV的结果没有任何顺序。
- 两次计算的第一个(第 0 个)值相同,因为在这种情况下,复数部分为 0 (因为公式中的 e^0 = 1)。 其他值不同,例如OpenCV的结果包含负值,而我们的没有。
这是我们的 DFT 实现:
// complex number
std::complex<float> j;
j = -1;
j = std::sqrt(j);
std::complex<float> result;
std::vector<std::complex<float>> fourier; // output
// this->N = length of contour, 512 in our case
// foreach fourier descriptor
for (int n = 0; n < this->N; ++n)
{
// Summation in formula
for (int t = 0; t < this->N; ++t)
{
result += (this->centroidDistance[t] * std::exp((-j*PI2 *((float)n)*((float)t)) / ((float)N)));
}
fourier.push_back((1.0f / this->N) * result);
}
这就是我们使用 OpenCV 计算 DFT 的方式:
std::vector<std::complex<float>> fourierCV; // output
cv::dft(std::vector<float>(centroidDistance, centroidDistance + this->N), fourierCV, cv::DFT_SCALE | cv::DFT_COMPLEX_OUTPUT);
变量 centroidDistance 是在上一步计算的。
注意:请避免回答说使用 OpenCV 而不是您自己的实现。
您忘记为 n
的每次迭代初始化 result
:
for (int n = 0; n < this->N; ++n)
{
result = 0.0f; // initialise `result` to 0 here <<<
// Summation in formula
for (int t = 0; t < this->N; ++t)
{
result += (this->centroidDistance[t] * std::exp((-j*PI2 *((float)n)*((float)t)) / ((float)N)));
}
fourier.push_back((1.0f / this->N) * result);
}