0
点赞
收藏
分享

微信扫一扫

【优化算法】改进定步长与变步长LMS算法【含Matlab源码 629期】


一、获取代码方式

获取代码方式1:

完整代码已上传我的资源:​​【优化算法】改进定步长与变步长LMS算法【含Matlab源码 629期】​​

获取代码方式2:

通过订阅紫极神光博客​付费专栏​,凭支付凭证,​私信博主​,可获得此代码。

备注:

订阅紫极神光博客​付费专栏​,可免费获得​1​份代码(​有效期​为订阅日起,三天内有效);

二、LMS简介

最小均方(LMS, Least Mean Squares)是最基本的自适应滤波算法。

LMS算法是自适应滤波器中常用的一种算法与维纳算法不同的是其系统的系数随输入序列而改变。维纳算法中截取输入序列自相关函数的一段构造系统的最佳系数。而LMS算法则是对初始化的滤波器系数依据最小均方误差准则进行不断修正来实现的。因此理论上讲LMS算法的性能在同等条件下要优于维纳。但是LMS是在初始值下逐步调整的,因此在系统稳定前,会有一段调整时间,调整时间受步长因子的控制,一定范围内,步长因子越大,调整时间越小,步长因子的最大取值为R的迹。LMS采用平方误差最小的原则代替均方误差最小的原则,信号基本关系如下:

【优化算法】改进定步长与变步长LMS算法【含Matlab源码 629期】_matlab

【优化算法】改进定步长与变步长LMS算法【含Matlab源码 629期】_matlab_02

三、部分源代码

clear all
clc
t=0:1/1000:100-1/1000;
s=15*sin(0.15*pi*t);
snr=10;
s_power=var(s); %var函数: 返回方差值
linear_snr=10^(snr/10);
factor=sqrt(s_power/linear_snr);
noise=randn(1,length(s))*factor;
%noise=wgn(1,length(s),factor);
x=s+noise; %由SNR计算随机噪声
x1=noise; %噪声源输入
x2=noise;
%x3=noise;
w1=0; %权系数初值
w2=0;
%w3=0;
e=zeros(1,length(x));
error=zeros(1,length(x));
y=0;
%mu=0;
mu=0.000009;
for i=1:100000 %定步长LMS算法
y=w1*x1(i)+w2*x2(i);%+w3*x3(i);
e(i)=x(i)-y;
error(i)=s(i)-e(i);
% ee=error^2;
% mu=xuanze(mu,ee);
w1=w1+mu*e(i)*x1(i);
w2=w2+mu*e(i)*x2(i);
% w3=w3+mu*e(i)*x3(i);
end
figure(1)
subplot(4,1,1)
plot(t,s);
title('纯正弦信号')
subplot(4,1,2)
plot(t,x);
title('带噪声正弦信号')
axis([0 100 -30 30]);
subplot(4,1,3)
plot(t,noise);
title('噪声信号')
axis([0 100 -30 30]);
subplot(4,1,4)
plot(t,e);
title('定步长LMS算法自适应噪声对消器')
axis([0 100 -30 30]);
wu=error;
figure(2)
subplot(3,1,1);
plot(wu);
title('定步长LMS算法收敛过程')







%自适应噪声对消器
clear all
clc
t=0:1/1000:100-1/1000;
s=15*sin(0.15*pi*t);
snr=10;
s_power=var(s); %var函数: 返回方差值
linear_snr=10^(snr/10);
factor=sqrt(s_power/linear_snr);
noise=randn(1,length(s))*factor;
x=s+noise; %由SNR计算随机噪声
x1=noise; %噪声源输入
x2=noise;
w1=0; %权系数初值
w2=0;
e=zeros(1,length(x));
error=zeros(1,length(x));
y=0;
mu=0;
%mu=0.05;
for i=1:100000 %变步长LMS算法
y=w1*x1(i)+w2*x2(i);
e(i)=x(i)-y;
error(i)=s(i)-e(i);
ee=error(i)^2;
if ee>0.0005;
ee=0.0005;
end
mu=xuanze(mu,ee);
w1=w1+mu*e(i)*x1(i);
w2=w2+mu*e(i)*x2(i);
end
figure(3)
subplot(4,1,1)
plot(t,s);
title('纯正弦信号')
subplot(4,1,2)
plot(t,x);
title('带噪声正弦信号')
axis([0 100 -30 30]);
subplot(4,1,3)
plot(t,noise);
title('噪声信号')
axis([0 100 -30 30]);
subplot(4,1,4)
plot(t,e);
title('变步长LMS算法自适应噪声对消器')
axis([0 100 -30 30]);
wu=error;
figure(2)
subplot(3,1,2);
plot(wu);
title('变步长LMS算法收敛过程')





%自适应噪声对消器
clear all
clc
t=0:1/1000:100-1/1000;
s=15*sin(0.15*pi*t);
snr=10;
s_power=var(s); %var函数: 返回方差值
linear_snr=10^(snr/10);
factor=sqrt(s_power/linear_snr);
noise=randn(1,length(s))*factor;
x=s+noise; %由SNR计算随机噪声
x1=noise; %噪声源输入
x2=noise;
w1=0; %权系数初值
w2=0;
e=zeros(1,length(x));
error=zeros(1,length(x));
y=0;
mu=0;
%mu=0.05;
for i=1:100000 %改进变步长LMS算法
y=w1*x1(i)+w2*x2(i);
e(i)=x(i)-y;

ee=exp(abs(error(i))^3)-1;
% ee=error^4;


end
mu=xuanze(mu,ee);
w1=w1+mu*e(i)*x1(i);
w2=w2+mu*e(i)*x2(i);
end
figure(4)
subplot(4,1,1)
plot(t,s);
title('纯正弦信号')
subplot(4,1,2)
plot(t,x);
title('带噪声正弦信号')
axis([0 100 -30 30]);
subplot(4,1,3)
plot(t,noise);
title('噪声信号')
axis([0 100 -30 30]);
subplot(4,1,4)
plot(t,e);
title('改进变步长LMS算法自适应噪声对消器')
axis([0 100 -30 30]);

四、运行结果

【优化算法】改进定步长与变步长LMS算法【含Matlab源码 629期】_优化算法_03

【优化算法】改进定步长与变步长LMS算法【含Matlab源码 629期】_自适应_04

【优化算法】改进定步长与变步长LMS算法【含Matlab源码 629期】_自适应_05

【优化算法】改进定步长与变步长LMS算法【含Matlab源码 629期】_matlab_06

五、matlab版本及参考文献

1 matlab版本

2014a

2 参考文献

[1] 包子阳,余继周,杨杉.智能优化算法及其MATLAB实例(第2版)[M].电子工业出版社,2016.

[2]张岩,吴水根.MATLAB优化算法源代码[M].清华大学出版社,2017.



举报

相关推荐

0 条评论