代码之家  ›  专栏  ›  技术社区  ›  Jared Lo

FFT的正确采样点

  •  1
  • Jared Lo  · 技术社区  · 8 年前

    我想用matlab上的fft计算信号的傅立叶级数。我遇到了以下意想不到的问题。只是一个例子

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

    m=59;
    x=交易(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函数说明信号采样方式的选项。无法以正确的方式对数据重新取样。

    避免光谱泄漏的主要原因是我对这些傅立叶项分别进行了实部和imag部的进一步操作。而光谱泄漏正在破坏最终的结果。

    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函数说明信号采样方式的选项。无法以正确的方式对数据重新取样。

    避免光谱泄漏的主要原因是我对这些傅立叶项分别进行了实部和imag部的进一步操作。而光谱泄漏正在破坏最终的结果。

    1 回复  |  直到 8 年前
        1
  •  1
  •   Cris Luengo    8 年前

    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
    
    推荐文章