北京交通大学DSP课程设计自适应滤波.docx

上传人:b****4 文档编号:26710265 上传时间:2023-06-22 格式:DOCX 页数:37 大小:305.32KB
下载 相关 举报
北京交通大学DSP课程设计自适应滤波.docx_第1页
第1页 / 共37页
北京交通大学DSP课程设计自适应滤波.docx_第2页
第2页 / 共37页
北京交通大学DSP课程设计自适应滤波.docx_第3页
第3页 / 共37页
北京交通大学DSP课程设计自适应滤波.docx_第4页
第4页 / 共37页
北京交通大学DSP课程设计自适应滤波.docx_第5页
第5页 / 共37页
点击查看更多>>
下载资源
资源描述

北京交通大学DSP课程设计自适应滤波.docx

《北京交通大学DSP课程设计自适应滤波.docx》由会员分享,可在线阅读,更多相关《北京交通大学DSP课程设计自适应滤波.docx(37页珍藏版)》请在冰豆网上搜索。

北京交通大学DSP课程设计自适应滤波.docx

北京交通大学DSP课程设计自适应滤波

DSP课程实验报告——

利用DSP实现自适应滤波

学院:

电子信息工程学院

专业:

自动化(铁道信号)

学生姓名:

学号:

任课教师:

 

北京交通大学电工电子教学基地

一、设计任务书

自适应滤波器能够根据环境的改变,使用自适应算法来改变滤波器的参数和结构。

自适应滤波器的系数是由自适应算法更新的时变系数,其系数自动连续地适应于给定信号,以获得期望响应。

自适应滤波器的最重要的特征就在于它能够在未知环境中有效工作,并能够跟踪输入信号的时变特征。

自适应滤波器应用于通信领域的自动均衡、回波消除、天线阵波束形成,以及其他有关领域信号处理的参数识别、噪声消除、谱估计等方面。

本设计要求利用DSP的DMA方式进行信号采集和信号输出,同时对外部输入的信号进行自适应滤波。

二、设计内容

1.基本部分

(1)设计数字滤波算法,或调用DSPLIB中的滤波函数,实现对信号的滤波

(2)利用C语言对A/D、D/A进行初始化

(3)利用C语言对DMA进行初始化

(4)编写DMA中断服务程序,实现信号的实时滤波

(5)利用CCS信号分析工具分析信号的频谱成分,确定滤波器的参数

2.发挥部分

(1)比较不同自适应性滤波器的滤波效果;

(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方式完成一次数据采集。

当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缓存区中,数据存放方式为左右声道交替存放的。

在进行处理前左右声道需要分别提取出来,再分别进行处理。

处理完成之后再将左右声道进行合并后输出。

其过程图3-3所示。

图3-3左右声道处理流程

3.回波产生

输入的左声道信号产生回波信号后,与右声道的信号叠加,生成带回波的信号,从右声道输出。

图3-4是左声道数据在时延两个单位后叠加在右声道上形成带回波噪声的信号的示意图。

图3-4回波产生示意图

我们希望能通过耳朵对回波信号进行区分,所以延时要求比较高,我们设定采样频率为8k,延时为0.5S。

所以另外定义两个存储器delayone和delaytwo。

先存储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所示

图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]————自适应滤波器的输出;

h[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.程序设计

(1)DMA过程

定义函数copyDatadev,实现将接收缓存区的数据进行左右声道的分别提取过程

voidcopyDatadev(Int16*inbuf,Int16*outbuf1,Int16*outbuf2,Int16*outbuf3,Int16length)

{

Int16i;

for(i=0;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;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)回波信号的产生

定义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;j

delayone[di]=inbuf[j];//存储当前采集到的信号于当前di到di+128的存储空间

if(di>=delay)//判断是否存满缓冲,满了需要复位参数

{

p=0;

di=0;

}}

else//Mode==0时原理同上。

{

Int16j;

for(j=0;j

delaytwo[ti]=inbuf[j];

if(ti>=delay)

{

q=0;

ti=0;

}}

if(Mode==0)

{

for(i=0;i

{outbuf[i]=outbuf[i]+0.1*decay*delaytwo[q];//回波叠加。

inbuf[i]=delaytwo[q];//左声道存储延时信号用于滤波。

//!

本函数的返回值中,leftbuff的值变为延时的左声道信号。

}

if(q>=delay)Mode=1;//延时缓冲读完,切换读取的缓存……

}

else//参考Mode=1,原理同上。

{

for(i=0;i

{outbuf[i]=outbuf[i]+0.1*decay*delayone[p];

inbuf[i]=delayone[q];//左声道存储延时信号用于滤波

}

if(p>=delay)Mode=0;

}

}

if(pingPong==PONG)

{

copyDatadev(gBufferRcvPing,leftbuff,rightbuff,right_buff,SINSIZE);

echogenerate(leftbuff,right_buff,SINSIZE);

copyDatacom(leftbuff,rightbuff,gBufferXmtPing,SINSIZE);

}

else

{

copyDatadev(gBufferRcvPong,leftbuff,rightbuff,right_buff,SINSIZE);

echogenerate(leftbuff,right_buff,SINSIZE);

copyDatacom(leftbuff,rightbuff,gBufferXmtPong,SINSIZE);

}

(3)调用dlms函数进行滤波处理

dlms(leftbuff,h,rightbuff,right_buff,dbuffer,STEP,NH,NX);

for(i=0;i

上述两句代码实现了right_buff中的噪声的滤除,这两句是自适应滤波的核心,dlms函数根据leftbuff估计出收到的叠加有回波的信号中回波噪声,然后从有声道中减去噪声就可以得到没有回波的右声道信号。

2.实验步骤

1)把工程拷入C:

\CCStudio_v3.3\MyProjects

2)插上DSK板子

4)打开音量调节控制

选中选项中的高级控制

点击属性——播放模式下选中麦克风——取消麦克风静音——软件、CD、后端输入选中静音

点击属性——录音模式下取消后端输入——选中高级——麦克风加强去掉

点击属性——播放模式确认——选中后端输入高级——取消麦克风加强

主音量和麦克风音量尽量减小根据虚拟仪器显示进行微调。

6)打开虚拟仪器,点击信号源,左通道产生一定频率的正弦波。

