精选DSP实验报告.doc_第1页
精选DSP实验报告.doc_第2页
精选DSP实验报告.doc_第3页
精选DSP实验报告.doc_第4页
精选DSP实验报告.doc_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

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

文档简介

目录一、 课程的目的和要求.2 1.设计要求及目标.2 2.设计思路. .23.设计内容.2二、 设计原理 .2 1.实验概述.2 2、实验原理.33.相关理论知识.3 (1)DSK系统基本结构.3 (2)TLC320AD50C的内部结构及初始化程序.5 (3)McBSP的结构及寄存器部分配置.5 (4)均匀量化、非均匀量化.6(5)编译流程.8 三、设计步骤. .91.程序及说明.92.程序调试.16 3.结果分析.164 心得体会.185 附录.19语音压缩、存储和回放一.课程的目的和要求1.设计要求及目标 基本部分:(1)使用DSP实现语音压缩和解压缩的基本算法,算法类型自定,例如可以采用G.711、G.729等语音压缩算法。(2)采用A/D转换器从MIC输入口实时采集语音信号,进行压缩后存储到DSP的片内和片外RAM存储器中,存储时间不小于10秒。(3)存储器存满之后,使用DSP进行实时解压缩,并从SPEAKER输出口进行回放输出。(4)使用指示灯对语音存储和回放过程进行指示。 发挥部分:使用多种算法进行语音的压缩、存储和解压缩,比较它们之间的优缺点。2.设计思路 语音信号的幅度(发音强度)并非均匀分布,由于小信号占的比例比大信号大很多,因此可以进行非均匀量化。达到这一目标的基本做法是,对大信号使用大的量化间隔,而小信号则使用小的台阶。ITU-T G.711建议的PCM A律和律语音压缩标准可以分别将13比特和14比特压缩为8比特,达到语音压缩的目的。3.设计内容(1)使用DSP实现语音压缩和解压缩的基本算法,算法类型采用G.711的a律压扩算法。(2)采用A/D转换器从MIC输入口实时采集语音信号,进行压缩后存储到DSP的片内RAM存储器中,存储时间约为10秒。(3)但采样数据达到规定次数后,使用DSP进行实时解压缩,并从SPEAKER输出口进行回放输出。(4)使用DSK板的指示灯对语音存储和回放过程进行指示: 循环闪烁:板子自检,程序开始 LED0亮:录音(10秒钟左右) LED0灭:放音2 设计原理1 实验概述:语音信号是信息的重要形式, 语音信号处理有着广泛的应用领域,而语音压缩在语音信号的传输、存储等方面有非常广泛的作用,而且在通信领域中已经有较成熟的发展和广泛应用。本设计要求采用DSP及其A/D、D/A转换器进行语音信号的压缩、存储和回放。语音信号模数、数模转换采用TLC320AD50C(以下简称AD50),这是一款SIGMA-DELTA型单片音频接口芯片(AIC)。它内部集成了16位的D/A和A/D转换器,采样速率最高可达22.05kb/s,其采样速率可通过DSP编程来设置,内含抗混叠滤波器和重构滤波器。在DAC之前有一个插值滤波器以保证输出信号平滑和ADC之后有一个抽取滤波器以提高输入信号的信噪比。2.实验原理:(1)概念:语音编码一般分为两类:一类是波形编码,一类是被称为“声码器技术”的编码。PCM编码即脉冲编码调制。波形编码的最简单形式就是脉冲编码调制(Pulse code modulation),这种方式将语音变换成与其幅度成正比的二进制序列,而二进制数值往往采用脉冲表示,并用脉冲对采样幅 度进行编码,所以叫做脉冲编码调制。 脉冲编码调制没有考虑语音的性质,所以信号没有得到压缩。 (2)量化:脉冲编码调制用同等的量化级数进行量化,即采用均匀量化,而均匀量化是基本的量化方式。但是均匀量化有缺点,在信号动态范围较大而方差较小的时候,其信噪比会下降 。 国际上有两种非均匀量化的方法:A律和律,律是最常用的一种。在美国,7位律是长途电话质量的标准。 而我国采用的是A律压缩,而且有标准的A律PCM编码芯片。 (3)DPCM&ADPCM: 降低传输比特率的方法之一是减少编码的信息量,这要消除语音信号中的冗余度。相邻的语音样本之间存在明显的相关性,因此对相邻样本间的差信号进行编码,便可使信息量得到压缩。因为差分信号比原语音信号的动态范围和平均能量都小。这种编码叫Differential PCM,简称DPCM,即差分脉冲编码调制。 3相关理论知识:(1)DSK系统基本结构:5402 DSK主要包括100MHz VC5402 DSP,1个软件等待周期的64K字的外部SRAM存储器,256K字的FLASH存储器,内嵌的并口仿真器,模拟输入/输出音频接口,以及扩展板接口。其结构如下图:DSK的主要硬件资源包括: DSP主芯片1枚:100 MHz TMS320VC5402 DSP RAM 1枚:1个软件等待的64K16bit的SRAM(CY7C1021V33) FLASH 1枚:256K16bit 的 FLASH存储器(AM39VF400A) 接口2个:用于仿真的JTAG测试总线控制器和一个连接到PC机并口的主 机端接口HPI 信号采集和输出端口:麦克风/耳机音频接口 下面分别介绍: aDSP芯片 DSK 支持TMS320VC5402 DSP,工作频率可以高达100MHz,工作的内 核电压为1.8V,I/O 电压为3.3V b外部数据存储器 DSK提供了64字SRAM。可以使用的外部数据存储器的大小取决于DROM 的设置。如果DROM0,那么0x40000xFFFF(48K words)的空间是外部存储器(FLASH 或SRAM)。如果DROM1,外部存储器只能使用0x40000xEFFF。 是否可以访问板上或扩展板存储器取决于DMSEL 控制寄存器位。如果DMSEL0(缺省),那么可以使用板上的数据存储器。如果DMSEL1那么可以使用扩展板存储器,并且地址开始于0x8000。数据存储器空间资源也取决于MP/MC 状态。c外部程序存储器 DSK提供了256K字的FLASH。外部程序存储器的可用大小取决于OVLY 位的设置和MP/MC# 跳线的设置。如果 OVLY位0 、MP/MC#0,那么程序存储器的空间0x00000xEFFF(60K words)映射到外部存储器,是FLASH 还是SRAM 决定于控制寄存器的FLASHENB 状态位。在上电状态,FLASHENB位置位是为了允许从FLASH 引导。然后软件清除此位,使具有1个等待状态的SRAM 使用这个相同的存储器空间。如果MP/MC = 1 并且 OVLY = 0,那么0x00000xFFFF 空间是分配给外部存储器( FLASH 或SRAM )。使用 FLASH 存储器的情况下(FLASHENB=1),总线的速率为100MHz,访问FLASH需要7个等待状态。 在SRAM 情况下(FLASHENB=0),总线速率为100MHz 时,访问SRAM需要1 个等待状态。如果MP/MC = 1并且OVLY = 1,则只有x40000xFFFF 是映射到外部存储器的。dI/O空间存储器 I/O空间由2部分组成,一部分是系统基于CPLD的控制空间,另一部分是扩展板存储器空间。DM_SEL位是外部存储器存取控制寄存器位,能够控制I/O空间的访问。如果DSP向此位写1,那么扩展板存储器的I/O空间是不能被访问的。如果向此位写0,那么扩展板存储器的I/O空间可以被访问。 e模拟输入/输出音频接口 音频接口使用了2 个标准的3.5mm 的连接器: 一个连接麦克风(J5)的音频输入 一个连接耳机(J6)的音频输出 麦克风的输入信号最大允许标准是500mVp。在DSK上有10dB前置放大器增益。当接入信号源的输入时,需要使用隔直电容(0.1u)。音频输入可以编程控制,在软件的控制下,可以提供0dB、+6dB、+12dB的增益。音频输出也是可以编程控制的,在软件的控制下,可以提供0dB、-6dB、-12dB的增益。 DSK板上使用了AD50 CODEC作为A/D和D/A的转换设备。它是内部集成了16位的A/D和D/A转换器以及抗混叠滤波器,采样速率最高可达22.05kHz。此外,ADC之后有一个抽取滤波器以提高输入信号的信噪比,在DAC之前有一个插值滤波器以保证输出信号平滑输出。AD50与DSP芯片通过同步串行通信接口(MCBSP1)相连。(2)TLC320AD50C的内部结构及初始化程序 TLC320AD50C是TI公司生产的一个SIGMA-DELTA型16位串行A/D、D/A转换电路。采样速率可通过DSP编程来设置,最高可达22.05 kHz。内含抗混叠滤波器和重构滤波器 在DAC之前有一个插值滤波器:保证输出信号平滑, 在ADC之后有一个抽取滤波器:提高输入信号的信噪比A/D、D/A转换器的初始化编程: /* 获取设置A/D和D/A的句柄 */ hHandset = codec_open(HANDSET_CODEC); /* 设置CODEC的工作参数 */ /* DAC和ADC工作在15+1bit模式 */ codec_dac_mode(hHandset, CODEC_DAC_15BIT); codec_adc_mode(hHandset, CODEC_ADC_15BIT); /* ADC模拟增益设置为6dB */ codec_ain_gain(hHandset, CODEC_AIN_6dB); /* 设置DAC模拟输出增益为-6dB */ codec_aout_gain(hHandset, CODEC_AOUT_MINUS_6dB); /* 设置抽样频率为8KHz */ codec_sample_rate(hHandset,SR_8000);(3)McBSP的结构及寄存器部分配置 McBSP:多通道缓冲串行口(Multi-channel Buffered Serial Port),是串行口的一种。它既可以利用DSP提供的DMA功能实现自动缓存功能,又可以实现时分多路通信功能。TMS320C5402有两个McBSP串口,分别为McBSP0、McBSP1。 McBSP由引脚、接收发送部分、时钟及祯同步信号产生、多通道选择以及CPU中断信号和DMA同步信号组成。 引脚中我们用到的只有两个: DR和DX,通过这两个引脚实现DSP与外部设备的通信和数据交换。DR用来接收数据,DX完成数据的发送。这两个引脚分别对应两个寄存器DRR和DXR,如果准备就绪,从这两个寄存器中就可以读取数据了。(注:两个McBSP串口,所以两个寄存器分别用DRR1、DXR1、 DRR2、DXR2表示) 那么如何判断接收器和发送器是否准备就绪呢?这就采用了SPCR1、SPCR2控制位来判断。当RRDY=0时,接收器未就绪;当RRDY=1时,接受器就绪,可以从DDR1或2种读取数据。当XRDY=0时,发送器尚未就绪;当XRDY=1时,发送器就绪,可以从XDR1或2种发送数据。所以在实际实验中我们采用以下语句命令:a接收数据时while (!MCBSP_RRDY(HANDSET_CODEC) ; /查询、等待接收handset处的采样data = *(volatile u16*)DRR1_ADDR(HANDSET_CODEC); /从handset处读取采样b发送数据时while (!MCBSP_XRDY(HANDSET_CODEC) ; *(volatile u16*)DXR1_ADDR(HANDSET_CODEC) = data1;/a律解压完成后,DSP将数据通过串行口McBSP1发送(4)均匀量化、非均匀量化 如果采用相等的量化间隔对采样得到的信号作量化,那么这种量化称为均匀量化。均匀量化就是采用相同的“等分尺”来度量采样得到的幅度,也称为线性量化,如图2所示。均匀量化PCM就是直接对声音信号作A/D转换,在处理过程中没有利用声音信号的任何特性,也没有进行压缩。该方法将输入的声音信号的振幅范围分成个等份(B为量化位数),所以落入同一等份数的采样值都编码成相同的B位二进制码。只要采样频率足够大,量化位数也适当,便能获得较高的声音信号数字化效果。为了满足听觉上的效果,均匀量化PCM必须使用较多的量化位数。这样所记录和产生的音乐,可以达到最接近原声的效果。当然提高采样率及分辨率后,将引起储存数据空间的增大。 PCM的编码规律 PCM: Pulse Code Modulation 脉冲编码调制,一般速率为64kbps,是指对语音信号直接采样量化的一种编码办法,采样速率为8000Hz,每样点用8bit表示。CD 用16bit 44.1kHz采样的PCM。 数字电话用的也是PCM,PCM是非线性编码,根据G.711建议,编码结束后需要做偶数位翻转。 如果编码后结果是 0110 1001 则在发送的时候需要经过偶数位翻转得到: 0011 1100 。PCM码的压缩分a律u律,在中国使用a律。PCM码有很多种,网络上主要有4种:MANCHESTER码,差分Manchester码,AMI码,HDB3码,2B1Q码。分别用于以太网,ISDN,DDN,电话。A律压扩其特性可表示为: 很明显,小信号时为线性特性,大信号时近似为对数特性。这种压扩特性常把压缩、量化和编码合为一体。A律可用13段折线逼近(相当于A=87.6),便于用数字电路实现。13段折线的压缩特性如下图。过程为: 第一步:把x(x0 部分)划分为不均匀的8段。第一分点取在V/2处,然后每段都是剩下部分的1/2。;依次取第八段为VV/2 第七段为V/2V/4;第一段为V/1280。 第二步:把每段均匀划分为16等份,每一份表示一个量化级,显然8段共16x8=128= 个量化级,需要二进制7位编码表示。可以看出每个量化级是不均匀的。在小信号的量化台阶很小,使小信号时量化噪声减小。如果按均匀量化计算,以最小台阶 为单位,最大信号需用L=128X16=2048= 个量化级表示,既需要11位编码。这样非均匀编码使小信号量化台阶缩小了16倍,相当于小信号信噪比改善了20dB。第三步:把y轴均匀划分为8段,每段均匀分为16分。这样y也分为128个量化级,与x轴的128个量化级对应。因此,压扩特性各段的斜率 是不同的。第一段斜率: 其他段为:。 以上分段为x取正值时的情况。而x取负值时,压扩特性与x取正值成奇对称。在正8段和负8段中,正1,2段和负1,2段斜率相同,合为一段。所以原来的16段折线变为13段折线。 表1(5)编译流程首先要掌握实验的编译流程,从而在其指导下进行实验。 aC编译器(C Compiler)将C语言源程序自动地编译为C54x的汇编语言源程序。 b汇编器(Assembler)将汇编语言源文件汇编成机器语言COFF目标文件。源文件中包括指令、汇编命令以及宏命令。 c链接器(Linker)把汇编生成的、可重新定位的COFF目标模块组合成一个可执行的COFF目标模块。当链接器生成可执行模块时,它要调整对符号的引用,并解决外部引用的问题。它也可以接受来自文档管理其中的目标文件,以及链接以前运行时所生成的输出模块。 d文档管理器(Archiver)将一组文件(源文件或目标文件)集中为一个文档文件库。汇编时,可以搜索宏文件库,并通过源文件中的宏命令来调用。也可以利用文档管理器,将一组目标文件集中到一个目标文件库。通过文档管理器来替换、添加、删除和提取库文件。 e助记符指令,将包含的助记符指令的汇编语言源文件转换成包含代数指令的汇编语言源文件。 f建库实用程序。用来建立用户自己用的、C语言编写的支持运行的库函数。链接时,用rts.src中的源文件代码和rts.lib中的目标代码提供标准的支持运行的库函数。十六进制转换程序,将COFF目标文件转换成TI、Intel等目标文件格式,可以下载到EPROM编程器,以便对用户的EPROM进行编程。 g绝对列表程序将链接后的目标文件作为输入,生成.abs输出文件。对.abs文件汇编产生包含绝对地址的清单。如果没有绝对制表程序,所生成清单可能是冗长的,并要求进行许多人工操作。交叉引用制表程序利用目标文件生成一个交叉引用清单,列出所链 接的源文件中的符号以及它们的定义和引用情况。图4三设计步骤1.程序及说明下面就是本程序设计的流程图:/*/* 头文件 */*/#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(0x70)/* Segment field mask. */*/* 函数声明 */*/void delay(s16 period);void led(s16 cnt);void initcodec(void);void flashenable(void);unsigned char data2alaw(s16 pcm_val);int alaw2data(unsigned chara_val);static int search(int val,short*table,int size);/*/* 全局变量 */*/HANDLE hHandset; /*CODEC句柄设置*/s16 data; /*定义有符号的整形变量,名字是data*/s16 data1; /*定义有符号的整形变量,名字是data1*/u16 i=0; /*定义无符号的整形变量并附值为0,名字是i*/u16 temp1; /*定义无符号的整形变量,名字是temp1*/u16 j=0; /*定义无符号的整形变量并附值为0,名字是j*/u16 k,l=0; /*定义两个无符号的整形变量并附值为0,名字是k和l*/u8 temp2; /*定义无符号的字符型变量,名字是temp2*/u16 buffer15000;/*定义无符号的一维数组,名字是buffer,容量是15000*/static short seg_end8=0x1F,0x3F,0x7F,0xFF,0x1FF,0x3FF,0x7FF,0xFFF;/*/* 主函数 */*/void main() if (brd_init(100) /*DSK板初始化函数,将DSP主频设置为100MHz*/ return; led(2); /闪灯两次 initcodec(); /初始化codec flashenable(); /选择片外FLASH为片外存储器 /* delay(100); brd_led_toggle(BRD_LED0); for(i=0x9000;i0xefff;i+) REG_WRITE(i,*(volatile u16*)DRR1_ADDR(HANDSET_CODEC); delay(20); brd_led_toggle(BRD_LED1); delay(200); for(i=0x9000;i0xefff;i+) *(volatile u16*)DXR1_ADDR(HANDSET_CODEC)=REG_READ(i); delay(20); brd_led_toggle(BRD_LED2); */ while (1) while (!MCBSP_RRDY(HANDSET_CODEC) ; /等待接收handset处的采样 data = *(volatile u16*)DRR1_ADDR(HANDSET_CODEC); /从handset处读取采样 temp1=data2alaw(data); /对采样进行a律压缩 /*/ /* 把低地址数据放在高八位 高地址数据放在低八位 */ /*/ i=i+1; if(i%2=1) bufferj=(temp1=30000) i=0; if(j=15000) j=0; brd_led_toggle(BRD_LED0); /熄灭数码管0 表示录音结束 delay(100); /延时100 brd_led_toggle(BRD_LED1); /点亮二极管1 表示放音开始 /*/ /* 放音部分 */ /*/ for(k=0;k8)&0x0ff; else temp2=bufferl&0x0ff; l+; if(l=15000) l=0; data1=alaw2data(temp2); while (!MCBSP_XRDY(HANDSET_CODEC) ; *(volatile u16*)DXR1_ADDR(HANDSET_CODEC) = data1; /*/ /* 放音结束 */ /*/ if(k=29999) brd_led_toggle(BRD_LED1); /熄灭二极管1 表示放音结束 delay(100); /延时100 brd_led_toggle(BRD_LED2); /点亮二极管2 表示程序结束 /主程序结束/*/ /* 子函数 */ /*/*延时*/void delay(s16 period) int i, j; for(i=0; iperiod; i+) for(j=0; j1; j+); /*闪灯*/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);/*初始化codec*/void initcodec(void) /* Open Handset Codec */ hHandset = codec_open(HANDSET_CODEC); / 获得对编码器的处理 /* Set codec parameters */ codec_dac_mode(hHandset, CODEC_DAC_15BIT); / DAC 放在15-bit模式 codec_adc_mode(hHandset, CODEC_ADC_15BIT); / ADC放在15-bit模式 codec_ain_gain(hHandset, CODEC_AIN_6dB); / 模拟输入获得6db增益 codec_aout_gain(hHandset,CODEC_AOUT_MINUS_6dB); /模拟输出获得-6db增益 codec_sample_rate(hHandset,SR_16000); / 设置16KHz 取样率 /*设置flash*/void flashenable(void)CPLD_CTRL2_REG|=0x0010;CPLD_DMCTRL_REG|=0x0040;/*a律压缩*/unsigned char data2alaw(s16 pcm_val) intmask;intseg;unsigned charaval;if (pcm_val = 0) mask = 0xD5; / 标记 (7th) bit = 1 else mask = 0x55; / 标记 bit = 0 pcm_val = -pcm_val;/ 将以测量的数量转换成分割数据. seg = search(pcm_val, seg_end, 8); / 链接信号,段和量子化数据 if (seg = 8) / 超出范围, 返回最大数. return (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);/*a律解压*/int alaw2data(unsigned chara_val)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=(seg-4);return (a_val & SIGN_BIT) ? t : -t);/*/* 结束 */*/2. 程序调试 CCS程序调试运行:(1).编译程序之前的准备工作 a头文件的添加,本实验中的具体路径为:C:tic5400dsk5402include,在build options选项中的preprocessor(预编译)选项中的Include Seach Path中的路径应该与此路径一致,否则程序编译将报错,报错的原因是某些头文件无法找到。 b还有就是library的库文件就需要自己从TI文件夹中寻找添加。 (a)drv5402.lib是软件仿真所用的仿真器所必需的库文件; (b)dsk5402.lib是驱动DSK板所必需的库文件; (c)rts.lib,这个库提供目标DSP运行时间支持。 c添加.cmd文件(cmd文件描述见下面)。(2)选择Project/Rebuild All或单击(Rebuild All)菜单条按钮, CCS重新进行编辑、汇编、连接工程里的所有文件。这个处理的有关信息在窗口底部一个小框里显示。(3)默认时,.out文件编译到位于当前工程文件夹中的调试(debug)目录中; 也可以通过CCS工具条选择一个存储目录。(4)选择File/Load Program.选中sound.out,并按Open。(c:timyprojectssound1Debug 文件夹中。)CCS将程序装载到目标DSP上,打开显示程序反汇编指令的Disassembly窗口。(5)选择View/Mixed Source/ASM,这样可以同时查看C源程序和产生的汇编代码。(6)在混合窗口单击汇编指令(单击有效指令,而不是指令的地址或所传递的区域),单击F1,CCS可以寻找此指令的帮助。这是学习指令的很好的方法。(7)选择Debug/Go Main。从主程序开始执行。(8)选择Debug/Run或单击(Run)按钮。(9)选择Debug/ Halt,退出程序运行。3.结果分析编译运行结果如下图: 图5编译运行无错误输入波形输出波形4.结论:编译调试过程到此就完毕了,实验的结果比较理想,基本满足实验的基本要求。我们采用a律压扩法

温馨提示

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

评论

0/150

提交评论