logo资料库

自适应滤波.doc

第1页 / 共6页
第2页 / 共6页
第3页 / 共6页
第4页 / 共6页
第5页 / 共6页
第6页 / 共6页
资料共6页,全文预览结束
自适应滤波器的相关算法的仿真实验报告 一、 实验目的 学会阅读、理解论文的能力并整理相关知识点。 掌握 matlaba 编程能力。 了解自适应滤波器算法并能够对其进行性能分析。 二、 实验内容 本实验主要针对两个典型的自适应滤波算法 LMS 算法和 RLS 算法进行仿 真,并对其性能进行分析。自适应滤波算法对其参数进行控制,以实现最佳滤波。 主要的核心思想是针对横向滤波器,通过调整抽头值,使得输出信号与参考信号 的误差值最小。LMS 算法主要是利用梯度下降法得到了关于抽头系数的迭代公 式,此公式是一个线性关系的表达式,不涉及到相关矩阵,因此大大地简化了计 算量。但是 LMS 算法收敛速度慢,估计精度低而且权系数估计值因瞬时梯度估 计围绕精确值波动较大,权噪声大,不稳定。RLS 算法利用遗忘因子进行收敛。 RLS 在提取信号时,收敛速度快,估计精度高而且稳定性好,可以明显抑制振 动加速度收敛过程,故对非平稳信号的适应性强。 三、 实验结果以及分析 3、1 LMS 算法代码 %LMS 算法演示(matlab) %设置参数,N 为采样个数,u 为步长 clear,clc; N=16;u=0.1; %设置迭代次数 k k=250; %pha 为随机噪声的平均功率 rk=randn(1,k)/2;%%正态分布的随机矩阵 pha=mean(rk);%%求元素平均值 %设置起始权值 wk(1,:)=[0 0];
%用 LMS 算法迭代求最佳权值 for i=1:k xk(i,:)=[sin(2*pi*i/N) sin(2*pi*(i-1)/N)]+rk(i);%输入信号 yk(i)=xk(i,:)*wk(i,:)';%输出信号 dk(i)=2*cos(2*pi*i/N);%期望信号 err(i)=dk(i)-yk(i);%误差 wk(i+1,:)=wk(i,:)+2*u*err(i)*xk(i,:);%权值迭代 end [x,y]=meshgrid([-2:0.1:8],[-10:0.1:0]); %求性能表面 z=(0.5+pha)*(x.^2+y.^2)+x.*y*cos(2*pi/N)+2*y*sin(2*pi/N)+2; %求理论最佳权值 x1,y1 x1=2*cos(2*pi/N)*sin(2*pi/N)/((1+pha)^2-(cos(2*pi/N))^2); y1=-2*(1+2*pha)*sin(2*pi/N)/((1+pha)^2-(cos(2*pi/N))^2); %画性能表面的等高线 %figure,contour(x,y,z,[0.78 1.9 6.3 13.6 23.8 37]);%%等值线图 %画迭代时权值的变化 %hold on;plot(wk(:,1),wk(:,2),'r'); %标注最佳权值的位置 %hold on;plot(x1,y1,'*'); %绘制误差与迭代次数的图 figure,plot(err); title('LMS误差和迭代次数'); 3、2 RLS 算法代码 %基于 RLS 算法的自适应线性预测 clc; clear all; N=300; M=100;%计算的次数 w1=zeros(N,M);w2=zeros(N,M);I=eye(2);e1=zeros(N,M);
for k=1:M %产生白噪声 Pv=0.008;%定义白噪声方差 a1=-0.195;a2=0.95;o=0.02;r=0.95; m=5000;%产生 5000 个随机数 v=randn(1,m); v=v*sqrt(Pv);%产生均值为 0,方差为 Pv 的白噪声 %m=1:N; v=v(1:N);%取出前 1000 个 %plot(m,v);title('均值为 0,方差为 0.0965 的白噪声');ylabel('v(n)');xlabel('n'); v=v'; %向量初使化 x=zeros(1,N); x(1)=v(1);%x(0)=v(0) x(2)=v(2)-a1*v(1);%x(1)=v(1)-a1*v(0) w=zeros(2,N); w(:,1)=[0 0]';%w(0)=[0 0]'; X=zeros(2,N); X(:,2)=[v(1) 0]';%X(0)=[0 0]';X(1)=[v(0) 0]' C=zeros(2,2*N); C(:,1:2)=1/o.*I;%C(0)=1/o*I e=zeros(1,N)';%定义误差向量 u=zeros(1,N); g=zeros(2,N); %根据 RLS 算法进行递推 for n=1:N-2 x(n+2)=v(n+2)-a1*x(n+1)-a2*x(n); X(:,n+2)=[x(n+1) x(n)]';
u(n)=X(:,n+1)'*C(:,2*n-1:2*n)*X(:,n+1); g(:,n)=(C(:,2*n-1:2*n)*X(:,n+1))./(r+u(n)); w(:,n+1)=w(:,n)+g(:,n)*(x(n+1)-X(:,n+1)'*w(:,n)); C(:,2*n+1:2*(n+1))=1/r.*(C(:,2*n-1:2*n)-g(:,n)*X(:,n+1)'*C(:,2*n-1:2*n)); e(n)=x(n+1)-X(:,n+1)'*w(:,n); w1(:,k)=w(1,:)'; w2(:,k)=w(2,:)';%将每次计算得到的权矢量值储存 e1(:,k)=e(:,1);%将每次计算得到的误差储存 end end %求权矢量和误差的 M 次的平均值 wa1=zeros(N,1);wa2=zeros(N,1);en=zeros(N,1); for k=1:M wa1(:,1)=wa1(:,1)+w1(:,k); wa2(:,1)=wa2(:,1)+w2(:,k); en(:,1)=en(:,1)+e1(:,k); end n=1:N; %subplot(221) %plot(n,w(1,n),n,w(2,n));%作出单次计算权矢量的变化曲线 %xlabel('n');ylabel('w(n)');title('w1(n)和 w2(n)的单次变化曲线(线性预测,RLS)') %subplot(222) %plot(n,wa1(n,1)./M,n,wa2(n,1)./M);%作出 100 次计算权矢量的平均变化曲线 %xlabel('n');ylabel('w(n)');title('w1(n)和 w2(n)的 100 次平均变化曲线') figure, plot(n,e(n,1));%作出计算 e^2 的变化曲线 xlabel('n');ylabel('e');title('计算 e 的变化曲线'); %subplot(224)
%plot(n,(en(n,1)/M).^2);%作出 M 次计算 e^2 的平均变化曲线 %xlabel('n');ylabel('e^2');title('100 次计算 e^2 的平均变化曲线'); 3、3 实验结果及结论 LMS 算法的实验结果如图 1 所示。LMS 算法的误差值在[-3 3]范围内波动, 且随着迭代次数的增加,误差值在零值附近收敛。可以看出大概在迭代次数在 200 左右开始,误差值的波动范围在[-1 1]附近,收敛相对较慢。 图 1 LMS 算法误差与迭代次数结果图 RLS 算法实验结果如图 2 所示。误差值的波动范围在[-0.4 0.4]附近波动。 且收敛速度相对较快。
综上比较,RLS 算法比 LMS 算法误差值波动性更小,精确度更高,且收敛速度 更快。
分享到:
收藏