【老生谈算法】matlab实现功率谱密度算法源码——功率谱密度

功率谱密度的三种matlab实现方法


1、文档下载:

本算法已经整理成文档如下,有需要的朋友可以点击进行下载

序号 文档(点击下载)
本项目文档 【老生谈算法】自己编写算法的功率谱密度的三种matlab实现方法.doc

2、算法详解:

一:实验目的:
(1)掌握三种算法的概念、应用及特点;
(2)了解谱估计在信号分析中的作用;
(3) 能够利用burg法对信号作谱估计,对信号的特点加以分析。

二;实验内容:
简单说明三种方法的原理。
用三种方法编写程序,在matlab中实现。
将计算结果表示成图形的形式,给出三种情况的功率谱图。
比较三种方法的特性。
写出自己的心得体会。

三:实验原理:
1.周期图法:
周期图法又称直接法。它是从随机信号x(n)中截取N长的一段,把它视为能量有限x(n)真实功率谱的估计的抽样.

认为随机序列是广义平稳且各态遍历的,可以用其一个样本x(n)中的一段来估计该随机序列的功率谱。这当然必然带来误差。由于对采用DFT,就默认在时域是周期的,以及在频域是周期的。这种方法把随机序列样本x(n)看成是截得一段的周期延拓,这也就是周期图法这个名字的来历。

相关法(间接法):
这种方法以相关函数为媒介来计算功率谱,所以又叫间接法。这种方法的具体步骤是:
第一步:从无限长随机序列x(n)中截取长度N的有限长序列列
第二步:由N长序列求(2M-1)点的自相关函数序列。
在这里插入图片描述

                                       (2-1)   这里,m=-(M-1)…,-1,0,1…,M-1,MN,是双边序列,但是由自相关函数的偶对称性式,只要求出m=0,。。。,M-1的傅里叶变换,另一半也就知道了。

第三步:由相关函数的傅式变换求功率谱。即
在这里插入图片描述

以上过程中经历了两次截断,一次是将x(n)截成N长,称为加数据窗,一次是将x(n)截成(2M-1)长,称为加延迟窗。因此所得的功率谱仅是近似值,也叫谱估计,式中的代表估值。一般取M<

三:Burg法:
AR模型功率谱估计又称为自回归模型,它是一个全极点的模型,要利用AR模型进行功率谱估计须通过levinson_dubin递推算法由
Yule-Walker方程求得AR的参数:σ2,α1α2…αp。

计算中,预测系数必须满足Lenvinson-Durbin递推关系,并且可直接计算而无需首先计算自相关系数。这种方法的优点就是对未知数据不需要做任何假设,估计精度较高。其缺点是在分析噪声中的正弦信号时,会引起谱线分裂,且谱峰的位置和正弦信号的相位有很大的关系。

Burg算法是使前向预测误差和后向预测误差均方误差之和最小来求取Km的,它不对已知数据段之外的数据做认为假设。计算m阶预测误差的递推表示公式如下:
【老生谈算法】matlab实现功率谱密度算法源码——功率谱密度_第1张图片

求取反射系数的公式如下:
在这里插入图片描述

对于平稳随机过程,可以用时间平均代替集合平均,因此上式可写成:
【老生谈算法】matlab实现功率谱密度算法源码——功率谱密度_第2张图片

这样便可求得AR模型的反射系数。
将m阶AR模型的反射系数和m-1阶AR模型的系数代入到Levinson关系式中,可以求得AR模型其他的p-1个参数。
Levinson关系式如下:
在这里插入图片描述
【老生谈算法】matlab实现功率谱密度算法源码——功率谱密度_第3张图片

实验内容:
实验程序及实验图像
周期法:

Fs=1000;
nfft=10000;         %2^n
n=0:Fs;
x=sin(2*pi*0.2*n)+sqrt(2)*sin(2*pi*0.213*n)+randn(size(n));
X=fft(x,nfft);
Pxx=abs(X).^2/length(n);   %求解PSD
t=0:round(nfft/2-1);
f=t/nfft;
P=10*log10(Pxx(t+1));   %纵坐标的单位为dB
plot(f,P);
grid on

【老生谈算法】matlab实现功率谱密度算法源码——功率谱密度_第4张图片

							nfft=200

【老生谈算法】matlab实现功率谱密度算法源码——功率谱密度_第5张图片

nfft=1024
【老生谈算法】matlab实现功率谱密度算法源码——功率谱密度_第6张图片

nfft=10000

相关法:

