您的当前位置:首页正文

DSP课程设计报告(精)甄选范文

来源:画鸵萌宠网
DSP课程设计报告(精)

DSP课程设计

实 验 报 告 语音压缩、存储与回放 成绩:

工程设计50

报告20

答辩30

总分

评语: 指导教师签字:

日期:

一、 实验背景与内容

语音通信是现代多媒体通信中一个重要的组成部分,而语音信号是信息的重要形式, 语音信号处理有着广泛的应用领域,同时语音压缩在语音信号的传输、存储等方面有非常广泛的作用,而且在通信领域中已经有较成熟的发展和广泛应用。本设计要求采用DSP及其A/D、D/A转换器进行语音信号的压缩、存储和回放。 语音的数字通信无论在可靠性、抗干扰能力、保密性还是价格方面都远优于模拟语音信号,但这是以信道占用宽频带宽为代价的。因此为了减少语音信号所占用的带宽或存储空间,就必须对数字语音信号进行压缩编码。一个优秀的语音压缩系统要求能够在软硬件资源占用比例低和压缩编解码时间短的同时,可以实现

多通道语音实时压缩。

1 / 31 doc可编辑

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 / 31 doc可编辑

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硬件优点:

内部多总线结构保证在一个机器周期内可以多次访问程序空间和数据空间;指令执行时的多重流水线结构将指令周期降低到了最

3 / 31 doc可编辑

小值;多处理单元可以在一个指令周期内同时进行运算,而这种结构恰好满足了数字信号处理中的一些特殊要求如FIR、IIR、FFT

等运算。 C5402的软件特点:7种有效灵活的寻址方式,仅为10ns的指

令执行周期。 2、TMS320C5402的结构及原理

TMS320C5402采用先进的改进的哈佛结构和8条总线结构,解决了冯诺伊曼(Von-Neumann)结构中高速数据传输时的传输通道上的瓶颈现象,使处理器的性能大大提高,程序数据总线相互独立,允许同时访问程序存储器和数据存储器,实现高度并行操作。此外,还可以在数据总线与程序总线之间相互传送数据,从而使处理器具有在单个周期内同时执行算数运算、逻辑运算、移位操作、乘法/累加运算以及访问程序和数据存储器的强大功能。

TMS320C5402的内部多总线结构保证在一个机器周期内可以多次访问程序空间和数据空间;指令执行时的多重流水线结构将指令周期降低到了最小值;多处理单元可以在一个指令周期内同时进行运算,而这种结构恰好满足了数字信号处理中的一些特殊要求如FIR、IIR、FFT等运算。由于C5402有7种有效灵活的寻址方式的软件特点,仅为10ns的指令执行周期,还有一些特殊的运算指令更好地满足了数字信号处理中特有的运算需要。

4 / 31 doc可编辑

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个数据和控制寄存器,用于编程控制它们的工作状态。它的数据传输模式和采样速率都

5 / 31 doc可编辑

可以通过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)

6 / 31 doc可编辑

在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的压扩硬件处理

7 / 31 doc可编辑

在电信中常常利用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接口输出端。

8 / 31 doc可编辑

若使用A/D转换器,必须首先对A/D转换器进行初始化设置,即设置A/D转换器的工作模式、输入增益以及抽样频率等。

A律压缩编码表

线性输入编码

压缩编码

0000000wxyza 0000001wxyza 000001wxyzab 00001wxyzabc 0001wxyzabcd 001wxyzabcde 01wxyzabcdef 1wxyzabcdefg

000wxyz 001wxyz 010wxyz 011wxyz 100wxyz 101wxyz 110wxyz 111wxyz

9 / 31 doc可编辑

五、程序设计思路

DSP程序设计应包括用户程序、存储器配置程序。为了实现语音信号的采集与回放,先将语音信号采集,运用a律压缩算法将信号压缩并存入存贮器中,当放音开始时运用a律解压算法将信号解压并从存储器中释放出来,实现语音的回放。 1、软件设计流程 否

2、TMS320VC5402 mcbsp的串口的初始化

首先将DSP的串口1复位,再对串口1的16个寄存器进行编程,使串口1工作在以下状态:禁止SPI模式,但数据相,每帧一字,每字16位,帧同步脉冲低电平有效,并且帧同步信号和移位信号有外部时钟产生。

hHandset = codec_open(HANDSET_CODEC;

此语句调用了函数codec_open(对串口1进行了初步设置,设置成功返回codec的句柄放在变量 hHandset中,作为调用其他函数的实参。

10 / 31 doc可编辑

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;*/

11 / 31 doc可编辑

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. */

12 / 31 doc可编辑

/******************************************************************/ /* 函数声明 */

/*******************************************************************/

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;

13 / 31 doc可编辑

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,表示录音开始

14 / 31 doc可编辑

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 }

15 / 31 doc可编辑

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;

16 / 31 doc可编辑

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 表示放音结束 } }

} //主程序结束

/*******************************************************************/ /* 子函数 */

/****************************************************************/

17 / 31 doc可编辑

/*******延时******/ 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;

}

18 / 31 doc可编辑

}

/*****初始化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;

19 / 31 doc可编辑

}

/*****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;

20 / 31 doc可编辑

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;

}

21 / 31 doc可编辑

/*****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;

22 / 31 doc可编辑

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 */

23 / 31 doc可编辑

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

24 / 31 doc可编辑

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

25 / 31 doc可编辑

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:\i\\ c5400\\cgtools\\ rts.lib

相关的头文件 C:\i\\ c5400\\cgtools\\include\\*.h

DSK板库文件:

26 / 31 doc可编辑

C:\i\\ c5400\\dsk5402\\ drv5402.lib,dsk5402.lib 相关的头文件 C:\i\\ 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”加入头文件所指定的位置。如下图:

27 / 31 doc可编辑

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

运行。

4、实验现象结果显示:

通过波形及寄存器的值可以详细察看程序的执行状况,并观看每个时刻的情况。

用到的关键寄存器

选择View中的Registers的CPU Registers选项,可以看到CPU中寄存器的变化情况,选择View中的Registers的Peripheral Regs选项,可以看到外设寄存器的变化情况。寄存器及变量某瞬时值如下:

28 / 31 doc可编辑

实验波形

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

输入波形:

压缩波形:

输出波形:

29 / 31 doc可编辑

5、硬件结果显示

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

通过此次实验设计,我了解了DSP的内部资源以及各部件的作用。通过应用DSP算法实现对语音信号的压缩、存储和回放的实验过程,使我熟悉了使用C语言编写较复杂的程序,对CCS5000对程序的完整调试过程有了进一步的理解。另外对A律算法的C语言实现基本掌握,对PCM语音压缩算法的基本原理有了一定的认识。

设计开始时,我先熟悉了实验所要实现的功能以及CCS软件的基本操作和调试,通过查找相关的资料,对语音压缩的算法,编码与解码有了一定的了解。ITU-T G.711建议的PCM A律和µ律语音压缩标准可以分别将13比特和14比特压缩为8比特,可以达到语音压缩的目的。

30 / 31 doc可编辑

实验中,需要首先了解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

感谢您使用本店文档 您的满意是我们永恒的追求! (本句可删)

------------------------------------------------------------------------------------------------------------

31 / 31 doc可编辑

因篇幅问题不能全部显示,请点此查看更多更全内容

Top