假设信号对应于一年(365天)中的日值。它由所有零组成,除了几个稀疏值,这些稀疏值对应于所有以相同间隔(30天)分开的孤立峰。我使用快速傅立叶变换功能获得频谱。

  • 如何摆脱0Hz峰值?
    编辑:这与信号的非零均值性质有关。有关更多详细信息,请参见this post
  • 然后,第一个峰值为12Hz,这在某种程度上是可以预期的。但是,峰值也出现在24Hz,36Hz,48Hz ...处。这是一个混叠问题吗?如何摆脱它?

  • 下面是我的代码。它已在Octave中进行了测试,但也应在Matlab中工作
    close all
    clear all
    
    T = 1/365; % period
    samp_freq = 1/T;  % sample frequency
    t=0:T:2; % overall time span is two years
    
    % build signal
    x= zeros(length(t),1);
    for i=1:length(t)
        if mod(i,30) == 0
           x(i) = 100;
        else
            x(i) = 0;
        end
    end
    
    figure(1)
    plot(t,x)
    grid
    xlabel("Time [years]")
    ylabel("Signal amplitude")
    
    
    y=fft(x);
    N = length(x);
    
    for i=1:N
        f(i) = (i-1)*samp_freq/N;
    end
    
    figure(2)
    plot(f,abs(y))
    xlabel("Frequency")
    ylabel("Signal amplitude")
    
    figure(3)
    plot(f(1:80),abs(y(1:80)))
    xlabel("Frequency")
    ylabel("Signal amplitude")
    

    matlab - 仅正稀疏信号的FFT的意外峰值[OCTAVE或MATLAB]-LMLPHP

    matlab - 仅正稀疏信号的FFT的意外峰值[OCTAVE或MATLAB]-LMLPHP

    最佳答案

    0 Hz处的峰值代表信号的“DC分量”,与算术平均值相同。您可以从数据集中减去平均值以消除此误差,或忽略它。

    其他以12 Hz为倍数的峰值称为"harmonics"-之所以存在是因为您的周期信号不是正弦波(实际上是脉冲序列)。第一个峰值为12 Hz,称为"fundamental"。您可以对信号进行预滤波以消除谐波,也可以忽略上面的所有内容(例如20 Hz)。

    您可能还需要考虑将window function应用于数据,以减少spectral leakage,从而使峰更尖锐,更准确。

    关于matlab - 仅正稀疏信号的FFT的意外峰值[OCTAVE或MATLAB],我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42620759/

    10-12 16:35