www.pudn.com > lms.rar > lms.m


 %一种变步长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 
 
subplot(3,1,1)  %期望输出 
plot(s) 
title('系统期望输出') ; 
xlabel('样本') 
ylabel('输出') 
 
subplot(3,1,2)  %实际输出 
plot(y,'r'); 
title('系统实际输出') ; 
xlabel('样本') 
ylabel('输出') 
 
subplot(3,1,3)  %均方误差 
plot(yy,'m') 
xlabel('样本') 
ylabel('均方误差') 
title('均方误差分析') 
grid