MATLAB做LMS算法(最小均方误差算法)


背景知识

自适应滤波的4种不同应用是:预测、辨识、反建模和干扰抵消

LMS算法(最小均方误差算法)是自适应滤波算法的一种,主要干的事情是:基于最小均方误差准则,使滤波器的输出信号与期望输出信号之间的均方误差最小。
LMS算法简单有效,计算量小,鲁棒性好,易于实现。

代码

LMS.m 代码来自这本书[1],本人改了2个句子[2]
这份代码是真的强,\(0.05\pi\)角频率的单频信号叠上3dB且0均值的加性高斯白噪声,很快被“纠正回”期望的\(0.05\pi\)角频率的单频信号。

%用MATLAB实现LMS算法,将输入和输出信号进行对比,并给出均方误差曲线。
%假设滤波器抽头个数为k,数据长度为N


g=100; %统计仿真次数为g
N=1024; %输入信号抽样点数为N
k=128;  %时域抽头LMS算法滤波器阶数
pp=zeros(g,N-k);%将每次独立循环的误差结果存于矩阵pp中,以便后面取平均
u=0.0002;%步长因子u
for q=1:1:g
    t=1:1:N;
    a=1;
    s=a*sin(0.05*pi*t);  %输入单频信号s
    figure(1);
    subplot(311);
    plot(t,real(s) ); %信号s时域波形
    title('信号s时域波形');
    xlabel('n');ylabel('s');
    axis([0,N,-a-1,a+1]);
    xn=awgn(s,5);%加入均值为0的高斯白噪声,信噪比为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):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
subplot(312);
plot(t,real(xn)); %信号s时域波形
title('信号s加噪声后的时域波形');
subplot(313);
plot(t,real(y));%信号s时域波形
title('自适应滤波后的输出时域波形');
bi=mean(pp,1);    %对第一维度求平均
%人生苦短,对某一维度求平均这么写不是更好写吗 
figure(2);
t=1:1:N-k;
plot(t,bi,'r');
title('均方误差-时间曲线')   %太蠢了这里为什么会写hold on

参考


  1. 《无线通信的MATLAB和FPGA实现》 ↩︎

  2. 炫耀我刚学的Markdown 脚注语法 ↩︎


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM