LMS算法Matlab实现function[yn,W,en]=LMS(xn,dn,M,mu,itr)%LMS(LeastMeanSqure)算法%输入参数:%xn输入的信号序列(列向量)%dn所期望的响应序列(列向量)%M滤波器的阶数(标量)%mu收敛因子(步长)(标量)要求大于0,小于xn的相关矩阵最大特征值的倒数%itr迭代次数(标量)默认为xn的长度,Mitrlength(xn)%输出参数:%W滤波器的权值矩阵(矩阵)%大小为Mxitr,%en误差序列(itrx1)(列向量)%yn实际输出序列(列向量)%参数个数必须为4个或5个ifnargin==4%4个时递归迭代的次数为xn的长度itr=length(xn);elseifnargin==5%5个时满足Mitrlength(xn)ifitrlength(xn)|itrMerror('迭代次数过大或过小!');endelseerror('请检查输入参数的个数!');end%初始化参数en=zeros(itr,1);%误差序列,en(k)表示第k次迭代时预期输出与实际输入的误差W=zeros(M,itr);%每一行代表一个加权参量,每一列代表-次迭代,初始为0%迭代计算fork=M:itr%第k次迭代x=xn(k:-1:k-M+1);%滤波器M个抽头的输入y=W(:,k-1).'*x;%滤波器的输出en(k)=dn(k)-y;%第k次迭代的误差%滤波器权值计算的迭代式W(:,k)=W(:,k-1)+2*mu*en(k)*x;end%求最优时滤波器的输出序列yn=inf*ones(size(xn));fork=M:length(xn)x=xn(k:-1:k-M+1);yn(k)=W(:,end).'*x;endLMS函数的一个实例:%functionmain()closeall%周期信号的产生t=0:99;xs=10*sin(0.5*t);figure;subplot(2,1,1);plot(t,xs);grid;ylabel('幅值');title('it{输入周期性信号}');%噪声信号的产生randn('state',sum(100*clock));xn=randn(1,100);subplot(2,1,2);plot(t,xn);grid;ylabel('幅值');xlabel('时间');title('it{随机噪声信号}');%信号滤波xn=xs+xn;xn=xn.';%输入信号序列dn=xs.';%预期结果序列M=20;%滤波器的阶数rho_max=max(eig(xn*xn.'));%输入信号相关矩阵的最大特征值mu=rand()*(1/rho_max);%收敛因子0mu1/rho[yn,W,en]=LMS(xn,dn,M,mu);%绘制滤波器输入信号figure;subplot(2,1,1);plot(t,xn);grid;ylabel('幅值');xlabel('时间');title('it{滤波器输入信号}');%绘制自适应滤波器输出信号subplot(2,1,2);plot(t,yn);grid;ylabel('幅值');xlabel('时间');title('it{自适应滤波器输出信号}');%绘制自适应滤波器输出信号,预期输出信号和两者的误差figureplot(t,yn,'b',t,dn,'g',t,dn-yn,'r');grid;legend('自适应滤波器输出','预期输出','误差');ylabel('幅值');xlabel('时间');title('it{自适应滤波器}');运行后的结果如下: