基于TMS320VC5416的自适应滤波器的实现一.自适应滤波器滤波是电子信息处理领域的一种最基本而又极其重要的技术。在有用信号的传输过程中,通常会受到噪声或干扰的污染。利用滤波技术可以从复杂的信号中提取所需要的信号,同时抑制噪声或干扰信号,以便更有效地利用原始信号。滤波器实际上是一种选频系统,它对某些频率的信号予以很小的衰减,让该部分信号顺利通过;而对其他不需要的频率信号则予以很大的衰减,尽可能阻止这些信号通过。在电子系统中滤波器是一种基本的单元电路,使用很多,技术也较为复杂,有时滤波器的优劣直接决定产品的性能,所以很多国家非常重视滤波器的理论研究和产品开发。自适应滤波器属于现代滤波器范畴,是相对固定滤波器而言的,固定滤波器属于经典滤波器,它滤波频率是固定的,FIR和IIR两种滤波器是具有固定滤波器系数的滤波器,其特性是确定已知的。但在许多应用场合,由于无法预知信号和噪声的特性,因此就无法使用具有固定滤波器系数的滤波器来对信号实现最优滤波。而自适应滤波器滤波的频率则是自动适应输入信号而变化的,所以其适用范围更广。在没有任何关于信号和噪声的先验知识的条件下,自适应滤波器利用前一时刻已获得的滤波器参数来自动调节现时刻的参数,以适应信号和噪声未知或随机变化的统计特性,从而实现最优滤波。自适应滤波器实质上就是一种能调节其自身传输特性以达到最优化的维纳滤波器。二.自适应滤波器原理自适应滤波器具有自学习或训练能力,能够跟踪信号和噪声变化,并且能使得滤波器的动态特性随着信号和噪声的变化而变化,以达到最优滤波效果。它的这种特性变化是由自适应算法通过调整滤波器的系数来实现的。其系数(一般称为权系数)可以根据自适应算法来不断修改,使得系统中的冲击响应满足给定的性能。例如语音信号的ADPCM编码,采用线性预测自适应就可以实现误差信号与输入信号的线性无关,并由此作为依据,不断调节滤波器的权系数,最终使得误差信号趋近于0,使得该滤波器完全适应该输入信号;同样,只要输入信号出现变换,自适应滤波器根据误差信号的变化再次调整其权系数,从而跟上信号的变化。自适应滤波器一般都由两部分组成:一是滤波器结构,它为完成期望的处理功能而设计;二是自适应算法,它调节滤波器系数以改进性能。图1自适应滤波器结构的一般形式上图为自适应滤波器结构的一般形式,图中x(k)为输入信号,通过参数可调的数字滤波器后产生输出信号y(k),将输出信号y(k)与标准信号(或者为期望信号)d(k)进行比较,得到误差信号e(k)。e(k)和x(k)通过自适应算法对滤波器的参数进行调整,调整的目的使得误差信号e(k)最小。重复上面过程,滤波器在自己的工作过程中逐渐了解到关于输入信号和噪声的统计规律,并以此为根据自动调整自己的参数,从而达到最佳的滤器效果。一旦输入信号的统计规律发生了变化,滤波器能够自动跟踪上输入信号的变化,自动调整滤波器的参数,最终达到滤波效果,实现自适应过程,就是使用自适应滤波器的系统识别原理图。自适应滤波器的结构可以采用FIR或IIR结构,由于IIR滤波器存在稳定性问题,因此一般采用FIR滤波器作为自适应滤波器的结构,自适应FIR滤波器结构又可分为三种结构类型:横向型结构(TransversalStructure)、对称横向型结构(SymmetricTransversalStructure)、格型结构(LatticeStructure)。自适应滤波器设计中最常用的是FIR横向型结构。图2是横向型滤波器的结构示意图。输入信号输出信号y(k)标准信号d(k)误差信号e(k)参数可调滤波器结构自适应算法图2横向型滤波器的结构示意图其中,X(n)=[x(n),x(n-1),…,x(n-N+1)]T为自适应滤波器的输入矢量;W(n)=[w0(n),w1(n),…,wn-1(n)]T为系统的冲激响应;y(n)=x(n)*w(n)为自适应滤波器的输出矢量;n为时间序列;N为滤波器的阶数。由表达式可以看出输出是两矢量的内积。三.自适应滤波算法自适应滤波器除了包括一个按照某种结构设计的滤波器,还有一套自适应的算法。自适应算法是根据某种判断来设计的。自适应滤波器的算法主要是以各种判据条件作为推算基础的。通常有两种判据条件:最小均方误差判据和最小二乘法判据。LMS算法是以最小均方误差为判据的最典型的算法,因具有计算量小、易于实现、不依赖模型、性能稳健等优点而最为广泛应用。最小均方误差(LeastMeanSquare,LMS)算法是一种易于实现、性能稳健、应用广泛的算法。所有的滤波器系数调整算法都是设法使y(n)接近d(n),所不同的只是对于这种接近的评价标准不同。LMS算法的目标是通过调整系数,使输出误差序列e(n)=d(n)-y(n)的均方值最小化,并且根据这个判据来修改权系数,该算法因此而得名。误差序列的均方值又叫“均方误差”(MeanSquareError,MSE)。误差均方ε表示为:})]()({[)]([22nyndEneE对于横向型结构的滤波器,代入y(n)的表达式并采用迭代算法求最佳权系数,经推导得迭代公式为:)()(2),()1,(knXnenkWnkW式中,X(n-k)为输入信号;n和n+1表示前后2个时刻,k=0,1,…,N-1,N为滤波器的阶数;W(k,n)和W(k,n+1)分别是迭代前后的系数值;μ是一个用于控制自适应速度和稳定性的增益常数,也叫收敛因子;e(n)为误差信号。LMS算法调整权系数时不需要进行平方运算和统计平方运算,实现起来很简单。下一时刻权矢量w(n+1)等于当前的权矢量w(n)加上一个修正量,该修正量是误差信号e(n)的加权值,加权系数为2μX(n),正比于当前的输入信号。值得注意的是,对权矢量的估值的所有分量来说,误差信号e(n)是相同的。在自适应滤波器的实际操作中,必须注意自适应步长μ的选择。显然,上面的LMS算法不需要事先已知信号的统计量,而使用它们的瞬时估计代替。LMS算法获得的权重只是一个估计值,但随着调节权重,这些估计值逐渐提高,滤波器也越来越适应信号特性。四.自适应滤波器的DSP实现本设计中完成了自适应滤波器的LMS算法的编程与实现,通过对未知系统传递函数的建模,识别该未知系统,并对该系统进行噪声滤波。程序采用了c和汇编语言混合编程的方式。ad_filter.c程序主要实现数据段的分配、数据格式的转换并调用汇编程序lms.asm实现关键的LMS算法进行自适应滤波。下面是两个程序的流程图。图3主程序ad_filter.c流程图开始输入信号、标准信号数据格式转换将浮点数转换为定点数调用lms算法实现自适应滤波结束分配数据和滤波器系数块图4LMS算法lms.asm实现流程图五.运行结果1.输入信号波形图5输入信号波形2.标准信号波形开始初始化,获取参数,开辟自适应滤波系数和输入样值的存储单元,初始化各地址指针读入样值点进行滤波计算计算误差,更新系数存储滤波输出并重新计算误差结束图6标准信号波形3.误差信号波形图7误差信号波形4.输出信号波形图8输出信号波形由上面的图可以看出,加入噪声后的信号发生了较为明显的变化。但经过自适应滤波器的滤波,原始信号的趋势基本被还原出来了。六.总结实验结果表明:自适应滤波器却能很好地消除叠加在信号上的噪声,虽然也可以用固定滤波器来实现,但设计固定滤波器时需要预先知道信号和噪声的统计特性,而自适应滤波器则不需要,并且当信号和噪声的统计特性发生变化时,自适应滤波器也能自动地调节其冲激响应特性来适应新的情况。通过对自适应滤波器的学习研究,我对其原理及LMS算法有了更为深刻的理解,理论和实践能力都有所提高,也认识到了数字信号处理技术的重要性和广阔前景。附录:1.ad_filter.c程序#includemath.h#includestdio.h#includetms320.h#includedsplib.h#defineNX128//数据点数#defineNH12//滤波器阶数#defineSTEP278#pragmaDATA_SECTION(h,.coefs)#pragmaDATA_SECTION(dbuffer,.dbuffer)floatx1[NX]={0.9988,0.8653,0.5275,0.0562,-0.5744,-1.2977,-1.7143,-1.5031,-0.8727,-0.0977,0.7884,1.5265,1.6615,1.2359,0.6463,0.0941,-0.3407,-0.4771,-0.3579,-0.2164,-0.0069,0.4059,0.8153,0.8959,0.6896,0.3781,0.1568,0.1206,0.0569,-0.1742,-0.3774,-0.5365,-0.8262,-0.8800,-0.2590,0.6903,1.3395,1.5300,1.4183,1.1028,0.5906,-0.1410,-0.8719,-1.2172,-1.1212,-0.7689,-0.2300,0.4809,1.0284,1.1365,0.8274,0.1238,-0.9435,-1.9115,-2.1646,-1.6390,-0.6517,0.4911,1.4056,1.6633,1.3114,0.7349,0.2193,-0.2173,-0.5744,-0.8145,-0.9202,-0.9819,-0.9101,-0.3513,0.6638,1.4902,1.6561,1.4064,1.0575,0.5659,-0.1650,-0.9552,-1.5450,-1.7267,-1.3245,-0.3835,0.6962,1.3814,1.5357,1.4416,1.2442,0.7062,-0.1408,-0.8417,-1.2149,-1.3453,-1.0604,-0.2593,0.6211,1.0825,1.0489,0.7153,0.2855,-0.1244,-0.4387,-0.6034,-0.7102,-0.9113,-1.1777,-1.2608,-0.8542,0.0149,0.8467,1.1630,0.9059,0.2065,-0.7142,-1.4775,-1.8816,-1.8629,-1.2621,-0.2417,0.5033,0.6136,0.3687,0.0356,-0.2774,-0.3358,-0.1678,-0.2025,-0.6556,-1.1490};//输入数据,信号与噪声的叠加floatdes1[NX]={1.0000,0.8671,0.5036,0.0063,-0.4927,-0.8607,-0.9999,-0.8733,-0.5144,-0.0188,0.4818,0.8543,0.9997,0.8793,0.5252,0.0314,-0.4707,-0.8477,-0.9993,-0.8852,-0.5358,-0.0440,0.4596,0.8409,0.9987,0.8910,0.5464,0.0565,-0.4484,-0.8341,-0.9980,-0.8966,-0.5569,-0.0691,0.4371,0.8271,0.9972,0.9021,0.5673,0.0816,-0.4258,-0.8200,-0.9961,-0.9075,-0.5776,-0.0941,0.4144,0.8127,0.9950,0.9127,0.5878,0.1066,-0.4029,-0.8053,-0.9936,-0.9178,-0.5979,-0.1191,0.3914,0.7978,0.9921,0.9227,0.6079,0.1316,-0.3798,-0.7902,-0.9905,-0.9274,-0.6179,-0.1440,0.3681,0.7824,0.9887,0.9321,0.6277,0.1564,-0.3564,-0.7745,-0.9867,-0.9365,