8)正确连接PC机和板子,耳机输出接到DSK板上的J5端口,麦克输入接到DSK板上的J6端口。

9)打开setupCCS3.3,正确装载并在退出前保存。

10)在CCS环境中,选中Project——Open选择建好的工程(.pjt)文件。

选择debug——connect,链接电脑与DSP试验箱。

选择LoadProgram,读取.out文件。

选择debug——gomain。

点击run运行文件。

11)在CCS中选择View/Graph/Time/Frequency,出现图形属性对话框。

12)如果要观察频域波形,DisplayType改为FFTMagnitude。

3.结果分析

(1)滤波前后频谱的变化

未滤波前,输入的左声道信号产生回波信号后,与右声道的信号叠加,生成带回波的信号,从左声道输出。

所以,左声道为加噪声后的信号。

进行自适应滤波后,滤除回波的信号从右声道输出。

所以,右声道为滤波后的信号。

滤波前后信号的变化如图4-2所示。

图4-2滤波器前后虚拟仪器上频谱分布

绿色表示左声道频谱,红色表示右声道频谱,可见,左声道有回波噪声的存在。

自适应滤波后,右声道成功的滤除了回波噪声。

五、设计(安装)与调试的体会

在本次DSP实验中,我通过阅读资料、了解DSP实验系统的组成,学会集成开发环境CCS的使用,并利用自适应算法进行滤波处理。

首先,我们通过老师的讲解,阅读PPT和TMS320C55X等资料,了解了DSP实验系统的基本组成和结构,并掌握了利用DMA进行信号采集和输出的原理,接着,我们在main函数中利用C语言编程,实现了信号输入后左右声道的提取,并能成功将左右声道提取的信号进行合并后输出。

接下来,我们根据要求设计产生回波信号,将左声道的回波加到右声道后,从左声道输出。

最后,我们调用dlms函数,对回波信号进行自适应滤波,得到无回波的信号。

为了对自适应滤波进行实际的应用。

我们输入一段音频信号,产生回声,并进行滤除。

插入耳机后,可以听到左声道有明显的回声,而右声道无回声。

在本次试验中我们遇到了很多问题。

例如,在产生回波信号时我们对实验要求不太理解。

开始时,我们将左声道信号叠加到右声道,从右声道输出,这样虽然原则上并没有错,但每次需要对比有无滤波时,必须把滤波的语句注释掉,重新编译运行。

经过与老师和其他组的讨论后,我们才将左声道信号叠加到右声道,从左声道输出。

这样左声道表示的是滤波器前信号,右声道表示滤波后信号。

可以同时观察,并且通过耳机的左右声道能明显分辨出有回声和回声滤除后的明显效果。

在调用dlms函数时,我们也遇到了问题。

开始时我们将回波后左声道信号作为输入,原右声道信号作为期望值,进行滤波。

后来通过与老师讨论,我们意识到在实际应用中,我们是无法得知对端的信号,所以不能用对端信号最为期望。

通过查找文献资料,我们终于明白了自适应滤波实现波波消除的原理,用自适应滤波拟合回声信号,在与叠加了回声的信号相减,得到了对端传来的无回声信号。

应用自适应滤波实现音频信号的回声滤除时,我们希望通过双耳能分辨出滤波前后的音效。

但人耳能分辨的时间间隔为0.1秒。

而如果按照先前的程序,时延几个到几十个单位远远无法达到人耳的分辨。

所以,我们又新定义两个4096的存储区交替存储,延时衰竭与右声道叠加,这样才实现了延时0.5s,双耳能明显分辨出回声信号的有无。

在这次DSP课程设计中,我们投入了大量时间和精力。

也正是因为不断地学习、探索、交流,我们对DSP实验系统有了很深的了解,也能在CCS中进行熟练的操作。

并通过自己的设计实现了自适应滤波,实现了课堂所学到实践应用的转变。

在以后的学习中,我还会继续努力学习,将知识与实践完美结合。

 

