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


%lmsËã·¨Ô´³ÌÐò 
 
clear all 
close all 
%channel system order 
sysorder = 5; 
% Number of system points 
M=2000; 
inp = randn(M,1); 
n = randn(M,1); 
[b,a] = butter(2,0.25); 
Gz = tf(b,a,-1); 
%This function is submitted to make inverse Z-transform (Matlab central file exchange) 
%The first sysorder weight value 
%h=ldiv(b,a,sysorder)'; 
% if you use ldiv this will give h :filter weights to be 
h= [0.0976; 
0.2873; 
0.3360; 
0.2210; 
0.0964;]; 
x= lsim(Gz,inp) 
%add some noise 
n = n * std(x)/(10*std(n)); 
y= x + n; 
d=x; 
totallength=size(d,1); 
%Take 60 points for training 
N=60 ; 
%begin of algorithm 
w = zeros ( sysorder , 1 ) ; 
for n = sysorder : N 
u = inp(n:-1:n-sysorder+1) ; 
y(n)= w' * u; 
e(n) = d(n) - y(n) ; 
% Start with big mu for speeding the convergence then slow down to reach the correct weights 
if n < 20 
mu=0.030; 
else 
mu=0.015; 
end 
w = w + mu * u * e(n) ; 
end 
 
 
 
%----------------------------------------------------------- 
figure  
plot(u,'g'); 
%check of results 
for n = N+1 : totallength 
u = inp(n:-1:n-sysorder+1) ; 
y(n) = w' * u ; 
e(n) = d(n) - y(n) ; 
end 
hold on 
 
figure 
plot(d) 
plot(y,'r'); 
title('System output') ; 
xlabel('Samples') 
ylabel('True and estimated output') 
figure  
plot(abs(e)) ; 
title('Error curve') ; 
xlabel('Samples') 
ylabel('Error value') 
figure 
plot(h, 'k+') 
hold on 
plot(w, 'r*') 
legend('Actual weights','Estimated weights') 
title('Comparison of the actual weights and the estimated weights') ; 
axis([0 6 0.05 0.35])