【问题标题】:correct sampling points for FFTFFT 的正确采样点
【发布时间】:2018-07-18 07:21:10
【问题描述】:

我想在 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 值会发生变化,因为那里的 y 值完全不同。如果你看一下光谱,它们都是一样的。
  • 虽然它们看起来很相似,abs 值也几乎相同,但我需要对它们做一些进一步的矩阵运算,光谱泄漏会弄乱我的结果。

标签: matlab fft sampling dft


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-13
    • 1970-01-01
    • 2013-04-30
    • 1970-01-01
    • 1970-01-01
    • 2016-11-11
    • 2014-11-25
    相关资源
    最近更新 更多