声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 2538|回复: 3

[其他] 请高手帮俺看下LMS的程序!!!

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

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

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

x
谢谢你的回复,我昨天对程序进行了修改,改成100次计算的平均,结果波形不平坦,和理论计算波形差别很大,单次计算的波形又不正确,还望高手出手相助啊!!
  1. a1=-0.195;a2=0.95;p=-10.22;%功率是-10.22dbw
  2. x=zeros(1,10000);
  3. w1=zeros(1,10000);
  4. w2=zeros(1,10000);
  5. a=zeros(1,100);
  6. b=zeros(1,100);
  7. v=wgn(1,1000,p);
  8. x(1)=v(1);
  9. x(2)=v(2)-a1*x(1);
  10. e(1)=x(1);
  11. e(2)=x(2);
  12. w1(1)=0;w2(1)=0;
  13. w1(2)=0;w2(2)=0;
  14. w1(3)=0.02*x(1)*e(2);
  15. w2(3)=0;
  16. for n=3:1000;
  17. for m=1:100;
  18. e(n)=x(n)-w1(n)*x(n-1)-w2(n)*x(n-2);
  19. w1(n+1)=w1(n)+ 0.02*x(n-1)*e(n);
  20. w2(n+1)=w2(n)+ 0.02*x(n-2)*e(n);
  21. x(n)=v(n)-a1*x(n-1)-a2*x(n-2);
  22. a(m)=w1(n);
  23. b(m)=w2(n);
  24. end;
  25. for i=1:100;
  26. w1(n)=w1(n)+a(i);
  27. w2(n)=w2(n)+b(i);
  28. end
  29. w1(n)=w1(n)/100;
  30. w2(n)=w2(n)/100;
  31. end
  32. n=1:1000;
  33. plot(n,w1(n),'r',n,w2(n),'b');
复制代码
回复
分享到:

使用道具 举报

发表于 2006-3-21 09:22 | 显示全部楼层
你的程序一点注解都没有,读起来很来
给你个例子,你自己参考改改吧

matlab lms 算法实例
  1. function [wn,en]=lms(xn,dn,M,delt,varargin)
  2. % LMS Algorithm ,返回滤波器加权系数矩阵和误差向量
  3. %
  4. % 调用格式
  5. % [wn,en]=lms(xn,dn,M,delt,itr)
  6. % en=滤波器输出和d(n)的误差序列,为列向量
  7. % wn=滤波器的加权参量序列,为一矩阵,其每行代表一个加权参量,每列代表一次迭代;初始化值设为0
  8. % xn=输入列向量信号
  9. % dn=期望列向量信号
  10. % M=滤波器阶数
  11. % delt=步长
  12. % itr=迭代次数
  13. %
  14. % [wn,en]=lms(xn,dn,M,delt)
  15. % 迭代次数为默认值,即等于x(n)的点数

  16. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  17. % 输入输出参数的检查
  18. %--------------------------------------------------------------------------
  19. vin=length(varargin); Item=vin+4;
  20. error(nargchk(4,Item,nargin)); % 检查输入变量数目是否合适,其中前四个参数必须输入
  21. if nargout>2 % 检查输出变量数目是否合适
  22. error('Too many output arguments');
  23. end
  24. %------------------------------------------------------------------------
  25. Nx=length(xn); % x(n)的长度
  26. if Nx~=length(dn) % 检查x(n)和d(n)长度是否相等
  27. error('The length of x(n) is not equal to that of d(n)');
  28. end
  29. %------------------------------------------------------------------------
  30. sizex=size(xn); % 检查输入向量是否为列向量
  31. if sizex(1)<sizex(2)
  32. xn=xn.';
  33. end
  34. sizedn=size(dn); % 检查期望信号向量是否为列向量
  35. if sizedn(1)<sizedn(2)
  36. dn=dn.';
  37. end
  38. %-------------------------------------------------------------------------
  39. itr=Nx; % 迭代次数取默认值
  40. %-------------------------------------------------------------------------
  41. % 当输入变量为5个时
  42. if Item==5 % 确定迭代次数
  43. itr=varargin{1};
  44. if itr>Nx | itr<M
  45. error('Too many or too few iterations');
  46. end
  47. end
  48. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  49. % 参数的初始化
  50. en=zeros(itr,1);
  51. wn=zeros(M,itr); % 每行代表一个加权参量,每列代表一次迭代
  52. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  53. % 迭代计算
  54. for k=M:itr % 第k次迭代
  55. x_tap=xn(k:-1:k-M+1);
  56. en(k)=dn(k)-wn(:,k-1)'*x_tap;
  57. wn(:,k)=wn(:,k-1)+2*delt*en(k,1)*x_tap;
  58. end
复制代码
发表于 2006-3-23 11:24 | 显示全部楼层
另外你的信号x(n)产生有点问题,用二阶自回归模型产生的,使用循环产生即可。
 楼主| 发表于 2006-3-24 18:32 | 显示全部楼层
谢谢大家的回复!!不胜感激!
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

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

GMT+8, 2024-11-27 08:24 , Processed in 0.062444 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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