FFTW дает разные результаты из numpy.fft - PullRequest
0 голосов
/ 03 мая 2018

Я портирую код на C ++ на Python. Код C ++ выполняет DFT и IDFT с использованием библиотеки FFTW, тогда как в Python я решил использовать реализацию numpys в настоящее время.

Я столкнулся с каким-то странным поведением. Кажется, что прямое преобразование вычисляется одинаково в обоих случаях, но обратное преобразование дает разные результаты!

соответствующий код C ++:

int N = 12;
auto fft_coefficients = new complex<double>[N] {
        5.45, -0.54, 1.81, 1.49, 0.48, 3.98, 0.93, 3.98, 0.48, 1.49, 1.81, -0.54 };
fftw_plan plan_ifft = fftw_plan_dft_1d(
        N, reinterpret_cast<fftw_complex *>(fft_coefficients),
        reinterpret_cast<fftw_complex *>(fft_coefficients), FFTW_BACKWARD,
        FFTW_ESTIMATE);
fftw_execute(plan_ifft);
// Results in
// [20.82, -1.98, 4.55, 1.86, 3.63, 13.68, 1.10, 13.68,, 3.63, 1.86, 4.55, -1.98]

Однако, когда я запускаю тот же код на Python, но используя numpy, я получаю следующее:

np.fft.ifft(np.array([5.45, -0.54, 1.81, 1.49, 0.48, 3.98, 0.93, 3.98, 0.48, 1.49,
                      1.81, -0.54], dtype=np.complex64)).real
# array([ 1.73, -0.16,  0.38,  0.15,  0.3 ,  1.14,  0.09,  1.14,  0.3 ,
#         0.15,  0.38, -0.16])

Я подумал, что мне может понадобиться добавить опцию norm='ortho' в numpy для выполнения унитарного IDFT, но это также не делает их совпадающими.

Я не понимаю, как эти две библиотеки могли по-разному вычислять обратное ДПФ, а не просто радикально разные результаты.

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

FFTW заявляет : "FFTW вычисляет ненормализованный ДПФ"

То есть для ifft они вычисляют enter image description here

Однако, как указано, например, Википедия , обратное ДПФ определяется как enter image description here

Таким образом, вывод fftw на самом деле неверен и его нужно масштабировать.

0 голосов
/ 03 мая 2018

Неважно. Я нашел ответ. По-видимому, FFTW обрабатывает нормализацию иначе, чем просто с помощью коэффициента нормализации. Если я умножу numpys ifft на N, я получу тот же результат, что и с FFTW.

Это открывает еще один вопрос: кто из них пропускает нормализацию в прямом преобразовании? И почему? Это выглядит как очень противоречивое поведение.

...