正确的 FFT 采样点

correct sampling points for FFT

我想在 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;零其他任何东西

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

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

完全搞砸了 Yk 的价值观

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

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

第二种采样形式在余弦周期内包含一个样本过多。这会导致一些频谱泄漏,并为您的信号添加一个小的偏移(这会导致非零虚值)。如果你放弃最后一点,你将再次正确采样余弦,你将摆脱这两种影响。你的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