码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2021-06-25 16:39:42      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:pow   差值   erro   and   ESS   不同   代码   误差   err   

一、简介

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

三、运行结果

技术图片
技术图片
技术图片
技术图片

四、备注

版本:2014a
完整代码或代写加1564658423

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

标签:pow   差值   erro   and   ESS   不同   代码   误差   err   

原文地址:https://www.cnblogs.com/homeofmatlab/p/14928526.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!