LMS自适应滤波算法的 matlab实现

算法思路

1LMS算法实现步骤:
1).令起始时刻 i=0自适应滤波器的系数矢量W(0)为任意值;
2).根据输入信号矢量X(i) ,利用期望信号d(i) 和滤波器的输出信号 y(i)计算误差信号e(i);
3).根据误差信号,利用以下的递推公式 ,进行滤波器系数的更新;
递推公式
4).重复步骤2)和3),直到达到平稳状态(系数W几乎保持不变)。

2.LMS算法的收敛条件:
通过引入系数误差矢量 ,整理得LMS算法的收敛条件为 :
在这里插入图片描述
注: λmax为输入信号的自相关矩阵 的最大特征值

子程序

function [w,e,yn] = my_LMS(xn,dn)
%% LMS实现程序
%   输入:
% xn   输入信号       
% dn   理想信号          
% L    迭代次数      
% k    滤波器的阶数   
%   输出:
% w    滤波器的系数矩阵    大小为 k×L  每一列代表一次迭代后的系数
% e    误差信号            大小为 L×1  每一行代表一次迭代后产生的误差
% yn   滤波器的输出信号    

%% 参数配置
k=128;              %滤波器阶数
L=length(xn);       %迭代次数=输入信号长度

%% 初始化
yn=zeros(1,L);      %初始化滤波输出信号
yn(1:k)=xn(1:k);    %初始化输出信号前k位数据,保证
w=zeros(1,k);       %初始化权重
e=zeros(1,L);       %初始化误差

%% 求收敛常数u
fe = max(eig(xn*xn.'));%求解输入xn的自相关矩阵的最大特征值fe,A = eig(B),意为将矩阵B的特征值组成向量A
u = 2*(1/fe);

%% 迭代更新滤波器的参数
for i=(k+1):L    %要保证输入延时后的信号有效,所以实际的迭代次数只有(L-k)次,
    XN=xn((i-k+1):(i));   %将输入信号延迟,使得滤波器的每个抽头都有输入
    yn(i)=w*XN';          %计算出滤波器的输出
    e(i)=dn(i)-yn(i);     %得出误差信号
    w=w+u*e(i)*XN;        %迭代更新滤波器的系数
end

end

主程序

clear;
clc;
close all;

L=1024;    %信号长度
a=1;       %原始信号幅度
t=1:L;      
dn=a*sin(0.05*pi*t);%原始正弦信号
subplot(411);plot(dn);axis([0,L,-a-1,a+1]);
title('原始信号s时域波形');
xn=awgn(dn,1);   %添加信噪比5dB的白高斯噪声

subplot(412);plot(xn);axis([0,L,-a-1,a+1]);
title('信号加高斯白噪声后的时域波形');

[w,e,yn] = my_LMS(xn,dn);%调用滤波算法

subplot(413);plot(yn);axis([0,L,-a-1,a+1]);
title('LMS算法自适应滤波后的输出时域波形');

subplot(414);plot(e);axis([0,L,-a-1,a+1]);
title('LMS算法自适应滤波后与原始信号误差');

运行结果

LMS自适应滤波算法的 matlab实现_第1张图片

参考文章地址

你可能感兴趣的:(matlab算法,matlab)