您现在的位置:首页 > >

DSP课程设计报告(精)

发布时间:

DSP 课程设计

实?验?报?告 语音压缩、存储与回放 成绩: 工程设计 50

报告 20

答辩 30

总分

评语: 指导教师签字: 日期:

一、 实验背景与内容
语音通信是现代多媒体通信中一个重要的组成部分,而语音信号是信息的重要形式, 语音信号处理有着广泛的应用领域,同时语音压缩在语音信号的传输、存储等方面 有非常广泛的作用,而且在通信领域中已经有较成熟的发展和广泛应用。本设计要 求采用 DSP 及其 A/D、D/A 转换器进行语音信号的压缩、存储和回放。 语音的数字通信无论在可靠性、抗干扰能力、保密性还是价格方面都远优于模拟语 音信号,但这是以信道占用宽频带宽为代价的。因此为了减少语音信号所占用的带 宽或存储空间,就必须对数字语音信号进行压缩编码。一个优秀的语音压缩系统要 求能够在软硬件资源占用比例低和压缩编解码时间短的同时,可以实现多通道语音 实时压缩。 DSP 仿真器用于 DSP 的在线调试开发,可以通过软件在线控制 DSP 的运行状态, 并能够查看 DSP 内部寄存器。PC 是开发人员和 DSP 系统之间的交互界面,通过 PC *沧暗 CCS 集成开发环境,开发人员可以在友好的图形界面下对目标系统进 行操作。 本次实验采用 DSP C5402 实验板实现语音信号的压缩解压的。SEED-VC5402 DSK 实验板上集成了 SRAM,FLASH,音频输入输出接口等部件。

二、 实验目的
1、应用 DSP 算法实现对语音信号的压缩、存储和回放。 2、熟悉使用 C 语言编写较复杂的程序; 3、熟悉 C 语言对外设(DSK 板或示波器)的访问(软件编程、硬件连接); 4、熟练使用软件 CCS5000 对程序的完整调试过程。

三、实验设计要求及目标
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 比特,达到语音压缩的目的。

