离散傅里叶变换的实现结果与OpenCV DFT不同

3
我们已经实现了离散傅里叶变换(DFT),并希望使用OpenCV的实现进行测试。结果是不同的。
  1. 我们DFT的结果按从小到大的顺序排列,而OpenCV的结果没有任何顺序。
  2. 在这种情况下,两个计算的第一个(0th)值相同,因为复数部分为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代替您自己的实现。

1个回答

5

您忘记在每次迭代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);
}

1
哇...这是一个初学者的错误...感谢指出,现在结果是一样的。 - Silex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接