背景知識
自適應濾波的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


參考
《無線通信的MATLAB和FPGA實現》 ↩︎
