《DSP课程设计报告--语音噪声滤波-自动化毕业论文.doc》由会员分享,可在线阅读,更多相关《DSP课程设计报告--语音噪声滤波-自动化毕业论文.doc(41页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、DSP课程设计实验报告 自动化0804 姚笑菲 08212116DSP课程设计实验报告语音噪声滤波院(系):电子信息工程学院 班级: 自动化0804 姓名: 姚笑菲 学号: 08212116 指导教师: 杨恒 目录一、实验背景3二、设计要求3三、设计思路3四、算法原理41、直接存储器访问DMA42、A/D和D/A转换器63、FIR滤波器算法64、LMS算法75、利用DSP产生回波86、利用自适应滤波实现回波对消9五、用C语言实现LMS算法11六、用MATLAB设计FIR滤波器15七、程序设计171、主程序(firlab.c)172、中断服务程序(dma2isr.c)223、链接命令文件(540
2、2a.cmd)244、中断向量表(c5402vec.asm)26八、程序调试30九、结果分析31十、感想40一、实验背景我们的日常生活中离不开语音通信,如接打电话、收听音乐等。语音通信的过程主要分为三个部分,即发送部分将音频信号转化为电信号,经发送端设备变换为适合传输的形式发送出去;传输部分通过传输信道将电信号进行传输;接收部分经接收端设备恢复出原来的语音信号,经耳机或者喇叭转换为接收者可以听到的声音信号。但是由于环境的原因,我们采集到语音信号经常含有不同程度的噪声。与语音通信系统的三个部分相对应,语音通信系统中的噪声一般也来自三个方面:一是信号发送端空间环境中的音频噪声信号经麦克风变换为电信
3、号之后,与有用信号其同传递到接收端;二是信号接收端空间环境中的音频噪声对信号接收者的影响;三是信号处理设备产生的电噪声及传输信道中的电噪声。当语音信号受到背景噪声干扰而使语音通信质量变得不可接受时,要对语音信号中的噪声进行滤除,也就是本次实验要完成的语音噪声滤波。二、设计要求1、基本部分:(1) 对DMA进行初始化;(2) 对A/D、D/A进行初始化;(3) 编写DMA中断服务程序和滤波算法程序,实现语音信号的实时滤波;2、发挥部分:(1) 使用DSP产生带回波的语音信号;(2) 利用自适应滤波实现语音信号的回波对消。(3) 比较采用不同窗和阶数时滤波器的滤波效果;(4) 测试所设计滤波器的幅
4、频特性和相频特性,并与MATLAB下的设计结果进行比较。三、设计思路首先利用DSP的DMA方式对外部含噪声的语音信号进行实时采集,语音信号先经过A/D转换为数字信号,利用MCBSP的接收寄存器接收数据。编写滤波算法程序,或调用DSPLIB中的滤波函数,对信号进行滤波。滤波后的数据利用DMA方式送到D/A转换器转换为模拟信号。设计流程框图如下:上电复位A/D和D/A初始化DMA通道初始化DMA方式接收A/D数据等待DMA接收中断信号滤波信号经D/A输出主程序中断服务程序模式选择模式0普通滤波模式1自适应滤波加有噪声色语音信号由DSK板的MIC端口输入,经A/D转换器转换为数字信号后到达DSP的D
5、MA通道2,DSP接收到信号后调用中断服务程序进行滤波,可选择滤波模式进行不同种类的滤波,滤波后的信号在CCS上显示,或通过DMA通道3将信号输出到D/A转换器,转换为模拟信号后从SPEAKER端口输出。四、算法原理1、直接存储器访问DMA直接存储器访问(Direct Memory Access)是C54x DSP非常重要的片上外设,DMA控制器可以在不影响CPU的情况下完成数据的传输,因此数据传输速度快,在要求信号实时采集和处理的系统中常采用DMA方式进行信号采集和传输。C5402有6个可独立编程的DMA通道,每个DMA通道受各自的5个16位寄存器控制:源地址寄存器DMSRC、目的地址寄存器
6、DMDST、单元计数寄存器DMCTR、同步事件和计数寄存器DMSFC、发送模式控制寄存器DMMCR。目的地址寄存器DMDST规定DMA要传送数据目的地址和首地址。单元计数寄存器DMCTR规定DMA传送数据的个数为DMCTR寄存器的值加1。同步事件和帧计数寄存器DMSFC规定DMA传送数据的同步事件类型和传送一块数据所含帧信号的个数。发送模式控制寄存器DMMCR规定DMA通道的传输模式,当DMA工作在自动初始化模式时,CPU在一个DMA事件完成后自动装载下一个DMA初始化设置并继续进行数据传送。DINM位和IMOD位设置DMA中断产生方式。CTMOD位设置发送计数模式控制,CTMOD位为0时,D
7、MA工作在多帧模式,CTMOD位为1时,DMA工作在自动缓冲ABU模式。SIND位和DIND位用来设置源地址和目的地址的自动调整方式。此外,DMA的6个通道还受通道优先级和使能控制寄存器DMPREC控制。本实验利用DMA通道2与MCBSP1通道结合来读取A/D转换器的数据,利用DMA通道3与MCBSP1通道结合来将处理后的数据发送至D/A转换器。选择MCBSP1通道的接收寄存器DRR11(41H)为DMA传送数据的首地址,并选择DMA源地址工作在不调整方式,选择MCBSP1接收事件为DMA同步事件,以实现DMA和MCBSP的结合。A/D转换器的数据按MCBSP1的设置被传送到DSP内部接收寄存
8、器DRR11中,再由DMA通道2将DRR11中的数据读到指定数据存储区INP-BUFFER中完成数据采集。DMA在传送外部来的数据时不会影响CPU的正常运行,当DMA通道2采集完一组数据后产生一个DMA中断事件中断CPU,来通知CPU对其进行相应的处理,此时DMA通道2可以按照设定继续采集下一组数据,实现了数据采集与CPU处理的并行操作。当一组数据处理完成后,将数据存放在数据存储区OUT-BUFFER中,选择OUT-BUFFER为DMA通道3的首地址,并选择源工作地址工作在不调整方式。选择MCBSP1通道的发送寄存器DXR11(43H)为DMA通道3传送数据的目的地址,并选择DMA源地址工作在
9、不调整方式,选择MCBSP1接收事件为DMA同步事件,以实现DMA和MCBSP的结合。在CCS集成开发环境中,与DMA相关的头文件有regs54xx.h和dma54xx.h。在这两个头文件中,定义了DMA的寄存器资源、使用方法和DMA寄存器的地址和基本访问方式,以及寄存器的各个比特域和访问方法,因此需要进行C源程序的开始处包含这两个头文件。输入信号经A/D转换后,利用DMA通道2进行传输进入DSP处理,而滤波后的信号输出利用了DMA通道3进行传输进入D/A转换器等输出,因此需要对DMA通道2和通道3进行初始化配置。详细的DMA初始化程序请见后面的程序清单。2、A/D和D/A转换器A/D模数转换
10、器是将输入电压信号转换为输出的数字信号。由于数字信号本身不具有实际意义,仅仅表示一个相对大小,所以任何一个模数转换器都需要一个参考模拟量作为转换的标准,而输出的数字量则表示输入信号相对于参考信号的大小。A/D转换器能够将接收的语音信号(模拟信号)转化为数字信号,供CPU进行处理。D/A转换器是将数字信号转换为模拟信号的电路。实现原理就是将输入的二进制代码按其权值的大小转换成相应的模拟量,然后将所有的模拟量相加,使其与数字量成正比。D/A转换器能够将数字信号转换为语音信号送SPEAKER端口输出。要使用A/D和D/A转换器,必须首先对A/D和D/A转换器进行初始化设置,即设置A/D转换器的工作模
11、式(15+1bit模式,16bit模式)、输入增益(0dB,6dB,12dB)以及抽样频率(8000Hz,16000Hz)等。3、FIR滤波器算法数字滤波器原理一般具有如下差分方程:y(n)=x(n-k)+ y(n-k) (1)式中x(n)为输人序列,y(n)为输出序列,和为滤波器系数,,N是滤波器阶数。当所有的均为零时,则有y(n)= x(n-k) (2)(2)式是FIR滤波器的差分方程,其一般形式为y(n)= h(k)x(n-k) (3)对(3)式进行z变换,整理后可得FIR滤波器的传递函数:H(z)= h(k) (4)FIR(Finite Impulse Response)滤波器,即有限
12、长单位冲激响应滤波器,是指系统的单位脉冲响应hk仅在有限范围内有非零值的滤波器。FIR数字滤波器的设计方法主要有窗函数法和频率抽样设计法,其中窗函数法是基本而有效的设计方法。下面为FIR滤波器的算法实现方法。FIR滤波为有限冲击响应滤波,其滤波结构是一个分节的延时线,每节的输出加权累加,得到滤波器的输出。由前面的分析知,FIR滤波器数学上可表示为:y(n)= h(k)x(n-k) (5)式(5)中 xn为最近(t=nT)的输人信号,xn-k是延时了k个取样周期的输人信号,hk是第k个延时的加权值(即滤波器系数),可由MATLAB设计出来,yn是时刻t=nT时滤波器的输出信号,N是滤波器的阶数也
13、称滤波器的抽头数,为实整数,且须满足N*t1/,其中为采样频率。因为该滤波器的冲激响应在N个周期后变为0也就是每次乘加运算都要用到之前N个数。滤波器系数可通过MATLAB设计得到。 4、LMS算法LMS(least-mean-square)算法,即最小均方算法,是由Widrow和Hof在1960年创建的,直到现在它还是应用最广泛的自适应滤波算法。LMS算法是随机梯度算法族中的一员。该算法在随机输入维纳滤波器递推计算中使用确定性梯度。LMS算法的一个显著特点就是它的简单性。此外,它不需要计算有关的相关函数,也不需要矩阵求逆运算。事实上,正是因为LMS算法的简单性,使得它成为其他自适应滤波算法的参
14、照标准。这两个过程一起工作组成一个反馈环,如下图所示。首先有一个横向滤波器(围绕它构造LMS算法),该部件的作用在于完成滤波过程。其次,有一个对横向滤波器抽头权值进行自适应控制过程的算法。横向滤波器各部分的细节如下图所示。抽头输入u(k),u(k-1),u(k-M+1),其中M+1是延迟单元的个数,这些输入张成一个多维空间。相应的(k), (k), ., (k)为抽头权向量h(k)的元素。通过LMS算法计算这个向量所得的值表示一个估计,当迭代次数趋于无穷时,该估计的期望值可能接近维纳最优解,在滤波过程中,期望响应d(k)与抽头输入向量z(k)一道参与处理。在这种情况下,给定一个输入,横向滤波器
15、产生一个输入,横向滤波器产生一个输出y(k)作为期望响应d(k)的估计。因此,我们可把估计误差e(k)定义为期望响应与实际滤波器输出之差,估计误差e(k)与抽头输入向量z(k)都被加到自适应部分,因此围绕抽头权值的反馈环是闭环的。5、利用DSP产生回波在打电话的过程中,常常能听见自己说话的声音在话筒里重复,实际上就是自己的声音泄露到了接收系统中。在一些特定的系统中出现这种现象将会对信号的正常收发产生不利影响。因此,回声在上述系统中会严重影响了通话的清晰度,多点回声甚至会引起通讯网之间声音的振荡。可通过设置时间的延迟,将过去的信号衰减加到现在的信号上,以产生回波。这次实验我们的回声信号定义为语音
16、信号的延迟再进行适当的衰减。即将麦克输入的语音信号叠加上述麦克输入语音信号的延时衰减后的信号,用此混合信号模拟真实的回波信号。因此回声通道的传输函数为:其中S为衰减,M为延迟点数。听到的回波是混合信号,此时不仅能听到自己的声音,也能听到几个衰减后叠加的回声,该回声为近端输入的延迟和衰减。回波产生程序如下:while (!MCBSP_RRDY(HANDSET_CODEC) ; /codec句柄如未准备好则等待dk = *(volatile u16*)DRR1_ADDR(HANDSET_CODEC); /从ADC读数bfi=dk; /放入缓冲区if(i=10000) i=0; *(volatile
17、 u16*)DXR1_ADDR(HANDSET_CODEC) = dk+bfi+1/2; /延迟+衰减6、利用自适应滤波实现回波对消声学回声消除的功能原理框图如下图所示:其基本原理可概括为,自适应地合成回声,并从有回声干扰地信号中减去该合成回声。一般回声消除算法通过自适应滤波来完成,其基本原理如下图所示:其中,远端信号x(k)通过回声信道h产生回声y(k),近端信号d(k)是由回声y(k)和近端声音信号(可包含噪声信号)得到。通过使用M抽头的FIR自适应滤波器来模拟回声信道h,可以使所得y(k)通近回声信号,进而达到回声消除的目的由此可见,回声消除的关键是自适应地调整使其通近h,可通过现有的各
18、种自适应滤波算法实现。这个实验采用的LMS算法,即最小均方误差算法设计的自适应滤波器进行未知系统识别,以将回声信号滤除。该自适应滤波器是FIR横向滤波器,可以根据输出自动修改滤波器的权系数,从而逼近未知系统回声通道。算法的实现基于TMS320C5402DSP芯片和CCS系统的C语言。 远端的信号通过回声通道产生回声信号d(n),该信号一般为远端信号的衰减和延迟。远端信号通过自适应滤波器产生回声预测信号y(n)。在k时刻,它们之差为剩余回声信号:用它来控制LMS自适应滤波器的系数(n)其中为自适应步长因子,一般取01,可视为常数,k时刻滤波器的输出为:以上三个方程是LMS最小均方误差算法的核心方
19、程,也是C语言编程的依据。LMS的算法流程图如下:结束开始送入信号dk求回声预测信号yk求剩余的求自适应步长u更新滤波器系数dk的值送入in(n)五、用C语言实现LMS算法由C语言实现LMS算法的C语言程序如下所示:double lms (double w,double x,double dk,double ek) /移植到CCS中的lms算法s16 i;double uek,yk;yk=0;for(i=0;iN;+i)yk=yk+wi*xi;ek=dk-yk;uek=2*mu*ek;for(i=0;iN;i+)wi=wi+uek*xi; return(ek);然而算法的效率与滤波器的长度有关
20、,因此应当适当减小滤波器的长度;同时也应该适当的提高FIR滤波器的阶数。同时替换原有的LMS算法的C语言实现程序,更换为CCS的diplib库中的函数short dlms(PARAM)取代自定的lms()函数,同时用dsplib库里的函数short fir(PARAM)产生回声通道的输出信号(也就是用预定阶数的FIR滤波器模拟回声通道),该输出信号作为自适应滤波器的理想输出信号,对之进行逼近进而得到预定结果。Dsplib库中的dlsm函数和fir函数的子程序:Dlsm.h的程序如下,路径:C:tic5400dsplibEXAMPLESDLMS/*/ Filename: dlms_t.c/ Ve
21、rsion: 0.01/ Description: test for dlms routine/*#include #include #include #include test.hshort i;short eflagr= PASS;short eflagh= PASS;void main(void) /* clear */ for (i=0;iNH;i+) hi =0;/ clear coeff buffer (optional) for (i=0;iNX;i+) ri =0;/ clear output buffer (optional) for (i=0; iNH; i+) dbuff
22、eri = 0; / clear delay buffer (a must) /* compute */ dlms(x,h,r,&dp,des,STEP, NH, NX); /* test */ eflagr = test(r, rtest, NX, MAXERROR);/ for r eflagh = test(h, htest, NH, MAXERROR);/ for h if (eflagr != PASS) exit(-1); if (eflagh != PASS) exit(-1); return;FIR.h的程序如下,路径:C:tic5400dsplibEXAMPLESFIR/*/
23、 Filename: fir_t.c/ Version: 0.01/ Description: test for fir routine/*#include #include #include #include test.hshort i;short eflag1= PASS;short eflag2= PASS;DATA *dbptr = &db0;void main(void) /* 1. Test for single-buffer */ /* clear */ for (i=0; iNX; i+) ri = 0; / clear output buffer (optional) for
24、 (i=0; iNH; i+) dbi = 0; / clear delay buffer (a must) /* compute */ fir(x, h, r, &dbptr, NH, NX); /* test */ eflag1 = test (r, rtest, NX, MAXERROR); /* 2. Tests for dual-buffer */ /* clear */ for (i=0; iNX; i+) ri = 0; / clear output buffer (optional) for (i=0; i=4) fir(x, h, r, &dbptr, NH, NX/4);
25、fir(&xNX/4, h, &rNX/4, &dbptr, NH, NX/4); fir(&x2*NX/4, h, &r2*NX/4, &dbptr, NH, NX/4); fir(&x3*NX/4, h, &r3*NX/4, &dbptr, NH, NX/4); /* test */ eflag2 = test (r, rtest, NX, MAXERROR); if (eflag1 != PASS) exit(-1); if (eflag2 != PASS) exit(-2); return;这两个函数是用C5000汇编语言编写的,具有很高的执行效率,使用这个函数可以大大提高运算速度,以
26、解决用C语言编写的程序效率不能满足要求的问题。下面以dlsm.h为例,其使用方法如下:short oflag = dlms (DATA *x, DATA *h, DATA *r, DATA *d, DATA *des, DATA step, ushort nh, ushort nx)其C子函数定义的各个变量的意义如下表所示: oflag溢出错误标志,为1时在计算过程中发生了数据溢出;为0时无数据溢出。x输入信号数组h自适应滤波器系数矢量r输出数组d延迟缓冲区,用来存放上一时刻的输出数据des理想输出信号数组step为了适应DSP定点数的运算一般取STEP为327nx向量x中的个数nh系数的个数
27、注意:h和d的存储地址要求起点必须位于Kbit边界处,即起始地址值的最低有效位必须是0,必须在CMD文件中开辟对齐1K边界的空间,并且只能在头文件中进行段的配置。否则编译无法通过。同理,FIR.h的使用方法如下:oflag = short fir (DATA *x, DATA *h, DATA *r, DATA *dbuffer, ushort nh, ushort nx)oflag溢出错误标志,为1时在计算过程中发生了数据溢出;为0时无数据溢出。x输入信号数组hFIR滤波器的系数矢量,也是要逼近的对象r输出数组d延迟缓冲区,用来存放上一时刻的输出数据nx向量x中的个数nh系数的个数注意:h、
28、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;jLENGTH_IN;+j) k=LENGTH_IN-j;xk=xk-1; /从低位压向高位x0=dk; / 当前采样值存入最低位六、用MATLAB设计FIR滤波器用MATL
29、AB设计FIR流程如下:打开MATLAB,在命令窗中输入fdatool,打开滤波器设计与分析工具。更改滤波器的各个参数值,因为语音信号的频率成分主要分布在300Hz到3400Hz,所以我们只要设计300Hz到3400Hz的带通FIR滤波器就可以实现对语音信号中掺杂的噪声的滤除。在FDA中选择带通FIR滤波器,阶数选择15,抽样频率选择16kHz,阻带截频分别为0.25 kHz和3.45 kHz,通带截频分别为0.3 kHz和3.4 kHz。点击“Desgin filter” 完成滤波器设计,滤波器的波形如下图所示。然后将设计好的结果导出为fir.h文件。下面就是导出的fir.h文件。/* *
30、Filter Design and Analysis Tool - Generated Filter Coefficients - C Source * Generated by MATLAB - Signal Processing Toolbox */* General type conversion for MATLAB generated C-code */#include tmwtypes.h/* * Expected path to tmwtypes.h * C:MATLAB6p5externincludetmwtypes.h */const int BL = 16;const re
31、al64_T B16 = -1737, -22, 494, -1762, -4117, -2011, 5080, 11684, 11684, 5080, -2011, -4117, -1762, 494, -22, -1737;七、程序设计实验中用到的源程序有以下几个:1.主程序(firlab.c)/*/* */ /* */* */* */*/#include #include #include #include #include #include #include void delay(s16 period);extern void DMAC2ISR();#define SS 16 /*/*
32、 全局变量 */*/HANDLE hHandset;unsigned int dmsefc,dmmcr,dmctr,src_addr,dst_addr;unsigned int dmpre,dmsrcp,dmdstp,dmidx0,dmidx1,dmfri0,dmfri1,dmgsa,dmgda,dmgcr,dmgfr;/*存放输入数据*/#pragma DATA_SECTION(inp_buffer,audio_buffer);int inp_buffer0x200;/*存放输出数据*/#pragma DATA_SECTION(out_buffer,outt_buffer);int out_
33、buffer0x200;int out1_buffer0x200;/*存放滤波器系数*/#pragma DATA_SECTION(coeffs,coefficients);/*低通滤波器*/DATA coeffs16= 0, -113, 419, -878, 1031, 0, -3731, 19656, 19656, -3731, 0, 1031, -878, 419, -113, 0;/*高通滤波器*/*这里COEFF的数据类型曾经是 int*/*带通滤波器*/*带阻滤波器*/*全通滤波器*/*存放延迟数据*/#pragma DATA_SECTION(delaybuff,delayb);in
34、t delaybuff16=0;int frame=0;int flag=0;int temp;int currbuff=0;int choose=1;int *delayptr1= &(delaybuff0);interrupt void DMAC2ISR();DATA ySS;double p,q,temp1;u16 fSS/2+1;int iii,mm;/*/* MAIN */*/void main()s16 cnt=2;BSCR=0x8806;XPC=0;PMST=0xA0;brd_set_cpu_freq(100);TIMER_HALT(0);brd_set_wait_states(
35、7,7,9);TIMER_RESET(0);IMR=0; /*计算滤波器的FFT*/ cbrev(coeffs,y,SS/2); rfft(y,SS,0);/*求信号的幅度谱*/ f0=abs(y0); fSS/2=abs(y1); mm=1; for(iii=2;iiiSS;iii=iii+2) p=yiii; q=yiii+1; temp1=sqrt(p*p+q*q);/取幅度谱 fmm=temp1; mm+; /*/*/if(brd_init_bios()return;while (cnt-)brd_led_toggle(BRD_LED0);delay(1000);brd_led_tog
36、gle(BRD_LED1);delay(1000);brd_led_toggle(BRD_LED2);delay(1000);hHandset=codec_open(HANDSET_CODEC);/*设置codec参数*/codec_dac_mode(hHandset,CODEC_DAC_15BIT);codec_adc_mode(hHandset,CODEC_ADC_15BIT);codec_ain_gain(hHandset,CODEC_AIN_6dB);codec_aout_gain(hHandset,CODEC_AOUT_MINUS_6dB);codec_sample_rate(hHa
37、ndset,SR_16000);INTR_CLR_FLAG(DMAC2);dma_reset_all();/*初始化DMA2通道*/dmsefc=(DSYNC_REVT112);dmmcr=(AUTOINIT_ENABLE15)|(DINM_ENABLE14)|(IMOD_HALFBLOCK13)|(CTMOD_DEC12)|(INDEXMODE_NOMOD8)|(SPACE_DATA6)|(INDEXMODE_INC2)|(SPACE_DATA);dmmcr=0xe045;dmctr= 0xFF;src_addr=DRR1_ADDR(HANDSET_CODEC);dst_addr=(unsi
38、gned int)&inp_buffer;dma_init(DMA_CH2,dmsefc,dmmcr,dmctr,SPACE_DATA,src_addr,SPACE_DATA,dst_addr);DMA_FRAMECOUNT(DMA_CH2,1);dmgsa=src_addr;dmgda=dst_addr;dmgcr=0xFF;dmgfr=1;dmpre=(HIGH_PRIORITY10)|(INTSEL_016);dmsrcp=SPACE_DATA;dmdstp=SPACE_DATA;dmidx0=0;dmidx1=0;dmfri0=0;dmfri1=0;dma_global_init(dm
39、pre,dmsrcp,dmdstp,dmidx0,dmidx1,dmfri0,dmfri1,dmgsa,dmgda,dmgcr,dmgfr);DMA_ENABLE(DMA_CH2);temp=*(volatile u16*)DRR1_ADDR(HANDSET_CODEC);INTR_ENABLE(DMAC2);INTR_GLOBAL_ENABLE;for(;);void delay(s16 period) int i,j;for(i=0;iperiod;i+) for (j=0;jperiod;j+);2.中断服务程序(dma2isr.c)#include#include#include#includeextern void del