自适应滤波器的初探

  最近开始玩自适应滤波器。说真的,自己算是电子出身,对于单片机、电子电路较为熟悉,而对信号通信类的知识则相对陌生,故而这个领域对我来说有点难度。看了几天的书,在此做一些初探说明。

  自适应滤波器具有在未知环境下良好的运作并跟踪输入统计量随时间变化的能力。尽管对于不同的应用有不同的实现结构,但是他们都有一个基本的特征:输入向量X(n)和期望响应d(n)被用来计算估计误差e(n),即e(n)=d(n)-X(n),并利用此误差信号构造一个自适应算法的性能函数(比如均方误差MSE),并随数据的不断输入自适应地更新此性能函数,目标是最小化此性能函数,在此过程中不断地更新调整滤波器的滤波参数,使得这个参数在前面的最小化性能函数所使用的准则下最优,从而达到滤波效果,实现自适应过程。自适应滤波器主要应用有:预测、辨识、反建模、干扰抵消。

  实现自适应滤波器的算法有很多,比较经典的有:LMS,RLS。其中LMS算法是属于梯度类算法,在1996年被Hassibi等证明了在准则下为最优,失调系数和收敛性可以通过合理的选取收敛因子u,但是如果输入相关矩阵的特征值比较分散时,算法的收敛性变差,故而后来又出现一些改进算法,比如NLMS。RLS是递推算法,准则是最小二乘准则,属于精确分析,相对于LMS滤波,RLS对于非平稳信号的适应性要强很多。

  自适应滤波器可以由不同的结构来实现。目前主要有两种结构:FIR、IIR。前者也可以称为横向结构,易于实现,但是存在收敛性差的问题,后者主要是存在系统可能不稳定的问题。

  自己根据一些matlab书籍上的例程做了一个LMS算法的基本实验,在这里要说一下,有些书籍真是非常的不负责任,源代码乱写,其说明更是漏洞百出。误人子弟也啊。废话不说了,本人写的代码如下:

clear;
clc;
N=150;
length=10000;
t=0:1/(N+length):1-1/(N+length);
s=sin(4*pi*t);
n=randn(size(t));
x=s+n;
w=zeros(1,N);
e=zeros(1,length);
E=zeros(1,length);
u=0.00174;
for i=1:length
    y(i)=x(i:i+N-1)*w';
    e(i)=s(i)-y(i);
    w=w+2*u*e(i)*x(i:i+N-1);
    E(i)=e(i)*e(i);
end
figure(1);
subplot(3,1,1);
plot(t,x);
axis([0 1 -5 5]);
title('带噪声信号');
subplot(3,1,2);
plot(t,s);
axis([0 1 -1.1 1.1]);
title('期望信号');
subplot(3,1,3);
plot(0:1/(N+length):(length-1)/(N+length),y);
axis([0 1 -1.1 1.1]);
title('滤波后信号');
figure(2);
plot((1:length),E);
axis([0 10000 0 0.1]);
title('误差')

结果如下:

  这里我使用的是150个抽头的FIR,主要是因为我的DE2-70的cycloneiiEP2C70 FPGA内嵌的是150个硬乘法器,故而一般就以150作为抽头指标,现在的实验对后续的研究会有一些帮助。一般抽头数是越多越好,但是最少都要有两位数要不得不到好的滤波效果。上图可以看出,此自适应滤波器有良好的滤波效果。

 

【参考文献】
  [1] 丁玉美,阔永红,高新波 A . 数字信号处理-时域离散随机信号处理 [M] .西安:西安电子科技大学出版社, 2002. 
      [2] 万建伟,王玲. 信号处理仿真技术 [M] .长沙:国防科技大学出版社, 2008 .
  [3] 薛年喜. MATLAB在数字信号处理中的应用(第2版) [M] .北京:清华大学出版社, 2008 .

posted on 2010-08-21 19:36  枫飒LoVe之舞  阅读(8863)  评论(0编辑  收藏  举报

导航