语音压缩、存储与回放

更新时间:2024-05-30 10:37:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

DSP课程设计

实 验 报 告

语音压缩、存储与回放

目录

一. 设计任务书 .............................................................................................................................. 1

1. 设计概述 ............................................................................................................................. 1

二. 三.

四.

五.

六. 七.

2. 设计目的 ............................................................................................................................. 1 3. 设计目标 ............................................................................................................................. 1 设计内容 .................................................................................................................................. 2 设计算法、原理说明............................................................................................................... 2 1. 设计方案 ............................................................................................................................. 2 2. 设计框图 ............................................................................................................................. 2 3. 算法原理 ............................................................................................................................. 2 硬件平台介绍 .......................................................................................................................... 7 1. 系统组成结构 ..................................................................................................................... 7 2. 主要硬件分析 ..................................................................................................................... 7 程序设计、调试与结果分析 ................................................................................................... 9 1. 程序流程图 ......................................................................................................................... 9 2. 源程序 ................................................................................................................................. 9 3. 存储器配置程序(.cmd文件) ...................................................................................... 18 4. 调试过程 ........................................................................................................................... 19 5. 结果分析 ........................................................................................................................... 19 总结感想 ................................................................................................................................ 20 参考文献 ................................................................................................................................ 20

语音压缩、存储与回放 王哲 09211114 一. 设计任务书

1. 设计概述

语音信号是信息的重要形式, 语音信号处理有着广泛的应用领域,而语音压 缩在语音信号的传输、存储等方面有非常广泛的作用,而且在通信领域中已经有较成熟的发展和广泛应用。本设计要求采用DSP及其A/D、D/A转换器进行语音信号的压缩、存储和回放。 2. 设计目的

(1) 了解DSP处理系统的关键器件的使用方法;

(2) 掌握DSP课程设计的基本方法,巩固信号处理的基本理论知识; (3) 掌握查阅有关资料和使用器件手册的基本方法,学会阅读原版英文资

料;

(4) 掌握DSP片外资源和片上资源访问的基本方法,如存储器、McBSP、A/D

和 D/A转换器等。

(5) 通过本次试验的设计和操作,掌握在CCS的软件环境下进行编辑、编译

链接、调试和数据分析等工作。

(6) 分利用DSK的集成环境,完成语音的采集,存储和回放。 (7) 掌握PCM编码技术的基本原理及语音的A律压缩与解压。 3. 设计目标 基本部分:

(1) 使用DSP实现语音压缩和解压缩的基本算法,算法类型自定,例如可以

采用G.711、G.729等语音压缩算法。

(2) 采用A/D转换器从MIC输入口实时采集语音信号,进行压缩后存储到DSP

的片内和片外RAM存储器中,存储时间不小于10秒。

(3) 存储器存满之后,使用DSP进行实时解压缩,并从SPEAKER输出口进行

回放输出。

(4)使用指示灯对语音存储和回放过程进行指示。 发挥部分:

使用多种算法进行语音的压缩、存储和解压缩,比较它们之间的优缺点。

第 1页 共 20 页

语音压缩、存储与回放 王哲 09211114 二. 设计内容

a. 修改编写CODEC程序,利用A/u律实现语音信号的采集、压缩存储,解压

缩与回放语音信号的基本算法。

b. 创建、编译、链接工程项目,在BJTU-DSP5502板上调试运行。 c. 采用A/D转换器从MIC端(J5端口)接入Line in信号采集信号(来自计算机

麦克风输出),进行压缩后存储到DSP的片内或片外RAM存储器中。

d. 存储器存满之后,使用DSP进行实时解压缩,并从输出口进行回放输出,

在Head phone信号输出端(J6端口)接入扬声器或耳机,试听语音信号输出的效果。

三. 设计算法、原理说明

1. 设计方案

利用BJTU-DSP5502系统实验箱实现。用系统板CODEC芯片中的AD/DA转换电路AIC23B将由MIC输入的模拟信号转换为16位数字信号送入DSP板中进行压缩处理,压缩处理后的数据经过解压后再送至D/A转换器转换为模拟信号,由SPEAKER口输出,压缩和解压缩用A律和u率格式。可通过键盘输入进行选择,从而实现语音信号的采集压缩、存储与回放,编程由C语言完成。 2. 设计框图

3. 算法原理

