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

【优化算法】改进型的LMS算法【含Matlab源码 630期】

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

标签:简介   log   enter   dma   code   vpd   代码   初始   out   

一、简介

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

二、源代码

 %一种变步长lms 算法
clear all
close all
hold off    
sysorder = 5 ; %抽头数

t = 0:1/5000:1-0.0001;
s = sin(2*pi*t); %不带噪声的信号
N = size(t);
M = length(t);
% %计算自相关矩阵的最大特征值
% xx=rcorr(length(s),s);
% [V,D]=eig(xx);
% Dmax=max(max(D));

n = randn(N);   %产生高斯白噪声
[b,a] = butter(2,0.25);
Gz = tf(b,a,-1); %逆变换函数
y = lsim(Gz,s);  %加入正弦信号
z = n * std(y)/(10*std(n));  %标准差为0的噪声信号
x = s + z;      %实际输入信号
dd = s; %期望输出信号

%算法的开始
w = zeros(1,sysorder);%权向量初始化
umax=0.45;   %设置步长最大值
umin=0.0003; %设置步长最小值

for i=1:2
          u = umax;
          y(i) = x(i:i+4)* w‘ ; %系统输出

          e(i) = dd(i) - y(i);%误差
  
          w = w + u * e(i) * x(i); %迭代方程
end

for i = 3:M-4

     if ((u >= umin)&&(u <= umax))

       y(i) = x(i:i+4)* w‘ ;  %系统输出
 
       e(i) = dd(i) - y(i);  %误差

       w = w + u * e(i) * x(i);  %迭代方程

       u = ((e(i) * e(i-1)/((dd(i))^2)))* umax;  %步长更新公式
    end
   
    if    u > umax
          u = umax;
          
          y(i) = x(i:i+4)* w‘ ; %系统输出
   
          e(i) = dd(i) - y(i);   %误差

           w = w + u * e(i) * x(i);  %迭代方程
           
           u = ((e(i) * e(i-1)/((dd(i))^2)))* umax;  %步长更新公式
    end
    
   if     u < umin
          u = umin;

          y(i) = x(i:i+4)* w‘ ;  %系统输出

          e(i) = dd(i) - y(i); %误差

             w = w + u * e(i) * x(i);  %迭代方程

             u = ((e(i) * e(i-1)/((dd(i))^2)))* umax; %步长更新公式
   end

end

 %计算均方误差 
st = 0;
 i = 1;

while i <= M-4       
      a = (e(i))^2;
     st = st+a;
    out = (1/i)*st;
    yy(1,i) = out;
    i = i+1;
  
end

% %作图
hold on;
%不带噪声的信号
subplot(3,1,1)
plot(s)      
title(‘纯净的输入信号‘)
 %噪声
subplot(3,1,2)
plot(z,‘g‘)     
title(‘噪声‘)
 %带噪声的输入信号  
subplot(3,1,3)
plot(x,‘c‘)      
title(‘带噪声的输入信号‘)
figure

三、运行结果

技术图片
技术图片

四、备注

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

【优化算法】改进型的LMS算法【含Matlab源码 630期】

标签:简介   log   enter   dma   code   vpd   代码   初始   out   

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

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