您好,欢迎访问三七文档
LMS算法基本原理及MATLAB实现1959年,Widrow和Hoff二人提出了一种粗略估计梯度的简单方法,这就是应用非常广泛的LMS算法。LMS算法是由梯度下降法导出的,这种方法不需要求相关矩阵,更不涉及矩阵求逆,其基本思路与梯度下降法是一致的,不同之处仅在于用梯度向量的估计)(n来代替真实的梯度)(nw,也就是说,是对梯度下降法的近似简化,更符合实际应用。最速梯度法的迭代公式为:w(n+1)=w(n)-)(nw,)(nw是梯度,这种算法能得到精确的结果,但是计算复杂。如果用平方误差)(2ne代替E[)(2ne],则可得到梯度向量的近似表达式为:)()(2)()(2)()(2nnewnenewnnxeNw)(n表示梯度向量的估计,实际上它是单个平方误差序列的梯度,现用它代替多个平方误差序列统计平均的梯度)(nw,这就是LMS算法最基本的思想。由此,得出LMS算法的迭代公式为:)()()()1(nnenwnwxNLMS算法实际上是在每次迭代中使用很粗略的梯度估计值来代替精确梯度)(nw。不难想象,权系数的调整路径不可能精确的沿着理想的最速下降的路径,因而权系数的调整过程是有噪声的,或者说权向量w(n)不再是确定性函数而变成了随机变量,在迭代过程中存在随机波动,所以LMS算法也称为随机梯度法或噪声梯度法.下面是LMS算法的MATLAB实现:%lms算法源程序clearallcloseall%系统阶数sysorder=5;%系统点数N=2000;inp=randn(N,1);n=randn(N,1);[b,a]=butter(2,0.25);Gz=tf(b,a,-1);h=[0.0976;0.2873;0.3360;0.2210;0.0964;];y=lsim(Gz,inp);%加入噪声n=n*std(y)/(10*std(n));d=y+n;totallength=size(d,1);%用60个点训练N=60;%算法开始w=zeros(sysorder,1);forn=sysorder:Nu=inp(n:-1:n-sysorder+1);y(n)=w'*u;e(n)=d(n)-y(n);ifn20mu=0.32;elsemu=0.15;endw=w+mu*u*e(n);endforn=N+1:totallengthu=inp(n:-1:n-sysorder+1);y(n)=w'*u;e(n)=d(n)-y(n);endholdonplot(d)plot(y,'r');title('系统输出');xlabel('抽样值')ylabel('真实和估计输出')figuresemilogy((abs(e)));title('误差曲线');xlabel('抽样值')ylabel('误差值')figureplot(h,'k+')holdonplot(w,'r*')legend('实际权重','估计权重')title('实际权重和估计权重的比较');axis([060.050.35])%Plotresultsfigure;plot(20*log10(abs(e)));title('学习曲线');xlabel('迭代次数');ylabel('用db表示系统输出估计误差');以下是仿真结果的图像:
本文标题:LMS算法实现
链接地址:https://www.777doc.com/doc-5052935 .html