(1) 语音编码概述

将模拟声音信号转换为数字声音信号需要经过抽样、量化、编码三步。其中,信号采样率就是抽样的频率,A/D转换的位数对应了量化的精

语音信号MIC 语音信号 SPEAKER A/D A/u率压缩 存入SRAM DAC A/u率解压 第 2页 共 20 页

语音压缩、存储与回放 王哲 09211114

度。在本实验系统中这两步是由板载Codec来实现的。这种以信号的强度依照同样的间距分成数段,然后用二进制码记录的编码方式称为PCM(脉冲编码调制)。脉冲编码调制用同等的量化级数进行量化,即采用均匀量化,而均匀量化是基本的量化方式。但是均匀量化有缺点,在信号动态范围较大而方差较小的时候,其信噪比会下降。

为了在电话线路上传输更多的语音话路,实际应用中还需要对PCM信号进行压缩。压缩编码的方式,是建立在语音信号的特点及统计规律之上的。首先,人说话的语音信号普遍在3kHz左右,最高基本不超过3.4kHz。其次,根据对大量语音样本的统计,我知道,在语音信号中小幅度成分出现的概率要比大幅度多得多,因而对大幅度信号采用较低的量化精度,不会对整体效果产生太大的影响,即小幅度信号量化间隔小,大幅度信号的量化间隔大,这种量化方式即非均匀量化。

根据以上原理,CCITT在上世纪80年代制订了G.711 A律、μ律编码标准,通常又被称为A律PCM或μ律PCM。经过G.711标准编码后语音信号采样率为8kHz,按13段(A律)或15段(μ律)进行8位非均匀量化,每秒的数据量为8-bit×8000=64kbit=8kB。根据相关测试,其8-bit非均匀量化的效果可与13-bit均匀量化的效果相当。

由于相比均匀量化来说,小幅度信号的量化间隔被变小,大幅度信号的量化间隔被拉大,故这种方式又成为压缩扩展(压扩)技术。压扩技术主要分为“模拟压扩法”和“直接非均匀编解码法”,不同之处在于对信号进行非线性量化的时刻不同。

在本实验中,非均匀量化由软件在16-bit均匀量化的结果上实现,属于“直接非均匀编解码法”。

(2) A率和μ率压缩,解压缩编码原理及对应表

G.711的两个标准的压缩扩展特性曲线称为A律和μ律,是CCITT提出的G.711协议PCM编码方式的一部分。国际上,北美和日本使用μ律,欧

第 3页 共 20 页

语音压缩、存储与回放 王哲 09211114

洲和我国使用A律,两种算法都使用了非线性的量化方式,把量化间隔变换成人耳能检测的线性空间。

其中A律将归一化后的幅度,正负分别分为了8段。如下图所示其中第1段、第2段斜率相同,因而下图的完整版(包含中心对称的正幅值和负幅值部分)常被称为A律13折线。每一段内,再均匀等分为16个量级。因此,总共的量化级数就由原先的215变为2×8×16=28,即256级。在图中也可以直观的看到,其量化间隔在信号幅度小时较信号幅度大时密集许多。同时,G..711标准建议编码后码字要进行偶数位翻转,然后进行传输。

A律限制采样值为12+1比特,将压缩后的格式码定义为PSSSQQQQ ,相当于将正负值输入分成8 个区段(0~7) 。其中P 为符号位,0代表正,1代表负;SSS表示3位高位的区段码;QQQQ表示区段内码,区分不同输入的范围值。这种编码方式使压缩、解压缩变得简洁而有效率。下表为输入值与压缩编码间的关系,其中X 为压缩中舍弃的位,输入值越大,被 舍弃的位数就越多,每个输入值有其对应的最高有效位。 其压扩特性的数学表达式如下:

F(x)?sgn(x)A|x|11?lnA|x|1(0?|x|?)?sgn(x)(?|x|?1)1?lnAA1?lnAA

μ率除编码位数不同外,原理与A率相似。

第 4页 共 20 页

语音压缩、存储与回放 王哲 09211114

A率编码表

A率解压缩表

μ率编码表

第 5页 共 20 页

语音压缩、存储与回放 王哲 09211114

μ率解压缩表

(3) G.726原理概述

