2015-04-21 2 views
0

У меня есть функция быстрого преобразования Фурье в Python для версий 2.x. Я хочу сделать это в Python 3.x, но у меня есть некоторые проблемы с «xrange» и идентификаторами списков (как сказал мой компилятор). Я также не знаю, как вычислить Inversed FFT из моего БПФ без использования каких-либо нестандартных библиотек. Код ниже. Заранее спасибо ...Перевод функции FFT из Python 2.x в Python 3.x и вычисление IFFT из него

from cmath import exp,pi 

def FFT(X): 
    n = len(X) 
    w = exp(-2*pi*1j/n) 
    if n > 1: 
    X = FFT(X[::2]) + FFT(X[1::2]) 
    for k in xrange(n/2): 
     xk = X[k] 
     X[k] = xk + w**k*X[k+n/2] 
     X[k+n/2] = xk - w**k*X[k+n/2] 
return X 

UPD: Полностью реконструирован, мой БПФ и построены IFFT из-за ваших советов. P.S. Как закрыть сообщение?

+0

не доверять 'rfft' и' irfft' в 'numpy.fft'? – dbliss

+0

должно быть достаточно, чтобы заменить 'xrange' на' range', чтобы код работал с python 3. – jepio

+0

Не видел их. Но я хочу знать, как переписать этот код. Потому что очень коротко и легко запоминать. Потому что мне нужно запомнить этот код перед программированием. И в этих библиотеках коды довольно длинные. – Reodont

ответ

0

Есть несколько способов конвертировать ваш БПФ в формат IFFT. Самый простой способ - избавиться от знака минус внутри параметра к вашей функции exp() для w. Следующее - взять комплексное сопряжение БПФ комплексно-сопряженного ввода.

Если вы не масштабируете свой передний БПФ, то обычной практикой является масштабирование вашего вычисления IFFT на 1/N (длина), так что IFFT (FFT()) приводит к той же суммарной суммарной сумме. Если вы масштабируете свой БПФ на 1/N, то не масштабируйте вычисление IFFT. Или масштабируйте как 1/sqrt (N).

+0

Спасибо за ваш ответ. У вас есть другой вопрос. Если переход к реальным входным данным FFT (не сложным), если IFTFT этот реальный БПФ данных должен иметь сложные данные с нулевой мнимой частью (например, 23.23141 + 0j) или что-то еще? Потому что я не так хорош в математике и довольно молод. – Reodont

+0

IFFT (FFT()) строго реальных данных будет иметь арифметические ошибки округления или числовые шумы. Таким образом, мнимая часть (и, следовательно, фаза) не будет равна нулю, но ее следует игнорировать как слишком маленькую, чтобы быть значимой или полезной. – hotpaw2

+0

Я хочу сделать умножение FFT двух больших целых чисел. I FFT первый номер. Затем второе число FFT. Умножают элементы из них (например, [q * w для q, w в zip (a, b)]), а затем вычисляют IFFT этого умножения. Но он дает некоторые неявные данные. Пример: Вход: 10 10 Выход: [(0,5 + 0j), (0,5 + 0j)] – Reodont

Смежные вопросы