|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?我要加入
x
- 程序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')
复制代码 转自:http://blog.sina.com.cn/s/blog_5def5a660100c25e.html
|
|