本次课程设计是我从头到尾都参加的一次课程设计,经历比较完整,收获十分的大。

至于说感想和体会,我觉着这篇报告前面的很多内容都能说出一些我的体会,因为前面的内容虽然不算很多,但是每一句都是我自己敲上去的。

最后我就把自己遇到的一些问题叙述一下。

选择这个题目,是因为我刚看到题目时觉着这个题比较难,而且时间比较充裕,有足够多的时间来做。

在实际开始做的时候,我们觉着这个题也就是分三步就可以做完,并且每步都不会太难,尤其是第三步,直接利用CCS库函数dlms对信号进行滤波,几乎没什么难度。

然而,在我们滤波前的工作都做完以后,却发现dlms函数的根本不是我们想得那样。

dlms函数的各个输入参数并不是我们想得那样简单的使用。

因为该函数中的参数要求并不明确,而且在调试中实验设备的处理也并不是很稳定,所以并不是和我们事先想的一样简单。

而且最让人不可捉摸的在好几种情况下,处理后都有较为理想的滤波输出,有些时候真的就以为是自适应滤波完成了,但还好能及时各种问题,才不至于错误地使用这个函数。

最后导致总是感觉今天做的是对的,然后准备截图时忽然间发现不合理或者有时候都把图截好准备写报告时发现问题,所以一直持续做到最后,才搞明白了这个函数的调用。

最后回头想想我觉着我们这个月几乎一直在做DSP,虽然这个题目看起来简单,但我觉着我们不只是简单调用了一个函数,而且是通过各种方法去研究了一个已经封装好的没有任何说明的函数的功能。

虽然Dsplib中对这个函数有一些说明,但到最后我觉着那根本就不是那我们正常人的思维写的说明,当然,这更大的原因还是我们自己对自适应回波算法的原理不是很了解。

我们这次课程设计最终能够得到理想的结果与其他小组之间的讨论是分不开的,因为当局者迷,自己总是会认为自己的相法是正确的,当稍微有些结果,哪怕不合理,自己也可以接受,这样很容易进入误区。

还有就是要学会利用互联网资源,我们少数人的思维毕竟太狭隘,只有我们多了解他人对相同问题的看法,并且加以思考才可以更好地得出我们自己的想法。

六、参考文献

[1]高海林钱满义DSP技术及其应用清华大学出版社,2009

[2]陈后金等信号分析与处理实验.高等教育出版社,2006

[3]邹鲲等MATLAB6.x清华大学出版社,2002

[4]TMS320C55XDSPLibraryProgrammer’sReference,SPRU422J.pdf

[5]TMS320VC5502Fixed-PointDigitalSignalProcessorDataManual,SPRS166K.pdf

[6]TMS320C55XChipSupportLibraryAPIReferenceGuide,SPRU433I.pdf

[7]许国威、马胜前等.自适应滤波RLS算法研究与DSP实现.计算机技术与发展.2010.10

[8]BJTU-DSP5502实验系统简介.北京交通大学电信学院电工电子教学基地

 

七、附录

1.Main函数

/*

*Copyright(C)2003TexasInstrumentsIncorporated

*AllRightsReserved

*/

/*

*---------main_dma4.c---------

*ThisisaDMAapplicationexampleforCodecAIC23Banaloginput/output,

*TheexampleplacestheMCBSPinDMAtransmitdatamodeand

*syncsMCBSPreceivewithDMAchannel4andMCBSPtransmit

*withDMAchannel5.

*TheexampleusespredefinedCSLmacrosandsymbolic

*constantstocreatetheinitializationvaluesneededfor

*theMCBSPandDMAcontrolregisterstoeffectthetransfer

*Createdbyhailingao,BJTU,2012/06/25,2014/06/16

*/

#include

#include

#include

#include

#include

#include

#include

#include"dlms.h"

//---------Globaldatadefinition---------

/*Constantsforthebufferedping-pongtransfer*/

#defineBUFFSIZE256

#definePING0

#definePONG1

#defineSINSIZE128

#defineCAHE4096

Int16decay=6,Mode=0,delay=4095;

Int16p=0,q=0;//回波产生参数

Int16di=0,ti=0;//回波缓存参数

/*

*Databufferdeclarations-theprogramusesfourlogicalbuffersofsize

*BUFFSIZE,onepingandonepongbufferonbothreceiveandtransmitsides.

*/

#pragmaDATA_SECTION(gBufferXmtPing,"buffer_sect");

Int16gBufferXmtPing[BUFFSIZE];//TransmitPINGbuffer

#pragmaDATA_SECTION(gBufferXmtPong,"buffer_sect");

Int16gBufferXmtPong[BUFFSIZE];//TransmitPONGbuffer

#pragmaDATA_SECTION(gBufferRcvPing,"buffer_sect");

Int16gBufferRcvPing[BUFFSIZE];//ReceivePINGbuffer

#pragmaDATA_SECTION(gBufferRcvPong,"buffer_sect");

Int16gBufferRcvPong[BUFFSIZE];//ReceivePONGbuffer

#pragmaDATA_SECTION(delayone,".buffer_cahe");

Int16

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 职业教育 > 职高对口

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1