Реализация дискретного преобразования Фурье дает результат, отличный от OpenCV DFT

Мы внедрили DFT и хотели протестировать его с реализацией OpenCV. Результаты разные.

  1. результаты нашего DFT находятся в порядке от самого маленького до самого большого, тогда как результаты OpenCV не в любом порядке.
  2. первое (0-е) значение одинаково для обоих вычислений, так как в этом случае комплексная часть равна 0 (так как е ^ 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:

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 вместо собственной реализации.

3

Решение

Вы забыли инициализировать result за каждую итерацию n:

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);
}
4

Другие решения


По вопросам рекламы [email protected]