美文网首页
使用matlab计算时间序列的振幅谱、功率谱(PSD)以及幅度(

使用matlab计算时间序列的振幅谱、功率谱(PSD)以及幅度(

作者: AibWang | 来源:发表于2023-04-14 20:43 被阅读0次

    基本区分

    • 振幅谱对应频率域的振幅 |F(f_1)|
    • 功率谱对应振幅的平方 psd_{f1} = [|F(f_1)|]^2
    • 幅度(dB)对应振幅平方的换算 := 10 lg(psd_{f1}) 【根据matlabdb2pow帮助文档】

    使用FFT计算振幅谱和功率谱(Matlab)

    fs = 100;
    
    t = 0:1/fs:2-1/fs;
    x = cos(2*pi*20*t) + randn(length(t));
    
    N = length(x);
    if(mod(N, 2) == 1)
    N = N - 1;
    end
    
    fft_x = fft(x, N);
    fft_x = fft_x(1:N/2+1);
    ampsp_x = (1/N) * abs(fft_x);
    psd_x = (1/N) * abs(fft_x).^2;
    
    ampsp_x(2:end-1) = 2 * ampsp_x(2:end-1);
    psd_x(2:end-1) = 2 * psd_x(2:end-1); 
    

    注意事项

    • FFT要求时间序列的长度为2的倍数
    • 由于时间序列f(x)是离散信号,对应的傅里叶变换F(f)为周期信号,虽然长度相同,但F(f)包含两个周期(负频率部分和正频率部分),因此,我们只需要正频率部分即可fft_x = fft_x(1:N/2+1);
    • 由于F(f)包含两个周期,而我们仅取了一个周期,故要恢复准确的振幅和功率谱,需要对振幅(功率谱)乘以2;但零频率和奈奎斯特频率(fs/2)不会出现两次,故这两个频率对应的值不必乘以2

    matlab计算功率谱密度(PSD)

    1、对于平稳信号,可以使用FFT计算PSD(代码如上)

    2、对于非平稳信号,可以使用如短时傅里叶变换、Multitaper spectral estimate等工具计算【matlab中pmtm函数】

    3、Multitaper spectral estimate对FFT的能量泄露进行了优化,能更准确稳定的求解功率谱(振幅谱直接开方即可amp=\sqrt{PSD}

    相关文章

      网友评论

          本文标题:使用matlab计算时间序列的振幅谱、功率谱(PSD)以及幅度(

          本文链接:https://www.haomeiwen.com/subject/uqytjdtx.html