Есть ли какая-либо практическая разница между БПФ и обратным БПФ?

#fft #fftw

#БПФ #fftw

Вопрос:

Библиотеки БПФ, такие как FFTW или numpy.fft, обычно предоставляют две функции fft() и ifft() (и их специальные версии для ввода реальных значений). Эти функции, по-видимому, определены таким образом, что

 ifft(fft(X)) == X
  

и

 fft(X) == constant_factor * reverse(ifft(X))
  

Существуют ли какие-либо практические или технические причины, которые следует учитывать при выборе между ifft() и fft() работой со сложным вводом? Хотя интерпретации X (сигнала, временной или пространственной области) и fft(X) (спектра, частотной области) различны, имеет ли это какое-либо значение с вычислительной точки зрения?

Ответ №1:

Разные библиотеки БПФ помещают константу масштабирования в разные места, в БПФ, ifft или 1 / sqrt (N) в обоих. Так что это лишь незначительная разница, зависящая от реализации. БПФ и ifft меняют порядок своих результатов на обратный. Так что это только разница между индексацией вперед или назад в вашем результирующем массиве. Независимо от того, вызываете ли вы одно время / пространство в зависимости от частоты, разница только в маркировке.

Итак, практически, выберите тот, в котором независимо от масштаба, используемого библиотекой, и направления, в котором вы хотите индексировать свои результаты, создается наиболее читаемый код. Обычно библиотеки fft / ifft настроены так, что можно индексировать положительное время и более высокую частоту в одном направлении ( ).

ДОБАВЛЕНО: Незначительная, возможно, ненужная оптимизация: если вам все равно нужно выполнить последующее масштабирование результатов FT, выберите реализацию fft или ifft, которая не включает встроенное масштабное умножение, поскольку это может сэкономить N операций полуизбыточного умножения.

Комментарии:

1. Не различаются ли коэффициенты поворота для прямого / обратного БПФ? По памяти я думаю, что знак меняется на мнимой части?

2. Изменение знаков в некоторых коэффициентах поворота — это то, что «обращает время вспять» или выводит результирующий вектор с противоположным направлением индексации.

3. ХОРОШО — спасибо — я никогда не рассматривал возможность того, что FFT и IFFT могут быть взаимозаменяемыми таким образом — мне придется изучить это дальше, хотя бы ради любопытства.

4. итак, технически, если бы БПФ был реализован с помощью 1 / sqrt (N), то fft(fft(array)) вернул бы обратный массив? Поправьте меня, если я ошибаюсь

5. БПФ (fft()) изменил бы массив, обычно симметричный вокруг элемента 0, возможно масштабируемый, в зависимости от масштабирования реализации, возможно, включая числовой шум округления. Симметрия: значение в элементе массива 0 должно оставаться неизменным, в зависимости от индексации (C против matlab и т.д.).