DSP语音压缩存储和回放报告.docx
《DSP语音压缩存储和回放报告.docx》由会员分享,可在线阅读,更多相关《DSP语音压缩存储和回放报告.docx(32页珍藏版)》请在冰豆网上搜索。
DSP语音压缩存储和回放报告
数字信号处理(DSP)
综合设计性实验报告
题目:
语音压缩、存储与回放
学院:
班级:
一.实验目的
1.掌握利用DSP进行信号采集的方法,掌握利用DSP进行语音信号的压缩和解压方法,以及语音信号的回放方法。
2.学会A/D、D/A的工作原理和使用,学会A/D、D/A转换器的编程方法。
3.以语音信号处理为依托,深入理解信号的抽样和重建的基本方法,提高学生系统地思考问题和解决实际问题的能力。
4.通过调用DSPCSL库对McBSP接口进行编程,学会DSP片上外设的使用方法。
二.实验内容
1.基本部分
(1)使用DSP实现语音压缩和解压缩的基本算法,算法类型自定,例如可以采用G.711、G.729等语音压缩算法。
(2)设置A/D的采样率为32KHz,从Line-in或MIC输入口实时采集语音信号,利用McBSP1接收寄存器将外部语音数据接收到DSP中,接收1s数据。
(3)采用适当的语音压缩算法,将接收到的数据进行压缩。
也可以将接收到的数据直接压缩后存储。
(4)对上述已压缩数据进行解压。
(5)将解压后的数据经Headphone端口输出,利用耳机试听。
(6)使用指示灯对语音存储和回放过程进行指示。
2.发挥部分
(1)至少使用2种算法进行语音的压缩、存储和解压缩,比较它们之间的优缺点。
(2)将A/D采样率和D/A的转换率设置为不同频率,对比输出的语音信号,发现不同并解释原因。
三.实验原理
1.语音编码
(1)概念
语音编码一般分为两类:
一类是波形编码,一类是被称为“声码器技术”的编码。
PCM编码即脉冲编码调制。
波形编码的最简单形式就是脉冲编码调制(Pulsecodemodulation),这种方式将语音变换成与其幅度成正比的二进制序列,而二进制数值往往采用脉冲表示,并用脉冲对采样幅度进行编码,所以叫做脉冲编码调制。
脉冲编码调制没有考虑语音的性质,所以信号没有得到压缩。
(2)量化
脉冲编码调制用同等的量化级数进行量化,即采用均匀量化,而均匀量化是基本的量化方式。
但是均匀量化有缺点,在信号动态范围较大而方差较小的时候,其信噪比会下降。
国际上有两种非均匀量化的方法:
A律和μ律,μ律是最常用的一种。
在美国,7位μ律是长途电话质量的标准,而我国采用的是A律压缩,而且有标准的A律PCM编码芯片。
2.当前压缩算法及压缩技术介绍
(1)压缩算法介绍
用途
抽样频率(kHz)
压缩标准或系统
压缩技术
码率(kbit/s)
长途电话
8
G.711
G.726
G.728
PCM
ADPCM
LD-CELP
64
40/32/24/16
16
移动电话
8
GSM
IS54/IS95
G.729
RPE/LTP
VSELP/QSELP
CS-ACELP
13.2
16/8/4/2/1
8
ISDN,会议电视
1
G.722
SB-ADPCM
64/56/48
VCD
32/48
ISO/IEC10149
MPEG1
192/128/96
表1压缩算法介绍
(2)压缩技术介绍
a.波形编码:
直接对语音时域或频域波形样值进行编码。
如PCM,ADPCM.
b.参数编码:
对人类语音的生成模型的参数进行编码。
c.混合编码:
结合波形编码和参数编码。
MPLPC,RPE/LTP,CELP,VSELP
d.可变速率编码:
G.727嵌入式编码
e.无失真编码:
霍夫曼编码
f.ADPCM工作原理
h.自适应地改变量化幅值
i.确定好量化幅度的最大值和最小值
3.语音的A律压缩与解压
统计表明对于语音信号来说,语音中小幅度成分出现的概率要比大幅度多得多,为了在语音信号的整个动态范围内都可以接受低电平信号,量化电平必须照顾到语音的低电平信号,极低电平的量化间隔要小,高电平的量化间隔要大。
两个标准的压缩算法扩展特性曲线称为u律和A律,使CCITT提出的G.711协议PCM编码方式的一部分。
北美和日本使用u律,欧洲使用A律,两个算法使用了非线性,把量化间隔变换成人耳能检测的线性空间。
A律和μ律语音压缩标准可以分别将13比特和14比特压缩为8比特,达到语音压缩的目的。
A律限制采样值为12比特(除去符号位),A律的压缩可以按照下列公式进行定义:
式中,A是压缩参数(在欧洲,A=87.6)x是需要压缩的归一化整数。
从线性到A律的压缩转换如下表所示:
压缩后的码字组成:
比特0-3表矢量化值,比特4-6表示段值,压缩后的码字符号放在比特7,为了简化未写出。
压缩前的码字
丢弃的比特数
压缩后的码字
输入值
段值量化值
比特:
11109876543210
比特:
6543210
0000000abcdx
1
000abcd
0000001abcdx
1
001abcd
000001abcdxx
2
010abcd
00001abcdxxx
3
011abcd
0001abcdxxxx
5
100abcd
001abcdxxxxx
6
101abcd
01abcdxxxxxx
7
110abcd
1abcdxxxxxxx
8
111abcd
表2A律压缩转换表
A律的扩展可定义为:
从A律到线性扩展的转换如下表:
压缩过的码字
偏值的输入
段值量化值
比特:
6543210
比特:
11109876543210
000abcd
0000000abcd1
001abcd
0000001abcd1
010abcd
000001abcd10
011abcd
00001abcd100
100abcd
0001abcd1000
101abcd
001abcd10000
110abcd
01abcd100000
111abcd
1abcd1000000
表3A律解压转换表
4.语音的u律压缩与解压原理
u率限制采样模值为13比特,u律的压缩可定义为:
从线性到u律的压缩转换如下表所说明。
压缩后的码字组成:
比特0-3表示量化值,比特4-6表示段值,压缩后的码字符号放在比特7,为了简化未写出。
U律二进制编码表如下:
压缩前的码字
丢弃的
比特数
压缩后的码字
输入值
段值量化值
比特:
1211109876543210
比特:
6543210
00000001abcdx
1
000abcd
0000001abcdxx
2
001abcd
000001abcdxxx
3
010abcd
00001abcdxxxx
4
011abcd
0001abcdxxxxx
5
100abcd
001abcdxxxxxx
6
101abcd
01abcdxxxxxxx
7
110abcd
1abcdxxxxxxxx
8
111abcd
表4U律压缩转换表
在扩展前,u律码字再次反转。
低位的有效比特原是丢弃的,但是为了减少精度损失,用中间值近似。
为了简化,扩展后的码字符号左溢。
U率二进制解码表
压缩过的码字
偏值的输入
段值量化值
比特:
6543210
比特:
1211109876543210
000abcd
00000001abcd1
001abcd
0000001abcd10
010abcd
000001abcd100
011abcd
00001abcd1000
100abcd
0001abcd10000
101abcd
001abcd100000
110abcd
01abcd1000000
111abcd
1abcd10000000
表5U律解压转换表
5.设置采样率和转换率
更改采样率和转换率,查找手册TLV320AIC23BDataManual(Rev.G):
根据上表修改AIC23.c子程序采样率设置语句:
Uint16Sample_Rate_Control[2]={
Codec_SRC_REV,
SRC_CLKIN(0)+SRC_CLKOUT(0)+SRC_SR(6)
+SRC_BOSR(0)+SRC_USB(0)
};
将SRC_SR(6)中数值6改为相应数值,代表其他采样率。
如表,1代表48K-8K,2代表8K-48K,0代表48K-48K。
四.程序设计
1.硬件组成
(1)BJTU-DSP5502实验板
DSP芯片1枚(U1):
TMS320VC5502@300MHz
SDRAM1枚(U5):
2M×32bit(8Mbytes)HY57V643220CT
FLASH1枚(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)
图1BJTU-DSP5502板结构组成框图
(2)信号采集和输出端口
立体音输入接口line-in(J5,直接连接电脑的语音输出端口)/麦克风输入接口(J7)/耳机音频输出接口(J6)。
通过AIC23B(A/D、D/A转换器)来提供立体音输入/麦克风输入/耳机音频输出。
AIC23B与DSP的McBSP1相连接。
(3)LED灯
D2:
+5V电源指示灯。
D4:
+3.3V电源指示灯。
D1:
用户指示灯,由DSP的XF引脚控制。
XF输出“1”时(BSETXF),点亮D1;XF输出“0”时(BCLRXF),熄灭D1。
D5:
用户指示灯,由DSP的GPIO7引脚控制。
GPIO7输出“1”时,点亮D5;GPIO7输出“0”时,熄灭D5。
(4)片上外设
64bitTimer:
4个,TIMER0/TIMER1/WatchDogTIMER/TIMER3(DSP/BIOStimer)
McBSP:
3通道,McBSP0/McBSP1/McBSP2
DMA:
6通道,DMA0/DMA1/DMA2/DMA3/DMA4/DMA5/DMA6
IIC:
1通道
UART:
1通道
8/16bitHPI:
1通道
(5)片上存储器
DARAM:
32K×16bit
BootROM:
16K×16bit
片内ROM受VC5502的ST3寄存器中的MPNMC状态位控制。
当MPNMC=1时,32K片内ROM被屏蔽。
MPNMC的状态由上电复位时采样引脚BOOTM[2:
0]的状态决定。
当BOOTM[2:
0]为000B或100B时,MPNMC=1;否则MPNMC=0。
DSP在联机仿真状态下,MPNMC=1。
图2BJTU-DSP5502板功能框图
(6)McBSP的结构及工作原理
VC5502有3个缓冲多通道串行口:
McBSP0(本板与外扩接口相连)、McBSP1(本板和Codec相连)和(McBSP2本板和UART复用)。
McBSP:
多通道缓冲串行口(Multi-channelBufferedSerialPort),是串行口的一种。
McBSP特点:
全双工同步串行口/可直接与系统中的其它C55x器件、编码解码器、串行A/D、D/A转换器以及其它的串行器件直接接口/支持传输的数据字长:
8bit、12bit、16bit、20bit、24bit或32bit/内置μ-律和A-律压扩硬件。
图3McBSP的结构功能框图
2.程序流程图
图3程序流程图
3.主程序
(1)使用A律压缩方法,按题目要求设置采样率为32KHz。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include"5502_FLASH.h"
#include"E2PROM_Function.h"
#include"CODEC.h"
#undefCODEC_ADDR
#defineCODEC_ADDR0x1A//宏定义
Uint16SourData[65536]={0};//采集存放数组
//Uint16CompData2[65536]={0};
//Uint16CompData3[65536]={0};
Uint16CompData[65536]={0};//压缩后的数组
Uint16OutData[65536]={0};//解压回放数组
//Uint16OutData2[65536]={0};
//Uint16OutData3[65536]={0};
#pragmaDATA_SECTION(SourData,".Audio_in_data0");//用户自定义数据段数据连接到与.bbs不同的存储空间“Audio_out_data6”段
#pragmaDATA_SECTION(CompData,".Audio_in_data1");
//#pragmaDATA_SECTION(CompData2,".Audio_in_data2");
//#pragmaDATA_SECTION(CompData3,".Audio_in_data3");
#pragmaDATA_SECTION(OutData,".Audio_out_data1");
//#pragmaDATA_SECTION(OutData2,".Audio_out_data2");
//#pragmaDATA_SECTION(OutData3,".Audio_out_data3");
#defineAUDIOTRY0xAA0A//音频试听
#defineAUDIOCOPY0xAA07//音频压缩存储回放
#defineTESTCOMMAND2//操作命令选择
MCBSP_HandlehMcbsp;//定义McBSP的句柄
unsignedcharCompand(intdata);//A律压缩子程序
unsignedcharUCompand(intdata);//u律压缩子程序
intDisCompand(unsignedcharinput);//A律解压子程序
intUDisCompand(unsignedcharinput);//u律解压子程序
voidblink();//闪灯(D1)子程序
voiddelay(intperiod);//延时子程序
voidmain(void)
{
Uint16DataTempLeft=0;
Uint16DataTempRight=0;
Uint16i,a,b;
Uint16TempData;
Uint16TestCommand=0;
//初始化CSl库
CSL_init();
#ifTESTCOMMAND==1
TestCommand=AUDIOTRY;//试听
#endif
#ifTESTCOMMAND==2
TestCommand=AUDIOCOPY;//录音并回放
#endif
//Themainfrequencyofsystemis240MHz
//该频率是为了设置IIC模块的需要设置的,为了使用I2C_setup函数
PLL_setFreq(1,0xC,0,1,3,3,0);
//EMIF初始化
Emif_Config();
//OpenMcBSPport1andgetaMcBSPtypehandle
hMcbsp=MCBSP_open(MCBSP_PORT1,MCBSP_OPEN_RESET);
//ConfigMcBSPport1byusepreviouslydefinedstructure
Mcbsp_Config(hMcbsp);
//I2C初始化
I2C_cofig();
//CODEC寄存器初始化(此例采样率为32KHz,详情见AIC23.c)
inti_AIC();
//ReceivetheADCoutputdataofCODEC
//ThenoutputthereceiveddatatoDACofCODEC
/*------------------------------------------------------------------------------------*/
while
(1)
{
//scanf("%d",&a);
//if(a)
//{
switch(TestCommand)
{
caseAUDIOTRY:
//音频试听
/*说明:
McBSP1接收寄存器分别对linein的左右声道进行采样*/
/*Linein(J5)左通路数据*/
while(!
MCBSP_rrdy(hMcbsp)){};
DataTempLeft=MCBSP_read16(hMcbsp);
/*Linein(J5)右通路数据*/
while(!
MCBSP_rrdy(hMcbsp)){};
DataTempRight=MCBSP_read16(hMcbsp);
/*说明:
McBSP1发送寄存器分别对linein的左右声道接收到的数据进行发送*/
/*Microin(J7)左声道耳机输出*/
while(!
MCBSP_xrdy(hMcbsp)){};
MCBSP_write16(hMcbsp,DataTempLeft/16);
/*Microin(J7)右声道耳机输出*/
while(!
MCBSP_xrdy(hMcbsp)){};
MCBSP_write16(hMcbsp,DataTempRight);
break;
caseAUDIOCOPY:
//录音并回放
blink();//D1闪一次
scanf("%d",&b);//手动选择压缩标准:
1-A率,2-u率
if(b==1)//A率
{
for(i=0;i<65535;i++)
{
while(!
MCBSP_rrdy(hMcbsp)){};
//SourData[i]=MCBSP_read16(hMcbsp);
SourData[i]=TempData;
TempData=MCBSP_read16(hMcbsp);
CompData[i]=Compand(TempData);
}
/*
for(i=0;i<65535;i++)
{
while(!
MCBSP_rrdy(hMcbsp)){};
TempData=MCBSP_read16(hMcbsp);
CompData2[i]=Compand(TempData);
}
for(i=0;i<65535;i++)
{
while(!
MCBSP_rrdy(hMcbsp)){};
TempData=MCBSP_read16(hMcbsp);
CompData3[i]=Compand(TempData);
}
*/
blink();//D1闪两次,表示开始解压数据并回放
blink();
for(i=0;i<65535;i++)
{
OutData[i]=DisCompand(CompData[i]);
}
for(i=0;i<65535;i++)
{
while(!
MCBSP_xrdy(hMcbsp)){};
MCBSP_write16(hMcbsp,OutData[i]);
}
/*
for(i=0;i<65535;i++)
{
OutData2[i]=DisCompand(CompData2[i]);
}
for(i=0;i<65535;i++)
{
while(!
MCBSP_xrdy(hMcbsp)){};
MCBSP_write16(hMcbsp,OutData2[i]);
}
for(i=0;i<65535;i++)
{
OutData3[i]=DisCompand(CompData3[i]);
}
for(i=0;i<65535;i+