1. 程式人生 > 其它 >如何用Matlab實現自適應濾波器!!!

如何用Matlab實現自適應濾波器!!!

技術標籤:matlab演算法

自適應濾波器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,就分享這些,歡迎評論指出不足,及時改正不誤導大家!