利用LMS算法和RLS算法将一个叠加有噪声的信号实现噪声消除,恢复原始信号。
二.实验过程及仿真在一个理想信号中,混入一定量的高斯白噪声,通过上述两种自适应算法把噪声尽可能消除,最终恢复输入的理想信号。
主输入信号x(n)由理想信号s(n)和噪声n0组成。为了便于分析,理想信号s(n)可以是正弦信号,n0是方差为1、均值为零的高斯白噪声。自适应算法实现降噪的原理框图如图所示.
在本程序中,先取500点信号长度,产生正弦信号作为参考输入信号。然后产生同样长度的随机噪声,把它叠加在正弦信号中。LMS滤波算法单独编写了一个子函数,输入各项参数分别为输入信号、参考输入、收敛因子,输出各项参数分别为滤波器的系数矩阵、误差信号、输出信号。程序如下:
%%%% LMS自适应滤波算法实现滤波功能 %%%% close all; clear; t=0:499; % 产生理想信号 xs=5*sin(0.2*t);%xs为理想的正弦信号 figure; %绘制理想信号的图像 subplot(311); plot(t,xs); grid on;%显示窗格 title("理想信号"); xn=randn(1,500);%产生均值为0的随机噪声 subplot(312);%绘制随机噪声的图像 plot(t,xn); grid on; %显示窗格 title("随机噪声"); xn=xs+xn; %产生输入信号(理想信号+噪声) xn=xn.'; %将输入信号由行向量转置为列向量 dn=xs.'; %将理想信号由行向量转置为列向量 subplot(313);%绘制输入信号和理想信号的图像 plot(t,xn,'r'); grid on; %显示窗格 title('输入信号(理想信号+随机噪声)'); mu=0.003; %收敛常数 %引用LMS算法实现滤波 [w,en,yn]=my_LMS(xn,dn,mu); figure; %绘制滤波器输出信号和误差信号图像 plot(t,yn);%绘制经过滤波器滤波后信号 grid on; %显示窗格 title('滤波后信号'); figure; subplot(311); plot(t,xn,'red'); grid on; %显示窗格 title('滤波器的输入信号'); subplot(312); plot(t,yn,'blue'); grid on; %显示窗格 title('滤波器的输出信号'); subplot(313); plot(t,en,'green'); grid on; %显示窗格 title('误差信号'); %LMS算法子函数 function [w,en,yn]=my_LMS(xn,dn,mu) %LMS实现程序 % 输入: % xn 输入信号 列向量 % dn 理想信号 列向量 % mu 收敛常数 标量 % itr 迭代次数 标量 % M 滤波器的阶数 标量 % 输出: % w 滤波器的系数矩阵 大小为M×itr 每一列代表一次迭代后的系数 % en 误差信号 大小为itr×1 每一行代表一次迭代后产生的误差 % yn 滤波器的输出信号 列向量 M=20; %定义滤波器的阶数为20 itr=length(xn); %使得迭代次数为输入信号xn的长度 w=zeros(M,itr);%将滤波器的初始值设置为0 en=zeros(itr,1);%将初始误差设置为0 %迭代更新滤波器的参数 for k=M:itr %要保证输入延时后的信号有效,所以实际的迭代次数只有(itr-M)次, x=xn(k:-1:k-M+1);%将输入信号延迟,使得滤波器的每个抽头都有输入 y=w(:,k-1).'*x; en(k)=dn(k)-y; %得出误差信号 w(:,k)=w(:,k-1)+mu*en(k)*x;%迭代更新滤波器的系数 end %滤波器参数固定后,得出经过优化滤波器滤波后的输出信号 yn=inf*ones(length(xn)); %inf意为无穷大,将yn的初始值置为无穷大, %绘制图像的时候将无法显示 for k=M:itr x=xn(k:-1:k-M+1); yn(k)=w(:,k).'*x; end end3.2 RLS算法实现降噪
用同样的方法,先取1000点信号长度,产生余弦信号作为参考输入信号。然后产生同样长度的随机噪声,把它叠加在正弦信号中。RLS滤波算法单独编写了一个子函数 [e,w]=my_rls(lambda,M,u,d,delta),输入各项参数分别为指数加权因子、滤波器阶数、输入信号、参考输入信号、正则系数,输出各项参数分别为滤波器输出、滤波器系数矩阵。程序如下:
%%%%RLS自适应滤波算法实现滤波功能 %%%% %RLS实现噪声消除 clc;close all; N=1000; %信号点数 t=1:N; s=5*cos(0.05*pi*t); %余弦信号 s=s-mean(s); %除去直流分量 s=s/max(abs(s)); %幅度归一化 clean=s; ref_noise=0.1*randn(1,N); %产生高斯白噪声 mixed=clean+ref_noise; %产生带噪信号 mu=0.005;M=2;espon=1e-4; delta=1e-7; lambda=1; [en,w]=rls(lambda,M,ref_noise,mixed,delta);%RLS算法子程序 er=en-clean; %er为误差信号,滤波器输出-输入 figure(1); subplot(311); plot(t,clean); grid on; xlabel('信号点数'); ylabel('幅度'); title('原始信号'); subplot(312); plot(t,mixed); grid on; xlabel('信号点数'); ylabel('幅度'); title('含噪信号'); subplot(313); plot(t,en); grid on; xlabel('信号点数'); ylabel('幅度'); title('滤波器的输出信号'); axis([0 1000 -2 2]); figure(2); plot(t,er); grid on; xlabel('信号点数'); ylabel('幅度'); title('误差信号'); function [e,w]=rls(lambda,M,u,d,delta) %输入参数: % lambda = 指数加权因子, (0,1] % M = 滤波器阶数, dim 1x1 % u =输入信号, dim Nx1 % d =参考输入, dim Nx1 % delta = 正则系数, 通常取 1e-7. % 输出参数 % e = 滤波器输出, dim Nx1 % w = 滤波器系数矩阵, dim Mx1 % 1.初始化变量 w=zeros(M,1); P=eye(M)/delta; u=u(:); d=d(:); %输入信号长度 N=length(u); e=d.'; % 2.RLS算法部分 for n=M:N uvec=u(n:-1:n-M+1); e(n)=d(n)-w'*uvec; k=lambda^(-1)*P*uvec/(1+lambda^(-1)*uvec'*P*uvec); P=lambda^(-1)*P-lambda^(-1)*k*uvec'*P; w=w+k*conj(e(n)); end三.仿真结果及分析
利用LMS算法实现噪声消除的仿真结果如下。图3-1为理想信号、随机噪声、滤波器输入信号的时域波形图。图3-2为滤波器输入信号、滤波器输出信号、误差信号的时域波形图。把滤波器输出信号与理想信号进行对比,可以发现两者波形很相似,但是输出波形有一定延迟。这是因为滤波器的长度为20,经过这20个信号样值的循环后,在下一时刻滤波器才有输出,同时误差逐渐收敛到0。
利用RLS算法实现噪声消除的仿真结果如下。通过比较原始信号与输出信号我们可以发现,在经过一定的时间后,未加噪信号与输出信号之间的误差已经缩小到可以忽略不计,滤波器输出信号与原始信号几乎一样。因此,我们认为RLS算法进行的噪声消除的结果是成功的。
图3-3:噪声消除RLS算法仿真
图3-4: RLS算法误差信号
在本次实验中,通过生成原始正弦信号,并将该信号分别通过LMS算法、RLS算法进行噪声消除,最终我们得到了信号的输出情况。完成这些之后,我们又将LMS算法与RLS算法加以对比。最终,我们得出结论:RLS算法不仅收敛速度比LMS算法快得多,而且收敛后的噪声消除稳定度比LMS算法好。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)