william 发表于 2016-5-4 10:53

LMS算法仿真(Matlab)

程序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();
    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);
forloop=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=';
            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);
forn=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=';
            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);
%未知系统
=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);
forn=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')转自:http://blog.sina.com.cn/s/blog_5def5a660100c25e.html

sizhiyuan2006 发表于 2017-10-8 17:27

谢谢分享!!!
页: [1]
查看完整版本: LMS算法仿真(Matlab)