首页 > 编程知识 正文

matlab自适应滤波器设计,自适应加权算法matlab

时间:2023-05-03 18:00:45 阅读:167084 作者:4102

LMS自适应滤波算法是基于wiener滤波算法,基于最陡梯度下降法形成的滤波算法,利用梯度向量估计代替其精确值,得到了广泛的应用。 本文是在入门中学习LMS算法时整理总结的,包含了自己在实现编程上的疑问和自己思考后的解答。 如果有不足的地方,请谦虚地指出。

LMS算法的理论基础LMS算法的损耗函数(cost function )如下:

LMS算法的递推公式如下。

注: 是用于控制系统稳定性和自适应算法收敛速度的调节步长的常数,以下示例中的mu.LMS算法实现步骤开始时i=0的自适应滤波器的系数矢量w(0)为任意值; 根据输入信号矢量x[I],利用期望信号d[I]和滤波器的输出信号y[I]计算出误差信号e[I]; 根据误差信号,使用以下递归公式,进行滤波系数的更新;

重复步骤2 )和3 )直到达到平稳的状态(系数w几乎没有变化)。 LMS算法的收敛条件:

通过引入系数误差矢量,整理后的LMS算法的收敛条件如下

注:max是输入信号的自相关矩阵的最大特征值

LMS算法基于matlab的LMS算法实现步骤分为两部分,第一部分为LMS算法函数,主要完成LMS的实现过程; 第二部分是主函数,准备数据,调用第一部分的算法实现过滤。

LMS子程序function [w,en,yn]=my_LMS(xn,dn, mu ) LMS安装程序(输入) xn输入信号串矢量(dn理想信号串矢量) mu收敛常数标量) ITR重复次数标量) m滤波器的次数标量)输出) w滤波器的系数矩阵尺寸为Mitr的各列是1次重复后的系数使%重复次数为输入信号xn的长度w=Zeros(m,itr ); 将%过滤器的初始值设定为0en=Zeros(itr,1 ); %将初始误差设定为0%反复更新滤波器的参数for k=M:itr %为了保证输入延迟后的信号有效,实际的反复次数为(itr-M )次,x=xn ) k:-1:k-m1; 输入到%过滤器每个抽头的y=w(:k-1 ).' *x; %计算过滤器的输出en(k )=dn (k )-y; %误差信号w(:k )=w65:k-1 ) mu*en(k ) *x; 固定%迭代更新滤波器的系数end %滤波器参数后,获得经过优化滤波器滤波的输出信号yn=INF*ones(length(xn ) )。 %inf意味着无限大,如果将yn的初始值设定为无限大,则绘制图像时不再显示fork=m : itrx=xn (k :-1: k-m1 )。 yn(k )=w ) :k ).' *x; 结束LMS主程序%%%% LMS自适应滤波算法实现滤波功能的%%%%%理想信号t=03360199xs=10*cos(0.5*t ); %xs是理想余弦信号%描绘理想信号的图像figure; subplot (2,1,1 ); 网格; %显示窗格plot(t,xs ); 标题(理想信号); %发生随机噪声信号xn=randn(1,200 ); 产生大小为1200的噪声信号的%随机噪声的图像subplot (2,1,2 ); 网格; %显示窗格plot(xn; title (随机噪声); %发生输入信号xn=xs xn; xn=xn.'; %将输入信号从行向量转换为列向量dn=xs.'; %将理想信号从行向量替换为列向量%绘制输入信号和理想信号的图像图; plot(t,xn,' r ',t,dn,' blue ' ); legend (“混合有噪声的输入信号”、“理想信号”); title (输入信号与理想信号的对比); 求%收敛常数Fe=max (EIG ) xn*xn.' ); 求出%输入xn的自相关矩阵的最大特征值fe,a=EIG(b )意味着矩阵b的特征值为向量amu=2* ) )1/Fe )。 引用LMS算法实现过滤[w,en,yn]=my_LMS(xn,dn,mu ); %绘制滤波器输出信号和误差信号图像figure; subplot (2,1,1 ); 网格; plot(yn; 描绘%滤波后信号subplot (2,1,2 ); 网格; plot(t,xn,' red ',t,yn,' blue ',t,en,' yellow ' ); legend (“滤波器输入信号”、“滤波器的输出信号”、“误差信号”); title(3 (三种信号的比较); 算法的执行结果

如何获得学习中的问题和解答理想信号d(I )?

a )要设计滤波器,设计师必须知道滤波器的实际输入和理想输出。 否则,就不能说是滤波器设计。 因此,LMS滤波算法中的理想信号d(I ),即滤波器的理想输出实际上与机器学习中的label是不同的,是人为规定的。 d(I )存在是为了得到滤波器的成本函数(cost function )、LMS算法的本质

是最小化其代价函数,当代价函数最小时,滤波器的参数就能取得最优值,即滤波器设计完毕。LMS子程序中滤波器每个抽头的输入如何获得?
答: 以下图为例子(引用于[1]),滤波器每个抽头的输入都是输入信号x(i)延时的结果,故在LMS程序中用以下语句实现,在本例中,输入信号是一个200×1的列向量,要保证输入的延时信号有效,实际迭代的次数只有170次,故w矩阵30列以前的值都为0,滤波器输出yn列向量30行以前都为无穷大,误差e(i)的30行以前都为0。 for k = M:itr %要保证输入延时后的信号有效,所以实际的迭代次数只有(itr-M)次, x = xn(k:-1:k-M+1);%将输入信号延迟,使得滤波器的每个抽头都有输入 y = w(:,k-1).'*x; %计算出滤波器的输出 en(k) = dn(k)-y; %得出误差信号 w(:,k) = w(:,k-1)+mu*en(k)*x;%迭代更新滤波器的系数end


4. 在程序中为什么要把yn的初始值设为无穷大?
答: 在matlab的绘图程序中,由于精度的问题,无法绘制出无穷大,故若将yn的初始值设置为无穷大,绘制其图像时,其前面30行就不会出现在图中,可以便于观察,与之对应的是误差信号en的初始值设置为0,故绘制其图像时,前面无效的30行也出现在图中了,显得有些乱。不过仁者见仁,智者见智,可以自己根据自己的喜好自动调整。

[1]fddgtx. 无线传感器网络中分布式LMS算法的研究[D].西安邮电大学,2014
[2]future_fighter.LMS算法Matlab实现.https://blog.csdn.net/future_fighter/article/details/2334181

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。