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