《基于TMS320VC5402语音采集压缩存储与回放(共26页).doc》由会员分享,可在线阅读,更多相关《基于TMS320VC5402语音采集压缩存储与回放(共26页).doc(26页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上摘 要本课程设计的主要目的是熟悉CCS集成开发环境。然后在CCS环境下实现基于TMS320VC5402芯片的语音采集压缩与存储和回放。本课程设计首先采用A/D转换器从MIC输入口实行语音信号采集,进行压缩后存储到DSP的片内和片外RAM存储器中,等到存储器存满之后,使用DSP实行解压缩,并从SPEAKER输出口进行回放输出,并且用指示灯对语音存储和回放过程进行指示。关键词:CCS;DSP;采集;压缩;存储与回放;第1章 引言随着信息技术革命的深入和计算机技术的飞速发展,数字信号处理技术已经逐渐发展成为一门关键的技术学科。而DSP芯片的出现则为数字信号处理算法的实现提供
2、了可能。这一方面极大地促进了数字信号处理技术的进一步发展;另一方面,它也使数字信号处理的应用领域得到了极大的拓展。在国外DSP芯片已经被广泛地应用于当今技术革命的各个领域;在我国,DSP技术也正以极快的速度被应用到科技和国民经济的各个领域。目前,在微电子技术发展的带动下,DSP芯片的发展日新月异,DSP的功能日益强大,性能价格比不断上升,开发手段不断改进。DSP芯片已经完全走下了“贵族”的圣坛。DSP芯片已经在通信与电子系统、信号处理系统、自动控制、雷达、军事、航空航天、医疗、家用电器、电力系统等许多领域中得到了广泛的应用,而且新的应用领域在不断地被发掘。第2章 硬件设计2.1 TMS320V
3、C5402芯片的基本原理TMS320VC5402 数字信号处理器是TI公司为实现低功耗,高速实时信号处理而专门设计的16位定点数字信号处理器,采用改进的哈佛结构,具有高度的操作灵活性和运行速度,适用于远程通信等实时嵌入式应用的需要。广泛应用于电子测试、电子设计、模拟仿真、通信工程中。TMS320VC5402具有的主要优点如下:(1) 围绕一组程序总线、三组数据总线和四组地址总线而建立的改进哈佛结构,提高了系统的多功能性和操作的灵活性。 (2) 具有高度的并行性和专用硬件逻辑的CPU设计,提高了芯片的性能。(3) 具有完善的寻址方式和高度专业化指令系统,更适用于快速算法的实现和高级语言编程的优化
4、。(4) 模块化结构设计,使派生器件得到了更快的发展。(5) 采用先进的IC制造工艺,降低了芯片的功耗,提高了芯片的性能。(6) 采用先进的静态设计技术,进一步降低了功耗,使芯片具有更强的应用能力。TMS320VC5402主要有中央处理器CPU,特殊功能寄存器,数据存储器RAM,程序存储器ROM,I/O接口功能,串行口,主机通信接口HPI,定时器,中断系统等10部分组成。各部分功能如下:(1) 中央处理器(CPU)它是DSP芯片的核心,它有以下特点:(a) 采用多总线结构,通过一组程序总线、三组数据总线和四组地址总线来实现。(b) 40位算术逻辑运算单元ALU,包括一个40位的桶形移位寄存器和
5、两个独立的40位累加器。(c) 1717位并行乘法器,与40位专用加法器相连,可用于进行非流水线的单周期乘法累加运算。(d) 比较、选择、存储单元,可用于Viterbi译码器的加法比较选择运算。(e) 指数编码器,是一个支持单周期指令EXP的专用硬件。可以在一个周期内计算40位累加器数值的指数。(f) 配有两个地址生成器,包括8个辅助寄存器和2个辅助寄存器运算单元。(2)数据存储器RAMTMS320VC5402有两种片内数据存储器:(a) 双寻址RAM:在一个指令周期内,可对其进行两次存取操作,一次读出和一次写入;(b) 双寻址RAM:在一个指令周期内,只能进行一次存取操作。(3) 程序存储器
6、ROMTMS320VC5402的程序存储器可由ROM和RAM配置而成,程序空间可以定义在ROM上,也可以定义在ROM上。当需要高速运行程序时,可以将片外ROM中的程序调入到片内RAM中,以提高程序运行速度。降低对外部ROM的要求,增强系统整体抗干扰性能。(4) I/O口TMS320VC5402芯片只有两个通用I/O引脚BIO和XF,BIO主要用来监测外部设备工作状态,而XF用来发信号给外部设备。 另外,芯片还配有主机接口HPI,同步串行口和64K字的I/O空间,HPI和串行口通过控制,用做通用I/O口使用。而64K字I/O空间可通过外加缓冲器或锁存电路,配合外部I/O读写控制时序构成片外外设的
7、控制电路。(5) 定时器定时器是一个软件可编程计数器,用来产生定时中断。定时器主要由定时寄存器TM,定时周期寄存器PRD,定时控制寄存器TCR及相应的逻辑控制电路组成。其中寄存器TIM、PRD和TCR都是存储映象寄存器,它们在数据存储器中的地址分别为0024H、0025H和0026H。TIM是一个减1寄存器。PRD用来存放定时时间常数。TCR中包含定时器的控制位和状态位。 (6) 中断系统TMS320VC5402的中断系统具有硬件中断和软件中断。 硬件中断:由外围设备引起的中断分为片外外设所引起的中断和片内外设所引起的中断。软件中断:有程序指令INTR、TRAP和RESET所引起的中断。中断管
8、理优先级为1116个固定级,有4种工作方式。 (7) 主机接口HPIHPI是一个与主机通信的并行接口,主要用于DSP与其他总线或CPU进行通信,信息可通过TMS320VC5402的片内存储器与主机进行数据交换。不同型号的器件配置不同的HPI口,可分为8位标准HPI口、8位增强型HPI接口和16位增强型HPI接口。 (8) 指令系统支持单指令重复和块指令重复;支持存储器块传送指令;支持32位长操作数指令;具有支持2操作数或3操作数的读指令;具有能并行存储和并行加载的算术指令;支持条件存储指令及中断快速返回指令。(9) 片外围电路具有软件可编程等待状态发生器;设有可编程分区转换逻辑电路;带有内部震
9、荡器或外部时钟源的片内锁相环发生器;支持全双工操作的串行口,可进行8位或16位串行通信。2.2 语音采集与输出模块语音采集与输出模块采用的是TI公司推出的一款高性能的立体声音频Codec芯片TLC320AD50C,内置耳机输出放大器,支持MIC和LINE IN两种输入方式(二选一),且对输入和输出都具有可编程增益调节。AD50的模数转换(ADCs)和数模转换(DACs)部件高度集成在芯片内部,采用了先进的Sigmadelta过采样技术,可以在8K到96K的频率范围内提供16bit、20bit、24bit和32bit的采样,ADC和DAC的输出信噪比分别可以达到90dB和100dB。与此同时,A
10、D50还具有很低的能耗,回放模式下功率仅为23mW,省电模式下更是小于15uW。由于具有上述优点,使得AD50是一款非常理想的音频模拟I/O器件,可以很好的应用在随声听(如CD,MP3)、录音机等数字音频领域2。由TLC320AD50C组成的语音输入与输出模块不仅采样率高最高可达96K,且外围电路简单,性价比高。采用DSP可以直接对PCM编码后的语音信号进行律和A律压缩。图2.1是DSP硬件实现数据压缩解压的简单流程,DSP将传输来的压缩后的数据进行解压成16位或者32位,然后对解压后的数据进行分析、处理,最后将处理后的数据按照要求压缩成8位的数据格式输出到相应设备,供其他设备读取。 CPUR
11、SRDXR压缩XSRRBR解压RJUSTDRRCPUDRDX图2.1 数据压缩解压流程图2.2是DSP将数据解压的值,DSP将压缩的8位数据解压成16位的DSP通用数据格式,其中高13位为解压后的数据,低3位补0。这是因为6711的A律压缩只能对13位数据操作。DSP将解压后的数据放在缓冲串口的发送寄存器中,只要运行发送指令,缓冲串口就会将数据发送出去。缓冲串口对接收数据的解压过程和压缩过程完全相反。图2.3是律数据解压的示意图。 DSP内部的缓冲串口(McBSPs)带有硬件实现的律A律压缩解压,只需要在相应寄存器中进行设置就可以了。在进行A律压缩时,采样后的12位数据,默认其最高位为符号位,
12、压缩时要保持最高位即符号位不变,原数据的后11位要压缩成7位。这7位码由3位段落码和4位段内码组成。具体的压缩变换后的数据根据后11位数据大小决定。除对串行口数据实现压扩处理外,这套硬件在McBSP不使用时还可以当作一个特殊的处理单元对内部数据实现压扩处理,他有两种实现方法。法一:当串行口的发送和接受部分都处于复位状态时,DRR1和DXR1内部通过压扩逻辑连接在一起,数据从DXR1写入并根据XCOMPAND处理,然后根据RCOMPAND再处理,在4个CPU时钟后从DRR1中读出数据。该处理比软件实现快,不利之处在于处理完后没有同步信息通知CPU和DMA。法二:在数据环回模式下,McBSP也实现
13、了一种内连。数据处理与第一种方法相同,但它可以提供中断信号(或同步事件)给CPU(或DMA)。这里数据处理的时间是根据串行口的比特律确定的。另外,在通常情况下McBSP先传输信号的高位后传输低位,但是在字长为8比特的数据传输时,McBSP提供了比特倒序的功能,即可以先传输低位后传输高位。在本实验中,我们通过软件编程来完成线性码转换成A律。语音信号通常是小信号概率大,大信号出现的概率小,为提高小信号时的量化信躁比,压缩比特速率,可为非线性量化。语音压缩是把16位的数据比特转化为8位数据比特,从而到达语音压缩的目的。在主程序中通过A/D抽样量化,可以得到16位的线性编码,再由编码表通过软件计算得到
14、8位A律编码,其中最高位为符号位,第6位到第4位为段落码,低4位为段内码。将8位的压缩结果存储到系统RAM中进行缓存,根据抽样率、语音存储时间以及系统RAM的容量设置语音存储缓冲区的大小,待缓冲区存满后,将缓冲区内的数据进行解压缩,然后输出到SPEAKER接口输出端。若使用A/D转换器,必须首先对A/D转换器进行初始化设置,即设置A/D转换器的工作模式、输入增益以及抽样频率等。第3章 软件设计3.1 设计流程在对语音进行采集时,先要初始化DSP及其串口和A/D和D/A转换器,待所有的都进行初始化后,就可以进行语音的采集,其后续的步骤如下面的流程图3.1所示: 图3.1 设计流程图3.2 创建工
15、程文件及编写程序利用CCS创建一个新工程,然后向该工程中添加源代码文件和库文件。首先在CCS的安装目录e:ccs的文件夹e:ccsmyprojects下建立一个新的文件夹,命名为1111。并将所有的源代码全部拷贝到该新建的文件夹中。然后双击桌面上图标,在出现的对话框中选择C5402 simulator模式下,然后点击“确定”按钮即可进入“code composer studio”界面。从CCS的Project菜单下选择子菜单New。将出现Project Creation对话框。在对话框中“Project Name”处输入1111,“Location”处输入”myproject1111”,在“P
16、roject”处选择Executable(.out)类型,在“Target”中选择CCS所配置的TMS320C54XX 类型的DSP。最后单击“完成”即可。创建好的工程的参数如下图3.2所示:图3.2 工程创建的参数通过上述步骤Code Composer Studio就建立了一个工程文件,名为1111.pjt,该工程文件用于存储工程配置以及在工程中所用到的若干文件。可在“工程项目观察窗口(Project view)”处看到。在CCS中选择菜单Project中的1111.pjt 然后单击右键选择“add Files to Project”,然后选文件yuyin.c,并单击Open。在CCS中选择
17、菜单Project,选中add Files to Project,并在文件类型选框中选汇编源文件(*.a*, *.s*),然后选vectors.asm 和 load.asm 这两个文件并单击Open。这些文件中包含了设置复位RESET中断到程序的C入口c_int00的一些汇编指令。对于更加复杂的程序,可在vectors.asm 文件中定义更多的中断向量。也可利用DSP/BIOS来自动定义所有的中断向量。在CCS中选择菜单Project,选择add Files to Project,并在文件类型选框中选择链接命令文件(*.cmd),然后选yuyin.cmd并单击Open,该命令文件将汇编程序的段
18、映射到DSP的存储空间中。在CCS中选择菜单Project 选择add Files to Project,进入编译库文件夹,在文件类型选框中选择目标文件类型和库文件类型(*.o*, *.lib),为所配置的目标DSP选rts.lib文件并单击Open。该库文件为目标DSP提供了运行时间(runtime)支持。在工程视图窗口,用鼠标右键单击工程文件1111.pjt 并在快捷菜单中选择 Scan All Dependencies。这时.h应出现于工程视图窗口中的库(Libraries)文件夹中。单击Project左边的小加号,将展开工程列表:1111.pjt,Libraries,以及 Source
19、。该列表即为工程视图。无需手工向工程中加入include文件,因为CCS将会在编译过程中自动找到这些文件。编译之后在工程视图中将出现这些include文件。添加好后的文件如下图3.3所示:图3.3 添加好的工程文件3.3编译并运行程序编译并运行程序的步骤: 选择Project点击Rebuild All 或单击工具按钮 就可以运行程序。(1)在默认情况下,将当前工程目录下的debug子目录中生成.out文件。通过CCS工具条可改变生成文件的存放位置。(2)选FileLoad Program,并在对话框中选刚刚编译生成的文件1111.out,单击Open打开。(默认在目录e:ccsmyprojec
20、ts1111Debug 文件夹下)这样CCS就将程序载入目标DSP,并打开一个反汇编窗口,显示出相应的反汇编指令。CCS也将在窗口底部自动打开一个标签区域来显示程序送往stdout的输出。(1)选ViewMixed Source/ASM,将同时看到c源代码和汇编结果代码。(2)在混合模式窗口中单击一条汇编伪指令本身,并按F1键,CCS将搜索该条指令的帮助。(3)选DebugGo Main开始从main 函数处执行程序。程序暂停在main处,并用黄色的箭头标识。(4)选DebugRun或单击工具按钮 来运行程序。(5)选DebugHalt来暂停程序执行。(6)从菜单View中选Mixed Sou
21、rce/ASM。将看到不带相应汇编的c代码。从而可以方便地进行下一个任务:修改程序选项,修正语法错误。通过以上步骤,在运行projectRebuilt All后得出下图3.4结果: 图3.4运行结果从上图可以看出没有错误,故该设计的源程序代码是正确的。接下来可以进行下面的检验以验证该课程设计是否正确。第4章 实验结果与分析4.1 数组和寄存器中的值点击工具栏上面的“view”选择“watch window”然后再输入“buffer”后就可以出现此数组的值,其结果如下图4.1所示:图4.1数组的值再在“view”中选择“memory”可以看到存储器中的数据,其结果如下图4.2所示: 图4.2存储
22、器中的值从上图中我们可以找到存储器中的任何内容,而且便于观察压缩前和压缩后的存储内容是否是一样的,这也可以用来验证设计的程序是否正确。4.2 波形仿真与分析仍然在“view”中选择“graph”然后点击“time frequentcy”可以看到语音输入的波形,压缩后的波形以及解压后的波形图。在观察波形的时候可以加入断点,然后按animate动态显示,这更便于观察波形。所有的输出的波形图如下图4.3所示:图4.3语音采集的输入波形图4.4语音压缩后的波形图4.5语音解压后的波形从上面的三幅仿真结果图可以得到输入的波形图与压缩后的波形图相比,压缩后的波形比输入的波形要尖锐一些,而解压后的波形图与输
23、入的波形相比基本上是一样的,也就是说该课程设计是成功的。第5章 结束语从本次课程设计的中心来看,课题是希望通过对语音信号的采集压缩存储与回放而将相应的结果显示出来,这里就是指对程序的编写,调试等。在这里我们只要编写正确的程序,经过调试,仿真硬件调试就可以对其进行处理了。在这里,用到了处理数字信号的强有力工具CCS软件。在课设过程中,我对DSP实验系统箱有了全面的了解,最重要的是对DSP实验系统箱上的芯片的分类,用处等有了全面的了解,充分的认识了DSP的作用,与此同时我还学会了使用CCS一些基本函数,增加了进一步学习CCS软件的兴趣。同时,通过本次课程设计,锻炼了我的动手能力,和提高了我分析问题
24、,解决问题的能力。整个课程设计过程中,我在不断的查阅资料和开动脑筋过程中,锻炼了我的资料采集能力,也锻炼了我的分析整理能力,为以后作毕业设计打下了基础;同样在实验过程中我遇到很多困难,而这些困难则锻炼了我的耐心和分析解决问题的能力。总之通过这次的课程设计,让我认识到了自己的不足,同时又通过这次的课程设计让我们学到了让我们受用一生的知识。虽然在设计中遇到了许多原理问题,但是在老师的悉心指导下,终于迎刃而解。同时,我也在老师的身上学到了许多有用的知识,使我受益匪浅,在此我表示感谢!参考文献1 周霖.DSP系统设计与实现M.北京:电子工业出版社,2005.2 苏涛. DSP实用技术M.西安:西安电子
25、科技大学出版社,2005.3 彭启宗.TMS320C54xx实用教程M.成都:科技大学出版社,2004.4 刘益成.DSP程序设计与开发M.北京:航天大学出版社,2001.5 戴明桢、周建江.TMs320C54x DSP 结构原理及应用M.北京:航空航天出版社 附录 存储器的分配(5402.cmd)MEMORY PAGE 0: VECS: origin = 0080h, length = 0080h /* Internal Program RAM */ PRAM: origin = 7600h, length = 8000h /* Internal Program RAM */ PAGE 1:
26、 SCRATCH: origin = 0060h, length = 0020h /* Scratch Pad Data RAM */ DMARAM: origin = 0C00h, length = 0300h /* DMA buffer */ DATA: origin = 1100h, length = 0080h /* Internal Data RAM */ STACK: origin = 1180h, length = 0560h /* Stack Memory Space */ INRAM: origin = 1900h, length = 0100h /* Internal Da
27、ta RAM */ HPRAM0: origin = 1A00h, length = 0002h /* HPI memory accessible by Host and DSP */ HPRAM1: origin = 1A02h, length = 0280h /* HPI memory accessible by Host and DSP */ HPRAM2: origin = 1C82h, length = 0280h /* HPI memory accessible by Host and DSP */ EXRAM: origin = 1F10h, length = 9000h /*
28、External Data RAM */SECTIONS .cinit 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 SCRATCH PAGE 1 .const EXRAM PAGE 1 .data EXRAM PAGE 1 .bss EXRAM PAGE 1 .cio EXRAM PAGE 1 .switch EXRAM PAGE
29、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 codebook */ cdbktab EXRAM PAGE 1 /* various codebook tables*/ logtab EXRAM PAGE 1 /* table for log2 */ powtab
30、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 /* table for square root */ acbtab EXRAM PAGE 1 /* table for thresholds in acb */ pm03tab EXRAM PAGE 1 /* table
31、 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 PAGE 1/*主程序设计*/*语音采集及回放程序*/*用A律进行压缩及解压*/*采用AD50进行A/D,D/A转换 */ /*灯循环闪烁程序开始*/*L0:录音*/*L1:放音*/#include /* 头文件*/#i
32、nclude #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
33、);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;s16 data;s16 data1;u16 i=0;u16 temp1;u16 j=0;u16 k,l=0;u8 temp2;u16 buffer20000;static short seg_end8
34、=0x1F,0x3F,0x7F,0xFF,0x1FF,0x3FF,0x7FF,0xFFF;void main() if (brd_init(100) 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_L
35、ED1); 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处的采样 brd_led_toggle(BRD_LED0); data = *(volatile u16*)DRR1_ADDR(HANDSET_CODEC); /从handset处读取采样 temp1=data2ala
36、w(data); /对采样进行a律压缩 i=i+1; if(i%2=1) bufferj=(temp1=40000) i=0; if(j=20000) j=0; brd_led_disable(BRD_LED0); brd_led_toggle(BRD_LED1); /点亮二极管1 表示放音开始 /* 放音部分 */ for(k=0;k8)&0x0ff; else temp2=bufferl&0x0ff; l+; if(l=20000) l=0; data1=alaw2data(temp2); / a律解压 while (!MCBSP_XRDY(HANDSET_CODEC) ; *(volat
37、ile u16*)DXR1_ADDR(HANDSET_CODEC) = data1; /将数据写入D/A转换器 /* 放音结束 */ brd_led_toggle(BRD_LED0); brd_led_toggle(BRD_LED1); /主程序结束 /* 子函数 */ /*延时*/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); /切换LED指示灯0的显示状态delay(1
38、000);brd_led_toggle(BRD_LED1);delay(1000);brd_led_toggle(BRD_LED2);delay(1000);/*初始化codec*/void initcodec(void)/* Open Handset Codec 获取设置codec的句柄*/ hHandset = codec_open(HANDSET_CODEC); / Acquire handle to codec /* Set codec parameters */ codec_dac_mode(hHandset, CODEC_DAC_15BIT); / DAC in 15-bit mo
39、de 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_8000); / 8KHz sampling rate /*设置flash*/vo
40、id 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;/ Convert the scaled magnitude to segment number. seg = search(pcm_val, seg_end, 8); / Combine t