Я портирую код на 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, но это также не делает их совпадающими.
Я не понимаю, как эти две библиотеки могли по-разному вычислять обратное ДПФ, а не просто радикально разные результаты.