您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > 自适应滤波与维纳滤波-MATLAB-仿真代码与实验结果分析
自适应滤波与维纳滤波-MATLAB-仿真代码与实验结果分析自适应滤波与维纳滤波的MATLAB仿真和结果分析MATLAB仿真代码function[]=wiener_LMS()%基于LMS的自适应滤波与维纳滤波的性能比较clear;clc;%产生原始信号n=1024;%输入信号抽样点数Nt=1:n;a=1;Signal=a*sin(0.04*pi*t)+a*sin(0.035*pi*t)+a*sin(0.05*pi*t);time=[1:1024];SignalAddNoise=awgn(Signal,5);%给原始信号加入信噪比为3dB的高斯白噪声figure(1)subplot(311);plot(time,Signal,'b');%绘制原始信号title('原始信号');xlabel('时间');ylabel('幅度');subplot(312);plot(time,SignalAddNoise,'r');%绘制加噪后的输入信号title('加噪后的输入信号');xlabel('时间');ylabel('幅度');subplot(313);plot(time,Signal,'b',time,SignalAddNoise,'r');legend('Signal(n)','SignalAddNoise(n)');axistight;xlabel('时间');ylabel('幅度');title('原始信号与加噪后的输入信号对比');%维纳滤波仿真Mlag=100;%相关函数长度变量N=100;%维纳滤波器长度Rxn=xcorr(SignalAddNoise,Mlag,'biased');%计算输入信号自相关函数%产生输入信号与原始信号的互相关函数Rxnx=xcorr(SignalAddNoise,Signal,Mlag,'biased');rxnx=zeros(N,1);rxnx(:)=Rxnx(101:101+N-1);Rxx=zeros(N,N);%产生输入信号自相关矩阵Rxx=diag(Rxn(101)*ones(1,N));fori=2:Nc=Rxn(101+i)*ones(1,N+1-i);Rxx=Rxx+diag(c,i-1)+diag(c,-i+1);endRxx;h=zeros(N,1);h=inv(Rxx)*rxnx;%计算维纳滤波器的h(n)yn=filter(h,1,SignalAddNoise);%将输入信号通过维纳滤波器figure(2)subplot(2,1,1)plot(time,Signal,'b',time,yn,'r');legend('Signal(n)','yn(n)');axistight;xlabel('时间');ylabel('幅度');title('原始信号与经过维纳滤波器后输出信号的对比');subplot(2,1,2)plot(time,SignalAddNoise,'k',time,yn,'r');legend('SignalAddNoise(n)','yn(n)');axistight;xlabel('时间');ylabel('幅度');title('加噪后的输入信号与经过维纳滤波器后输出信号的对比');%自适应滤波LMS算法仿真g=100;%统计仿真次数为gN=n;%输入信号抽样点数Nk=128;%时域抽头LMS算法滤波器阶数pp=zeros(g,N-k);%将每次独立循环的误差结果存于矩阵pp中,以便后面对其平均u=0.001;forq=1:g%设置初值yn_1=zeros(1,N);%outputsignalyn_1(1:k)=SignalAddNoise(1:k);%将输入信号SignalAddNoise的前k个值作为输出yn_1的前k个值w=zeros(1,k);%设置抽头加权初值e=zeros(1,N);%误差信号%用LMS算法迭代滤波fori=(k+1):NXN=SignalAddNoise((i-k+1):(i));yn_1(i)=w*XN';e(i)=Signal(i)-yn_1(i);w=w+2*u*e(i)*XN;endpp(q,:)=(e(k+1:N)).^2;endfigure(3)subplot(2,1,1);plot(time,real(Signal),'b',time,real(yn_1),'r');%原始信号与经过自适应滤波后的效果图legend('Signal(n)','yn_1(n)');axistight;xlabel('时间');ylabel('幅度');title('原始信号与经过LMS自适应滤波器后输出信号的对比');subplot(2,1,2);plot(time,real(Signal),'g',time,real(yn),'b',time,real(yn_1),'r');%自适应滤波与维纳滤波性能比较图legend('Signal(n)','yn(n)','yn_1(n)');axistight;xlabel('时间');ylabel('幅度');title('经过维纳滤波器与LMS自适应滤波器后输出信号的对比');forb=1:N-kbi(b)=sum(pp(:,b))/g;%求误差的统计平均endfigure(4);%算法收敛曲线t=1:N-k;plot(t,bi,'r');holdon%将每次循环的图形显示结构保存下来实验结果与分析仿真实验产生的4幅图,如图1至图4所示,其中,图1演示的是原始信号和加入均值为零的高斯白噪声,信噪比为3dB后的输入信号的波形图;图2演示的是输入信号经过维纳滤波器后所获得的滤波效果;图3演示的输入信号经过LMS算法的自适应滤波后的滤波效果,并比较维纳滤波与自适应滤波的滤波性能;图4展示了LMS自适应滤波的收敛曲线。如图1所示,实验产生并演示了信号的加噪过程,将原始信号加入均值为零的高斯白噪声,从而得出了输入信号的波形图。图2说明了维纳滤波器在MMSE的准则下,对输入信号进行滤波。它能够在一定程度上抑制噪声的影响,并近似复原原始信号,但是与原始信号还是有一定的差距。维纳滤波器的适应面较广,不足之处是需要预先得到很多的观察数据,并知道自相关序列之类的统计特性,这在实际应用中较难实现。图1原始信号和加噪后的输入信号图2维纳滤波器的滤波效果图3演示了基于LMS算法的自适应滤波的仿真效果,并与维纳滤波做出比较。从实验结果可以知道,基于LMS算法的自适应滤波能够较快的跟踪变化的信号,并自动调整自身的参数,以达到最佳的滤波效果。而且这种滤波器事先并不需要知道信号的自相关序列之类的统计特性,它的滤波效果明显比维纳滤波强。图4演示了在步长因子001.0下得到的LMS算法的收敛曲线。实验得知,减少步长因子可减少自适应滤波算法的稳态失调,提高算法的收敛精度,不过减少步长因子将降低算法的收敛速度和跟踪速度,因此的大小应根据实际情况加以选择。图3基于LMS算法的自适应滤波效果图并与维纳滤波比较图4001.0时,LMS算法的收敛曲线
本文标题:自适应滤波与维纳滤波-MATLAB-仿真代码与实验结果分析
链接地址:https://www.777doc.com/doc-7433741 .html