#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 и т.д.).