Обратное преобразование FFTW умножается на N - PullRequest
2 голосов
/ 13 июля 2020

По сути, CPP_FFTW(N, signal, backwards) = NP_IFFT(N, signal) * N, где CPP_FFTW - это (плавающая версия) библиотеки FFTW в C ++, а NP_IFFT - numpy.fft.ifft из Python.

Проблема здесь CPP_FFTW(N, CPP_FFTW(N, signal, forwards), backwards) равно N * signal, а не signal, как можно было бы ожидать.

Я могу разделить на N, но моя проблема в том, что мой N очень большой, поэтому я теряю плавающие - точечная точность. По сути, это нарушает мою программу; У меня почти одинаковые комплексные коэффициенты в приложениях C ++ и Python. Однако я теряю всю свою точность, потому что я использую (c*N)/N после выполнения обратного преобразования.

Можно ли остановить это умножение?

До IFFT коэффициенты почти идентичны. Это следующее IFFT:

Python enter image description here CPP введите описание изображения здесь

1 Ответ

3 голосов
/ 13 июля 2020

Как вы можете видеть в документации , FFTW вычисляет ненормализованное преобразование. То есть дополнительное деление на длину сигнала необходимо для восстановления входного сигнала после прямого и обратного преобразования: IFFT(FFT(signal))/N = signal.

Python NumPy БПФ нормализовано, оно включает деление на N в обратном преобразовании.

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

Дополнительная информация:

Некоторые библиотеки (например, FFTW) вычисляют ненормализованное БПФ, пропуская деление на N в обратном преобразовании для скорости, поскольку иногда в этом нет необходимости. Другие библиотеки вообще определяют другую нормализацию, например, они могут делать деление на N в прямом преобразовании вместо обратного, или они могут делить на квадрат root из N как в прямом, так и в обратном преобразованиях.

...