DSP课程设计实验报告语音压缩、存储和回放2目录一、设计任务书封面…………………………………………………1二、设计内容与要求…………………………………………………3三、设计算法原理说明………………………………………………4四、程序设计、调试与结果分析……………………………………7CMD程序,C语言程序……………………………………………7调试过程…………………………………………………………15波形与数据显示…………………………………………………16五、设计(安装)与调试的体会……………………………………17六、参考文献…………………………………………………………183语音的压缩、存储与回放一、设计要求与目标(1)使用DSP实现语音压缩和解压缩的基本算法,算法类型自定,例如可以采用G.711、G.729等语音压缩算法。(2)采用A/D转换器从MIC输入口实时采集语音信号,进行压缩后存储到DSP的片内和片外RAM存储器中,存储时间不小于10秒。(3)存储器存满之后,使用DSP进行实时解压缩,并从SPEAKER输出口进行回放输出。(4)使用指示灯对语音存储和回放过程进行指示。发挥部分:使用多种算法进行语音的压缩、存储和解压缩,比较它们之间的优缺点。二、实验目的1、通过本实验掌握5402DSP片上外设多通道缓冲串行口mcbsp。2、学习掌握tlc320ad50CODEC编译码器的内部结构、工作原理。3、学习A律语音压缩以及C语言下的编程方法。三、实验原理1.语音采集与输出模块语音采集与输出模块采用的是TI公司推出的一款高性能的立体声音频Codec芯片TLC320AD50C,内置耳机输出放大器,支持MIC和LINEIN两种输入方式(二选一),且对输入和输出都具有可编程增益调节。AD50的模数转换(ADCs)和数模转换(DACs)部件高度集成在芯片内部,采用了先进的Sigma-delta过采样技术,可以在8K到96K的频率范围内提供16bit、20bit、24bit和32bit的采样,ADC和DAC的输出信噪比分别可以达到90dB和100dB。与此同时,AD50还具有很低的能耗,回放模式下功率仅为23mW,省电模式下更是小于15uW。由于具有上述优点,使得AD50是一款非常理想的音频模拟I/O器件,可以很好的应用在随声听(如CD,MP3……)、录音机等数字音频领域[2]。由TLC320AD50C组成的语音输入与输出模块不仅采样率高最高可达96K,且外围电路简单,性价比高。2.语音编码(1)概念:语音编码一般分为两类:一类是波形编码,一类是被称为“声码器技术”的编码。PCM编码即脉冲编码调制。波形编码的最简单形式就是脉冲编码调制(Pulsecodemodulation),这种方式将语音变换成与其幅度成正比的二进制序列,而二进制数值往往采用脉冲表示,并用脉冲对采样幅度进行编码,所以叫做脉冲编码调制。脉冲编码调制没有考虑语音的性质,所以信号没有得到压缩。(2)量化:脉冲编码调制用同等的量化级数进行量化,即采用均匀量化,而均匀量化是基本的量化方式。但是均匀量化有缺点,在信号动态范围较大而方差较小的时候,其信噪比会下降。国际上有两种非均匀量化的方法:A律和u律,u律是最常用的一种。在美国,7位u律是长途电话质量的标准。而我国采用的是A律压缩,而且有标准的A律PCM编码芯片。(3)DPCM&ADPCM:降低传输比特率的方法之一是减少编码的信息量,这要消除语音信号中的冗余度。相邻4的语音样本之间存在明显的相关性,因此对相邻样本间的差信号进行编码,便可使信息量得到压缩。因为差分信号比原语音信号的动态范围和平均能量都小。这种编码叫DifferentialPCM,简称DPCM,即差分脉冲编码调制。ADPCM即自适应差分脉冲编码调制,是包括短时预测的编码系统。CCITT(国际电报电话咨询委员会)在1984年提出的32kbit/s的编码器建议就是采用ADPCM作为长途传输中的国际通用语音编码方案。这种ADPCM编码方案达到64kbit/sPCM的语音传输质量,并具有很好的抗误码性能。(4)a律压缩a律压缩示意图A律压缩编码表A律压缩编码表线性输入编码压缩编码0000000wxyza000wxyz0000001wxyza001wxyz000001wxyzab010wxyz00001wxyzabc011wxyz0001wxyzabcd100wxyz001wxyzabcde101wxyz01wxyzabcdef110wxyz1wxyzabcdefg111wxyz采用DSP可以直接对PCM编码后的语音信号进行μ律和A律压缩。图1是DSP硬件实现数据压缩解压的简单流程,DSP将传输来的压缩后的数据进行解压成16位或者32位,然后对解压后的数据进行分析、处理,最后将处理后的数据按照要求压缩成8位的数据格式输出到相应设备,供其他设备读取。5图1数据压缩解压流程图2是DSP将数据解压的值,DSP将压缩的8位数据解压成16位的DSP通用数据格式,其中高13位为解压后的数据,低3位补0。这是因为6.711的A律压缩只能对13位数据操作。DSP将解压后的数据放在缓冲串口的发送寄存器中,只要运行发送指令,缓冲串口就会将数据发送出去。缓冲串口对接收数据的解压过程和压缩过程完全相反。图3是μ律数据解压的示意图。图2A律数据解压图3μ律数据解压DSP内部的缓冲串口(McBSPs)带有硬件实现的μ律/A律压缩解压,用户只需要在相应寄存器中进行设置就可以了。在进行A律压缩时,采样后的12位数据,默认其最高位为符号位,压缩时要保持最高位即符号位不变,原数据的后11位要压缩成7位。这7位码由3位段落码和4位段内码组成。具体的压缩变换后的数据根据后11位数据大小决定。表2A律数据压缩表6除对串行口数据实现压扩处理外,这套硬件在McBSP不使用时还可以当作一个特殊的处理单元对内部数据实现压扩处理,他有两种实现方法。法一:当串行口的发送和接受部分都处于复位状态时,DRR1和DXR1内部通过压扩逻辑连接在一起,数据从DXR1写入并根据XCOMPAND处理,然后根据RCOMPAND再处理,在4个CPU时钟后从DRR1中读出数据。该处理比软件实现快,不利之处在于处理完后没有同步信息通知CPU和DMA。法二:在数据环回模式下,McBSP也实现了一种内连。数据处理与第一种方法相同,但它可以提供中断信号(或同步事件)给CPU(或DMA)。这里数据处理的时间是根据串行口的比特律确定的。另外,在通常情况下McBSP先传输信号的高位后传输低位,但是在字长为8比特的数据传输时,McBSP提供了比特倒序的功能,即可以先传输低位后传输高位。在本实验中,我们通过软件编程来完成线性码转换成A律。语音信号通常是小信号概率大,大信号出现的概率小,为提高小信号时的量化信躁比,压缩比特速率,可为非线性量化。语音压缩是把16位的数据比特转化为8位数据比特,从而到达语音压缩的目的。在主程序中通过A/D抽样量化,可以得到16位的线性编码,再由编码表通过软件计算得到8位A律编码,其中最高位为符号位,第6位到第4位为段落码,低4位为段内码。将8位的压缩结果存储到系统RAM中进行缓存,根据抽样率、语音存储时间以及系统RAM的容量设置语音存储缓冲区的大小,待缓冲区存满后,将缓冲区内的数据进行解压缩,然后输出到SPEAKER接口输出端。若使用A/D转换器,必须首先对A/D转换器进行初始化设置,即设置A/D转换器的工作模式、输入增益以及抽样频率等。3.程序设计(1)、程序流程7存储器的分配(5402.cmd)MEMORY{PAGE0:VECS:origin=0080h,length=0080h/*InternalProgramRAM*/PRAM:origin=7600h,length=8000h/*InternalProgramRAM*/PAGE1:SCRATCH:origin=0060h,length=0020h/*ScratchPadDataRAM*/DMARAM:origin=0C00h,length=0300h/*DMAbuffer*/DATA:origin=1100h,length=0080h/*InternalDataRAM*/STACK:origin=1180h,length=0560h/*StackMemorySpace*/INRAM:origin=1900h,length=0100h/*InternalDataRAM*/HPRAM0:origin=1A00h,length=0002h/*HPImemoryaccessiblebyHostandDSP*/HPRAM1:origin=1A02h,length=0280h/*HPImemoryaccessiblebyHostandDSP*/HPRAM2:origin=1C82h,length=0280h/*HPImemoryaccessiblebyHostandDSP*/EXRAM:origin=1F10h,length=9000h/*ExternalDataRAM*/初始化DSP及串行口初始化A/D转换器D/A转换器语音经A/D转换器输入数据压缩数据存储解压缩经D/A转换器回放结束开始8}SECTIONS{.cinitPRAMPAGE0.textPRAMPAGE0.vectorsVECSPAGE0init_varPRAMPAGE0detectPRAMPAGE0vrcprgPRAMPAGE0matprgPRAMPAGE0.stackSTACKPAGE1.trapSCRATCHPAGE1.constEXRAMPAGE1.dataEXRAMPAGE1.bssEXRAMPAGE1.cioEXRAMPAGE1.switchEXRAMPAGE1tablesEXRAMPAGE1varEXRAMPAGE1svctabEXRAMPAGE1/*SS_VLSPtable*/vctabEXRAMPAGE1/*VLSPtable*/uvctabEXRAMPAGE1/*UVLSPtable*/cuvtabEXRAMPAGE1/*Stochasticcodebook*/cdbktabEXRAMPAGE1/*variouscodebooktables*/logtabEXRAMPAGE1/*tableforlog2*/powtabEXRAMPAGE1/*tableforpow2*/hamtabEXRAMPAGE1/*tableforhamming*/lgwtabEXRAMPAGE1/*tableforlagwindow*/acostabEXRAMPAGE1/*tableforarccos*/sqrtabEXRAMPAGE1/*tableforsquareroot*/acbtabEXRAMPAGE1/*tableforthresholdsinacb*/pm03tabEXRAMPAGE1/*tableforx^(-0.3)computation*/costabEXRAMPAGE1/*tableforcosine*/V23INRAMPAGE1FSKINRAMPAGE19hpibuff0HPRAM0PAGE1hpibuff1HPRAM1PAGE1hpibuff2HPRAM2PAGE1dma_buffDMARAMPAGE1}/*主程序设计*//*语音采集及回放程序*//*用A律进行压缩及解压*//*采用AD50进行A/D,D/A转换*//*灯循环闪烁程序开始*//*L0:录音*//*L1:放音*/#includetype.h/*头文件*/#includeboard.h#includecodec.h#includemcbsp54.h/*宏定义*/#defineSIGN_BIT(0x80)/*SignbitforaA-lawbyte.*/#defineQUANT_MASK(0xf)/*Quantizationfieldmask.*/#def