分析傅立叶变换与Matlab中函数的FFT

时间:2018-03-16 09:59:25

标签: matlab fft

我已针对此问题调整了Comparing FFT of Function to Analytical FT Solution in Matlab中的代码。我正在尝试进行FFT并将结果与​​Wikipedia tables中的分析表达式进行比较。

我的代码是:

a = 1.223;
fs = 1e5; %sampling frequency
dt = 1/fs;
t = 0:dt:30-dt;     %time vector
L = length(t); % no. sample points
t = t - 0.5*max(t); %center around t=0

y = ; % original function in time
Y = dt*fftshift(abs(fft(y))); %numerical soln

freq = (-L/2:L/2-1)*fs/L; %freq vector
w = 2*pi*freq; % angular freq

F = ; %analytical solution

figure; subplot(1,2,1); hold on
plot(w,real(Y),'.')
plot(w,real(F),'-')
xlabel('Frequency, w')
title('real')
legend('numerical','analytic')
xlim([-5,5])
subplot(1,2,2); hold on;
plot(w,imag(Y),'.')
plot(w,imag(F),'-')
xlabel('Frequency, w')
title('imag')
legend('numerical','analytic')
xlim([-5,5])

如果我研究高斯函数并让

y = exp(-a*t.^2); % original function in time

F = exp(-w.^2/(4*a))*sqrt(pi/a); %analytical solution

在上面的代码中,看起来在绘制函数的实部和虚部时有很好的一致性:

enter image description here

但如果我研究衰减指数乘以一个Heaviside函数:

H = @(x)1*(x>0); % Heaviside function
y = exp(-a*t).*H(t);

F = 1./(a+1j*w); %analytical solution

然后

enter image description here

为什么会出现差异?我怀疑它与行Y =有关,但我不确定为什么或如何。

修改:我将ifftshift更改为fftshift中的Y = dt*fftshift(abs(fft(y)));。然后我也删除了abs。第二个图现在看起来像:

enter image description here

'镜像'图表背后的数学原因是什么?如何删除它?

1 个答案:

答案 0 :(得分:2)

问题底部的图表没有镜像。如果您使用线而不是点绘制那些,您会看到数字结果具有非常高的频率。绝对组件匹配,但阶段不匹配。当这种情况发生时,几乎可以肯定的是时域发生了变化。

实际上,您可以在中间定义时域函数。 FFT期望原点位于第一个(最左侧)样本。这是ifftshift的用途:

Y = dt*fftshift(fft(ifftshift(y)));

ifftshift将原点移动到第一个样本,为fft调用做准备,fftshift将结果的原点移动到中间,以便显示。

修改

您的t没有0:

>> t(L/2+(-1:2))
ans =
  -1.5000e-05  -5.0000e-06   5.0000e-06   1.5000e-05

t(floor(L/2)+1)处的样本需要为0.这是ifftshift移动到最左边样本的样本。 (如果floor的大小奇怪,我会使用L,而不是这里的情况。)

要生成正确的t,请执行以下操作:

fs = 1e5; % sampling frequency
L = 30 * fs;
t = -floor(L/2):floor((L-1)/2);
t = t / fs;

我首先生成一个正确长度的整数t轴,在正确的位置(t(floor(L/2)+1)==0)为0。然后我通过除以采样频率将其转换为秒。

使用此t,我在上面建议的Y,以及其他代码的原样,我在高斯示例中看到了这一点:

>> max(abs(F-Y))
ans =    4.5254e-16

对于另一个功能,我看到更大的差异,大约为6e-6。这是由于无法对Heaviside函数进行采样。在采样函数中需要t = 0,但H的值不为0.我注意到实部的偏移幅度相似,这是由t = 0处的样本引起的。

通常the sampled Heaviside function is set to 0.5 for t=0。如果我这样做,则完全消除偏移,并且实部的最大差异减少3个数量级(对于非常接近0的值,最大的误差发生,我看到Z字形图案)。对于虚部,最大误差减小到3e-6,仍然非常大,并且在高频时最大。我将这些误差归因于理想和采样的Heaviside函数之间的差异。

你应该将自己限制在带限功能(或几乎带限的功能,如高斯)。你可能想尝试用一个小sigma(sigma = 0.8 * fs是我考虑进行适当采样的最小sigma)用一个误差函数(高斯积分)替换Heaviside函数。 Its Fourier transform is known