MatLab實現FFT與功率譜


FFT和功率譜估計

  1. 用Fourier變換求取信號的功率譜---周期圖法

clf;
Fs=1000;
N=256;Nfft=256;%數據的長度和FFT所用的數據長度
n=0:N-1;t=n/Fs;%采用的時間序列
xn=sin(2*pi*50*t)+2*sin(2*pi*120*t)+randn(1,N);
Pxx=10*log10(abs(fft(xn,Nfft).^2)/N);%Fourier振幅譜平方的平均值,並轉化為dB
f=(0:length(Pxx)-1)*Fs/length(Pxx);%給出頻率序列
subplot(2,1,1),plot(f,Pxx);%繪制功率譜曲線
xlabel('頻率/Hz');ylabel('功率譜/dB');
title('周期圖 N=256');grid on;
Fs=1000;
N=1024;Nfft=1024;%數據的長度和FFT所用的數據長度
n=0:N-1;t=n/Fs;%采用的時間序列
xn=sin(2*pi*50*t)+2*sin(2*pi*120*t)+randn(1,N);
Pxx=10*log10(abs(fft(xn,Nfft).^2)/N);%Fourier振幅譜平方的平均值,並轉化為dB
f=(0:length(Pxx)-1)*Fs/length(Pxx);%給出頻率序列
subplot(2,1,2),plot(f,Pxx);%繪制功率譜曲線
xlabel('頻率/Hz');ylabel('功率譜/dB');
title('周期圖 N=256');grid on;

  1. 用Fourier變換求取信號的功率譜---分段周期圖法
    %思想:把信號分為重疊或不重疊的小段,對每小段信號序列進行功率譜估計,然后取平均值作為整個序列的功率譜
    clf;
    Fs=1000;
    N=1024;Nsec=256;%數據的長度和FFT所用的數據長度
    n=0:N-1;t=n/Fs;%采用的時間序列
    randn('state',0);
    xn=sin(2*pi*50*t)+2*sin(2*pi*120*t)+randn(1,N);
    Pxx1=abs(fft(xn(1:256),Nsec).^2)/Nsec; %第一段功率譜
    Pxx2=abs(fft(xn(257:512),Nsec).^2)/Nsec;%第二段功率譜
    Pxx3=abs(fft(xn(513:768),Nsec).^2)/Nsec;%第三段功率譜
    Pxx4=abs(fft(xn(769:1024),Nsec).^2)/Nsec;%第四段功率譜
    Pxx=10*log10(Pxx1+Pxx2+Pxx3+Pxx4/4);%Fourier振幅譜平方的平均值,並轉化為dB
    f=(0:length(Pxx)-1)*Fs/length(Pxx);%給出頻率序列
    subplot(2,1,1),plot(f(1:Nsec/2),Pxx(1:Nsec/2));%繪制功率譜曲線
    xlabel('頻率/Hz');ylabel('功率譜/dB');
    title('平均周期圖(無重疊) N=4*256');grid on;
    %運用信號重疊分段估計功率譜
    Pxx1=abs(fft(xn(1:256),Nsec).^2)/Nsec; %第一段功率譜
    Pxx2=abs(fft(xn(129:384),Nsec).^2)/Nsec;%第二段功率譜
    Pxx3=abs(fft(xn(257:512),Nsec).^2)/Nsec;%第三段功率譜
    Pxx4=abs(fft(xn(385:640),Nsec).^2)/Nsec;%第四段功率譜
    Pxx5=abs(fft(xn(513:768),Nsec).^2)/Nsec;%第四段功率譜
    Pxx6=abs(fft(xn(641:896),Nsec).^2)/Nsec;%第四段功率譜
    Pxx7=abs(fft(xn(769:1024),Nsec).^2)/Nsec;%第四段功率譜
    Pxx=10*log10(Pxx1+Pxx2+Pxx3+Pxx4+Pxx5+Pxx6+Pxx7/7);%Fourier振幅譜平方的平均值,並轉化為dB
    f=(0:length(Pxx)-1)*Fs/length(Pxx);%給出頻率序列
    subplot(2,1,2),plot(f(1:Nsec/2),Pxx(1:Nsec/2));%繪制功率譜曲線
    xlabel('頻率/Hz');ylabel('功率譜/dB');
    title('平均周期圖(重疊1/2) N=1024');grid on;

  2. 用Fourier變換求取信號的功率譜---welch方法
    %思想:welch法采用信號重疊分段,加窗函數和FFT算法等計算一個信號序列的自功率譜(PSD)和兩個信號序列的互功率譜(CSD),采用MATLAB自
    %帶的函數psd
    clf;
    Fs=1000;
    N=1024;Nfft=256;n=0:N-1;t=n/Fs;
    window=hanning(256);
    noverlap=128;
    dflag='none';
    randn('state',0);
    xn=sin(2*pi*50*t)+2*sin(2*pi*120*t)+randn(1,N);
    Pxx=psd(xn,Nfft,Fs,window,noverlap,dflag);
    f=(0:Nfft/2)*Fs/Nfft;
    plot(f,10*log10(Pxx));
    xlabel('頻率/Hz');ylabel('功率譜/dB');
    title('PSD--Welch方法');grid on;

  3. 功率譜估計----多窗口法(multitaper method ,MTM法)
    %思想:利用多個正交窗口獲得各自獨立的近似功率譜估計,綜合這些得到一個序列的功率譜估計;相對於普通的周期圖有更大的自由度;MTM法采用一個參數:時間帶
    %寬積NW,這個參數用以定義計算功率譜所用窗的數目為2*NW-1,NW越大,時間域分辨率越高而頻率分辨率越低,使得功率譜估計的波動減小;隨着NW的增大
    %,每次估計中譜泄露增多,總功率譜估計的偏差增大
    clf;
    Fs=1000;
    N=1024;Nfft=256;n=0:N-1;t=n/Fs;
    randn('state',0);
    xn=sin(2*pi*50*t)+2*sin(2*pi*120*t)+randn(1,N);
    [Pxx1,f]=pmtm(xn,4,Nfft,Fs); %此處有問題
    subplot(2,1,1),plot(f,10*log10(Pxx1));
    xlabel('頻率/Hz');ylabel('功率譜/dB');
    title('多窗口法(MTM)NW=4');grid on;
    [Pxx,f]=pmtm(xn,2,Nfft,Fs);
    subplot(2,1,2),plot(f,10*log10(Pxx));
    xlabel('頻率/Hz');ylabel('功率譜/dB');
    title('多窗口法(MTM)NW=2');grid on;

  4. 功率譜估計----最大熵法(maxmum entmpy method,MEM法)
    %思想:假定隨機序列為平穩高斯過程利用已知的自相關序列rxx(0),rxx(1),rxx(2)...rxx(p)為基礎,外推自相關序列rxx(p+1),rxx(p+2)...保證信息熵最大
    clf;
    Fs=1000;
    N=1024;Nfft=256;n=0:N-1;t=n/Fs;
    window=hanning(256);
    randn('state',0);
    xn=sin(2*pi*50*t)+2*sin(2*pi*120*t)+randn(1,N);
    [Pxx1,f]=pmem(xn,14,Nfft,Fs); %此處有問題
    subplot(2,1,1),plot(f,10*log10(Pxx1));
    xlabel('頻率/Hz');ylabel('功率譜/dB');
    title('最大熵法(MEM)Order=14');grid on;
    %采用Welch方法估計功率譜
    noverlap=128;
    dflag='none';
    subplot(2,1,2)
    psd(xn,Nfft,Fs,window,noverlap,dflag);
    xlabel('頻率/Hz');ylabel('功率譜/dB');
    title('Welch方法估計功率譜');grid on;

  5. 功率譜估計----多信號分類法(multiple signal classification,music法)
    %注:適用於白白噪聲中的多正弦波頻率估計
    %思想:將數據自相關矩陣看成是由信號自相關矩陣和噪聲自相關矩陣兩部分組成,求他們的矩陣特征值向量
    clf;
    Fs=1000;
    N=1024;Nfft=256;n=0:N-1;t=n/Fs;
    randn('state',0);
    xn=sin(2*pi*100*t)+2*sin(2*pi*200*t)+randn(1,N);
    pmusic(xn,[7,1.1],Nfft,Fs,32,16);
    xlabel('頻率/KHz');ylabel('功率譜/dB');
    title('Welch方法估計功率譜');grid on;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM