声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 2658|回复: 1

[编程技巧] LMS算法仿真(Matlab)

[复制链接]
发表于 2016-5-4 10:53 | 显示全部楼层 |阅读模式

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

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

x
  1. 程序1:基本LMS算法
  2. %  该程序实现时域LMS算法,并用统计的方法仿真得出不同步长下的收敛曲线
  3. clear                             %   清空变量空间
  4. g=100;                          %   统计仿真次数为g
  5. N=1024;                        %   输入信号抽样点数N
  6. k=128;                          %   时域抽头LMS算法滤波器阶数
  7. pp=zeros(g,N-k);                 %   将每次独立循环的误差结果存于矩阵pp中,以便后
  8.                                %   面对其平均
  9. u=0.001;                        %   收敛因子
  10. for q=1:g               
  11. t=1:N;
  12.     a=1;
  13.     s=a*sin(0.5*pi*t);            %   输入单频信号s
  14.     figure(1);
  15.     plot(t,real(s));                %   信号s时域波形
  16.     title('信号s时域波形');
  17.     xlabel('n');
  18.     ylabel('s');
  19.     axis([0,N,-a-1,a+1]);
  20.     xn=awgn(s,3);               %   加入均值为零的高斯白噪声,信噪比为3dB   
  21.     % 设置初值
  22.     y=zeros(1,N);                %    输出信号y
  23.     y(1:k)=xn(1:k);              %   将输入信号xn的前k个值作为输出y的前k个值
  24.     w=zeros(1,k);                %    设置抽头加权初值
  25.     e=zeros(1,N);                %    误差信号
  26.     % 用LMS算法迭代滤波
  27.     for i=(k+1):N
  28.                XN=xn((i-k+1):(i));
  29.                y(i)=w*XN';
  30.                e(i)=s(i)-y(i);
  31.                w=w+u*e(i)*XN;   
  32.      end
  33.      pp(q,:)=(e(k+1:N)).^2;  
  34.   end
  35.   for b=1:N-k
  36.          bi(b)=sum(pp(:,b))/g;     %   求误差的统计平均
  37.   end
  38.   figure(2);                    %   算法收敛曲线
  39.   t=1:N-k;
  40.   plot(t,bi);
  41.   hold off                     %   将每次循环的图形显示结果保存下来

  42. 程序2  归一化LMS算法

  43. MATLAB程序实现如下:
  44. 1. NLMS算法1次实验
  45. %  N=训练序列长度
  46. %  u=收敛因子
  47. clear;
  48. N=500;
  49. db=20;
  50. sh1=sqrt(10^(-db/10));
  51. u=1;
  52. error_s=zeros(1,N);
  53. for  loop=1:1
  54.         w=0.05*ones(1,11)';
  55.         V=sh1*randn(1,N );
  56.         K=randn(1,N)-0.5;
  57.         x=sign(K);
  58. for n=3:N;
  59.             M(n)=0.3*x(n)+0.9*x(n-1)+0.3*x(n-2);
  60. end
  61. z=M+V;
  62. for n=8:N;
  63.             d(n)=x(n-7);
  64. end
  65.         a(1)=z(1)^2;
  66. for n=2:11;
  67.             a(n)=z(n).^2+a(n-1);
  68. end
  69. for n=12:N;
  70.             a(n)=z(n).^2-z(n-11)^2+a(n-1);
  71. end
  72. for n=11:N;
  73.             z1=[z(n) z(n-1) z(n-2) z(n-3) z(n-4) z(n-5) z(n-6) z(n-7) z(n-8) z(n-9) z(n-10)]';
  74.             y(n)=w'*z1;
  75.             e(n)=d(n)-y(n);                                                                           
  76.             w=w+u./(eps+a(n)).*z1.*conj(e(n));
  77. end                                                                                       
  78.         error_s=error_s +e.^2;
  79. end
  80. w
  81. error_s=error_s./1;
  82. n=1:N;
  83. plot(n,error_s);
  84. xlabel('n (当u=1;DB=20时)');                                                                              
  85. ylabel('e(n)^2');
  86. title('NLMS算法1次实验误差平方的均值曲线');
  87. 2.NLMS算法20次实验
  88. clear;
  89. N=500;
  90. db=20;
  91. sh1=sqrt(10^(-db/10));
  92. u=1;
  93. error_s=zeros(1,N);
  94. for   loop=1:20
  95.         w=0.05*ones(1,11)';
  96.         V=sh1*randn(1,N );
  97.         K=randn(1,N)-0.5;
  98.         x=sign(K);
  99. for  n=3:N;
  100.            M(n)=0.3*x(n)+0.9*x(n-1)+0.3*x(n-2);
  101. end
  102.         z=M+V;
  103. for n=8:N;
  104.              d(n)=x(n-7);
  105. end
  106.         a(1)=z(1)^2;
  107. for n=2:11;
  108.              a(n)=z(n).^2+a(n-1);
  109. end
  110. for n=12:N;
  111.             a(n)=z(n).^2-z(n-11)^2+a(n-1);
  112. end
  113. for n=11:N;
  114.             z1=[z(n) z(n-1) z(n-2) z(n-3) z(n-4) z(n-5) z(n-6) z(n-7) z(n-8) z(n-9) z(n-10)]';
  115.             y(n)=w'*z1;
  116.             e(n)=d(n)-y(n);                                                                           
  117.             w=w+u./(eps+a(n)).*z1.*conj(e(n));
  118. end                                                                                       
  119.         error_s=error_s +e.^2;
  120. end
  121. w
  122. error_s=error_s./20;
  123. n=1:N;
  124. plot(n,error_s);
  125. xlabel('n (当u=1;DB=20时)');                                                                              
  126. ylabel('e(n)^2');
  127. title('NLMS算法20次实验误差平方的均值曲线');



  128. 基于LMS算法的系统辨识

  129. clear
  130. clc
  131. ee=0;
  132. fs=800;
  133. det=1/fs;
  134. f1=100;
  135. f2=200;
  136. t=0:det:2-det;
  137. x=randn(size(t))+cos(2*pi*f1*t)+cos(2*pi*f2*t);
  138. %未知系统
  139. [b,a]=butter(5,150*2/fs);
  140. d=filter(b,a,x);
  141. %自适应FIR滤波器
  142. N=5;
  143. delta=0.06;
  144. M=length(x);
  145. y=zeros(1,M);
  146. h=zeros(1,N);
  147. for  n=N:M
  148.          x1=x(n:-1:n-N+1);
  149.          y(n)=h*x1';
  150.          e(n)=d(n)-y(n);
  151.          h=h+delta.*e(n).*x1;
  152. end
  153. X=abs(fft(x,2048));
  154. Nx=length(x);
  155. kx=0:800/Nx:(Nx/2-1)*(800/Nx);
  156. D=abs(fft(d,2048));
  157. Nd=length(D);
  158. kd=0:800/Nd:(Nd/2-1)*(800/Nd);
  159. Y=abs(fft(y,2048));
  160. Ny=length(Y);
  161. ky=0:800/Ny:(Ny/2-1)*(800/Ny);
  162. figure(1);
  163. subplot(3,1,1)
  164. plot(kx,X(1:Nx/2));xlabel('Hz')
  165. title('原始信号频谱')
  166. subplot(3,1,2)
  167. plot(kd,D(1:Nd/2))
  168. title('经未知系统后信号频谱');xlabel('Hz')
  169. subplot(3,1,3)
  170. plot(ky,Y(1:Ny/2))
  171. title('经自适应FIR滤波器后信号频谱');xlabel('Hz')
复制代码
转自:http://blog.sina.com.cn/s/blog_5def5a660100c25e.html
回复
分享到:

使用道具 举报

发表于 2017-10-8 17:27 | 显示全部楼层
谢谢分享!!!
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

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

GMT+8, 2024-12-23 06:58 , Processed in 0.076211 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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