标签:简介 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