语音信号的相邻样本之间具有很强的相关性,据统计其自相关系数通常可达0.85以上,故而可知相邻样本之间的差值是远小于量值本身的。DPCM(差分脉冲编码调制)就是通过对相邻样本的差值进行编码的语音编码方法。实现DPCM编码的原理图如下所示:

根据上图可知,编码器对本次样本与上一次译码器的采样值进行差分运算,这既可得到所需的差值,又可避免使用延时器获得上一样本时累计量化造成的误差。上图只显示了一次差分的过程,实际上为了达到更加好的预测效果,实际编码中将与多个相邻样本进行比较,充分利用到语音信号之间的相关性。ADPCM(自适应差分脉冲编码调制)是G.726标准的基本原理。其原理框图如下:

第 6页 共 20 页

语音压缩、存储与回放 王哲 09211114

对比DPCM的原理框图可知,ADPCM的核心思想就是在量化中采用自适应的原理,对量化间隔进行动态调整,使用过去的样本值估算下一个输入样本的预测值,使实际样本值和预测值之间的差值总是最小

四. 硬件平台介绍

1. 系统组成结构

本次设计采用的硬件系统是BJTU-DSP5502实验系统,实验箱内包括BJTU-DSP5502实验板和SEED-XDS510PLUS仿真器以及相关配件。BJTU-DSP5502实验板主要包括:DSP芯片1枚(U1):TMS320VC5502@300MHz,SDRAM 1枚(U5):2M×32bit(8Mbytes) HY57V643220CT,FLASH 1枚(U4):256K×16bit(512Kbytes) SST39VF400A-70,CPLD 1枚(U2):CY37064VP100,通信接口3个:仿真器JTAG接口(J1)、连接到PC机USB接口(J4)和UART接口(J2),信号采集和输出端口:立体音输入接口line-in(J5,直接接电脑的语音输出端口)/麦克风输入接口(J7)/耳机音频输出接口(J6),扩展板接口(J9,J10)等,整个系统板结构框图如图所示:

本次语音压缩、存储和回放设计实验将会重点用到信号采集和输出端口,该端口使用CODEC(语音编译码)芯片AIC23B(A/D、D/A转换器)来实现语音信号的输入/输出,AIC23B通过McBSP多通道缓冲串行口与DSP相连。 2. 主要硬件分析

(1) C5502的特点 ?

? ? ? ? ?

增强型哈佛结构,一个程序总线,三个独立的数据总线 40bit的算术逻辑单元ALU 可寻址的程序空间达1Mx16bit 4Kx16bit片内ROM

16Kx16bit双口片内RAM

片内外设:软件可编程等待状态发生器;片内锁相环时钟发生器;

第 7页 共 20 页

语音压缩、存储与回放 王哲 09211114

? 两个多通道缓冲串口;增强型8bit并行HPI口;两个16bit定时器; ? 10ns的指令执行周期。

(2) McBSP (Multi-channel Buffered Serial Port) :多通道缓冲串

行口。

C5502有两个McBSP,McBSP0和McBSP1,其功能特点有: ? 全双工通信。

? 双缓冲发送、三缓冲接收寄存器,以实现连续数据流发送。 ? 支持多达128通道个的接收和发送。

? 利用DMA, McBSP可脱离CPU控制,直接内存存取单独运行 ? 内置?律和?律硬件压缩和扩展。

(3) MCBSP数据的接收与发送:

数据的接收通过三级缓冲完成,如下图所示:

RRDY状态位置1,表明DRR数据已准备好,可以读数据数据的发送通过两 级缓冲完成,如下图所示:

第 8页 共 20 页

语音压缩、存储与回放 王哲 09211114 五. 程序设计、调试与结果分析

1. 程序流程图

2. 源程序

/*****************************************************************************/ /* 文件名: CODEC.c */ /* 创建时间:29/06/2012 */ /* 功能描述:DSP课程设计 语音压缩,存储并回放 */ /* 作者: 王哲 09211114 通信0909 */ /*****************************************************************************/ #include

#include #include #include #include #include #include #include

#include \

#include \#include \

#undef CODEC_ADDR #define CODEC_ADDR 0x1A

Uint32 SourData[5][65536]={0};

signed data; Uint16 temp1; Uint8 temp2;

第 9页 共 20 页

语音压缩、存储与回放 王哲 09211114

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

unsigned char data2alaw(signed pcm_val); int alaw2data(unsigned char a_val);

