DSP课程设计---基于DSP的回波的产生与抵消.doc_第1页
DSP课程设计---基于DSP的回波的产生与抵消.doc_第2页
DSP课程设计---基于DSP的回波的产生与抵消.doc_第3页
DSP课程设计---基于DSP的回波的产生与抵消.doc_第4页
DSP课程设计---基于DSP的回波的产生与抵消.doc_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

DSP课程设计DSP课程设计实 验 报 告基于DSP的回波的产生与抵消学 院:电子信息工程学院 班 级:通信0707设计人员:陈军07211195何家琪 07211202指导老师:高海林目录设计任务书 2任务设计 3设计内容 3设计方案及算法原理说明 4实验目的 4实验原理 4关于LMS算法 5程序代码 6程序设计及调试 12结果分析 19实验体会及总结 22参考文献 25一、 设计任务书过去,通过卫星打国际电话时,因为同步静止卫星的通话路径较长,引起通话延迟(单跳250ms,双跳500ms),因电路失配所引起的线路回声就很明显,所以从二十世纪80年代起人们就研究回声消除的办法。由简单的回声抑制器发展到自适应回声消除器,国际电联(ITU)也相应地制订了回声消除器的国际标准,例如G164、G165 、G167等等。进入90年代之后,通过互联网拨打长途电话,即IP电话开始流行。IP电话现在已成为Internet上实现实时传送语音信号的一种新型电信业务。与传统的PSTN网络采用电路交换技术不同,IP电话采用的是分组交换技术,充分利用Internet来传输数据,使得价格大大降低,因而具有广泛的研究和应用前景。IP电话以数据包的格式在因特网中与其他数据信息按TCP/IP协议一起传输,从发话端到收话端延时较长,并且是不确定的,IP电话系统的回声源复杂,回声路径的延时和抖动都相当大,这里的延迟包括算法延迟(0.125ms30ms),处理延迟(30ms),网络延迟(70100ms)等,总延迟在100ms以上,而人耳对大于50ms的回声就能鉴别出来,因此回声消除成了IP电话系统的一个关键问题。在电话系统中,自适应回声消除器成为不可缺少的设备。自适应滤波的优点在于,它不仅能够选择信号,而且能够控制信号的特性。自适应滤波器具有跟踪信号和噪声变化的能力,它的系数能够被一种自适应算法所修改。利用DSP可以实时地对信号进行自适应滤波。DSP利用直接存储器访问方式DMA采集数据时不打扰CPU,因此CPU可以对信号进行实时地滤波。本设计要求利用DSP的DMA方式进行信号采集和信号输出,同时对外部输入的信号进行数字滤波,完成对电话线路中较为严重的回波进行抵消,实现电话线路中通话清晰。二、任务设计首先,先测试原输入语音信号的效果。此时,说话者应只听到自己同步的语音。接着,对输入的语音信号产生对应的回波,使说话者能听到自己的说话声的同时,还可以听到多重回声。然后编写自适应滤波算法程序,或调用DSPLIB中的dlms自适应滤波函数对产生的回波进行滤除,使说话者只听到自己同步的语音,而没有回声。三、设计内容回声消除的基本原理是采用一个自适应滤渡器自动识别回声通道,通过自适应滤波算法的调整,使其冲激响应与实际回声路径逼近,从而得到回声预测信号y(n),再将预测信号从近端采样的语音信号d(n)中减去,即可实现回声消除。本实验的主要内容就是通过将过去的信号衰减加到现在的信号上,以产生回波,然后通过采用LMS算法设计一个自适应滤波器,将回波滤去,比较滤波前和滤波后信号的差异来衡量自适应滤波器的性能。四、设计方案、算法原理说明(一)、实验目的:1、掌握CCS环境的使用2、掌握TMS320C5402DSP芯片的基本知识3、掌握基于CCS编程设计的方法(1)对DMA进行初始化;(2)对A/D、D/A进行初始化;(3)编写DMA通道传输程序,实现数据实时采集和实时地输出;(4)设计自适应滤波算法,或调用DSPLIB中的自适应函数,实现信号的自适应滤波。(5)滤波后信号实时输出的同时,将数据存放在数据文件中;(6)利用自适应滤波实现语音信号回波对消。本程序是在CCS5000自带程序codec的基础上进行修改和加工,codec程序包含DSP板的初始化、语音的读取输出、A/D、D/A转换、滤波等一系列功能。涉及5402 DSP 多通道缓冲串行口mcbsp 和tlc320ad50 CODEC 编译码器的C 语言编程方法(二)、实验原理源自接收器(耳机)的声波,通过位于声音路径上的固体物体反射进入手机的麦克风(话筒)中,或扬声器电话中,这就形成了声学回声。声学回声消除的功能原理框图如图1所示:图1 回声消除器原理框图回声消除的基本原理是采用一个自适应滤渡器自动识别回声通道,通过自适应滤波算法的调整,使其冲激响应与实际回声路径逼近,从而得到回声预测信号y(n),再将预测信号从近端采样的语音信号d(n)中减去,即可实现回声消除。自适应算法要求收敛速度快、计算复杂度低、稳定性好和失调误差小。虽然许多自适应算法在理论上实现回声消除都是可行的,但通常采用的是较简单的算法。例如广泛应用的LMS自适应算法。(三)、关于LMS算法本实验采用LMS算法,即最小均方误差算法设计的自适应滤波器进行未知系统识别,以将回声信号滤除。该自适应滤波器是FIR横向滤波器,可以根据输出自动修改滤波器的权系数,从而逼近未知系统回声通道。算法的实现基于TMS320C5402DSP芯片和CCS系统的C语言。 远端的信号通过回声通道产生回声信号d(n),该信号一般为远端信号的衰减和延迟。远端信号通过自适应滤波器产生回声预测信号y(n)。在k时刻,它们之差为剩余回声信号: (1)用它来控制LMS自适应滤波器的系数w(n) (2)其中为自适应步长因子,一般取01,可视为常数k时刻滤波器的输出为: (3) 以上(1),(2),(3)三个方程是LMS最小均方误差算法的核心方程,也是C语言编程的依据。LMS算法流程图如下图所示:五、程序代码codec.c程序/*/* Codec.c*/* Digital Loopback example*/*/#include type.h#include board.h#include codec.h#include mcbsp54.h#include tms320.h#include dsplib.h#include setm.h/*/* Function Prototypes*/*/* This delay routine does not conflict with DSP/BIOS. It is used in this */* example rather than brd_delay_msec which causes DSP/BIOS conflicts just */* because of this. If you are not using DSP/BIOS, you can change the code */* to use brd_delay_msec. */void delay(void); /延迟void update(DATA x,DATA dk);void initarray(DATA x);/*/* Global Variables */*/HANDLE hHandset; /CODEC句柄DATA bf15000; /缓冲区/*/* MAIN*/*/DATA *dp_w = &dbuffer_w0;DATA *dp_h = &dbuffer_h0; void main() s16 j; s16 m; s16 cnt=3; /灯循环闪次数,初始化等待时钟周期数 DATA dk,out_delay,yk;/ek s16 mode=2; /决定是否产生回波是否使用回波抵消 s16 i; if (brd_init(100) /板的初始化 return; for (i=0; iLENGTH_IN; i+) dbuffer_hi = 0; for (i=0;iLENGTH_IN;i+) out_hi =0;/ clear output buffer (optional) for (i=0;iLENGTH_W;i+) coff_wi =0;/ clear coeff buffer (optional) for (i=0;iLENGTH_IN;i+) out_wi =0;/ clear output buffer (optional)/* blink the leds a couple times */while ( cnt- ) /*板子初始化,用灯闪来表示*/brd_led_toggle(BRD_LED0);/* brd_delay_msec(1000); */delay();brd_led_toggle(BRD_LED1);/* brd_delay_msec(1000); */delay();brd_led_toggle(BRD_LED2);/* brd_delay_msec(1000); */delay(); /* Open Handset Codec */ hHandset = codec_open(HANDSET_CODEC); /* Acquire handle to codec */ /* Set codec parameters */ codec_dac_mode(hHandset, CODEC_DAC_15BIT); /* DAC in 15-bit mode */ codec_adc_mode(hHandset, CODEC_ADC_15BIT); /* ADC in 15-bit mode */ codec_ain_gain(hHandset, CODEC_AIN_0dB); /* 0dB gain on analog input to ADC */ codec_aout_gain(hHandset, CODEC_AOUT_MINUS_12dB); /* -12dB gain on analog output from DAC */ codec_sample_rate(hHandset,SR_8000); /* 8KHz sampling rate */ brd_led_toggle(BRD_LED0); initarray(x); /初始化所有数组 i=0; j=3000; m=1500; while(1) /读数循环 while (!MCBSP_RRDY(HANDSET_CODEC) ; dk = *(volatile u16*)DRR1_ADDR(HANDSET_CODEC); / *(volatile u16*)DXR1_ADDR(HANDSET_CODEC)=dk; /从ADC读数 update(x,dk); if(mode=0) *(volatile u16*)DXR1_ADDR(HANDSET_CODEC)=dk; else if(mode=1) fir(x,coff_h,out_h,&dp_h,LENGTH_H,LENGTH_IN); if(i=5000) i=0; if(j=5000) j=0; if(m=5000) m=0; bf1i=out_h0;i+;/放入缓冲区 out_delay=0.5*bf1i+1+1.5*bf1j+bf1m+; yk=dk+out_delay; *(volatile u16*)DXR1_ADDR(HANDSET_CODEC)=yk; else if(mode=2) fir(x,coff_h,out_h,&dp_h,LENGTH_H,LENGTH_IN); if(i=5000) i=0; if(j=5000) j=0; if(m=5000) m=0; bf1i=out_h0;i+; out_delay=0.5*bf1i+1+1.5*bf1j+bf1m+; yk=dk+out_delay; update(y,yk); dlms(y,coff_w,out_w,&dp_w,out_h,STEP,LENGTH_W,LENGTH_IN); /ek=out_h0-out_w0; *(volatile u16*)DXR1_ADDR(HANDSET_CODEC)=out_wi; void delay(void) long int j; for(j=0; j100000; j+) asm(_nop); void update(DATA x,DATA dk) s16 j,k; for(j=1;jLENGTH_IN;+j) k=LENGTH_IN-j;xk=xk-1;x0=dk; void initarray(DATA x) s16 i; for(i=0;iLENGTH_IN;+i) xi=0; Codec.c的程序流程图如下图所示:首先,在输入信号之前,应先进行一些必要的准备工作,即初始化FIR延迟输出数组dbuffer_h、FIR输出数组、自适应滤波器系数矢量coff_w和自适应滤波器的输出数组out_w,再进行DSK板的初始化。然后采集输入的语音信号,根据模式的不同进行不同的处理以输出不同的信号来进行效果的比较。mode=0时为全通,即不做任何处理直接输出;mode=1时信号通过FIR滤波器后产生回声,为使现象更明显可以附加一个延迟;mode=2时用自适应滤波器逼近FIR滤波器以使之输出近似的信号,用信号通过两个系统产生的信号之差(即剩余回声)来调整自适应滤波器的系数,使剩余回声逐渐收敛于0。这时只听到自己说话的声音,因此这个系统可以看做是近端说话模式,即将远端信号设为0。其系统框图如下图所示:六、程序设计及调试由于实验条件限制(实验室的DSP板只有1个输入端),不能像实际线路中那样有近端回波、远端回波,所以该实验中,我们简化了这个回声产生。实验中,我们将麦克输入的语音信号叠加上述麦克输入语音信号的延时衰减后的信号,用此混合信号模拟真实的回波信号。回波产生程序如下:while (!MCBSP_RRDY(HANDSET_CODEC) ; /codec句柄如未准备好则等待 dk = *(volatile u16*)DRR1_ADDR(HANDSET_CODEC); /从ADC读数 bfi=dk; /放入缓冲区 if(i=10000) i=0; *(volatile u16*)DXR1_ADDR(HANDSET_CODEC) = dk+bfi+1/2; /延迟+衰减 调试中可以模拟产生较大延时的回波。当对着麦克说话时,不仅能耳塞中不仅能听到自己及时的声音也能听到自己的回声,而且延时特别大,感觉特别明显。 但是我们编写的回波抵消算法(LMS算法)程序的效果却并不尽如人意。噪声特别大,甚至根本没法听清自己的声音。分析原因可能是采样输入数据和lms算法效率不高,产生很大延时,也产生了很大的噪声,从而严重影响实验的结果。算法的开销与滤波器的长度有关,因此应该适当减小滤波器的长度的值。也有可是FIR滤波器的阶数不够。既然,因为自己编的LMS算法不能很好的抵消回波,所以我们对于我们所编写的程序进行了一定地改进。这一次,我们采用了C5000的dsplib库中的函数short dlms(PARAM)取代自定的lms()函数,同时用dsplib库里的函数short fir(PARAM)产生回声通道的输出信号(也就是用预定阶数的FIR滤波器模拟回声通道),该输出信号作为自适应滤波器的理想输出信号,对之进行逼近进而得到预定结果。这两个函数是用C5000汇编语言编写的,具有很高的执行效率,使用这个函数可以大大提高运算速度,以解决用C语言编写的程序效率不能满足要求的问题。其使用方法如下:short oflag = dlms (DATA *x, DATA *h, DATA *r, DATA *d, DATA *des, DATA step, ushort nh, ushort nx)参数如下表所示:注意:h和d的存储地址要求起点必须位于Kbit边界处,即起始地址值的最低有效位必须是0,必须在CMD文件中开辟对齐1K边界的空间,并且只能在头文件中进行段的配置。否则编译无法通过。oflag = short fir (DATA *x, DATA *h, DATA *r, DATA *dbuffer, ushort nh,ushort nx)oflag 溢出错误标志,=1时在计算过程中发生了数据溢出;=0时无数据溢出。x 输入信号数组h FIR滤波器的系数矢量,也是要逼近的对象r 输出数组d 延迟缓冲区,用来存放上一时刻的输出数据nx 向量x中的个数nh 系数的个数注意:h、d的地址要求同dlms()函数中的h、d参数。DATA 为tms320.h中定义的short整型。为了降低计算开销,输入缓冲数组长度应该尽量小,取长度为LENGTH_IN=5。采用数据压入方式,将最新的声音采样值存入数组x0,然后将存储的数据从低位压入高位。其实现程序update(DATA x,DATA dk)如下:void update(DATA x,DATA dk) /dk为当前采样值 s16 j,k; for(j=1;j PRAM PAGE 0 .text PRAM PAGE 0 .vectors VECS PAGE 0 init_var PRAM PAGE 0 detect PRAM PAGE 0 vrcprg PRAM PAGE 0 matprg PRAM PAGE 0 .stack STACK PAGE 1 .trap SCRATCH PAGE 1 .const EXRAM PAGE 1 .data EXRAM PAGE 1 .bss EXRAM PAGE 1 .cio EXRAM PAGE 1 .switch EXRAM PAGE 1 tables EXRAM PAGE 1 var EXRAM PAGE 1 svctab EXRAM PAGE 1 /* SS_V LSP table */ vctab EXRAM PAGE 1 /* V LSP table */ uvctab EXRAM PAGE 1 /* UV LSP table */ cuvtab EXRAM PAGE 1 /* Stochastic codebook */ cdbktab EXRAM PAGE 1 /* various codebook tables*/ logtab EXRAM PAGE 1 /* table for log2 */ powtab EXRAM PAGE 1 /* table for pow2 */ hamtab EXRAM PAGE 1 /* table for hamming */ lgwtab EXRAM PAGE 1 /* table for lag window */ acostab EXRAM PAGE 1 /* table for arccos */ sqrtab EXRAM PAGE 1 /* table for square root */ acbtab EXRAM PAGE 1 /* table for thresholds in acb */ pm03tab EXRAM PAGE 1 /* table for x(-0.3) computation */ costab EXRAM PAGE 1 /* table for cosine */ .dbufferh: INT_DM_RAMPAGE 1, align (1024) /添加部分 .dbufferw: INT_DM_RAMPAGE 1, align (1024) / 将这些段指定到1KBIT的边 .coffh : INT_DM_RAMPAGE 1, align (1024) /界,以满足dlms()和fir()两 .coffw : INT_DM_RAMPAGE 1, align (1024) /个函数对参数的要求 V23 INRAM PAGE 1 FSK INRAM PAGE 1 hpibuff0 HPRAM0 PAGE 1 hpibuff1 HPRAM1 PAGE 1 hpibuff2 HPRAM2 PAGE 1 dma_buff DMARAM PAGE 1七、结果分析经过上述的调试之后,下面我们对于得到的最终程序,进行一下系统分析:(1)在回波抵消过程中,通过dlms设置断点观察自适应滤波器的系数矢量coff_w趋向于Fir滤波器的系数矢量coff_h的过程断点设置如下图所示:coff_h观察结果如下图所示:coff_w观察结果如下图所示:(2)当输入语音信号变化时,观察输入变量dk的变化如下图所示:(3)在回波产生过程中,Mode=1时,输入语音信号变化时coff_w不变,过程图如下所示:(4)在回波产生过程中,当Mode=2时,out_w和out_h的对比图如下图示:综上所述,当mode=1时,如果不加附加延迟产生的声音信号有轻微不易察觉的延迟和比较明显的杂音,这是声音经过10阶FIR滤波器滤波即回声通道的结果,当加入附加延时后可以模拟比较逼真的回声效果,当然这并不是真正的回声,也不是LMS算法要逼近的部分,FIR的输出out_h才是真正的回声。当mode=2时,调用dlms()函数将FIR滤波器的输出out_h作为自己的理想输出des,不断逼近,不断适应,最终能听到比较纯净的声音。但杂音是无法完全消除的,这不仅取决于LMS的算法精度、收敛速度,FIR滤波器的阶数,也与程序中dlms()和fir()函数的执行效率有关。可以用CCS中的VIEW/GRAPH功能、MATLAB观察逼近后自适应滤波器的冲击响应。以下是实际测试得到的一组逼近后的自适应滤波器的系数:coff_w=1046,2284,4846,7518,7814,8463,6936,4411,1883,548实验中从MATLAB得到的一组FIR低通滤波器系数为:coff_h=790,2661,4629,6919,8210,8210,6919,4629,2661,790从实验结果中,我们得到很好的回声及对回波有十分明显的抵消,我们对最终的效果较为满意。八、实验的体会及总结通过这次DSP的课程设计的学习,是我们着实受益良多。以前在学习数字信号处理的时候,总是觉得内容十分的枯燥,难以理解。况且,即便将知识背下来,也不知道应该在何处使用,总有一种无用武之地,理论联系不上实际的挫败感。从完全不会,甚至最初连连接板子都有问题,到最后能够成功的完成实验的要求,这之间的进步是令人兴奋的。在选定题目之后,实验前我们查阅了很多相关资料,并做了认真总结,这为顺利完成实验奠定了基础。在进行准备的过程中,让我们充分认识到了我们的不足。虽然我们学习过C语言的编程,但一旦将它应用到实际的比较专业的问题上,我所学的知识就变得完全不够用了。由于资料中关于回波的建立过程多是汇编程序,所以我们花了很长的时间对此进行了研究及总结。在认真研究之后终于明白,回波的产生可以通过在原信号叠加上一个输入信号延时衰减后的小信号实现,这种混合信号可以近似看成是实际中的回波和语音信号的叠加。回波的抵消主要用到

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论