最小均方算法
最小均方算法
LMS算法是自适应滤波器中常用的一种算法,与维纳算法不同的是,其系统的系数随输入序列而改变。维纳算法中截取输入序列自相关函数的一段构造系统的最佳系数。而LMS算法则是对初始化的滤波器系数依据最小均方误差准则进行不断修正来实现的。因此,理论上讲LMS算法的性能在同等条件下要优于维纳算法,但是LMS算法是在一个初始化值得基础上进行逐步调整得到的,因此,在系统进入稳定之前有一个调整的时间,这个时间受到算法步长因子u的控制,在一定值范围内,增大u会减小调整时间,但超过这个值范围时系统不再收敛,u的最大取值为R的迹。权系数更新公式为:Wi+1=Wi+2ueiXi 。
依据上述算式,制定LMS滤波器设计实现方法为:
(1) 设计滤波器的初始化权系数W(0)=0,收敛因子u;
(2) 计算输入序列经过滤波器后的实际输出值:out(n)=WT(n)*X(n);
(3) 计算估计误差e(n)=xd(n)-out(n);
(4) 计算n+1阶的滤波器系数Wn+1=Wn+2*u*e(n)*X(n);
(5) 重复(2)--(4)过程
实验过程:
LMS函数:
function [yn,W,en] = LMS(xn,dn,M,mu,itr )
%LMS(Least Mean Squre)算法
% 输入参数:
%xn输入的信号序列(列向量)
%dn所期望的响应序列(列向量)
%M滤波器的阶数(标量)
%mu收敛因子(步长)(标量)要求大于0,小于xn的相关矩阵最大特征值的倒数
%itr迭代次数(标量)默认为xn的长度,M<itr<length(xn)
% 输出参数:
%W滤波器的权值矩阵(矩阵)
%大小为M x itr,
%en误差序列(itr x 1)(列向量)
%yn实际输出序列(列向量)
%参数个数必须为4个或5个
if nargin == 4 %4个时递归迭代的次数为xn的长度
itr = length(xn);
elseif nargin == 5 %5个时满足M<itr<length(xn)
if itr>length(xn) || itr<M
error('迭代次数过大或过小');
end
else
error('请检查输入参数的个数');
end
%初始化参数
en = zeros(itr,1);% 误差序列,en(k)表示第k次迭代时预期输出与实际输入的误差
W = zeros(M,itr);% 每一行代表一个加权参量,每一列代表-次迭代,初始为0 % 迭代计算
for k = 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));
for k = M:length(xn)
x = xn(k:-1:k-M+1);
yn(k) = W(:,end).'* x;
end
end
主函数:
%function main()
close all
%周期信号的产生
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);% 收敛因子 0 < mu < 1/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{自适应滤波器输出信号}');
% 绘制自适应滤波器输出信号,预期输出信号和两者的误差
figure;
plot(t,yn,'b',t,dn,'g',t,dn-yn,'r');
grid;
legend('自适应滤波器输出','预期输出','误差');
实验结果: