dsp实现语音噪声滤波设计.doc_第1页
dsp实现语音噪声滤波设计.doc_第2页
dsp实现语音噪声滤波设计.doc_第3页
dsp实现语音噪声滤波设计.doc_第4页
dsp实现语音噪声滤波设计.doc_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

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

文档简介

语音噪声滤波DSP课程设计实 验 报 告语音噪声滤波院(系):电气工程及其自动化学院设计人员:房文博学号:311208002810成绩:工程设计50报告20答辩30总分评语:指导教师签字: 日期:目录一、设计任务书2二、设计内容3三、设计方案、算法原理说明3四、程序设计、调试与结果分析8五、设计(安装)与调试的体会11六、源程序代码12参考文献:27一、设计任务书1、设计背景 语音通信的目的是传递声音信息。位于甲地的通信者发出的声音经语音传感器变换成为电信号,经发送端设备变换为适合传输的形式,通过传输信道传输到乙地。在乙地经接收端设备恢复出原来的语音信号,经耳机或者喇叭转换为接收者可以听到的声音信号。这就是最基本的语音通信系统,但是由于周围环境的原因,我们采集到语音信号经常含有不同程度的噪声。典型语音通信系统中的噪声来自三个方面:信号处理设备产生的电噪声及传输信道中的电噪声; 信号发送端空间环境中的音频噪声信号经麦克风变换为电信号之后,与有用信号其同传递到接收端;信号接收端空间环境中的音频噪声对信号接收者的影响。噪声是由于发生体作无规则振动产生的。在很多情况下,环境中的背景噪声是通信系统中噪声干扰的主要来源。当语音信号受到背景噪声干扰时语音通信质量变得不可接受,因此要对语音信号中的噪声滤除。DSP利用直接存储器访问方式DMA(Direct Memory Access)采集数据时不打扰CPU,因此利用DMA方式工作时,CPU可以对语音信号进行实时地滤波。本设计要求利用DSP的DMA方式进行信号采集和信号输出,对语音信号进行数字编码,滤波后进行解码。2、设计要求及目标基本部分:(1)对DMA进行初始化;(2)对A/D、D/A进行初始化;(3)编写DMA中断服务程序和滤波算法程序,实现语音信号的实时滤波;发挥部分:(1)使用DSP产生带回波的语音信号; (2)利用自适应滤波实现语音信号的回波对消。3、设计思路首先利用DSP的DMA方式对外部含噪声的语音信号进行实时采集,语音信号先经过A/D转换为数字信号,利用MCBSP的接收寄存器接收数据。编写滤波算法程序,或调用DSPLIB中的滤波函数,对信号进行滤波。滤波后的数据利用DMA方式送到D/A转换器转换为模拟信号。4、要求完成的任务(1)编写C语言程序,并在CCS集成开发环境下调试通过;(2)将包含噪声的语音信号进行滤波,从扬声器输出端口输出,比较滤波前后的信号的变化;(3)按要求撰写设计报告。二、设计内容随着现代科学的蓬勃发展,人类社会愈来愈显示出信息社会的特点。通信或信息交换已成为人类社会存在的必要条件,正如衣食住行对人类是必要的一样。语音作为语言的声学表现,是人类交流信息最自然、最有效、最方便的手段之一。然而,人们在语音通信过程中不可避免地会受到来自周围环境和传输媒介引入的噪声、通信设备内部电噪声、乃至其他讲话者的干扰。这些干扰最终将使接收者接收到的语音不再是纯净的原始语音,而是被噪声污染过的带有噪声的语音信号。例如,汽车、街道、机场中的电话,常受到强背景噪声的干扰,严重影响通话质量。而环境噪声的污染使得许多语音处理系统的性能急剧恶化。例如,语音识别已取得重大进展,正步入使用阶段。但目前语音识别系统大多都是在安静环境中工作的,在噪声环境中尤其是强噪声环境,语音识别系统的识别率将受到严重影响。在上述情况下,必须加入语音增强系统,或者抑制背景噪声,以提高语音通信质量, 或者作为预处理器,以提高语音处理系统的抗干扰能力,维持系统性能。因此,语音增强技术在实际中有重要价值。目前,语音增强已在语音处理系统、通信技术、多媒体技术、数字化家电等领域得到了越来越广泛的应用。三、设计方案、算法原理说明1、信道干扰滤波部分首先利用DSP的DMA方式对外部含噪声的语音信号进行实时采集,语音信号先经过A/D转换为数字信号,利用MCBSP的接收寄存器接收数据。编写滤波算法程序,或调用DSPLIB中的滤波函数,对信号进行滤波。滤波后的数据利用DMA方式送到D/A转换器转换为模拟信号。这就是我们的设计思路。具体的设计方案原理图如下。模拟输入信号通过DSK的MIC端口输入,经A/D转换,然后到达DSP的DMA通道2,DSP接收到信号后,调用中断服务程序进行滤波,滤波后的信号可以在CCS上显示,也可以通过DMA通道3将信号输出到D/A转换器,经D/A转换后从SPEAKER端口输出。(1)直接存储器访问DMA直接存储器访问(Direct Memory Access)是C54x DSP非常重要的片上外设,DMA控制器可以在不影响CPU的情况下完成数据的传输,因此数据传输速度快,在要求信号实时采集和处理的系统中常采用DMA方式进行信号采集和传输。C5402有6个可独立编程的DMA通道,每个DMA通道受各自的5个16位寄存器控制:源地址寄存器DMSRC、目的地址寄存器DMDST、单元计数寄存器DMCTR、同步事件和计数寄存器DMSFC、发送模式控制寄存器DMMCR。目的地址寄存器DMDST规定DMA要传送数据目的地址和首地址。单元计数寄存器DMCTR规定DMA传送数据的个数为DMCTR寄存器的值加1。同步事件和桢计数寄存器DMSFC规定DMA传送数据的同步事件类型和传送一块数据所含桢信号的个数。发送模式控制寄存器DMMCR规定DMA通道的传输模式,当DMA工作在自动初始化模式时,CPU在一个DMA事件完成后自动装载下一个DMA初始化设置并继续进行数据传送。DINM位和IMOD位设置DMA中断产生方式。CTMOD位设置发送计数模式控制,CTMOD位为0时,DMA工作在多桢模式,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内部接收寄存器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源地址工作在不调整方式,选择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进行初始化配置。(2)A/D和D/A转换器本实验要用到A/D和D/A转换器。A/D转换器能够将接收的语音信号(模拟信号)转化为数字信号,供CPU进行处理;D/A转换器能够将数字信号转换为语音信号送SPEAKER端口输出。要使用A/D和D/A转换器,必须首先对A/D和D/A转换器进行初始化设置,即设置A/D转换器的工作模式(15+1bit模式,16bit模式)、输入增益(0dB,6Db,12dB)以及抽样频率(8000Hz,16000Hz)等。2、回波去噪部分初始化FIR延迟输出数组dbuffer_h、FIR输出数组、自适应滤波器系数矢量coff_w和自适应滤波器的输出数组out_w以及DSK板之后,采集输入的语音信号,根据模式的不同进行不同的处理以输出不同的信号来进行效果的比较。我们的做法是利用设置参数mode来改变板子的功能。mode=1时信号通过FIR滤波器后产生回声,为使现象更明显可以附加一个延迟;mode=2时用自适应滤波器逼近FIR滤波器以使之输出近似的信号,用信号通过两个系统产生的信号之差(即剩余回声)来调整自适应滤波器的系数,使剩余回声逐渐收敛于0。(1)自适应滤波器的基本原理:自适应滤波原理:利用前一时刻获得的滤波结果,自动调节现时刻的滤波器参数,以适应信号和噪声的未知特性,从而实现最优滤波。自适应滤波器主要由系数可调的数字滤波器和调整滤波器系数的自适应算法两部分构成自适应滤波器的一般结构如图l所示自适应滤波其最重要的性能是能有效地在未知环境中跟踪时变的输入信号,使输出信号达到最优。因而在电信、雷达、声纳、实时控制以及图像处理等领域都有成功的应用。常规滤波器具有特定的特性,对于输入信号根据这个滤波器特性产生相应的输出。也就是,先有了滤波器构成的权系数,然后决定相应输出值。但有些实际应用往往是反过来要求的,即对滤波器输出的要求是明确的,而滤波器特性是无法预先知道的。例如长话系统,回波相消器的理想输出是无回波信号,这个要求是明确的,而系统本身却不能一开始就确定下来,因为它取决于长话系统话路传输条件的变化,像这样的应用技术就必须依赖自适应滤波技术。图l中d(n)为期望响应,x(n)为自适应滤波器的输入,y(n)为自适应滤波器的输出, e(n)为估计误差,P(n)= x(n)-y(n)前置级完成跟踪信号的选择,确定是信号还是噪声;后置级根据前置级的不同选择对数字滤波器输出作不同的处理,以得到信号输出自适应滤波器的滤波器系数受误差信号e(n)控制,根据e(n)的值和自适应算法自动调整(2)回声消除器的基本原理:回声消除的基本原理是采用一个自适应滤渡器自动识别回声通道,通过自适应滤波算法的调整,使其冲激响应与实际回声路径逼近,从而得到回声预测信号y(n),再将预测信号从近端采样的语音信号d(n)中减去,即可实现回声消除。自适应算法要求收敛速度快、计算复杂度低、稳定性好和失调误差小。虽然许多自适应算法在理论上实现回声消除都是可行的,但通常采用的是较简单的算法。例如广泛应用的LMS自适应算法。(3)LMS算法:本设计中自适应算法是根据最小均方误差判据来设计的,即理想信号与滤波器输出之差的平方值的期望值最小,并且根据这个判据来修改权系数。均方误差表示为Ee2(n)=Ed(n)-y(n)2对于横向结构滤波器,代入y(n)的表达式,有= Ed2(n)+WT(n)RW(n)-2 WT(n)P其中,R = EX(n) XT(n)是N*N的自相关矩阵,它是输入信号采样值间的相关性矩阵。P = Ed(n) X(n)为N*1互相关矢量,代表理想信号d(n)与输入矢量的相关性。在均方误差达到最小时,得到最佳权系数W*=w0*, w1* , w2*, , wN-1*T。它应满足下列方程=0即 R*W-P=0显然,x(m)=x(n)x(n-m)是x(n)的自相关值,xd(R) =Ex(n)d(n-k)是x(n)与d(n)的互相关值。在有些应用中,把输入信号的采样值分成相同的段(每段称为一帧),再求出R和P估计值,以得到每帧的最佳权系数。这种方法称为块对块自适应算法。如语音信号的线性预测编码LPC,就是把语音信号分成帧进行处理的。R和P的计算,要求出期望值E,在实际运算中不易实现。为此,可通过下式进行估计:=用以上方法获得最佳W*的运算量很大,对于一些在线或实时应用的场合,无法满足其时间要求。大多数场合使用迭代算法,对每次采样值求出较佳权系数,称为采样值对采样值迭代算法。迭代算法可以避免复杂的R-1和P的运算,又能实时求得式的近似解,因而切实可行。LMS算法是以最快下降法为原则的迭代算法,即W(n+1)矢量是W(n)矢量按均方误差性能平面的负斜率大小调节相应一个增量。W(n+1)= W(n)-u(n)这个u是由系统稳定性和迭代运算收敛速度来决定的自适应步长。(n)为n次迭代的梯度。对于LMS算法,(n)是Ee2(n)的斜率。由式W(n+1)= W(n)-u(n),产生了求解最佳权系数的两种方法,一种是最陡梯度法。其思路为,设定初始权系数,用上式迭代公式计算,直到W(n+1)与W(n)误差小于规定范围。其中(n)的E计算,可用估计值表达式式中K的取值应该足够大。如果用瞬时-2e(n)X(n)来代替上式对-2E e(n)X(n)的估计运算,就产生了另一种算法随机梯度法,即Widrow Hoff的LMS算法。此时迭代公式为W(n+1)= W(n)+2u e(n)X(n)以上讨论的自适应算法都是基于Widrow Hoff的LMS算法。上式的迭代公式,假定滤波器结构为横向结构。对于对称横向型结构,也可推出类似的迭代公式W(n+1)= W(n)+2u e(n)X(n)+ X(n-N+1) 其中,X(n)=,而X(n-N+1)=。LMS算法流程图自适应控制可以看作是一个能根据环境变化智能调节自身特性的反馈控制系统以使系统能按照一些设定的标准工作在最优状态。一般地说,自适应控制在航空、导弹和空间飞行器的控制中很成功。可以得出结论,传统的自适应控制适合(1)没有大时间延迟的机械系统;(2)对设计的系统动态特性很清楚。但在工业过程控制应用中,传统的自适应控制并不如意。PID自整定方案可能是最可靠的,广泛应用于商业产品,但用户并不怎么喜欢和接受。传统的自适应控制方法,要么采用模型参考要么采用自整定,一般需要辨识过程的动态特性。它存在许多基本问题(1)需要复杂的离线训练;(2)辨识所需的充分激励信号和系统平稳运行的矛盾;(3)对系统结构假设;(4)实际应用中,模型的收敛性和系统稳定性无法保证。另外,传统自适应控制方法中假设系统结构的信息,在处理非线性、变结构或大时间延迟时很难。3、脉冲式滤波:我们的方式先求个点的平均值,然后根据实际,大于这个平均值的5倍以上的信号幅度进行衰减,这样可以在时域直接进行处理。进而得到需要的声音,将乱入的声音滤掉,保护听者。四、程序设计、调试与结果分析1、调试过程a、首先设计FIR滤波器。FIR滤波器的算法可以由MATLAB来设计。打开MATLAB,在命令窗中输入FDAtool,打开滤波器设计与分析工具。因为语音信号的频率成分主要分布在300Hz到3400Hz,所以我们只要设计4000Hz的低通FIR滤波器就可以实现对语音信号中掺杂的噪声的滤除。在FDA中选择带低通FIR滤波器,阶数选择15,抽样频率选择16kHz。就可以设计所要的滤波器了。然后将设计好的结果导出为fir.c文件。设计好滤波器后,还要进行对A/D和D/A以及DMA的初始化,并编写主程序和中断服务程序,以及控制调用中断时程序流向的中断向量表,详细内容请见程序清单。由于DSK5402板上存储器分配方式基本相同,所以 .cmd文件可以采用其他程序中的 .cmd文件。b、信号滤波部分:(1)通过MIC向计算机输入语音信号。但此种方式不能很好的听出声音到底有什么变化,因为其实板子的噪声即不准。所以最好是用输入正弦波再利用CCS看图形的方式。(2)编译滤波工程之前先在CCS下选择Tools/Linker Configuration,出现连接器配置对话框,选择Use the Visual Linker,然后再对程序进行编译。(3)编译通过则会产生Firlab.out文件,并可执行文件Firlab.out下载到DSP中。(4)在中断服务程序dmac2isr.c中的有效行上设置断点,以便观察图形。(5)选择Debug/Animate,激活程序。Animate=Run-Halt-Run。(6)在CCS中选择View/Graph/Time/Frequency,出现图形属性对话框。图形属性对话框中,Start Adress设置为输入变量名、Acquisition Buffer Size为十进制256、Display Data Size 为十六进制、DSP Data Type为16位有符号整形数,其它设置不变。确定后出现如下图所示时域波形。c、扩展回波对消部分:(1)由麦克将产生的语音信号输入到J5端口。J6端口接入音响或耳机,对比处理前后的语音信号。(2)编译滤波工程之前先在CCS下选择Tools/Linker Configuration,出现连接器配置对话框,选择Use the text Linker,然后再对程序进行编译。(3)通过设置mode的值,对不同算法处理过的信号分别观察。0代表产生输入原声;1代表产生带回波噪声的声音;2代表用自适应消除回波后的声音;3代表产生添加正弦频率噪音的信号;4代表用自适应方法滤除正弦噪音后的声音;5代表音调降低;6代表近音调升高;7代表滤除脉冲噪音(4)选择Debug/Animate,激活程序。Animate=Run-Halt-Run。(5)在程序运行过程中,输入语音信号分别进行语音输出观察。2、结果分析(1)理论上的滤波输入输出信号:实际信号:女变男:明显看出有失真。五、设计(安装)与调试的体会 这次的dsp实验我们可以用辛酸来形容,500多人排不到20块板子,必须要起个大早才可以用到板子,所以我们的用板时间真的不是太多.当然有我们前几天的大意这方面的因素,后来当我们把理论知识研究到一定深度的准备实践的时候,实验室已经门可罗雀了,唉 我们的辛酸的借板子的历程就开始了.虽然资源不够,但这同样给与了我们提高,锻炼了我们非常娴熟的调试技术,可以用神速来形容我们俩生成工程的速度!所以,什么样的情况都是一种经历,这种艰苦的经历对于我们更是一种锻炼和提高,对于我们这种从小没怎么吃苦的孩子们也是一次额外的经历,也许到了我们老了,还会想起交大小学期排板子的经历.那时我们俩要是一起聊天,一定会相视一笑的因为本课题的基本语音滤波部分杨老师在课上给予了我们讲解,因此我们就在原本的基础上进行改善和增加拓展。因为课题要求是进行语音滤波,因此我们一开始从通道的初始化使能着手,然后了解到整个程序模板中真正对采集到的音频信号进行滤波的是中断服务程序,这与我们学得单片机有惊人的类似. 所以这方面的初始化,我们还是掌握的不错的,但是dma寄存器实在是太多了,我们只能照着书一点一点的翻,一点一点的写,当然书上的初始化程序还是给的很细,我们也借鉴了很多,但我们想,这些都是死的.我们没有必要在这上面浪费很多时间,还是以理解为主吧之后就是研究中断中具体的滤波程序了,我们是从噪声的种类角度下手,一点一点的进行的,考虑了很多噪声,这在报告的前面部分中也都提到了,然后我们就研究具体的解决办法,一步一步地下手.再查找具体的滤波函数的时候,我们也发现我们的数学水平真的还欠缺,或者说我们很强的耐心看很长的数学公式,这在日后的学习过程中还待加强阿接着,我们在原来的基础上,想到了变声。我们最初想对实时滤波处理过后的个语音样本点间的距离进行适当的拉长和压短,这样应该就会产生一定的变声。因为女生普遍比男生发生的频率高,这样音调高,所以对语音样本点间的距离进行压缩后,就能将一段男声近似变成“女声”;同理,对语音样本点间的距离进行拉长后,这样频率变低,就相应地实现女声变“男声”。最后经过反复实验,我们做出了近似变声功能。然后,我们用自适应滤波器滤除回波。比对了几种自适应滤波器后,我们最终决定采用滤波器进行滤波,最后我们用了将近一天的时间的参数使用和定义搞清楚。一开始我们遇到了不小的麻烦,不管怎么样都不出声,最后我们想到参考资料上介绍的是用采集方式,数据一个一个的采集,而我们用的是传输,是一串一串的采集,所以我们猜想是不是自适应滤波器的步长参数设置得过低,使得其自适应的过程中容量不够,因此我们尝试着将步长由原来的该为,最后一试还真的实现了回波消除。用板的一个语音输入端模拟一方的电话用户,而再用软件产生一个接近的正弦信号模拟另一端用户传来的语音,将这两端传来的信号叠加在一起后就类似于我们日常通话中能听到自己回声的现象,再采用自适应滤波,滤除一方信号后就能实现回声消除!最后我们自己模仿了脉冲噪音的形式,自己录制了一段声音,然后想在MODE7中应用阈值滤波法滤波,但是因为时间有限,主要是因为板子太少,在我们答辩以前,我俩还没有利用板子尝试过,但是我们的原理很清晰,并准备在答辩时现场尝试。综上,就是我们对这次实验的感想,最后我们表达一下对小学期的情感.虽然说这小学期比上课还要累,但我们从理论逐步向实践过渡了,把两门信号处理的大课的知识结合到实践中去做了.我们不再是只会算题的学生了,更像是两个工程师,虽然研究的东西不太高端,但对我们应经是受益匪浅了,用一句玩笑来形容就是,这些实践为我们回去和朋友吹嘘自己在大学学到了什么提供了很强的说服力.最后的最后,感谢杨老师为我们上课打下的最原始的基础,感谢那些借我们板子的可爱的同学们,更要感谢学院开设这么有意义的课.六、源程序代码1、FIRlab.C/*/* FIRlab.C AIC,McBSP,DMA initialization for FIR lab Filter */ /* */* Goal: This code performs the following functions: */*- toggle the three LEDs on the DSK */*- setup AIC (CODEC) parameters */* - initialize DMA Channel (CH2-input) */*- turn on interrupts */*- run forever (waiting for DMA interrupts to transfer data) */* */* Author: Scott Bland Date: 03/20/2000 */*/ /*/* Include Files */*/#include #include #include #include #include #include #include #include timer.h#include #include /*/* Function Prototypes */*/void delay(s16 period);extern void DMAC2ISR();/*/* Global Variables */*/HANDLE hHandset;unsigned int dmsefc, dmmcr, dmctr, src_addr, dst_addr;unsigned int dmpre, dmsrcp, dmdstp, dmidx0, dmidx1, dmfri0, dmfri1, dmgsa, dmgda, dmgcr, dmgfr;/* Create specific data section for buffer (symbol, section_name) */#pragma DATA_SECTION(inp_buffer,audio_buffer);int inp_buffer0x200;/* Create specific data section for buffer (symbol, section_name) */#pragma DATA_SECTION(out_buffer,outt_buffer);int out_buffer0x200;/* Create specific data section for coeffiecients */#pragma DATA_SECTION(coeffs,coefficients);/* Low Pass Filter fs=16000 fc=4000Hz*/ int coeffs16= -79, -136, 312, 654, -1244, -2280, 4501, 14655, 14655, 4501, -2280, -1244, 654, 312, -136, -79; /* High Pass Filter */ / int coeffs16=-120,5245,-3421,2451,-11216,40,-24657,29610,29610,-24657,40,-11216,2451,-3421,5245,-120; /* Band Pass Filter */ /* int coeffs16=921,-2494,137,-3654,-2485,-2063,-9015,16165,16165,-9015,-2063,-2485,-3654,137,-2494,921; */* Band Stop Filter */* int coeffs16=491,165,-2159,772,-6697,10044,648,12297,12297,648,10044,-6697,772,-2159,165,491; */ /* All Pass Filter */* int coeffs16 =32767,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0; */int highpass16=-848, -1129, -1496, -2000, -2754, -4053, -6980, -21279, 21279, 6980, 4053, 2754, 2000, 1496, 1129, 848; /* Create specific data section for delay buffer */#pragma DATA_SECTION(delaybuff,delayb);int delaybuff16=0; int delaybuff116=0;/* declare and initialize two variables for DMAC ISRs */int frame=0; int flag=0;int temp; int a,b;int bf10x3000=0;/* delayptr holds the address of the start of the delay buffer */ int *delayptr1 = &(delaybuff0); int *delayptr2 = &(delaybuff10); interrupt void DMAC2ISR();/*/* MAIN */*/void main() s16 cnt=2;a=8;b=6;/* These are the items that BIOS will set when we use it */ BSCR = 0x8806; XPC = 0; PMST = 0xA0; brd_set_cpu_freq(100); TIMER_HALT(0); brd_set_wait_states(7, 7, 9); TIMER_RESET(0); IMR=0;/禁止所有中断/* - */if(brd_init_bios() return; while(cnt-)brd_led_toggle(BRD_LED0);/切换LED指示灯的显示状态delay(1000);brd_led_toggle(BRD_LED1);/切换LED指示灯的显示状态delay(1000);brd_led_toggle(BRD_LED2);/切换LED指示灯的显示状态delay(1000); /* 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_6dB); /* 6dB gain on analog input to ADC */ codec_aout_gain(hHandset, CODEC_AOUT_MINUS_6dB); /* -6dB gain on analog output from DAC */ codec_sample_rate(hHandset,SR_16000); /* 16KHz sampling rate */* Clear IFR */ INTR_CLR_FLAG(DMAC2);/* Reset all DMA channels */ dma_reset_all();/* Initialize DMA channel 2 */ dmsefc = (DSYNC_REVT1 12);/DMA与McBSP1接收事件同步 dmmcr = (AUTOINIT_ENABLE 15) | (DINM_ENABLE 14) | (IMOD_HALFBLOCK 13) | (CTMOD_DEC 12) | (INDEXMODE_NOMOD 8) | (SPACE_DATA 6) | (INDEXMODE_INC 2) | (SPACE_DATA);/设置传输控制模式寄存器DMMCR/15bit AUTOINIT_ENABLE=1 使能自动初始化/14bit DINM_ENABLE=1 根据IMOD位产生中断/13bit IMOD_HALFBLOCK=1 帧和块结束时都产生中断/12bit CTMOD_DEC=0 减量计数模式(多帧模式)/10-8bit INDEXMODE_NOMOD=000 源地址模式No modify /7-6bit SPACE_DATA=01 源地址空间为数据空间/4-2bit INDEXMODE_INC=01 目的地址模式, 传输之后加/1-0bit SPACE_DATA=01 目的地址空间为数据空间 dmctr = 0xFF;/单元记数,期望传输数据减1 src_addr = DRR1_ADDR(HANDSET_CODEC);/将MCBSP1的接收寄存器设为源地址 dst_addr = (unsigned int) &inp_buffer;/目的地址为数组inp_buffer,即接收到的数据存放在inp_buffer中 dma_init(DMA_CH2, dmsefc, dmmcr, dmctr, SPACE_DATA, src_addr, SPACE_DATA, dst_addr);/* Set number of frames for channel 2 */ DMA_FRAMECOUNT(DMA_CH2, 1); /* Set up global autoinit registers for DMA CH2 Input */ dmgsa = src_addr;/将通道源地址赋给全局源地址重载寄存器 dmgda = dst_addr;/将通道目的地址赋给全局目的地址重载寄存器 dmgcr = 0xFF;/将通道单元记数寄存器的值赋给全局单元记数重载寄存器 dmgfr = 1;/将通道帧记数寄存器的值赋给全局帧记数重载寄存器 /* Set up global priority and enable control register for Ch2 */ dmpre = (HIGH_PRIORITY 10) | (INTSEL_01 6);/DMA通道优先级最高,中断分配控制位给DMA2 dmsrcp = SPACE_DATA;/源地址为数据空间 dmdstp = SPACE_DATA;/目的地址为数据空间 dmidx0 = 0;/给单元地址索引寄存器赋值 dmidx1 = 0;/给单元地址索引寄存器赋值 dmfri0 = 0;/给帧地址索引寄存器赋值 dmfri1 = 0;/给帧地址索引寄存器赋值 dma_global_init(dmpre, dmsrcp, dmdstp, dmidx0, dmidx1, dmfri0, dmfri1, dmgsa, dmgda, dmgcr, dmgfr);/* Enable channel 2 */ DMA_ENABLE(DMA_CH2); /* prime the serial port to begin input buffer stream */ temp = *(volatile u16*)DRR1_ADDR(HANDSET_CODEC); /* Enable DMAC2 interrupt */ INTR_ENABLE(DMAC2); /* Enable Global Interrupts */ INTR_GLOBAL_ENABLE;/* Endless loop waiting for DMAC2 interrupt */ for(;);interrupt void timer0_isr(void)a+;interrupt void timer1_isr(void)b+;void interrupt_init(void)IFR|=0x0ffff;/clear all interrupt flagIMR|=0x0003;/enable timer0 interrupt/PMST=PMST&0x007f|0x4000;/set IPTRPMST=0x4020;/set IPTRasm( RSBX INTM );/enable all interrupt/*/* delay() */*/void delay(s16 period) int i, j; for(i=0; iperiod; i+) for(j=0; jperiod; j+); 2、dmac2isr.c(中断服务程序)#include #include #includeextern void delay(s16 period);externunsigned int channel; /*IN: DMA channel number */externunsigned int dmsefc; /*IN: Value to set sync & fr reg */externunsigned int dmmcr; /*IN: Value to set mode control reg */externunsigned int dmctr; /*IN: Value to set element count reg */exter

温馨提示

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

评论

0/150

提交评论