static int search(int val,short *table,int size); void delay(int period);

static short seg_end[8]={0x1F,0x3F,0x7F,0xFF,0x1FF,0x3FF,0x7FF,0xFFF}; Uint8 data2ulaw(signed pcm_val); int ulaw2data(Uint8 input);

#pragma DATA_SECTION (SourData,\

/* 宏定义 */

#define u_law 0xAA0A//u律压缩 #define A_law 0xAA07//A律压缩

#define TESTCOMMAND 1 //操作命令选择

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

// 定义McBSP的句柄 MCBSP_Handle hMcbsp;

/*------------------------------------------------------------------------------------*/ //

// FUNCTION: MAIN //

/*------------------------------------------------------------------------------------*/ void main(void) {

Uint16 i,j,n;

Uint16 TempData;

Uint16 TestCommand =0;

第 10页 共 20 页

语音压缩、存储与回放 王哲 09211114

// Initialize CSL library - This is REQUIRED !!! CSL_init(); #if TESTCOMMAND==1 TestCommand =u_law;//u律压缩 #endif #if TESTCOMMAND==2 TestCommand =A_law;//A律压缩 #endif

// The main frequency of system is 240MHz

// 该频率是为了设置IIC模块的需要设置的,为了使用I2C_setup函数 PLL_setFreq(1, 0xC, 0, 1, 3, 3, 0);

//EMIF初始化 Emif_Config();

// Open McBSP port 1 and get a McBSP type handle hMcbsp = MCBSP_open(MCBSP_PORT1,MCBSP_OPEN_RESET);

// Config McBSP port 1 by use previously defined structure Mcbsp_Config(hMcbsp);

//I2C初始化 I2C_cofig();

//CODEC寄存器初始化(此例采样率为32KHz,详情见AIC23.c) inti_AIC();

/*------------------------------------------------------------------------------------*/

// Receive the ADC output data of CODEC

// Then output the received data to DAC of CODEC

/*------------------------------------------------------------------------------------*/ while(1) { switch(TestCommand) {

/************************************************************************/ /* u律压缩、储存与回放 */

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

第 11页 共 20 页

语音压缩、存储与回放 王哲 09211114

case u_law: asm(\ delay(3000);

asm(\ delay(3000);

asm(\ for(j=0;j<5;j++){

for(i=0;i<65535;i++) {

n=0; while(n<4) { while(!MCBSP_rrdy(hMcbsp)){}; TempData=MCBSP_read16(hMcbsp); temp1=data2ulaw(TempData); switch(n) { case 0:SourData[j][i]=(temp1<<=24);break; case 1:SourData[j][i]=(SourData[j][i]|(temp1<<=16));break; case 2:SourData[j][i]=(SourData[j][i]|(temp1<<=8));break; case 3:SourData[j][i]=(SourData[j][i]|temp1);break; default: break; } n++; } }

}

asm(\ delay(3000);

asm(\

for(j=0;j<5;j++){ for(i=0;i<65535;i++) { n=0; while(n<4){ switch(n) { case 0: temp2=(SourData[j][i]>>24)&0x0ff; case 1: temp2=(SourData[j][i]>>16)&0x0ff; case 2: temp2=(SourData[j][i]>>8)&0x0ff; case 3: temp2=SourData[j][i]&0x0ff;

第 12页 共 20 页

语音压缩、存储与回放 王哲 09211114

} while(!MCBSP_xrdy(hMcbsp)) {}; TempData=ulaw2data(temp2); MCBSP_write16(hMcbsp,TempData); n++; } } }

break;

/**********************************************************************/ /* A律压缩、储存与回放 */

/**********************************************************************/ case A_law: asm(\ delay(3000);

asm(\ delay(3000);

asm(\

for(j=0;j<5;j++){ for(i=0;i<65535;i++) {

n=0; while(n<4) { while(!MCBSP_rrdy(hMcbsp)){}; TempData=MCBSP_read16(hMcbsp); temp1=data2alaw(TempData); switch(n) { case 0:SourData[j][i]=(temp1<<=24);break; case 1:SourData[j][i]=(SourData[j][i]|(temp1<<=16));break; case 2:SourData[j][i]=(SourData[j][i]|(temp1<<=8));break; case 3:SourData[j][i]=(SourData[j][i]|temp1);break; default: break; } n++; }

第 13页 共 20 页

语音压缩、存储与回放 王哲 09211114

}

}

asm(\ delay(3000);

asm(\

for(j=0;j<5;j++){ for(i=0;i<65535;i++) { n=0; while(n<4){ switch(n) { case 0: temp2=(SourData[j][i]>>24)&0x0ff; case 1: temp2=(SourData[j][i]>>16)&0x0ff; case 2: temp2=(SourData[j][i]>>8)&0x0ff; case 3: temp2=SourData[j][i]&0x0ff; } while(!MCBSP_xrdy(hMcbsp)) {}; TempData=alaw2data(temp2); MCBSP_write16(hMcbsp,TempData); n++; } } } break; default: break; } } }

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

/*******延时******/ void delay(int period) {

int i, j;

第 14页 共 20 页

语音压缩、存储与回放 王哲 09211114

for(i=0; i

for(j=0; j>1; j++); } }

/*****a律压缩******/

unsigned char data2alaw(signed 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); } }

static int search(int val,short *table,int size) {

第 15页 共 20 页

语音压缩、存储与回放 王哲 09211114

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 = ((unsigned)a_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); }

/*****u律压缩******/

Uint8 data2ulaw(signed pcm_val) { int mask; int seg; unsigned char uval; Uint8 i,output; Uint16 absol,temp;

第 16页 共 20 页

语音压缩、存储与回放 王哲 09211114

if (pcm_val >= 0) { mask = 1; // 标记 (7th) bit = 1 } else { mask = 0; // 标记 bit = 0 pcm_val = -pcm_val; } absol=pcm_val+33; temp=absol; for (i=0;i<16;i++) { output=temp&0x8000; //确定temp中出现1的最高位 if(output) //temp 左移i位后最高位为1 break; temp<<=1; } seg=11-i; uval=(absol>>seg)&0x0f; //量化值 seg--; //段值 seg<<=4; output=seg+uval; //输出值的绝对值 if(absol>8191) //超过最大值8191,输出最大值0x7f output=0x7f; if(mask) return (output^=0xFF); //返回含有符号信息的输出值 else return (output^=0x7F); }

int ulaw2data(Uint8 input) {

int mask; int seg; unsigned char uval; Uint32 temp; int data1; temp=input^0xff; //得到含有符号信息的压缩值 mask=(temp&0x80)>>7; //符号位 seg=(temp&0x70)>>4; //段值 uval=temp&0x0f; //量化值 data1=uval<<1; data1+=33; //扩展后数值中的6位非零值 data1<<=seg;

第 17页 共 20 页

语音压缩、存储与回放 王哲 09211114

if(mask) return (33-data1); //有符号的扩展值 else return (data1-33); }

/*****************************************************************************/ // No more

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

3. 存储器配置程序(.cmd文件)

.cmd是链接器命令文件,用于存储器配置。.cmd由两条链接伪指令来描 述:MEMORY 和SECTIONS,其中:MEMORY定义用户目标系统存储器的配置; SECTIONS控制段的构建和存储器的分配。存储器空间是需要配置的,因为 DSP不同的空间占用相同的地址,因此需要人工分配。

/**********************************************************/ /* */ /* LINKER command file for SDRAM memory map */ /* */ /**********************************************************/

MEMORY {

MMR : origin = 0000000h, length = 00000c0h SPRAM : origin = 00000c0h, length = 0000040 VECS : origin = 0000100h, length = 0000100h DARAM0 : origin = 0000200h, length = 0007E00h DARAM1 : origin = 0008000h, length = 0008000h

CE0 : origin = 0010000h, length = 03f0000h /* 对应ZBTRAM空间 */ FLASH : origin = 0400000h, length = 0100000h /* Flash 空间 */ /* FLASH : origin = 0410000h, length = 00f0000h*/ EXTEND: origin = 0500000h, length = 0300000h /* 状态/控制寄存器、UARTA、UARTB、USB、和扩展总线所对应的空间 */

SDRAM : origin = 0800000h, length = 03FFFFCh /* SDRAM 空间*/ CE3 : origin = 0c00000h, length = 03f8000h /* SDRAM 空间*/

PDROM : origin = 0ff8000h, length = 07f00h

第 18页 共 20 页

本文来源:https://www.bwwdw.com/article/hl96.html

Top