类似于Python(和Matlab)中的数值算法。
但是我想使用这个替代定义:
我的Python代码改编自我之前的问题Scaling problems with IFFT in Matlab。它在G(w)
上执行FFT并反转向量元素(post的底部代码)。下面是上面的分析G(w)
与fft解和fft解相比的图,其中矢量被反转。
看起来(反向)数值解与G(w)
之间存在一致性,但实际上它们之间存在很大差异。这就像需要沿水平轴进行额外的移动才能获得更准确的结果:
当我使用IFFT从g(t)
转到g(-t)
时,会出现类似的问题。所以问题是,我如何实现FT的这种“替代”定义?我不确定我的“矢量反转”方法是否合适。我怀疑它与FT的阶段有关。
在回应Cris Luengo时,我已经解决了上述金融时报关系中的错别字。此外,似乎可以通过对维基百科的FT定义应用简单替换来实现“替代”FT:
长话短说,我应该在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