在Python中改变FFT的定义

时间:2018-05-24 07:46:47

标签: python fft ifft

维基百科中定义的傅里叶变换操作是 enter image description here

类似于Python(和Matlab)中的数值算法。

但是我想使用这个替代定义:

enter image description here

为了在数值上显示以下等式是FT对: enter image description here

我的Python代码改编自我之前的问题Scaling problems with IFFT in Matlab。它在G(w)上执行FFT并反转向量元素(post的底部代码)。下面是上面的分析G(w)与fft解和fft解相比的图,其中矢量被反转。

enter image description here

看起来(反向)数值解与G(w)之间存在一致性,但实际上它们之间存在很大差异。这就像需要沿水平轴进行额外的移动才能获得更准确的结果:

enter image description here

当我使用IFFT从g(t)转到g(-t)时,会出现类似的问题。所以问题是,我如何实现FT的这种“替代”定义?我不确定我的“矢量反转”方法是否合适。我怀疑它与FT的阶段有关。

编辑:

在回应Cris Luengo时,我已经解决了上述金融时报关系中的错别字。此外,似乎可以通过对维基百科的FT定义应用简单替换来实现“替代”FT: enter image description here

长话短说,我应该在FFT中使用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)) 。这听起来合乎逻辑吗?我在我的代码中尝试了这一点,数值和分析结果之间仍然存在很大的差异。

this.messages

0 个答案:

没有答案