обратное преобразование Фурье FFT3W

Я использую функцию C ++, чтобы найти обратное преобразование Фурье.

int inYSize = 170; int inXSize = 2280;

float* outData = new float[inYSize*inXSize];
fftwf_plan mReverse = fftwf_plan_dft_c2r_2d(inYSize, inXSize,(fftwf_complex*)temp, outdata,
FFTW_ESTIMATE);
fftwf_execute(mReverse);

Мой ввод — темп 2D-массива с комплексными числами. Все элементы имеют реальное значение 1 и мнимое 0.

Так что я ожидаю InverseFFT такого массива должен быть 2D массив с реальными значениями. Выходной массив должен иметь значение SPIKE 0,0, а все остальные значения равны 0. Но я получаю все разные значения в выходном массиве даже после нормализации с общим размером массива. Что может быть причиной?

1

Решение

С FFTW не так уж и легко справиться, когда дело доходит до многомерного DFT и преобразования «сложное в реальное».

  1. При выполнении преобразования C2R массива с основными строками MxN второе измерение сокращается пополам из-за симметрии результата: outData в два раза больше, чем нужно, но это не является причиной вашей проблемы (и это не так, как вы делаете C2R, а не R2C).
    Больше информации об этом извилистом вопросе: http://www.fftw.org/doc/One_002dDimensional-DFTs-of-Real-Data.html

    «Полезный совет»: используйте только «более простой» способ C2C, используйте модуль вывода, если вы не знаете, как обрабатывать результаты, но не тратите свое время на преобразование n-D Complex в Real.

  2. Из-за ограниченной точности, из-за численной реализации DFT, из-за неподчиненных выпитых битов, вы можете получить значения, которые не равны 0, даже если они очень малы. Это нормальное поведение алгоритма БПФ.

Помимо прочтения внимательно руководство пользователя (http://www.fftw.org/doc/) даже если это настоящая боль (я потерял несколько дней из-за этой библиотеки только для того, чтобы заставить работать 3D-преобразование, просто чтобы понять, как масштабировались данные)

  • Вы должны попробовать преобразование C2C 1D, прежде чем переходить к C2C 2D и C2R 2D, просто чтобы убедиться, что у вас есть представление о том, что вы делаете.
  • Что такое обратное БПФ планарной константы, где каждый бин «частотной плоскости» заполнен единицей? Вы ищете новый способ определения + inf или -inf? В этом случае я бы предпочел начать с более простого деления на 0 ^^. Прямое БПФ должно быть, как вы описали, с правильным масштабированием SPIKE, равным 1, уверенно, что обратное не так.

Не стесняйтесь добавлять точность к вашему вопросу, и удачи с FFTW

1

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

С этой маленькой информацией трудно сказать. Я мог бы представить, что вы получаете спектральную утечку из-за выбора окна (см. Эта статья в Википедии для деталей о утечке).

Что вы можете сделать, это попробовать использовать другую оконную функцию, чтобы уменьшить утечку или переопределить размер вашего оконного окна.

0

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