[Matlab科学计算] 功率谱一点介绍

信号的功率谱密度描述随机信号的功率在频域随频率的分布。利用给定的N个样本数据估计一个平稳随机信号的功率谱密度叫做谱估计,功率谱密度一般简称功率谱。谱估计方法分为参数化方法和非参数化方法。非参数化方法又叫经典谱估计,如周期图法、自相关法等,其主要缺点是描述功率谱波动的数字特征方差性能较差,频率分辨率低;而参数化谱估计又叫做现代谱估计,如AR模型法、MA模型法、自回归移动平均模型法(ARMA模型法)等。

功率谱的单位是W/Hz,如果做了对数处理10log,就是分贝(dB)。

1 经典功率谱估计

经典功率谱估计是截取较长的数据链中的一段作为工作区,相当于将数据加一个矩形窗函数。根据截取的N个样本数据用估计出其功率谱。其中可以利用相关函数法估计功率谱、也可以利用周期图法估计出功率谱。

1.1 根据自相关函数计算功率谱

1)先计算出自相关函数

                                                    \large R_{x}(m)=\frac{1}{N}\sum_{n=0}^{N-m-1}x(n)x(n+m)

2)对自相关函数做傅里叶变换,得到功率谱

matlab代码如下:

clear all;
clc;
close all;
Fs=1024;       % 采样频率
nfft = 1024;   % fft计算点数大于采样数据点时,补零
%产生含有噪声的序列
n=(0:Fs-1)/Fs;
xn=cos(2*pi*10*n)+3*cos(2*pi*20*n)+(2*randn(size(n)));
subplot(2,1,1);
plot(xn);title('加噪信号');grid on
% 自相关法
cxn=xcorr(xn,'unbiased'); %计算序列的自相关函数
CXk=fft(cxn,nfft);
psd2=abs(CXk);
index=0:round(nfft/2-1);
k=index*Fs/nfft;
psd2 = psd2 / max(psd2);
psd2=10*log10(psd2(index+1)+0.000001);
subplot(2,1,2);plot(k,psd2);title('自相关法');grid on

结果如下:

 

1.2根据周期图法计算功率谱

 周期图法是根据各态历经的随机过程功率谱的定义进行的谱估计。周期图法是把随机序列\large x(n)的N个观测数据视为一能量有限的序列,直接计算\large x(n)的离散傅里叶变换,得\large x(k),然后再取其幅值的平方,并除以N。

                                                            \large X_{N}(e^{-jw})=\sum_{n=0}^{N-1}x(n)e^{-jwn}\large S(w)=\frac{1}{N}\left | X_{N}(e^{-jw}) \right |^{2}

matlab代码如下:

clear all;
clc;
close all;
Fs=1024;       % 采样频率
nfft = 1024;   % fft计算点数大于采样数据点时,补零
%产生含有噪声的序列
n=(0:Fs-1)/Fs;
xn=cos(2*pi*10*n)+3*cos(2*pi*20*n)+(2*randn(size(n)));
subplot(2,1,1);
plot(xn);title('加噪信号');grid on
% 周期图法
window=boxcar(length(xn)); %矩形窗
[psd1,f]=periodogram(xn,window,nfft,Fs); %直接法
psd1 = psd1 / max(psd1);
subplot(2,1,2);
plot(f,10*log10(psd1+0.000001));
title('周期图法');grid on

 结果如下:

 2 现代谱估计法

 自相关法是AR模型参数估计中较为简单的一种功率谱估计方法,按照模型阶数从小到大的顺序进行计算。

matlab代码如下:

clear all;
clc;
close all;
Fs=1024;       % 采样频率
nfft = 1024;   % fft计算点数大于采样数据点时,补零
%产生含有噪声的序列
n=(0:Fs-1)/Fs;
xn=cos(2*pi*10*n)+3*cos(2*pi*20*n)+(2*randn(size(n)));
subplot(2,1,1);
plot(xn);title('加噪信号');grid on

index=0:round(nfft/2-1);
k=index*Fs/nfft;
% AR谱
psd3 = pyulear(xn, Fs, nfft); 
psd3=psd3/max(psd3);
index=0:round(nfft/2-1);
psd3=10*log10(psd3(index+1)+0.000001);
subplot(2,1,2);plot(k, psd3);title('AR谱估计');grid on;

结果如下图: 

三种方法对比结果如下:

3种经典功率谱估计方法的MATLABA代码-功率谱代码.doc 3种MATLAB的经典谱估计方法 希望对大家有用~ 附件所有代码: 直接法: 直接法又称周期图法,它是把随机序列x的N个观测数据视为一能量有限的序列,直接计算x的离散傅立叶变换,得X,然后再取其幅值的平方,并除以N,作为序列x真实功率谱的估计。 Matlab代码: clear; Fs=1000; %采样频率 n=0:1/Fs:1; %产生含有噪声的序列 xn=cos 3*cos randn); window=boxcar); %矩形窗 nfft=1024; [Pxx,f]=periodogram; %直接法 plot); 改进的直接法: 对于直接法的功率谱估计,当数据长度N太大时,谱曲线起伏加剧,若N太小,谱的分辨率又不好,因此需要改进。 1. Bartlett法 Bartlett平均周期图的方法是将N点的有限长序列x分段周期图再平均。 Matlab代码: clear; Fs=1000; n=0:1/Fs:1; xn=cos 3*cos randn); nfft=1024; window=boxcar); %矩形窗 noverlap=0; %数据无重叠 p=0.9; %置信概率 [Pxx,Pxxc]=psd; index=0:round; k=index*Fs/nfft; plot_Pxx=10*log10); plot_Pxxc=10*log10); figure plot; pause; figure plot; 2. Welch法 Welch法对Bartlett法进行了两方面的修正,一是选择适当的窗函数w,并再周期图计算前直接加进去,加窗的优点是无论什么样的窗函数均可使谱估计非负。二是在分段时,可使各段之间有重叠,这样会使方差减小。 Matlab代码: clear; Fs=1000; n=0:1/Fs:1; xn=cos 3*cos randn); nfft=1024; window=boxcar; %矩形窗 window1=hamming; %汉明窗 window2=blackman; %blackman窗 noverlap=20; %数据无重叠 range='half'; %频率间隔为[0 Fs/2],只计算一半的频率 [Pxx,f]=pwelch; [Pxx1,f]=pwelch; [Pxx2,f]=pwelch; plot_Pxx=10*log10; plot_Pxx1=10*log10; plot_Pxx2=10*log10; figure plot; pause; figure plot; pause; figure plot; 复制代码
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值