DSP课程实验报告——利用DSP实现自适应滤波学院:电子信息工程学院专业:自动化(铁道信号)学生姓名:学号:任课教师:北京交通大学电工电子教学基地2目录一、设计任务书....................................................................................3二、设计内容........................................................................................31.基本部分.............................................................................................32.发挥部分.............................................................................................3三、设计方案、算法原理说明............................................................41.利用DSP进行信号处理...................................................................42.利用DMA方式进行信号的采集和输出...........................................43.回波产生...........................................................................................64.自适应滤波.......................................................................................8四、程序设计、调试与结果分析........................................................91.程序设计...............................................................................................92.实验步骤.............................................................................................123.结果分析.............................................................................................13五、设计(安装)与调试的体会......................................................14六、参考文献......................................................................................18七、附录...............................................................................................183一、设计任务书自适应滤波器能够根据环境的改变,使用自适应算法来改变滤波器的参数和结构。自适应滤波器的系数是由自适应算法更新的时变系数,其系数自动连续地适应于给定信号,以获得期望响应。自适应滤波器的最重要的特征就在于它能够在未知环境中有效工作,并能够跟踪输入信号的时变特征。自适应滤波器应用于通信领域的自动均衡、回波消除、天线阵波束形成,以及其他有关领域信号处理的参数识别、噪声消除、谱估计等方面。本设计要求利用DSP的DMA方式进行信号采集和信号输出,同时对外部输入的信号进行自适应滤波。二、设计内容1.基本部分(1)设计数字滤波算法,或调用DSPLIB中的滤波函数,实现对信号的滤波(2)利用C语言对A/D、D/A进行初始化(3)利用C语言对DMA进行初始化(4)编写DMA中断服务程序,实现信号的实时滤波(5)利用CCS信号分析工具分析信号的频谱成分,确定滤波器的参数2.发挥部分(1)比较不同自适应性滤波器的滤波效果;4(2)在实验板的Linein输入端接入正弦信号,分左右声道分别采集,并分别滤波。三、设计方案、算法原理说明1.利用DSP进行信号处理首先,模拟信号x(t)经过A/D转换后,成为数字信号,由DSP读入;DSP对采集的数字信号采用数字信号处理的算法进行处理,处理结果仍为数字信号;处理后得到的数字信号经D/A转换后,成为模拟信号y(t)。利用DSP进行信号处理的流程如图3-1所示。图3-1DSP进行信号处理的流程2.利用DMA方式进行信号的采集和输出C5502的DMA能在不占用CPU资源的情况下,实现DSP存储器间数据的自由传送。C5502有6个可独立编程的DMA通道,每个DMA通道拥有各自的控制寄存器。在DMA功能正常使用之前,必须根据需要对这些寄存器进行正确的设置。A/D转换完的数据被串口1的数据接收寄存器收到后,启动DMA4传输,将数据写到指定的数据接收缓冲区,通过DMA方式完成一次数据5采集。当DMA4采集完一帧128个点数据后产生一次DMA4中断,通知CPU对其进行DLMS滤波处理。此时DMA4可以按照设定继续采集数据,实现了数据采集与CPU处理的并行操作。在DMA4的中断服务程序中,DMA4接收缓冲区1中的数据经过DLMS滤波处理后,放入DMA5的发送缓冲区1,同时启动DMA5进行DLMS数据到串口1的数据发送寄存器的DMA传输。DLMS输入数据缓冲区分为2个,gBufferRcvPing、gBufferRcvPong;输出数据缓冲区分为2个gBufferXmtPing、gBufferXmtPong;每个缓冲区的大小为128个点。输入输出缓冲区采用了“乒乓”方式,即输入1=〉输出1,输入2=〉输出2其框图如图3-3所示。图3-3DMA缓冲区在ping、pong缓存区中,数据存放方式为左右声道交替存放的。6在进行处理前左右声道需要分别提取出来,再分别进行处理。处理完成之后再将左右声道进行合并后输出。其过程图3-3所示。图3-3左右声道处理流程3.回波产生输入的左声道信号产生回波信号后,与右声道的信号叠加,生成带回波的信号,从右声道输出。图3-4是左声道数据在时延两个单位后叠加在右声道上形成带回波噪声的信号的示意图。图3-4回波产生示意图我们希望能通过耳朵对回波信号进行区分,所以延时要求比较高,我们设定采样频率为8k,延时为0.5S。所以另外定义两个存储器delayone和delaytwo。7先存储delayone存储区,存储满4096个点后,换存储delaytwo存储区。Delaytwo存满时,再换回存储到delayone。可见,delayone和delaytwo的第一单元延时差为4096.当存储一个delayone第一个单元时,将leftbuff第一个单元放入delayone第一个单元,同时将delaytwo的第一个单元衰减后加入right-buff,从right-buff输出。并将delaytwo的第一个单元放入leftbuff第一个单元,已以备后面使用。当存储完4096个单位时,换从delaytwo的第一个单元进行存储。将leftbuff第一个单元放入delaytwo第一个单元,同时将delayone的第一个单元衰减后加入right-buff,从right-buff输出。由于DSP处理时,一次处理4096个单元比较困难,所以将4096分成32个组,每次处理128个单元。此时right_buff为跌加了回波噪声的信号。以上原理图如下3-5所示8图3-5可辨别的回波产生示意图4.自适应滤波调用滤波函数对回波信号进行滤波。利用Dsplib中的延时自适应滤波dlms函数对叠加有回波信号的右声道进行滤波。Dlms函数的调用形式如下:dlms(DATA*x,DATA*h,DATA*r,DATA*des,DATA*dbuffer,DATAstep,ushortnh,ushortnx)Dlms的算法原理如下:各参数含义为:x[n]————自适应滤波器的输入;r[n]————自适应滤波器的输出;9h[n]————自适应滤波器的滤波系数;des[n]————期望响应;e[n]————估计误差;自适应滤波的原理:本地产生的语音x(k)信号经回波信道产生回波噪声y(k)叠加在对端的声音信号v(k)上面形成叠加右回波信号的声音d(k),最终导致本地通话方能够听见对方声音里夹带着自己刚才说话的声音。我们的自适应滤波是通过对接收到的叠加有噪声的对方的信号d(k)和本地的信号进行计算形成模拟的回波信道进而估计出回波噪声信号y’(k),然后与d(k)作减法,便可以滤除掉噪声信号,得到理想的对端的声音信号e(k)。如图3-3所示。图3-6四、程序设计、调试与结果分析1.程序设计10(1)DMA过程定义函数copyDatadev,实现将接收缓存区的数据进行左右声道的分别提取过程voidcopyDatadev(Int16*inbuf,Int16*outbuf1,Int16*outbuf2,Int16*outbuf3,Int16length){Int16i;for(i=0;ilength;i++){outbuf1[i]=inbuf[2*i];outbuf2[i]=inbuf[2*i+1];outbuf3[i]=outbuf2[i];}}定义函数copyDatadev,实现将左右声道的信号合并放入发送缓存区的过程voidcopyDatacom(Int16*inbuf1,Int16*inbuf2,Int16*outbuf,Int16length){Int16i;for(i=0;ilength;i++){outbuf[2*i]=inbuf1[i];outbuf[2*i+1]=inbuf2[i];}}if(pingPong==PONG){copyDatadev(gBufferRcvPing,leftbuff,rightbuff,right_buff,SINSIZE);copyDatacom(leftbuff,rightbuff,gBufferXmtPing,SINSIZE);}else{copyDatadev(gBufferRcvPong,leftbuff,rightbuff,right_buff,SINSIZE);copyDatacom(leftbuff,rightbuff,gBufferXmtPong,SINSIZE);}(2)回波信号的产生11定义echogenerate,实现回波信号的产生voidechogenerate(Int16*inbuf,Int16*outbuf,Int16length){/*p,q,di,ti为全局变量,方便加载初值和便于在多次函数调用总实现信号在存储空间的连续存放和读取*//*本函数的返回值中,leftbuff的值变为延时的左声道信号,right_buff返回值为叠加了左声道时延的信号*/Int16i;if(Mode==0)/*Mode==0,delayone存储当前信号,delaytwo用于读取延时的信号用于回波的叠加。*/{Int16j;for(j=0;jNX;di++,j++)delayone[di]=inbuf[j];//存储当前采集到的信号于当前di到di+128的存储空间if(di=delay)//判断是否存满缓冲,满了需要复位参数{p=0;di=0;}}else//Mode==0时原理同上。{Int16j;fo