繁体   English   中英

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

[英]Discrete Fourier Transform implementation gives different result than OpenCV DFT

我们已经实现了DFT,并希望通过OpenCV的实现来测试它。 结果不同。

  1. 我们的DFT结果从最小到最大,而OpenCV的结果不是任何顺序。
  2. 第一个(第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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM