Изменение определения БПФ в Python - PullRequest
0 голосов
/ 24 мая 2018

Операции преобразования Фурье, определенные в Википедии, являются enter image description here

, что аналогично числовым алгоритмам в Python (и Matlab).

Однако я хочуиспользуйте это альтернативное определение:

enter image description here

, чтобы численно показать, что следующие уравнения являются парами FT: enter image description here

Мой код Python адаптирован из моего предыдущего вопроса Проблемы масштабирования с IFFT в Matlab .Он выполняет БПФ на g(t) и переворачивает векторные элементы (код внизу поста).Вот график аналитической G(w) выше по сравнению с решением fft и решением fft с перевернутым вектором.

enter image description here

Похоже, что естьсоглашение между (обращенным) численным решением и G(w), но между ними существует большая разница.Это похоже на необходимость дополнительного смещения вдоль горизонтальной оси, чтобы получить более точный результат:

enter image description here

При использованииIFFT, чтобы перейти от G(w) до g(t).Итак, вопрос в том, как мне реализовать это «альтернативное» определение FT?Я не уверен, что мой метод "векторное обращение" уместен.Я подозреваю, что это как-то связано с фазой FT.

Редактировать:

В ответ на Cris Luengo я исправил опечатки в отношениях FT выше.Кроме того, представляется возможным реализовать «альтернативный» FT, применяя простую подстановку к определению FT Википедии: enter image description here

Короче говоря, я должен использовать g(-t) вБПФ, чтобы получить G(w).Звучит ли это логично?Я попробовал это в своем коде, и все еще существует большое расхождение между числовым и аналитическим результатом.


import numpy as np
from numpy.fft import fft,fftshift,ifft,ifftshift
import matplotlib.pyplot as plt

a = 3.119
b = 0.173

ts = 1e3 # time sampling
L = 500*ts # no. sample points
Ts = ts/L # sampling rate
Fs = 1/Ts # sampling frequency

f = (np.arange(-np.floor(L/2),(np.floor((L-1)/2)+1)))/L # digital (linear) freq
w = 2*np.pi*f # angular freq
t = np.arange(-L/2,L/2)*ts/L # time

H = lambda x:1*(x>0) # heaviside function

g = -1j*H(t)*np.exp(-(1j*a+b)*t) # test function for fft
Gn = 1/Fs*fftshift(fft(ifftshift(g))) # numerical fft
Gr = Gn[::-1] # reversed numerical result
Ga = 1/((Fs*w)-a+1j*b) # analytical

plt.figure(1)
plt.subplot(121)
plt.plot(w,np.real(Gn),'.--',label='numeric')
plt.plot(w,np.real(Gr),'.--',label='numeric reversed')
plt.plot(w,np.real(Ga),label='analytic')
plt.xlabel('freq, w')
plt.title('real part of FFT')
plt.legend(loc='best')
plt.xlim((-.02,.02))
plt.subplot(122)
plt.plot(w,np.imag(Gn),'.--',label='numeric')
plt.plot(w,np.imag(Gr),'.--',label='numeric reversed')
plt.plot(w,np.imag(Ga),label='analytic')
plt.xlabel('freq, w')
plt.title('imag part of FFT')
plt.legend(loc='best')
plt.xlim((-.02,.02))

plt.figure(2)
plt.plot(w,np.real(Gr-Gn),'.--',label='real')
plt.plot(w,np.imag(Gr-Gn),'.--',label='imag')
plt.xlabel(r'freq, $\omega$') 
plt.title(r'difference between FFT (reversed) and analytic') 
plt.legend()
plt.xlim((-.1,.1))

gn = Fs*ifftshift(ifft(fftshift(Ga))) # numerical ifft
gnr = gn[::-1] # reversed numerical result

plt.figure(3)
plt.subplot(121)
plt.plot(t,np.real(gn),'.--',label='numeric')
plt.plot(t,np.real(gnr),'.--',label='numeric reversed')
plt.plot(t,np.real(g),label='analytic')
plt.xlabel('time, t')
plt.title('real part of IFFT')
plt.legend(loc='best')
plt.xlim((-1,1))
plt.subplot(122)
plt.plot(t,np.imag(gn),'.--',label='numeric')
plt.plot(t,np.imag(gnr),'.--',label='numeric reversed')
plt.plot(t,np.imag(g),'-',label='analytic')
plt.xlabel('time, t')
plt.title('imag part of IFFT')
plt.legend(loc='best')
plt.xlim((-1,1))

plt.figure(4)
plt.plot(t,np.real(gnr-g),'.--',label='real')
plt.plot(t,np.imag(gnr-g),'.--',label='imag')
plt.xlabel(r'time, t') 
plt.title(r'difference between IFFT (reversed) and analytic') 
plt.legend()
plt.xlim((-.1,.1))
...