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