bravecapta 发表于 2006-3-18 12:28

请高手帮俺看下LMS的程序!!!

谢谢你的回复,我昨天对程序进行了修改,改成100次计算的平均,结果波形不平坦,和理论计算波形差别很大,单次计算的波形又不正确,还望高手出手相助啊!!
a1=-0.195;a2=0.95;p=-10.22;%功率是-10.22dbw
x=zeros(1,10000);
w1=zeros(1,10000);
w2=zeros(1,10000);
a=zeros(1,100);
b=zeros(1,100);
v=wgn(1,1000,p);
x(1)=v(1);
x(2)=v(2)-a1*x(1);
e(1)=x(1);
e(2)=x(2);
w1(1)=0;w2(1)=0;
w1(2)=0;w2(2)=0;
w1(3)=0.02*x(1)*e(2);
w2(3)=0;
for n=3:1000;
for m=1:100;
e(n)=x(n)-w1(n)*x(n-1)-w2(n)*x(n-2);
w1(n+1)=w1(n)+ 0.02*x(n-1)*e(n);
w2(n+1)=w2(n)+ 0.02*x(n-2)*e(n);
x(n)=v(n)-a1*x(n-1)-a2*x(n-2);
a(m)=w1(n);
b(m)=w2(n);
end;
for i=1:100;
w1(n)=w1(n)+a(i);
w2(n)=w2(n)+b(i);
end
w1(n)=w1(n)/100;
w2(n)=w2(n)/100;
end
n=1:1000;
plot(n,w1(n),'r',n,w2(n),'b');

simon21 发表于 2006-3-21 09:22

你的程序一点注解都没有,读起来很来
给你个例子,你自己参考改改吧

matlab lms 算法实例
function =lms(xn,dn,M,delt,varargin)
% LMS Algorithm ,返回滤波器加权系数矩阵和误差向量
%
% 调用格式
% =lms(xn,dn,M,delt,itr)
% en=滤波器输出和d(n)的误差序列,为列向量
% wn=滤波器的加权参量序列,为一矩阵,其每行代表一个加权参量,每列代表一次迭代;初始化值设为0
% xn=输入列向量信号
% dn=期望列向量信号
% M=滤波器阶数
% delt=步长
% itr=迭代次数
%
% =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

yang_miya 发表于 2006-3-23 11:24

另外你的信号x(n)产生有点问题,用二阶自回归模型产生的,使用循环产生即可。

bravecapta 发表于 2006-3-24 18:32

谢谢大家的回复!!不胜感激!
页: [1]
查看完整版本: 请高手帮俺看下LMS的程序!!!