DSP设计语音压缩.docx
《DSP设计语音压缩.docx》由会员分享,可在线阅读,更多相关《DSP设计语音压缩.docx(29页珍藏版)》请在冰点文库上搜索。
DSP设计语音压缩
DSP课程设计
实验报告
语音压缩、存储与回放
院(系):
设计人员:
成绩:
工程设计50
报告20
答辩30
总分
评语:
指导教师签字:
日期:
一、设计任务书…………………………………………………………3
二、设计内容……………………………………………………………4
三、设计方案、算法原理说明…………………………………………4
四、程序设计、调试与结果分析………………………………………9
五、设计(安装)与调试的体会………………………………………20
六、参考文献……………………………………………………………23
一、设计任务书
语音信号是信息的重要形式,语音信号处理有着广泛的应用领域,而语音压缩在语音信号的传输、存储等方面有非常广泛的作用,而且在通信领域中已经有较成熟的发展和广泛应用。
本设计要求采用DSP及其A/D、D/A转换器进行语音信号的压缩、存储和回放。
1、设计要求及目标
(1)使用DSP实现语音压缩和解压缩的基本算法,算法类型自定,例如可以采用G.711、G.729等语音压缩算法。
(2)采用A/D转换器从MIC输入口实时采集语音信号,进行压缩后存储到DSP的片内和片外RAM存储器中,存储时间不小于10秒。
(3)存储器存满之后,使用DSP进行实时解压缩,并从SPEAKER输出口进行回放输出。
(4)使用指示灯对语音存储和回放过程进行指示。
2、要求完成的任务
(1)编写C语言程序,并在CCS集成开发环境下调试通过。
(2)实现设计所要求的各项功能。
(3)按要求撰写设计报告。
3、实验目的
(1)建立信号处理系统的概念,学会使用DSP处理器;
(2)了解DSP处理系统的关键器件的使用方法;
(3)掌握DSP课程设计的基本方法,巩固信号处理的基本理论知识;
(4)掌握查阅有关资料和使用器件手册的基本方法,学会阅读原版英文资料;
(5)掌握DSP集成开发环境的使用和调试方法;
(6)掌握DSP片外资源和片上资源访问的基本方法,如存储器、定时器、McBSP、DMA、A/D和D/A转换器等。
4、设计思路
语音信号的幅度(发音强度)并非均匀分布,由于小信号占的比例比大信号大很多,因此可以进行非均匀量化。
达到这一目标的基本做法是,对大信号使用大的量化间隔,而小信号则使用小的台阶。
ITU-TG.711建议的PCMA律和µ律语音压缩标准可以分别将13比特和14比特压缩为8比特,达到语音压缩的目的。
二、设计内容
1.使用DSP实现语音压缩和解压缩的基本算法,算法类型采用G.711的a律压扩算法,利用C语言进行算法的编程。
2.采用A/D转换器从MIC输入口实时采集语音信号,进行压缩后存储到DSP的片外RAM存储器中,存储时间约为10秒。
3.但采样数据达到规定次数后,使用DSP进行实时解压缩,经过D/A转换后从SPEAKER输出口进行回放输出。
4.使用DSK板的指示灯对语音存储和回放过程进行指示:
循环闪烁两次:
板子运行,程序开始执行
LED0亮:
录音(10秒钟左右)
LED0灭:
放音
5.能够利用耳机听到经压缩解压后回放的语音。
三、设计方案、算法原理说明
(一)设计方案
要完成利用DSP进行语音压缩、存储和回放的功能,首先必须了解实验的硬件结构。
本次实验采用的是BJTU-DSP5502实验板,它的结构原理图如下:
BJTU-DSP5502实验系统是北京交通大学电信学院电工电子教学基地自行开发的一套DSP信号处理硬件实验系统。
BJTU-DSP5502实验板主要包括:
◆DSP芯片1枚(U1):
TMS320VC5502@300MHz
◆SDRAM1枚(U5):
2M×32bit(8Mbytes)HY57V643220CT
◆FLASH1枚(U4):
256K×16bit(512Kbytes)SST39VF400A-70
◆CPLD1枚(U2):
CY37064VP100
◆通信接口3个:
仿真器JTAG接口(J1)、连接到PC机USB接口(J4)和UART接口(J2)
◆信号采集和输出端口:
立体音输入接口line-in(J5,直接接电脑的语音输出端口)/麦克风输入接口(J7)/耳机音频输出接口(J6)
◆扩展板接口(J9,J10)
在了解DSK板的硬件结构基础之上,便可以进行设计方案的修改和完善。
针对要实现的语音压缩、存储和回放功能以及板子的硬件结构,提出以下设计方案。
首先是通过分析设计出语音的采集和回放的基本框架,从设计框架上我们可以看出DSP完成的是主要的功能,即经过A/D变换后的数字信号在DSP芯片中经过压缩和解压,最后再通过D/A变换得到音频输出信号。
结合基本框架结构,在利用C语言进行编程实现时,实现的四个主要过程包括:
数据编码压缩、语音存储、数据解压缩以及语音回放。
再考虑板子的初始化等因素得到以下的流程图:
(二)算法原理说明
1.语音编码
(1)概念:
语音编码一般分为两类:
一类是波形编码,一类是被称为“声码器技术”的编码。
PCM编码即脉冲编码调制。
波形编码的最简单形式就是脉冲编码调制(Pulsecodemodulation),这种方式将语音变换成与其幅度成正比的二进制序列,而二进制数值往往采用脉冲表示,并用脉冲对采样幅度进行编码,所以叫做脉冲编码调制。
脉冲编码调制没有考虑语音的性质,所以信号没有得到压缩。
(2)量化:
脉冲编码调制用同等的量化级数进行量化,即采用均匀量化,而均匀量化是基本的量化方式。
但是均匀量化有缺点,在信号动态范围较大而方差较小的时候,其信噪比会下降。
国际上有两种非均匀量化的方法:
A律和u律,u律是最常用的一种。
在美国,7位u律是长途电话质量的标准。
而我国采用的是A律压缩,而且有标准的A律PCM编码芯片。
(3)DPCM&ADPCM:
降低传输比特率的方法之一是减少编码的信息量,这要消除语音信号中的冗余度。
相邻的语音样本之间存在明显的相关性,因此对相邻样本间的差信号进行编码,便可使信息量得到压缩。
因为差分信号比原语音信号的动态范围和平均能量都小。
这种编码叫DifferentialPCM,简称DPCM,即差分脉冲编码调制。
ADPCM即自适应差分脉冲编码调制,是包括短时预测的编码系统。
CCITT(国际电报电话咨询委员会)在1984年提出的32kbit/s的编码器建议就是采用ADPCM作为长途传输中的国际通用语音编码方案。
这种ADPCM编码方案达到64kbit/sPCM的语音传输质量,并具有很好的抗误码性能。
(4)当前压缩算法及压缩技术介绍
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
2).压缩技术的介绍压缩技术
a.波形编码:
直接对语音时域或频域波形样值进行编码。
PCM,ADPCM,SBC,ATC
b.参数编码:
对人类语音的生成模型的参数进行编码。
c.混合编码:
结合波形编码和参数编码。
MPLPC,RPE/LTP,CELP,VSELP
d.可变速率编码:
G.727嵌入式编码
e.无失真编码。
霍夫曼编码
f.ADPCM工作原理
h.自适应地改变量化幅值
i.确定好量化幅度的最大值和最小值
2.A律编码和u律编码
两个标准的压缩扩展特性曲线称为u律和A律,使CCITT提出的G.711协议PCM编码方式的一部分。
两个算法使用了非线性,把量化间隔变换成人耳能检测的线性空间。
A律限制采样值为12比特,A律的压缩可以按照下列公式进行定义:
式中,A是压缩参数(在欧洲,A=87.6)x是需要压缩的归一化整数。
两种编码相比较,A律压缩的动态范围略较小,在小信号时质量较u律差些,A律最小量化间隔是2/4096,而u律是2/8159,事实上这二者的差别是不易察觉到的。
无论是A律或u律,在x(信号频率)值较小时其特性都是线性的,在x值大时则呈现对数压缩特性。
A律压缩:
将13位(符号位+12位数据)线性语音编码压缩为8位,具体的编码原理如下表:
A律扩展:
将A律压缩为的8位编码还原为13位(符号位+12位数据)的线性语音编码,具体的编码原理如下表:
µ律压缩:
将14位(符号位+13位数据)线性语音编码压缩为8位,具体的编码原理如下表:
µ律扩展:
将通过µ律压缩为的8位编码还原为14位(符号位+13位数据)线性语音编码,具体的编码原理如下表:
u律压缩就是压缩器的压缩特性具有如下关系的压缩律:
式中:
-归一化的压缩器输出电压,即Y=压缩器输出电压了压缩器可能的最大输出电压
-归一化的压缩器输出电压,即x=压缩器输出电压/压缩器可能的最大输出电压
-压扩参数,表示压缩的程度。
四、程序设计、调试与结果分析
1.实验各个相关程序:
用TMS320VC5502实现语音的A率压缩解压有两种方法:
a、使用多通道缓冲串口(McBSP)的缩展器
在多缓冲通道串口(McBSP)内部装置了硬件电路,支持A律格式缩展器,对数据进行压缩与扩展,A律缩展器允许14比特的动态范围。
首先描述一下McBSP硬件如何能够同时处理A律,如图显示的是McBSP缩展器硬件工作流程。
在接受端,McBSP接收压缩的、非线性的数据然后扩展为线性数据写道CPU或DMA,在发送端,从CPU或DMA得到的线性数据在发送前必须按着A律压缩。
RSRRBRRJUSTDRR
DLB模式非DSB模式
b、用软件实现
主程序的功能是从McBSP的接收通道读取A/D转换的值,然后经过压缩解压后将其发送到McBSP的发送通道,构成AIC23BCODEC模拟输入和输出通道的自环,是否能接收到A/D转换的数据是通过查询串口1的接收标志RRDY来进行的,程序为:
#include
#include
#include
#include
#include
#include
#include
#include
#include"5502_FLASH.h"
#include"E2PROM_Function.h"
#include"CODEC.h"
#undefCODEC_ADDR
#defineCODEC_ADDR0x1A
Int16SourData1[65536]={0};将存储地址初始化
Int16SourData2[65536]={0};
Int16SourData3[65536]={0};
Int16SourData4[65536]={0};
Int16SourData5[65536]={0};
Int16SourData6[65536]={0};
Int16SourData7[65536]={0};
Int16SourData8[65536]={0};
Int16SourData9[65536]={0};
Int16SourData10[65536]={0};
Int16SourData11[65536]={0};
Int16SourData12[65536]={0};
Int16SourData13[65536]={0};
Int16SourData14[65536]={0};
Int16SourData15[65536]={0};
Int16OutData1[65536]={0};
Int16OutData2[65536]={0};
Int16OutData3[65536]={0};
Int16OutData4[65536]={0};
Int16OutData5[65536]={0};
Int16OutData6[65536]={0};
Int16OutData7[65536]={0};
Int16OutData8[65536]={0};
Int16OutData9[65536]={0};
Int16OutData10[65536]={0};
Int16OutData11[65536]={0};
Int16OutData12[65536]={0};
Int16OutData13[65536]={0};
Int16OutData14[65536]={0};
Int16OutData15[65536]={0};
#pragmaDATA_SECTION(SourData1,".Audio_in_data1");设置存储器地址段,输入数据
#pragmaDATA_SECTION(SourData2,".Audio_in_data2");
#pragmaDATA_SECTION(SourData3,".Audio_in_data3");
#pragmaDATA_SECTION(SourData4,".Audio_in_data1");
#pragmaDATA_SECTION(SourData5,".Audio_in_data2");
#pragmaDATA_SECTION(SourData6,".Audio_in_data3");
#pragmaDATA_SECTION(SourData7,".Audio_in_data1");
#pragmaDATA_SECTION(SourData8,".Audio_in_data2");
#pragmaDATA_SECTION(SourData9,".Audio_in_data3");
#pragmaDATA_SECTION(SourData10,".Audio_in_data1");
#pragmaDATA_SECTION(SourData11,".Audio_in_data2");
#pragmaDATA_SECTION(SourData12,".Audio_in_data3");
#pragmaDATA_SECTION(SourData13,".Audio_in_data1");
#pragmaDATA_SECTION(SourData14,".Audio_in_data2");
#pragmaDATA_SECTION(SourData15,".Audio_in_data3");
#pragmaDATA_SECTION(OutData1,".Audio_out_data1");设置存储器地址段,输出数据
#pragmaDATA_SECTION(OutData2,".Audio_out_data2");
#pragmaDATA_SECTION(OutData3,".Audio_out_data3");
#pragmaDATA_SECTION(OutData4,".Audio_out_data1");
#pragmaDATA_SECTION(OutData5,".Audio_out_data2");
#pragmaDATA_SECTION(OutData6,".Audio_out_data3");
#pragmaDATA_SECTION(OutData7,".Audio_out_data1");
#pragmaDATA_SECTION(OutData8,".Audio_out_data2");
#pragmaDATA_SECTION(OutData9,".Audio_out_data3");
#pragmaDATA_SECTION(OutData10,".Audio_out_data1");
#pragmaDATA_SECTION(OutData11,".Audio_out_data2");
#pragmaDATA_SECTION(OutData12,".Audio_out_data3");
#pragmaDATA_SECTION(OutData13,".Audio_out_data1");
#pragmaDATA_SECTION(OutData14,".Audio_out_data2");
#pragmaDATA_SECTION(OutData15,".Audio_out_data3");
#defineAUDIOTRY0xAA0A//音频试听
#defineAUDIOCOPY0xAA07//音频存贮并回放
#defineTESTCOMMAND1//操作命令选择
//定义McBSP的句柄
MCBSP_HandlehMcbsp;
/*------------------------------------------------------------------------------------*/
//
//FUNCTION:
MAIN
//
/*------------------------------------------------------------------------------------*/
voidmain(void)
{
Int16DataTempLeft=0;//暂存采样数据
Int16DataTempRight=0;
Int16TempData;
Uint16i;
Uint16TestCommand=1;
CSL_init();
PLL_setFreq(1,0xC,0,1,3,3,0);CSL库提供PPL模块,PLL_setFreq()函数用于对PLL进行初始化,产生各个时钟
Emif_Config();
hMcbsp=MCBSP_open(MCBSP_PORT1,MCBSP_OPEN_RESET);
Mcbsp_Config(hMcbsp);
I2C_cofig();
inti_AIC();
while
(1)
{
switch(TestCommand)
{
/*音频试听*/
case1:
while(!
MCBSP_rrdy(hMcbsp)){};查询McBSP控制寄存器(RRDY接收数据准备好位)中是否有效,等待接收handset处的采样
DataTempLeft=MCBSP_read16(hMcbsp);
while(!
MCBSP_xrdy(hMcbsp)){};
MCBSP_write16(hMcbsp,DataTempLeft);
while(!
MCBSP_rrdy(hMcbsp)){};
DataTempRight=MCBSP_read16(hMcbsp);
while(!
MCBSP_xrdy(hMcbsp)){};
MCBSP_write16(hMcbsp,DataTempRight);
TestCommand=2;
break;
/*音频存贮压缩*/
case2:
asm("BSETXF");cclearXF
for(i=0;i<65535;i++)读入数位为16bits
{
while(!
MCBSP_rrdy(hMcbsp)){};
TempData=MCBSP_read16(hMcbsp);
SourData1[i]=linear2alaw(TempData);
}
for(i=0;i<65535;i++)
{
while(!
MCBSP_rrdy(hMcbsp)){};
TempData=MCBSP_read16(hMcbsp);
SourData2[i]=linear2alaw(TempData);对采样进行a律压缩,把低地址数据放在高八位高地址数据放在低八位
}
for(i=0;i<65535;i++)
{
while(!
MCBSP_rrdy(hMcbsp)){};
TempData=MCBSP_read16(hMcbsp);
SourData3[i]=linear2alaw(TempData);
}
for(i=0;i<65535;i++)
{
while(!
MCBSP_rrdy(hMcbsp)){};
TempData=MCBSP_read16(hMcbsp);
SourData4[i]=linear2alaw(TempData);
}
for(i=0;i<65535;i++)
{
while(!
MCBSP_rrdy(hMcbsp)){};
TempData=MCBSP_read16(hMcbsp);
SourData5[i]=linear2alaw(TempData);
}
for(i=0;i<65535;i++)
{
while(!
MCBSP_rrdy(hMcbsp)){};
TempData=MCBSP_read16(hMcbsp);
SourData6[i]=linear2alaw(TempData);
}
for(i=0;i<65535;i++)
{
while(!
MCBSP_rrdy(hMcbsp)){};
TempData=MCBSP_read16(hMcbsp);
SourData7[i]=linear2alaw(TempData);
}
for(i=0;i<65535;i++)
{
while(!
MCBSP_rrdy(hMcbsp)){};
TempData=MCBSP_read16(hMcbsp);
SourData8[i]=linear2alaw(TempData);
}
for(i=0;i<65535;i++)
{
while(!
MCBSP_rrdy(hMcbsp)){};
TempData=MCBSP_read16(hMcbsp);
SourData9[i]=linear2alaw(TempData);
}
for(i=0