如何用Matlab實現自適應濾波器!!!
阿新 • • 發佈:2020-12-12
自適應濾波器Matlab實現
直接上程式碼吧,原理一大堆,自行了解即可!這是LMS即自適應濾波器的Matlab程式碼。
function [yn,W,en]=LMS(xt,dn,M,mu)
itr = length(xt);
en = zeros(itr,1); % 誤差序列,en(k)表示第k次迭代時預期輸出與實際輸入的誤差
W = zeros(M,itr);% 每一行代表一個加權參量,每一列代表-次迭代,初始為0
% 迭代計算
for k = M:itr % 第k次迭代
x = xt(k:- 1:k-M+1) ; % 濾波器M個抽頭的輸入
y = W(:,k-1).' * x ; % 濾波器的輸出
en(k) = dn(k) - y ; % 第k次迭代的誤差
% 濾波器權值計算的迭代式
W(:,k) = W(:,k-1) + 2*mu*en(k)*x;
end
% 求最優時濾波器的輸出序列 r如果沒有yn返回引數可以不要下面的
yn = inf * ones(size(xt)) ;% inf 是無窮大的意思
for k = M:length(xt)
x = xt(k:-1:k-M+1);
yn(k) = W(:,end).'* x;%用最後得到的最佳估計得到輸出
end
end
關於如何使用整個函式,這裡給出一個例子,大家可以參考自行設計應用於自己的設計中!
close all
% 週期訊號的產生
t=0:999;
xs=5*square(0.03*t,50);
figure;
subplot(2,1,1);
plot(t,xs);grid;
ylabel('幅值');
title('{輸入週期性訊號}');
% 噪聲訊號的產生
t=0:999;
xn=randn(1,1000);
subplot(2,1,2);
plot(t,xn);grid;
ylabel('幅值');
xlabel( '時間');
title('{白噪聲訊號}');
% 訊號濾波
xt = xs+xn;
xt = xt.'; % 輸入訊號序列
dn = xn.' ; % 預期結果序列
M = 20 ; % 濾波器的階數
rho_max = max(eig(xt*xt.')); % 輸入訊號相關矩陣的最大特徵值
mu = (1/rho_max) % 收斂因子 0 < mu < 1/rho
[yn,W,en] = LMS(xt,dn,M,mu);
Y=xt-yn;
% 繪製濾波器輸入訊號
figure;
subplot(2,1,1);
plot(t,xt);grid;
ylabel('幅值');
xlabel('時間');
title('{濾波器輸入訊號}');
% 繪製自適應濾波器輸出訊號
subplot(2,1,2);
plot(t,yn);grid;
ylabel('幅值');
xlabel('時間');
title('{估計的白噪聲}');
% 繪製自適應濾波器輸出訊號,預期輸出訊號和兩者的誤差
figure
plot(t,xs,'g',t,Y,'y',t,Y-xs.','r');grid;
legend('預期輸出','自適應濾波器輸出','誤差');
ylabel('幅值');
xlabel('時間');
title('{自適應濾波器}');
OK,就分享這些,歡迎評論指出不足,及時改正不誤導大家!