FFT 算法计算 DFT,其原点(空间域和频域)位于第一个样本上。您需要移动信号(在应用汉宁窗之后),以便 t=0 是最左边的样本,并且在计算 FFT 后,您必须进行反向移动。
MATLAB 有ifftshift
and fftshift
,实现这两个转变。 NumPy 一定有类似的功能。
代码的另一个问题是计算 DFT,并将其绘制在由w
您计算的频率,但与计算 DFT 的实际频率无关。
这是您的代码,已转换为 MATLAB,并已修复以正确计算F2
and 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')
Footnote:
* I also changed the colors, MATLAB's green is too light.