《语音压缩、存储和回放(共25页).doc》由会员分享,可在线阅读,更多相关《语音压缩、存储和回放(共25页).doc(25页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上DSP技术课程设计报告-语音信号的压(解)缩、存储与回放指导教师: 高海林 班 级: 自动化0605班 姓 名: 王之秋 学号: 目录一、实验目的2二、实验内容2三、实验装置介绍2四、实验方案、算法原理说明8五、程序设计9 六、调试及结果分析21七、程序调试过程的问题 26八、实验总结27九、参考文献 27一、实验目的1、学习并掌握5402DSP片上外设多通道缓冲串行口MCBSP的内部结构和工作原理。2、学习并掌握TLC320AD50CODEC编译码器的内部结构和工作原理。3、使用C语言对MCBSP和CODEC的编程方法。4、熟练使用软件CCS5000对程序的完整调试
2、过程。二、实验内容 (1)编程实现语音信号的采集,压缩,存储,解压缩与回放语音信号的基本算法。 (2)创建、编译、链接工程项目,在5402 DSK 板上调试运行。(3)采用A/D转换器从MIC输入口实时采集语音信号,进行压缩后存储到DSP的片内和片外RAM存储器中。(4)存储器存满之后,使用DSP进行实时解压缩,并从SPEAKER输出口进行回放输出。三、实验装置介绍1、多通道缓冲串行口MCBSP(1) 结构及工作原理C5402 具有2 个高速的全双工同步串行口,可用来与系统中的其它C54x 器件、编码解码器、串行A/D、D/A 转换器以及其它的串行器件直接接口。这两个串行口均为多通道缓冲串行口
3、McBSP(Multi-channel Buffered Serial Port)。它支持全双工通信,双缓冲数据寄存器,允许连续的数据流,可以与工业标准的编/解码器、AICs 接口。支持多种方式的传输接口,如T1/E1 帧协议、MVIP 帧方式、H.100 帧方式、SCSA 帧方式、IIS 兼容设备等。可与多达128 个通道进行收发。支持传输的数据字长可以是8bit、12bit、16bit、20bit、24bit 或32bit。内置-律和A-律压扩硬件。其硬件结构图如图1所示: 图1 MCBSP接口提供了以下7个引脚信号用于与其他设备的通讯:DR: 串行数据接收引脚,输入DX: 串行数据发送引
4、脚,输出CLKX:发送时钟,输入或输出,可编程CLKR:接收时钟,输入或输出,可编程FSX: 发送帧同步信号,输入或输出,可编程FSR: 接收帧同步信号,输入或输出,可编程CLKS:外部时钟,输入数据发送通过DX,数据接收通过DR,串行口的控制信息(帧同步和时钟)从CLKX、CLKR、FSX 和FSR 获得,CLKS 为外部时钟源。CPU 和DMA 控制器通过内部外设总线对MCBSP 进行访问,从数据接收寄存器(DRR1,2)中读取数据,往数据发送寄存器(DXP1,2)写数据。数据从DR 引脚进入DSP,首先存放在接收移位寄存器RSR1,2中,当一个完整的字接收完毕后,结果将被复制到接收缓冲寄
5、存器RBR1,2,最后再由RBR1,2复制到DRR1,2中,供CPU 和DMA 控制器访问。写操作与读操作相仿,数据首先写入DXR1,2,然后送入发送移位寄存器XSP1,2,通过移位最后送到DX。从结构上可以看出发送和接收部分相对独立,所以可实现全双工通信。读写操作涉及到的DRR2、RBR2、RSR2、DXR2 和 XSR2 等寄存器在数据格式超过16 比特时才使用。MCBSP 在顺利发送和接收到数据后,可以给CPU 和DMA 控制器发送消息,通知它们及时的进行数据处理。(2) 多通道缓冲串行口MCBSP在CCS 集成开发环境下的相关头文件在CCS 集成开发环境中,与MCBSP相关的头文件有:
6、regs54xx.h、mcbsp54.h。在这两个头文件中,定义了MCBSP串口的寄存器资源以及使用方法。在reg54xx.h 头文件中,定义了MCBSP 中寄存器的地址和基本访问方式,以及寄存器的各个比特域和访问方法。在mcbsp54.h 头文件中,定义了与MCBSP 相关的宏函数(MACRO FUNCTIONS)和函数。Regs54xx.h、mcbsp54.h 这两个头文件是C 语言下对MCBSP 编程的基础,我们不仅可以用在5402 DSK 板的编程上,而且可以用在其它的C54X 的DSP 硬件编程上。2、TLC320AD50 CODEC 编译码器(1)内部结构及工作原理TLC320AD
7、50C 是TI 公司生产的一个SIGMA-DELTA 型的16 位A/D、D/A 转换电路,它的采样速率最高可达22.05kb/s,内含抗混叠滤波器和重构滤波器,属于模拟接口芯片(AIC),它有一个能与多种DSP 芯片相连的同步串行通信接口,其采样速率可通过DSP 编程来设置。在DAC 之前有一个插值滤波器以保证输出信号平滑,在ADC 之后有一个抽取滤波器以提高输入信号的信噪比。AD50C 片内还包括一个定时器(调整采样率和帧同步延时)和控制器(可编程的增益放大器,锁相环PLL,通讯协议等)。AD50 有28 脚的塑料SOP 封装(带DW 后缀)和48 脚的塑料扁平QFP 封装(带PT 后缀)
8、,体积较小,适用于便携设备。AD50C的工作温度范围是070,单一5V 电源供电或5V 模拟电源和3.3V 数字电源供电,工作时的最大功耗为120 mW。AD50 的内部结构简图如下所示: 图2上图最上面第一通道为模拟信号输入监控通道,第二通道为模拟信号转化为数字信号(A/D)通道,第三通道为数字信号转化为模拟信号(D/A)通道,最下面一路是AD50 的工作时钟和采样频率控制通道。输入时钟(MCLK)一般为8.192MHz,A/D 与D/A 的采样频率为MCLK/(128*N)Hz(N 为AD50C 的第4 个寄存器46 位所设)。AD50内部有7个数据和控制寄存器,用于编程控制它们的工作状态
9、。 寄存器0:空操作寄存器。 寄存器1:软件复位 ,软件掉电,选择16位或15位工作方式,硬件或软件二次通信请求方式的选择。 寄存器2:使能ALTDATA输入端 ,为ADC选择16/15位方式 。寄存器3:选择FS与FSD之间延迟SCLK的个数,告诉主机有几个从机被联上 。寄存器4:为输入和输出放大器选择放大器增益 ,选择N来设置采样频率,fs=MCLK/(128*N)或MCLK/(512*N),在MCLK输入端使能外部时钟输入并旁通内部的PLL 。寄存器5,6:保留 AD50与C5402之间的数据传送采用串行方式,包括两种传输模式:16位和15+1位传输模式。15+1位模式时,其中的D0位表
10、示二次通信。它们各自的时序如下: 图3 仅有首次通信时的ADC通道时序注:A,16位或15位工作方式是通过控制寄存器2来编程实现的。 B,M/S用来表明15位的数据是来自主机还是从机。C,最高位MSB(D15)在SCLK第一个周期的下降沿稳定,最低位(D0,M/S)在SCLK第16个周期的下降沿稳定。 图4 有首次通信和二次通信的ADC通道时序注:A,二次通信时的M/S位(DS15)用于表明在设置了读位后寄存器数据(地址和内容)是来自主机还是从机。在寄存器读期间,DS7-DS0位是指定寄存器的内容,在寄存器写期间,DS7-DS0为0。 AD50的数据传输模式和采样速率都可以通过DSP对其控制寄
11、存器的编程来实现,因此,在许多场合下,AD50都作为DSP的AIC来实现音频处理。 (2) 与AD50有关的相关头文件在CCS 集成开发环境中,与tlc320ad50 CODEC 编译码器相关的头文件是codec.h。它位于C:tic5400dsk5402include 目录下。在这个头文件中,定义了与ad50 CODEC 相关的枚举变量和库函数。除了可以调用codec.h 中提供的库函数之外,我们还可以利用这些枚举变量重新编写自己的codec 函数,使用枚举变量相或产生所需要的ad50 寄存器的初始化值。Codec.h 中的库函数位于函数库dsk5402.lib 和 drv5402.lib
12、中。函数库dsk5402.lib 和 drv5402.lib 是作为两个单独的文件,连同include 文件和头文件一起提供给用户的,如果你的应用程序中用到了其中的库函数,就需要与这两个函数库进行链接(link)dsk5402.lib 是一个主要的函数库,其内部使用了drv5402.lib 的头文件。应该注意的是有些库函数与DSP/BIOS 并不兼容,因为它们修改了中断向量表中中断服务程序的入口地址。3、u_LAW/a_LAW的压扩硬件处理 在通信中常常利用u律和a律对数据进行压扩处理,TMS320C54X在McBSP中提供了专门的硬件实验这一功能。压扩处理时,CPU访问到的都是16位的,他分
13、别是利用线性的14位数据(u律)和13位(a律)数据左对齐获得的。压扩硬件结构图5和相应的数据如下图6所示。图5图6除对串行口数据实现压扩处理外,这套硬件在McBSP不使用时还可以当作一个特殊的处理单元对内部数据实现压扩处理,它有两种实现方法。方法一:当串行口的发送和接受部分都处于复位状态时,DRR1和DXR1内部通过压扩逻辑连接在一起,数据从DXR1写入并根据XCOMPAND处理,然后根据RCOMPAND再处理,在4个CPU时钟后从DRR1中读出数据。该处理比软件实现快,不利之处在于处理完后没有同步信息通知CPU和DMA。方法二:在数据环回模式下,McBSP也实现了一种内连。数据处理与第一种
14、方法相同,但它可以提供中断信号(或同步事件)给CPU(或DMA)。这里数据处理的时间是根据串行口的比特律确定的。另外,在通常情况下McBSP先传输信号的高位后传输低位,但是在字长为8比特的数据传输时,McBSP提供了比特倒序的功能,即可以先传输低位后传输高位。在本实验中,我们通过软件编程来完成线性码转换成A律。4、存储器 (1)外部数据存储器DSK提供了64K*16位的SRAM,SRAM工作在+3V的电源电压。可以使用的外部数据存储器的大小取决于DROM的设置。如果DROM=0,那么0x40000xFFF(48k字)的空间是外部存储器(FLASH或SRAM)。如果DROM=1,外部存储器只能使
15、用0x40000xEFFF.DMSEL控制寄存器位决定访问板上或扩展板的存储器。如果DMSEL=0(缺省),使用板上的数据存储器;如果DMSEL=1,使用扩展板存储器,并且地址开始于0x8000(块的大小取决于DROM位)。数据存储器空间资源也取决于MP/MC状态。DSK外部数据空间的配置如图7所示。图7 (2)外部程序存储器外部程序存储器的可用大小是取决于OVLY 位的设置和MP/MC 跳线的设置。如果OVLY位0 并且MP/MC#0,那么程序存储器的空间0x00000xEFFF(60K words)映射到外部存储器,是FLASH 还是SRAM 决定于控制寄存器的FLASHENB 状态位。在
16、上电状态,FLASHENB位的设置是为了允许从FLASH 引导。然后软件清除此位,使具有1 个等待状态的SRAM 使用这个相同的存储器空间。如果MP/MC0,那么0xF0000xFFFF 是保留给片内ROM 和中断矢量表,并且外部程序存储器在0 页是不可用的,但是在其它页可以使用,这些取决于OVLY 位的设置。如果MP/MC# = 1 并且 OVLY = 0,那么0x00000xFFFF 空间是分配给外部存储器的,FLASH 或SRAM。在70nsFLASH 存储器的情况下(FLASHENB=1),总线的速率为100MHz,需要7 个等待状态,由5402 的内部等待状态产生器产生。在SRAM
17、情况下(FLASHENB=0),总线速率为100MHz 时,需要1 个等待状态。因为SRAM 和FLASH 共享同一个等待状态产生器, 5402 内部的等待状态产生器将必须从访问SRAM 的一个等待状态转换到访问FALSH 的7个等待状态。如果MP/MC = 1 并且OVLY = 1,那么只有0x40000xFFFF 是映射到外部存储器的。程序存储器的配置见表1。表1(3)I/O空间存储器IO 空间是由2 部分组成,一个是系统基于CPLD 控制空间,另一个是扩展板存储器空间。DM_SEL 位能够控制IO 空间的访问。如果DSP 向此位写1,那么扩展板存储器的IO 空间是不能被访问的。如果向此位
18、写0,那么扩展板存储器的IO 空间是可以被访问的。I/O空间存储器配置如图8示图8 I/O空间存储器配置5、麦克风和耳机接口音频接口使用了2 个工业标准的3.5mm 的连接器:一个连接麦克风(J5)的音频输入;一个连接耳机(J6)的音频输出。(1)音频输入是交流偶合的并且包括:1 个固定增益为10dB 的放大器;实现单端到差分的转换(在此之前,连接到DSP 的McBSP1 上的TLC320AD50对其进行数字化);电压偏置(支持电池电源和驻极体麦克风);被动滤波(在DSK 的音频插口和CODEC 之间)用来增强性能,为驻极体麦克风设计的麦克风的输入它需要一个电压偏置。如果使用电容来隔离偏置电压
19、,就能够使用动态的麦克风。麦克风的输入信号最大允许标准是500mV(350mVrms)。在DSK上有10dB前置放大器增益。(2)音频输出是可以编程控制的,在软件的控制下,可以在6dB增幅的范围内,增加增益+0+2dB。音频输入可以编程控制的,在6dB增幅范围内,提供+0+12dB的增益。另外,硬件跳线可以访问:直接访问AD50 输出(为了驱动一个单端的600ohm 的负载);或一个输出驱动级(为了连接低阻抗的耳机,如8ohm)。四、实验方案、算法原理说明1、实验方案利用DSK320VC5402板实现。用板内的AD/DA转换器AD50将由MIC输入的模拟信号转换为16位数字信号送入DSP板中进
20、行压缩处理,压缩处理后的数据经过解压后再送至DA转换器转换为模拟信号,由SPEAKER口输出,压缩和解压缩用A律格式。从而实现语音信号的采集压缩与回放,编程由C语言完成。方案图如图9 图9 数据处理框图2、算法原理说明语音信号通常是小信号概率大,大信号出现的概率小,为提高小信号时的量化信噪比,压缩比特速率,可为非线性量化。语音压缩是把16位的数据比特转化为8位数据比特,从而到达语音压缩的目的,下表是线性码转化为A律表:线性输入编码压缩编码解压缩码wxyza000wxyzwxyza001wxyzwxyzab010wxyz00001wxyzabc011wxyz0001wxyzabcd100wxyz
21、001wxyzabcde101wxyz01wxyzabcdef110wxyz1wxyzabcdefg111wxyz表2 A律表通过CODEC的A/D抽样量化,得到16比特的线性编码,再由转化表通过软件得到8位A律码,其中最高位(第7位)为符号位,第6位到第4位段落码,低四位为段内码。五、程序设计1、程序流程图图102、各个分块程序设计(1)初始化DSK程序段:if (brd_init(100) return;程序分析:brd_init()函数原型为:s16 brd_init(unsigned int cpuFreq),参数cpuFreq表示CPU的工作频率,单位为MHz。提供的频率必须是10倍
22、数,最小为20MHz,最大为100 MHz。20,30,40,50,60,70都可以。brd_init()返回参数为0则表示初始化成功,如果返回1,则表示初始化失败,执行return,继续执行初始化。(2)初始化A/D50C程序程序段:/*初始化codec*/void initcodec(void)/*获取设置DAC的句柄 */ hHandset = codec_open(HANDSET_CODEC); / Acquire handle to codec /*设置DAC的工作参数*/ codec_dac_mode(hHandset, CODEC_DAC_15BIT); / DAC in 15-
23、bit mode codec_adc_mode(hHandset, CODEC_ADC_15BIT); / ADC in 15-bit mode codec_ain_gain(hHandset, CODEC_AIN_12dB); / 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_8000); / 16KHz sampling rate 程序分析:
24、为codec设置各种参数。(程序中解释部分已说明)(3)LED02闪灯程序程序段:/*闪灯*/void led(s16 cnt)while ( cnt- )brd_led_toggle(BRD_LED0);delay(1000);brd_led_toggle(BRD_LED1);delay(1000);brd_led_toggle(BRD_LED2);delay(1000);程序分析:此函数用了一个while循环语句实现cnt次灯闪,通过调用delay子函数控制灯闪灭时间,其中brd_led_toggle()表示切换用户LED,改变用户控制LED02的状态。(4)语音信号采集存储与回放程序程序
25、段:while(1) /判断MCBSP是否做好接收准备 while (!MCBSP_RRDY(HANDSET_CODEC) ) ; /从A/D读取转换数据 din = *(volatile u16*)DRR1_ADDR(HANDSET_CODEC); din=amp*din; dacdatai=din;/ 将数据写入D/A转换器*(volatile u16*)DXR1_ADDR(HANDSET_CODEC) =dacdatai;i=i+1; 程序分析: (1)while (!MCBSP_RRDY(HANDSET_CODEC) ) ;:宏,获取McBSP是否做好接受的准备信息.RRDY=0:没有
26、准备好, RRDY=1:可以从DRR中读数据.信息在控制寄存器SPCR1中. (2)*(volatile u16*)DRR1_ADDR(HANDSET_CODEC):宏,定义数据接收寄存器1(共2个)的地址,从regs.h可查。(3)din=amp*din;dacdatai=din; :对输入信号进行处理。(4)*(volatile u16*)DXR1_ADDR(HANDSET_CODEC):宏,定义数据发送寄存器1(共2个)的地址,从regs.h可查。(5)数据ALAW 压缩程序程序段:/*a律压缩*/unsigned char data2alaw(s16 pcm_val) intmask;
27、intseg;unsigned charaval;if (pcm_val = 0) mask = 0xD5; / 标记 (7th) bit = 1 else mask = 0x55; / 标记 bit = 0 pcm_val = -pcm_val;/ Convert the scaled magnitude to segment number. seg = search(pcm_val, seg_end, 8); / Combine the sign, segment, and quantization bits. if (seg = 8) / out of range, 返回最大数. ret
28、urn (0x7F mask);else aval = seg SEG_SHIFT;if (seg 1) & QUANT_MASK;elseaval |= (pcm_val seg) & QUANT_MASK;return (aval mask);static int search(int val,short*table,int size)inti;for (i = 0; i size; i+) if (val = *table+)return (i);return (size);(6)数据ALAW 解压缩程序程序段:/*a律解压*/int alaw2data(unsigned chara_v
29、al)intt;intseg;a_val = 0x55; t = (a_val & QUANT_MASK) SEG_SHIFT;if(seg=0) t += 8; t=(t3);if(seg0) t +=0x108; t=(t(4-seg);if(seg3)t+=0x108;t=(t 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 SC
30、RATCH 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 cod
31、ebook */ 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 /* t
32、able 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 */ V23 INRAM PAGE 1 FSK INRAM PAGE 1 hpibuff0 HPRAM0 PAGE 1 hpibuff1 HPRAM1 PAGE 1 hpibuff2 HPRAM2 PAGE 1 dma_buff DMARAM PAG
33、E 14、总程序:/*/* .h文件 */*/#include #include #include #include /*/* 变量宏定义 */*/#defineSIGN_BIT(0x80)/* Sign bit for a A-law byte. */#defineQUANT_MASK(0xf)/* Quantization field mask. */#defineNSEGS(8) /* Number of A-law segments. */#defineSEG_SHIFT(4) /* Left shift for segment number. */#defineSEG_MASK(0x
34、70)/* Segment field mask. */*/* 函数声明 */*/void delay(s16 period);void led(s16 cnt);void initcodec(void);unsigned char data2alaw(s16 pcm_val);int alaw2data(unsigned chara_val);static int search(int val,short*table,int size);/*/* 全局变量 */*/HANDLE hHandset;s16 data;s16 data1;u16 i=0;u16 temp1;u16 j=0;u16 k,l=0;u8 temp2;u16 buffer30000;static short seg_end8=0x1F,0x3F,0x7F,0xFF,0x1FF,0x3FF,0x7FF,0xFFF;/*/* 主函数 *