Операции преобразования Фурье, определенные в Википедии, являются ![enter image description here](https://i.stack.imgur.com/1kdAym.jpg)
, что аналогично числовым алгоритмам в Python (и Matlab).
Однако я хочуиспользуйте это альтернативное определение:
![enter image description here](https://i.stack.imgur.com/5xGlim.jpg)
, чтобы численно показать, что следующие уравнения являются парами FT: ![enter image description here](https://i.stack.imgur.com/Yc1I8m.jpg)
Мой код Python адаптирован из моего предыдущего вопроса Проблемы масштабирования с IFFT в Matlab .Он выполняет БПФ на g(t)
и переворачивает векторные элементы (код внизу поста).Вот график аналитической G(w)
выше по сравнению с решением fft и решением fft с перевернутым вектором.
![enter image description here](https://i.stack.imgur.com/CZ5nx.png)
Похоже, что естьсоглашение между (обращенным) численным решением и G(w)
, но между ними существует большая разница.Это похоже на необходимость дополнительного смещения вдоль горизонтальной оси, чтобы получить более точный результат:
![enter image description here](https://i.stack.imgur.com/IOrvj.png)
При использованииIFFT, чтобы перейти от G(w)
до g(t)
.Итак, вопрос в том, как мне реализовать это «альтернативное» определение FT?Я не уверен, что мой метод "векторное обращение" уместен.Я подозреваю, что это как-то связано с фазой FT.
Редактировать:
В ответ на Cris Luengo я исправил опечатки в отношениях FT выше.Кроме того, представляется возможным реализовать «альтернативный» FT, применяя простую подстановку к определению FT Википедии: ![enter image description here](https://i.stack.imgur.com/BclHhm.jpg)
Короче говоря, я должен использовать 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))