如何用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,就分享这些,欢迎评论指出不足,及时改正不误导大家!

你可能感兴趣的:(matlab,算法)