加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

LMS算法仿真(Matlab)

(2009-02-07 19:13:39)
标签:

杂谈

分类: 学术讨论

程序1:基本LMS算法

该程序实现时域LMS算法,并用统计的方法仿真得出不同步长下的收敛曲线

clear                              清空变量空间

g=100;                           统计仿真次数为g

N=1024;                         输入信号抽样点数N

k=128;                           时域抽头LMS算法滤波器阶数

pp=zeros(g,N-k);                  将每次独立循环的误差结果存于矩阵pp中,以便后

                                面对其平均

u=0.001;                         收敛因子

for q=1:g                

t=1:N;

    a=1;

    s=a*sin(0.5*pi*t);             输入单频信号s

    figure(1);

    plot(t,real(s));                 信号s时域波形

    title('信号s时域波形');

    xlabel('n');

    ylabel('s');

    axis([0,N,-a-1,a+1]);

    xn=awgn(s,3);                加入均值为零的高斯白噪声,信噪比为3dB   

    % 设置初值

    y=zeros(1,N);                  输出信号y

    y(1:k)=xn(1:k);               将输入信号xn的前k个值作为输出y的前k个值

    w=zeros(1,k);                  设置抽头加权初值

    e=zeros(1,N);                  误差信号

    % 用LMS算法迭代滤波

    for i=(k+1):N

               XN=xn((i-k+1):(i)); 

               y(i)=w*XN';

               e(i)=s(i)-y(i);

               w=w+u*e(i)*XN;   

     end

     pp(q,:)=(e(k+1:N)).^2;  

  end

  for b=1:N-k

         bi(b)=sum(pp(:,b))/g;      求误差的统计平均

  end

  figure(2);                     算法收敛曲线

  t=1:N-k;

  plot(t,bi);

  hold off                      将每次循环的图形显示结果保存下来

程序2  归一化LMS算法

MATLAB程序实现如下:

1. NLMS算法1次实验

N=训练序列长度

u=收敛因子

clear;

N=500;

db=20;

sh1=sqrt(10^(-db/10));

u=1;

error_s=zeros(1,N);

for  loop=1:1

        w=0.05*ones(1,11)';

        V=sh1*randn(1,N );

        K=randn(1,N)-0.5;

        x=sign(K);

for n=3:N;

            M(n)=0.3*x(n)+0.9*x(n-1)+0.3*x(n-2);

end

z=M+V;

for n=8:N;

            d(n)=x(n-7);

end

        a(1)=z(1)^2;

for n=2:11;

            a(n)=z(n).^2+a(n-1);

end

for n=12:N;

            a(n)=z(n).^2-z(n-11)^2+a(n-1);

end

for n=11:N;

            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)]';

            y(n)=w'*z1;

            e(n)=d(n)-y(n);                                                                           

            w=w+u./(eps+a(n)).*z1.*conj(e(n));

end                                                                                       

        error_s=error_s +e.^2;

end 

w

error_s=error_s./1;

n=1:N;

plot(n,error_s);

xlabel('n (当u=1;DB=20时)');                                                                               

ylabel('e(n)^2');

title('NLMS算法1次实验误差平方的均值曲线');

2.NLMS算法20次实验

clear;

N=500; 

db=20;

sh1=sqrt(10^(-db/10));

u=1;

error_s=zeros(1,N);

for   loop=1:20

        w=0.05*ones(1,11)';

        V=sh1*randn(1,N );

        K=randn(1,N)-0.5;

        x=sign(K);

for  n=3:N;

           M(n)=0.3*x(n)+0.9*x(n-1)+0.3*x(n-2);

end

        z=M+V;

for n=8:N;

             d(n)=x(n-7);

end

        a(1)=z(1)^2;

for n=2:11;

             a(n)=z(n).^2+a(n-1);

end

for n=12:N;

            a(n)=z(n).^2-z(n-11)^2+a(n-1);

end

for n=11:N;

            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)]';

            y(n)=w'*z1;

            e(n)=d(n)-y(n);                                                                           

            w=w+u./(eps+a(n)).*z1.*conj(e(n));

end                                                                                       

        error_s=error_s +e.^2; 

end

w

error_s=error_s./20;

n=1:N;

plot(n,error_s);

xlabel('n (当u=1;DB=20时)');                                                                               

ylabel('e(n)^2');

title('NLMS算法20次实验误差平方的均值曲线'); 


基于LMS算法的系统辨识

clear

clc

ee=0;

fs=800;

det=1/fs;

f1=100;

f2=200;

t=0:det:2-det;

x=randn(size(t))+cos(2*pi*f1*t)+cos(2*pi*f2*t);

%未知系统

[b,a]=butter(5,150*2/fs);

d=filter(b,a,x);

%自适应FIR滤波器

N=5;

delta=0.06;

M=length(x);

y=zeros(1,M);

h=zeros(1,N);

for  n=N:M

         x1=x(n:-1:n-N+1);

         y(n)=h*x1';

         e(n)=d(n)-y(n);

         h=h+delta.*e(n).*x1;

end

X=abs(fft(x,2048));

Nx=length(x);

kx=0:800/Nx:(Nx/2-1)*(800/Nx);

D=abs(fft(d,2048));

Nd=length(D);

kd=0:800/Nd:(Nd/2-1)*(800/Nd);

Y=abs(fft(y,2048));

Ny=length(Y);

ky=0:800/Ny:(Ny/2-1)*(800/Ny);

figure(1);

subplot(3,1,1)

plot(kx,X(1:Nx/2));xlabel('Hz')

title('原始信号频谱')

subplot(3,1,2)

plot(kd,D(1:Nd/2))

title('经未知系统后信号频谱');xlabel('Hz')

subplot(3,1,3)

plot(ky,Y(1:Ny/2))

title('经自适应FIR滤波器后信号频谱');xlabel('Hz')

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有