四、实验原理
1、 DSK 包括: 主芯片 1 枚:100 MHz TMS320VC5402 DSP RAM 1 枚:1 个软件等待的 64K× 16bit 的 SRAM(CY7C1021V33 FLASH 1 枚:256K× 16bit 的 FLASH 存储器(AM39VF400A

接口 2 个:一个连接到 PC 机并口的主机端接口 HPI 和用于仿真的 JTAG 测试总线 控制器 信号采集和输出端口:麦克风/耳机音频接口 ??C5402 的硬件特点: 增强型哈佛结构,一个程序总线,三个独立的数据总线;40bit 的算术逻辑单元 ALU ;可寻址的程序空间达 1Mx16bit;4Kx16bit 片内 ROM ;16Kx16bit 双口片内 RAM;片内外设:软件可编程等待状态发生器;片内锁相环时钟发生器;两个多 通道缓冲串口;增强型 8bit 并行 HPI 口;两个 16bit 定时器;六通道 DMA 控制 器;节电模式 IDLE1,IDLE2,IDLE3 做功耗控制;单周期定点指令(100MIPS) 执行时间为 10ns。 ??C5402 硬件优点: 内部多总线结构保证在一个机器周期内可以多次访问程序空间和数据空间;指令执 行时的多重流水线结构将指令周期降低到了最小值;多处理单元可以在一个指令周 期内同时进行运算,而这种结构恰好满足了数字信号处理中的一些特殊要求如 FIR、IIR、FFT 等运算。 ??C5402 的软件特点:7 种有效灵活的寻址方式,仅为 10ns 的指令执行周期。 2、TMS320C5402 的结构及原理 TMS320C5402 采用先进的改进的哈佛结构和 8 条总线结构,解决了冯诺伊 曼(Von-Neumann)结构中高速数据传输时的传输通道上的瓶颈现象,使处 理器的性能大大提高,程序数据总线相互独立,允许同时访问程序存储器和 数据存储器,实现高度并行操作。此外,还可以在数据总线与程序总线之间 相互传送数据,从而使处理器具有在单个周期内同时执行算数运算、逻辑运 算、移位操作、乘法/累加运算以及访问程序和数据存储器的强大功能。 TMS320C5402 的内部多总线结构保证在一个机器周期内可以多次访问程序 空间和数据空间;指令执行时的多重流水线结构将指令周期降低到了最小 值;多处理单元可以在一个指令周期内同时进行运算,而这种结构恰好满足 了数字信号处理中的一些特殊要求如 FIR、IIR、FFT 等运算。由于 C5402 有

7 种有效灵活的寻址方式的软件特点,仅为 10ns 的指令执行周期,还有一些 特殊的运算指令更好地满足了数字信号处理中特有的运算需要。 TMS320C5402 具有高速的,全双工串行口,可用来与系统中的其他 C54x 器 件,编码解码器,串行 A/D,D/A 转换器以及其他的串行器件直接接口。这 两个串行口均为多通道缓冲串行口 McBSP(Multi-channel Buffered Serial Port)。它支持全双工通信,双缓冲数据寄存器,允许连续的数据流。内置 μ-律和 A-律压扩硬件。

DSP 结构框图

3、AD50 的结构与原理 AD50 是单片音频接口芯片(AIC)。它内部集成了 16 位的 D/A 和 A/D 转换 器,采样速率最高可达 22.05kb/s,其采样速率可通过 DSP 编程来设置。在 DAC 之前有一个插值滤波器以保证输出信号*滑和 ADC 之后有一个抽取滤 波器以提高输入信号的信噪比。 AD50 内部有 7 个数据和控制寄存器,用于 编程控制它们的工作状态。它的数据传输模式和采样速率都可以通过 DSP 对其控制寄存器的编程来实现,因此,在许多场合下,AD50 都作为 DSP 的 AIC 来实现音频处理。

寄存器 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 位表示二次通信。它们各 自的时序如下:

4、程序存储芯片 实验中,电路选用的芯片 SST39VF400 是一个低功耗 FLASH。 芯片硬件特点:A17 至 A0 为外部地址管脚,D15 至 D0 为 1 条数据线,CE#为片选 控制管脚(低有效),OE#为输出控制管脚(低有效),WE#为写入控制管脚(低 有效)。工作在 2.7V 至 3.6V 电压下,存储容量位 256KW,其。中的数据可以保 持 100 年以上,可重复编程次数高达 10 万次。 5、u_LAW/a_LAW 的压扩硬件处理 在电信中常常利用 u 律和 a 律对数据进行压扩处理,C5400 在 McBSP 中提供了专 门的硬件实验这一功能。压扩处理时,CPU 访问到的都是 16 位的,他分别是利用 线性的 14 位数据(u 律)和 13 位(a 律)数据左对齐获得的。压扩硬件结构和相 应的数据如下图所示。

在本实验中,我们通过软件编程来完成线性码转换成 A 律。

语音信号通常是小信号概率大,大信号出现的概率小,为提高小信号时的量化信躁 比,压缩比特速率,可为非线性量化。语音压缩是把 16 位的数据比特转化为 8 位 数据比特,从而到达语音压缩的目的。 在主程序中通过 A/D 抽样量化,可以得到 16 位的线性编码,再由编码表通过软件 计算得到 8 位 A 律编码,其中最高位为符号位,第 6 位到第 4 位为段落码,低 4 位 为段内码。将 8 位的压缩结果存储到系统 RAM 中进行缓存,根据抽样率、语音存 储时间以及系统 RAM 的容量设置语音存储缓冲区的大小,待缓冲区存满后,将缓 冲区内的数据进行解压缩,然后输出到 SPEAKER 接口输出端。 若使用 A/D 转换器,必须首先对 A/D 转换器进行初始化设置,即设置 A/D 转换器 的工作模式、输入增益以及抽样频率等。 A 律压缩编码表

线性输入编码

压缩编码

0000000wxyza

000wxyz

0000001wxyza

001wxyz

000001wxyzab

010wxyz

00001wxyzabc

011wxyz

0001wxyzabcd

100wxyz

001wxyzabcde

101wxyz

01wxyzabcdef

110wxyz

1wxyzabcdefg

111wxyz

五、程序设计思路 DSP 程序设计应包括用户程序、存储器配置程序。为了实现语音信号的采集与 回放,先将语音信号采集,运用 a 律压缩算法将信号压缩并存入存贮器中,当放音 开始时运用 a 律解压算法将信号解压并从存储器中释放出来,实现语音的回放。 1、软件设计流程 否 2、TMS320VC5402 mcbsp 的串口的初始化 首先将 DSP 的串口 1 复位,再对串口 1 的 16 个寄存器进行编程,使串口 1 工作在以下状态:禁止 SPI 模式,但数据相,每帧一字,每字 16 位,帧同步 脉冲低电*有效,并且帧同步信号和移位信号有外部时钟产生。 hHandset = codec_open(HANDSET_CODEC; 此语句调用了函数 codec_open(对串口 1 进行了初步设置,设置成功返回 codec 的句柄放在变量 hHandset 中,作为调用其他函数的实参。 3、AD50 的初始化:

该初始化过程调用了 5 个函数对 AD50 的 5 项参数进行了设置,包括 adc 和 dac 的工作模式,模拟输入和输出的增益;以及 AD,DA 的转换速率。

4、从 McBSP 的接收通道读取 A/D 转换的值,然后经过压缩解压后将其发送到 McBSP 的发送通道,讲解压后的数据将数据写入 D/A 转换器。 程序如下: while (1 { /* Wait for sample from handset */ while (!MCBSP_RRDY(HANDSET_CODEC {}; /* Read sample from and write back to handset codec */ data=*(volatile int*DRR1_ADDR(HANDSET_CODEC; pre=int2alaw(data; /*or pre=int2ulaw(data;*/ data=alaw2int(pre; /*or data=ulaw2int(pre;*/ *(volatile int*DXR1_ADDR(HANDSET_CODEC=data;

六、实验程序
1 C 语言程序

/******************************************************************/ /* 头文件 */ /*******************************************************************/ #include #include #include #include /*******************************************************************/ /* 变量宏定义 */ /*******************************************************************/ #define SIGN_BIT (0x80 /* Sign bit for a A-law byte. */ #define QUANT_MASK (0xf /* Quantization field mask. */ #define NSEGS (8 /* Number of A-law segments. */ #define SEG_SHIFT (4 /* Left shift for segment number. */ #define SEG_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 char a_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 buffer[22000]; static short seg_end[8]={0x1F,0x3F,0x7F,0xFF,0x1FF,0x3FF,0x7FF,0xFFF}; /*******************************************************************/ /* 主函数 */ /*******************************************************************/ void main( { if (brd_init(100 return; led(2; //闪灯两次

initcodec(; //初始化 codec flashenable(; //选择片外 FLASH 为片外存储器 while (1 { while (!MCBSP_RRDY(HANDSET_CODEC {}; //等待接收 handset 处的采样 if (i==0 brd_led_toggle(BRD_LED0; //点亮二极管 0,表示录音开始 data = *(volatile u16*DRR1_ADDR(HANDSET_CODEC; //从 handset 处读取采样 temp1=data2alaw(data; //对采样进行 a 律压缩 /*****************************************************************/ /* 把低地址数据放在高八位 高地址数据放在低八位 */ /*******************************************************************/ i=i+1; if(i%2==1 { buffer[j]=(temp1<<=8; /*奇数数据左移 8 位 temp1=abcdefgh00000000 buffer[j]=temp1*/ } else { buffer[j]=(buffer[j]|temp1; /*偶数数据与 temp1 取或 组成新的数据 buffer[j]=abcdefghiabcdefghi*/

j++; //j 加 1 } if(i>=44000 { i=0; } if(j>=22000 { j=0; brd_led_toggle(BRD_LED0; //熄灭数码管 0 表示录音结束 brd_led_toggle(BRD_LED1; //点亮二极管 1 表示放音开始 /*******************************************************************/ /* 放音部分 */ /*******************************************************************/ for(k=0;k<44000;k++ { if(k%2==0 { temp2=(buffer[l]>>8&0x0ff; } else { temp2=buffer[l]&0x0ff; l++;

} if(l>=22000 l=0; data1=alaw2data(temp2; while (!MCBSP_XRDY(HANDSET_CODEC {}; *(volatile u16*DXR1_ADDR(HANDSET_CODEC = data1; } /*******************************************************************/ /* 放音结束 */ /*******************************************************************/ if(k==44000 brd_led_toggle(BRD_LED1; //熄灭二极管 1 表示放音结束 } } } //主程序结束 /*******************************************************************/ /* 子函数 */ /****************************************************************/ /*******延时******/ void delay(s16 period { int i, j; for(i=0; i {

for(j=0; j >1; 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; // 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_8000; // 8KHz sampling rate } /*****设置 flash****/ void flashenable(void { CPLD_CTRL2_REG|=0x0010; CPLD_DMCTRL_REG|=0x0040; } /*****a 律压缩******/ unsigned char data2alaw(s16 pcm_val { Int mask; Int seg; unsigned char aval; 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, 返回最大数. return (0x7F ^ mask; else { aval = seg << SEG_SHIFT; if (seg < 2 aval |= (pcm_val >> 1 & QUANT_MASK; else aval |= (pcm_val >>seg & QUANT_MASK; return (aval ^ mask; } } /****alaw 的子程序**/ static int search(int val,short *table,int size { Int i; for (i = 0; i < size; i++

{ if (val <= *table++ return (i; } return (size; } /*****a 律解压******/ int alaw2data(unsigned char a_val { Int t; Int seg; a_val ^= 0x55; t = (a_val & QUANT_MASK << 4; seg = ((unsigneda_val & SEG_MASK >> SEG_SHIFT; if(seg==0 { t += 8; t=(t>>3; } if((seg<4&&(seg>0 { t +=0x108; t=(t>>(4-seg; }

if(seg>3 { t+=0x108; t=(t<<=(seg-4; } return ((a_val & SIGN_BIT ? t : -t; } /*******************************************************************/ /* 结束 */ /*******************************************************************/ 2、存储器的分配(*.cmd) MEMORY { PAGE 0: VECS: origin = 0080h, length = 0080h /* Internal Program RAM */ PRAM: origin = 7600h, length = 8000h /* Internal Program RAM */ PAGE 1: 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 Data 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 = 5A00h /* 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 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 > 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 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 } 七、CCS 程序调试与结果 1、启动 Setup CCS 程序 设置 CCS 的环境。选择浮动菜单 Import configuration->Available configuration 列 表中,然后选中 C5402 Device Simulator (没接 DSK 板时、C5402 DSK via Parallel Port Emulation (接 DSK 板时。选中 Import,最后选中 save and quit 以保存目标 DSP 的配置。

2、运行 CCS2(‘5000,出现 CCS 界面。新建一个工程,向工程中添加 c 语言 程序文件、CMD 程序、头文件和库文件。 C 程序运行支持库: C:\ti\ c5400\cgtools\ rts.lib 相关的头文件 C:\ti\ c5400\cgtools\include\*.h DSK 板库文件: C:\ti\ c5400\dsk5402\ drv5402.lib,dsk5402.lib 相关的头文件 C:\ti\ c5400\dsk5402\include\*.h 在程序中还用到其他头文件: #include #include #include #include C 语言程序文件、CMD 程序和库文件的加入可通过 Project 里的 Add Files to Project 找到相应的文件直接加入。最好是将.h 和.lib 文件都拷贝到自己的工程中,

或者在 CCS 的 example 中进行调试、编译,这样一般就不会出现找不到头文件的 错误信息。当汇编出现找不到头文件的错误时,如下图。

这时需要通过 Build options 里的“include SearchPath(-i)option”加入头文件 所指定的位置。如下图:

3、程序汇编、链接通过并生成.out 文件。装载.out 文件后就可以运行。

4、实验现象结果显示: 通过波形及寄存器的值可以详细察看程序的执行状况,并观看每个时刻的情 况。 用到的关键寄存器 选择 View 中的 Registers 的 CPU Registers 选项,可以看到 CPU 中寄存器的变化 情况,选择 View 中的 Registers 的 Peripheral Regs 选项,可以看到外设寄存器的变 化情况。寄存器及变量某瞬时值如下:

实验波形 通过 View 中的 Graph 可以看到波形图。如下:

输入波形:

压缩波形:

输出波形:

5、硬件结果显示 对语音信号开始采样后,灯闪两次,初始化 codec。二级管灯 0 亮开始采集语 音数据,二极管灯 0 熄灭录音结束,二极管灯 1 亮开始放音,二极管灯 1 熄灭放音 结束,二极管灯 0 亮重新开始采样语音信号。如此再循环运行程序。

八、实验总结
通过此次实验设计,我了解了 DSP 的内部资源以及各部件的作用。通过应用 DSP 算法实现对语音信号的压缩、存储和回放的实验过程,使我熟悉了使用 C 语 言编写较复杂的程序,对 CCS5000 对程序的完整调试过程有了进一步的理解。另 外对 A 律算法的 C 语言实现基本掌握,对 PCM 语音压缩算法的基本原理有了一定 的认识。 设计开始时,我先熟悉了实验所要实现的功能以及 CCS 软件的基本操作和调 试,通过查找相关的资料,对语音压缩的算法,编码与解码有了一定的了解。ITUT G.711 建议的 PCM A 律和 ?律语音压缩标准可以分别将 13 比特和 14 比特压缩为 8 比特,可以达到语音压缩的目的。

实验中,需要首先了解 DSK 板上的硬件资源的结构特点与作用。软件调试过 程中我们遇到了一些问题。首先,由于 C 语言程序文件、CMD 程序和库文件的加 入可通过 Project 里的 Add Files to Project 找到相应的文件直接加入。但是,编译时 出现找不到头文件的错误时,这时我们通过 Build options 里的加入头文件所指定的 位置。 最终通过学*及不断的调适能够熟练的应用软件实现自己需要的功能,将程序 下载到实验板上,成功运行。开始采集语音数据时二级管灯 0 亮,二极管灯 0 熄灭 表示录音结束,二极管灯 1 亮开始放音,二极管灯 1 熄灭放音结束,二极管灯 0 亮 说明重新开始采样语音信号。这样循环运行下去。 参考文献 [1] 高海林、钱满义.DSP 技术及其应用讲义.2005 年 10 月 [2]. 周霖. DSP 通信工程技术应用[M]. 北京: 国防工业出版社,2003.115 [3] 张勇.C/C++ 语言硬件程序设计[M]. 西安:西安电子科技大学出版社, 2002.27-75



热文推荐
猜你喜欢
友情链接: 医学资料大全 农林牧渔 幼儿教育心得 小学教育 中学 高中 职业教育 成人教育 大学资料 求职职场 职场文档 总结汇报