声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 3050|回复: 4

[综合讨论] 关于lms算法

[复制链接]
发表于 2006-12-12 11:19 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
在论坛上找到的lms算法的程序都是与下面这个程序类似的(程序如下)
具体的就是
x_tap=xn(k:-1:k-M+1);
en(k)=dn(k)-wn(:,k-1)'*x_tap;
wn(:,k)=wn(:,k-1)+2*delt*en(k,1)*x_tap;
这三句代码不停迭代运算
前些天学习了信号检测与估值理论相关知识
书上的lms算法的输出为估计量(滤波结果)和均方误差阵
而这个程序的输出结果是滤波器系数和误差系数
实际使用的时候,这样给出的结果应该更实用
我想知道,这个迭代算法的具体推导是在哪提出来的?
哪位朋友能介绍一下或者给我推荐篇文章看看吗?谢谢
%matlab lms 算法实例
function [wn,en]=lms(xn,dn,M,delt,varargin)
% LMS Algorithm ,返回滤波器加权系数矩阵和误差向量
%
% 调用格式
% [wn,en]=lms(xn,dn,M,delt,itr)
% en=滤波器输出和d(n)的误差序列,为列向量
% wn=滤波器的加权参量序列,为一矩阵,其每行代表一个加权参量,每列代表一次迭代;初始化值设为0
% xn=输入列向量信号
% dn=期望列向量信号
% M=滤波器阶数
% delt=步长
% itr=迭代次数
%
% [wn,en]=lms(xn,dn,M,delt)
% 迭代次数为默认值,即等于x(n)的点数
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 输入输出参数的检查
%--------------------------------------------------------------------------
vin=length(varargin); Item=vin+4;
error(nargchk(4,Item,nargin)); % 检查输入变量数目是否合适,其中前四个参数必须输入
if nargout>2 % 检查输出变量数目是否合适
error('Too many output arguments');
end
%------------------------------------------------------------------------
Nx=length(xn); % x(n)的长度
if Nx~=length(dn) % 检查x(n)和d(n)长度是否相等
error('The length of x(n) is not equal to that of d(n)');
end
%------------------------------------------------------------------------
sizex=size(xn); % 检查输入向量是否为列向量
if sizex(1)<sizex(2)
xn=xn.';
end
sizedn=size(dn); % 检查期望信号向量是否为列向量
if sizedn(1)<sizedn(2)
dn=dn.';
end
%-------------------------------------------------------------------------
itr=Nx; % 迭代次数取默认值
%-------------------------------------------------------------------------
% 当输入变量为5个时
if Item==5 % 确定迭代次数
itr=varargin{1};
if itr>Nx | itr<M
error('Too many or too few iterations');
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 参数的初始化
en=zeros(itr,1);
wn=zeros(M,itr); % 每行代表一个加权参量,每列代表一次迭代
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 迭代计算
for k=M:itr % 第k次迭代
x_tap=xn(k:-1:k-M+1);
en(k)=dn(k)-wn(:,k-1)'*x_tap;
wn(:,k)=wn(:,k-1)+2*delt*en(k,1)*x_tap;
end
回复
分享到:

使用道具 举报

 楼主| 发表于 2006-12-12 11:23 | 显示全部楼层
输出滤波器系数应该更适合做波形估计吧
像信道估计这种运用
我想知道这种迭代的求解过程
大侠指点一下吧
谢谢
发表于 2006-12-14 23:18 | 显示全部楼层
看现代信号处理的书都可以找到的
梯度法演变得来的
 楼主| 发表于 2006-12-15 13:59 | 显示全部楼层
谢谢zhengdan66
我这两天已经学习了相关的知识
学习了墨金的《自适应滤波器原理》中的相关内容
现在又遇到了其他的一些问题:
LMS算法滤波结果怎么比NLMS的滤波结果看起来更平滑?更接近于期望信号?
还有就是虽然NLMS的均方误差曲线开始下降的快一些
但是后面的叠代得到的均方误差也不比LMS得到的好啊?
这是怎么回事?大侠指点一下吧?是不是我的步长因子选的不合适?
我的仿真程序如下:

clear all
close all
N=10; %滤波器阶数
sample_N=500; %采样点数

A=1; %信号幅度
snr=10; %信噪比
t=1:sample_N;
length_t=100;
d=A*sin(2*pi*t/length_t); %期望信号
M=length(d); %M为接收数据长度
x=awgn(d,snr); %经过信道(加噪声)

delta=1/(10*N*(A^2)); %计算能够使LMS算法收敛的delta

y=zeros(1,M);
h=zeros(1,N); %LMS滤波器系数
h_normalized=zeros(1,N); %归一化LMS滤波器系数
y1=zeros(1,N);
for n=N:M %系数调整LMS算法
x1=x(n:-1:n-N+1);
%LMS算法
y(n)=h*x1';%LMS算法的滤波输出
e(n)=d(n)-y(n);
h=h+delta*e(n)*x1;
%NLMS算法
y_normalized(n)=h_normalized*x1';%NLMS算法的滤波输出
e_normalized(n)=d(n)-y_normalized(n);
h_normalized=h_normalized+e_normalized(n)*x1/(x1*x1');
end
error=e.^2; %LMS算法每一步迭代的均方误差
error_normalized=e_normalized.^2; %NLMS算法每一步迭代的均方误差
subplot(411)
plot(t,d);
axis([1,sample_N,-2,2]);
subplot(412)
plot(t,x);
subplot(413)
plot(t,y);
subplot(414)
plot(t,y_normalized);
figure(2)
plot(t,error,'r',t,error_normalized,'b');

[ 本帖最后由 回忆的路上 于 2006-12-15 14:07 编辑 ]
 楼主| 发表于 2006-12-17 10:46 | 显示全部楼层
谁能帮帮忙吗?
周末了,上论坛的人少了。。。
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-5-11 01:50 , Processed in 0.066165 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表