算法思路
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算法自适应滤波后与原始信号误差');
运行结果