clear;
Fs=1000; %采样频率
n=0:Fs;%产生含有噪声的序列
nfft=1024;
xn=sin(2*pi*0.2*n)+sqrt(2)*sin(2*pi*0.213*n)+randn(size(n));
cxn=xcorr(xn,'unbiased'); %计算序列的自相关函数
CXk=fft(cxn,nfft);      %求出功率谱密度
Pxx=abs(CXk);
index=0:round(nfft/2-1);
f=index/nfft;
plot_Pxx=10*log10(Pxx(index+1));
plot(f,plot_Pxx);
xlabel('频率');
ylabel('功率/DB');
grid on;

【老生谈算法】matlab实现功率谱密度算法源码——功率谱密度_第7张图片

nfft=256
【老生谈算法】matlab实现功率谱密度算法源码——功率谱密度_第8张图片

nfft=1024
Burg法:

clear
Fs=1000  %设置关键变量,可通过调节这些变量观察不同效果
f1=0.2;
f2=0.213;
nfft=128;          %取样点数
p=50;       %阶数p应该选择在N/3<p<N/2
delta=1;
m=sqrt(-1);
f=0:1/1000:0.5;
n=1:Fs;
xn=sin(2*pi*f1*n)+sqrt(2)*sin(2*pi*f2*n)+randn(size(n));
figure;
plot(n,xn);
title('burg时域');
xn= xn(:);
N=length(xn);
ef = xn;
eb = xn;
a = 1;
for l=1:p
   efp = ef(2:end);%m-1阶前向预测误差
   ebp = eb(1:end-1);%m-1阶后向预测误差
 
   num = -2.*ebp'*efp;%1km分子多项式 
   den = efp'*efp+ebp'*ebp;%1km的分母多项式
   
   k(l) = num ./ den;%计算反射系数
   
   % 更新前向和后向预测误差
   ef = efp + k(l)*ebp;%各阶前向预测误差
   eb = ebp + k(l)*efp;%各阶后向预测误差
   
   % 计算模型参数
   a=[a;0] + k(l)*[0;conj(flipud(a))];%AR模型参数a
end
a1=a(2:p+1);
 
for i=1:length(f) %循环递推
   sum=0;
   for k=1:p
       sum=sum+a1(k)*exp(-m*2*pi*f(i)*k);
   end
  Pbrg(i)=delta/(abs(1+sum))^2;
  Pbrg_f(i)=10*log10(Pbrg(i));%求出功率谱
end
figure
plot(f,Pbrg_f);
title('burg频域');    

【老生谈算法】matlab实现功率谱密度算法源码——功率谱密度_第9张图片

【老生谈算法】matlab实现功率谱密度算法源码——功率谱密度_第10张图片

nfft=128
【老生谈算法】matlab实现功率谱密度算法源码——功率谱密度_第11张图片

nfft=256

五:结果比较分析
(1) 在采样点相同的时,周期图法的特点是离散性大,曲线粗糙,方差较大,但是分辨率较高;采用周期突发估计得出的功率谱很不平滑,相应的估计协方差比较大。而且采用增加采样点的办法也不能吃周期图变得更加平滑,这是周期图法的缺点。周期图法得出的估计谱方差特性不好:当数据长度N太大时,扑线的起伏加剧;N太小时谱的分辨率又不好。对其改进的主要方法有二种,即平均和平滑,平均就是将截取的数据段再分成L个小段,分别计算功率谱后取功率谱的平均,这种方法使估计的方差减少,但偏差加大,分辨率下降。平滑是用一个适当的窗函数与算出的功率谱进行卷积,使谱线平滑。这种方法得出的谱估计是无偏的,方差也小,但分辨率下降。

(2)相关法当延迟与数据长度之比很小时,可以有良好的估计精度,相关法的收敛性较好,曲线平滑,方差较小,但是功率谱主瓣较宽,分辨率低。

(3)用Burg算法进行功率谱估计时令前后向预测误差功率之和最小,即对前向序列误差和后向序列误差前后都不加窗。Burg算法是建立在数据基础之上的,避免了先计算自相关函数从而提高计算速度。是较为通用的方法,计算不太复杂 并且分辨率优于自相关法。但对于白噪声加正弦信号有时会出现谱线分裂现象,并且从上两个图中可以看出burg法产生的功率谱曲线比较平滑即方差小,分辨率高,可以明显的观察到两个谱峰,在降低模型阶次后谱的分辨率降低(两个谱峰几乎变成一个谱峰),但是曲线的平滑性更好。

并且采样点数越大,谱图的分辨率就越高。对比nfft=128和nfft=256即可发现。除此之外还发现对于上面三种情况采样点数越大,其功率谱密度也越大。还有就是阶数p应该选择在N/3

你可能感兴趣的:(matlab算法原理详解,matlab,算法,开发语言)