正确的FFT采样点

时间:2018-07-18 07:21:11

标签: matlab fft sampling dft

我想在Matlab上使用FFT计算信号的傅立叶级数。我遇到了以下意外问题。只是例子

如果我定义一个网格,然后将fft计算为:

M=59;           
x= deal(1*(0:M-1)/M);
y=3*cos(2*pi*x);
Yk=fftshift(fft2(y)/(M));

这给了我确切的预期分析值:Yk(29)= 1.5; Yk(31)= 1.5;归零 enter image description here

但是如果我将网格定义为,并重复fft计算:

x=0:1/(M-1):1;
y=3*cos(2*pi*x);
Yk=fftshift(fft2(y)/(M));

完全弄错了Yk的值 enter image description here

这是一个烦人的问题,因为我必须像第二种方法一样分析许多采样的信号数据,因此Yk的值将是错误的。有办法解决此问题吗?一个告诉fft函数有关信号采样方式的选项。无法以正确的方式重新采样数据。

避免频谱泄漏的主要原因是,我对这些傅立叶项分别进行了实部和成像部分的进一步操作。光谱泄漏弄乱了最终结果。

1 个答案:

答案 0 :(得分:1)

第二种采样形式包括一个在余弦周期内过多的采样。这会导致一些频谱泄漏,并给您的信号增加一个小的偏移(导致虚值不为零)。如果您删除了最后一点,则将再次正确地采样余弦,并且将消除这两种影响。您的FFT值将减少一个值,我不知道这是否会以任何方式影响您的分析。

x = 0:1/(M-1):1;
y = 3*cos(2*pi*x);
Yk = fftshift(fft2(y(1:end-1))/(M-1));

>> max(abs(imag(Yk)))
ans =
     1.837610523517500e-16