我在时域中有一个表达
f = -1j*H(t) * exp(-(1j*a+b)*t)
可以使用known properties进行傅立叶变换分析(H
是Heaviside阶跃函数)。 FT操作的结果是
F = (w-a-1j*b)/((w-a)**2+b**2)
其中w
是频率。
现在我使用this article中的提示在Python中对f
进行数字傅立叶变换,并确认我得到的结果与F
相同:
import numpy as np
import matplotlib.pyplot as plt
t = np.linspace(-10,10,1e4) # time
w = np.linspace(-10,10,1e4) # frequency
b = 0.1
a = 1
H = lambda x: 1*(x>0) # heaviside function
# function in time
f = -1j*H(t)*np.exp(-(1j*a+b)*t)
# function in frequency (analytical work)
F = (w-a-1j*b)/((w-a)**2+b**2)
hann = np.hanning(len(t)) # hanning window
# function in frequency (numerical work)
F2 = 2/len(t)*np.fft.fft(hann*f)
plt.figure()
plt.plot(w,F.real,'b',label='analytical')
plt.plot(w,F2.real,'b--',label='fft')
plt.xlabel(r'$\omega$')
plt.ylabel(r'Re($F(\omega)$)')
plt.legend(loc='best')
plt.figure()
plt.plot(w,F.imag,'g',label='analytical')
plt.plot(w,F2.imag,'g--',label='fft')
plt.xlabel(r'$\omega$')
plt.ylabel(r'Im($F(\omega)$)')
plt.legend(loc='best')
plt.show()
然而,Python的FFT函数似乎给了我一些完全错误的东西。当F
和F2
被绘制时,这一点很明显。
编辑:以下是情节......
在这些图中并不明显,但如果放大w=-10
和10
区域,则会出现小振荡,可能是由于fft
算法造成的。
答案 0 :(得分:2)
FFT算法计算DFT,DFT在第一个样本上具有原点(空间和频域)。你需要移动你的信号(在应用Hanning窗口之后),使得t = 0是最左边的样本,并且在计算FFT之后你必须进行逆移。
MATLAB有ifftshift
和fftshift
,它们实现了这两个班次。 NumPy必须具有类似的功能。
您的代码的另一个问题是您计算DFT,并将其绘制在您计算的w
给出的位置,但与计算DFT的实际频率无关。
这是您的代码,已翻译为MATLAB,并已修复为正确计算F2
和w
*。我希望这很有用。需要注意的一点是,您的F
与F2
不符,我相信这不是F2
中的错误,而是F
计算错误}。形状类似,但F
按比例缩放并镜像。
N = 1e3;
t = linspace(-100,100,N); % time
Fs = 1/(t(2)-t(1));
w = Fs * (-floor(N/2):floor((N-1)/2)) / N; % NOTE proper frequencies
b = 0.1;
a = 1;
H = @(x)1*(x>0); % Heaviside function
% function in time
f = -1j*H(t).*exp(-(1j*a+b)*t);
% function in frequency (analytical work)
F = (w-a-1j*b)./((w-a).^2+b.^2);
% hanning window
hann = 0.5*(1-cos(2*pi*linspace(0,1,N)));
% function in frequency (numerical work)
F2 = fftshift(fft(ifftshift(hann.*f))); % NOTE shifting of origin
figure
subplot(2,1,1), hold on
plot(w,real(F),'b-')
plot(w,real(F2),'r-')
xlabel('\omega')
ylabel('Re(F(\omega))')
legend({'analytical','fft'},'Location','best')
subplot(2,1,2), hold on
plot(w,imag(F),'b-')
plot(w,imag(F2),'r-')
xlabel('\omega')
ylabel('Im(F(\omega))')
legend({'analytical','fft'},'Location','best')
脚注:
*我也改变了颜色,MATLAB的绿色太亮了。