dsp数字信号处理课程设计报告.docx
《dsp数字信号处理课程设计报告.docx》由会员分享,可在线阅读,更多相关《dsp数字信号处理课程设计报告.docx(19页珍藏版)》请在冰豆网上搜索。
dsp数字信号处理课程设计报告
淮阴工学院
《DSP技术与应用》课程设计报告
选题名称:
语音压缩与回放
系(院):
计算机工程学院
专业:
计算机科学与技术(嵌入式系统软件设计)
班级:
计算机1073
姓名:
魏庭九学号:
1071306123
指导教师:
马岱,常波
学年学期:
2009~2010学年第2学期
2010年6月11日
摘要:
数字化语音存储与回放系统的基本原理是对语音的录音与放音的数字化控制。
其中,关键技术在于,为了增加语音存储时间,提高存储器的利用率,采用了非失真压缩算法对语音信号进行压缩后再存储,而在回放时再进行解压缩,同时,对输入语音信号进行数字滤波以抑制杂音和干扰,从而确保了语音回放的可靠质量。
随着超大规模集成电路(VLSI)工艺的进步,高速数字信号处理器(DSP)技术的飞速发展以及先进开发工具的完备,使得复杂的语音编解码算法在以高性能微处理器为核心的硬件系统上实时实现成为可能。
本文介绍了一种基于目前性能价格比较高的16位定点DSP芯片TMS320VC54X的语音压缩处理系统,可以直接作为会议电视、可视电话、IP网络多媒体通信、远程医疗系统终端设备中声音信源编码解码器系统。
关键词:
语音;压缩;编码;DSP
目录
1课题综述1
1.1课题来源1
1.2预期目标1
1.3前置知识1
2系统设计及分析2
2.1基础知识2
2.2实验方案3
2.3程序流程图4
3原理图5
4程序代码5
4.1主函数5
4.2a律压缩子函数10
4.3a律解压缩子函数11
4.4延时子函数12
4.55402.cmd文件12
4程序运行与调试15
4.1实验结果15
总结17
参考文献18
1课题综述
1.1课题来源
语音信号是信息的重要形式,语音信号处理有着广泛的应用领域,而语音压缩在语音信号的传输、存储等方面有非常广泛的作用,而且在通信领域中已经有较成熟的发展和广泛应用。
本设计要求采用DSP及其A/D、D/A转换器进行语音信号的压缩、存储和回放。
在通信应用领域中,压缩语音信号的传输带宽或降低电话信道的传输码率,一直是设计人员追求的目标。
语音编码在实现这一目标的过程中担当着重要的角色,语音编码是压缩语音信号的数字表示,而且是这些信号所需比特数最小的算法。
可以说,语音压缩技术的发展和人类信息技术的发展息息相关。
因此,对语音压缩技术的研究具有重要的现实意义。
1.2预期目标
(1)使用DSP实现语音的压缩和解压缩,算法自行定义。
(2)将从MIC输入口实时采集的语音信号,通过A/D转换器进行压缩后存储到DSP的片内和片外RAM存储器中,存储时间不小于10秒。
(3)存储器存满之后,使用DSP进行实时解压缩,并从SPEAKER输出口进行回放输出。
(4)使用指示灯对语音存储和回放过程进行指示。
(5)利用多种算法进行语音压缩存储等,比较各算法的特点。
1.3前置知识
基于TMS320VC54X为核心的语音压缩与回放需要掌握和了解如下几个知识:
语音的采集与编码、量化、DPCM&ADPCM、采集与输出模块、a律压缩、A/D、D/A,以及DSP芯片选择等。
2系统设计及分析
2.1基础知识
2.1.1语音编码
语音编码一般分为两类:
一类是波形编码,一类是被称为“声码器技术”的编码。
波形编码的最简单形式就是脉冲编码调制(Pulsecodemodulation),这种方式将语音变换成与其幅度成正比的二进制序列,而二进制数值往往采用脉冲表示,并用脉冲对采样幅度进行编码,所以叫做脉冲编码调制。
脉冲编码调制没有考虑语音的性质,所以信号没有得到压缩。
2.1.2量化
脉冲编码调制用同等的量化级数进行量化,即采用均匀量化,而均匀量化是基本的量化方式。
但是均匀量化有缺点,在信号动态范围较大而方差较小的时候,其信噪比会下降。
国际上有两种非均匀量化的方法:
A律和u律,u律是最常用的一种。
在美国,7位u律是长途电话质量的标准。
而我国采用的是A律压缩,而且有标准的A律PCM编码芯片。
2.1.3DPCM&ADPCM
降低传输比特率的方法之一是减少编码的信息量,这要消除语音信号中的冗余度。
相邻的语音样本之间存在明显的相关性,因此对相邻样本间的差信号进行编码,便可使信息量得到压缩。
因为差分信号比原语音信号的动态范围和平均能量都小。
这种编码叫DifferentialPCM,简称DPCM,即差分脉冲编码调制。
ADPCM即自适应差分脉冲编码调制,是包括短时预测的编码系统。
CCITT(国际电报电话咨询委员会)在1984年提出的32kbit/s的编码器建议就是采用ADPCM作为长途传输中的国际通用语音编码方案。
这种ADPCM编码方案达到64kbit/sPCM的语音传输质量,并具有很好的抗误码性能。
2.1.4a律压缩
A律编码(A-law)是ITU-T(国际电联电信标准局)CCITTG.712定义的关于脉冲编码的一种压缩/解压缩算法。
世界上大部分国家采用A律压缩算法。
美国采用mu律算法进行脉冲编码。
令量化器过载电压为1,相当于把输入信号进行归一化,那么A律对数压缩定义为:
当0<=x<=1/A时,f(x)=(Ax)/(1+lnA)
当1/A<=x<=1时,f(x)=(1+lnAx)/(1+lnA)
在现行的国际标准中A=87.6,此时信号很小时(即小信号时),从上式可以看到信号被放大了16倍,这相当于与无压缩特性比较,对于小信号的情况,量化间隔比均匀量化时减小了16倍,因此,量化误差大大降低;而对于大信号的情况例如x=1,量化间隔比均匀量化时增大了5.47倍,量化误差增大了。
这样实际上就实现了“压大补小”的效果。
按上式得到的A律压扩特性是连续曲线,A的取值不同其压扩特性亦不相同,而在电路上实现这样的函数规律是相当复杂的。
为此,人们提出了数字压扩技术,其基本思想是这样的:
利用大量数字电路形成若干根折线,并用这些折线来近似对数的压扩特性,从而达到压扩的目的。
下图2-1为a律压缩的示意图
图2-1a律压缩示意图
2.2实验方案
用板内的AD/DA转换器AD50将由MIC输入的模拟信号转换为16位数字信号送入DSP板中进行压缩处理,压缩处理后的数据经过解压后再送至DA转换器转换为模拟信号,由SPEAKER口输出,压缩和解压缩用A律格式,从而实现语音信号的采集压缩与回放。
图2-2总体框架图
2.3程序流程图
基于TMS320VC54X的语音压缩与回放程序流程图如下图所示。
图2-4程序流程图
3原理图
图3-1实验原理图
4程序代码
4.1主函数
/*******************************main************************************/
voidmain()
{
if(brd_init(100))//初始化DSK板,失败退出
return;
/*blinktheledsacoupletimes*/
for(m=6;m>0;m--)
{
brd_led_toggle(BRD_LED0);
/*brd_delay_msec(1000);*/
delay(1000);
brd_led_toggle(BRD_LED1);
/*brd_delay_msec(1000);*/
delay(1000);
brd_led_toggle(BRD_LED2);
/*brd_delay_msec(1000);*/
delay(1000);
}
/*OpenHandsetCodec*/
hHandset=codec_open(HANDSET_CODEC);/*Acquirehandletocodec*/
/*Setcodecparameters*/
codec_dac_mode(hHandset,CODEC_DAC_15BIT);/*DACin15-bitmode*/
codec_adc_mode(hHandset,CODEC_ADC_15BIT);/*ADCin15-bitmode*/
codec_ain_gain(hHandset,CODEC_AIN_6dB);
/*6dBgainonanaloginputtoADC*/
codec_aout_gain(hHandset,CODEC_AOUT_MINUS_12dB);
/*-12dBgainonanalogoutputfromDAC*/
codec_sample_rate(hHandset,SR_16000);/*16KHzsamplingrate*/
/*Pollinganddigitalloopback*/
while
(1)
{
brd_led_disable(BRD_LED1);//关闭led1
brd_led_disable(BRD_LED2);//关闭led2
brd_led_toggle(BRD_LED0);//开启led0
/*Waitforsamplefromhandset*/
while(!
MCBSP_RRDY(HANDSET_CODEC))
{data=*(volatileu16*)DRR1_ADDR(HANDSET_CODEC);};//采集语音信号
temp1=data2alaw(data);//temp1=data2ulaw(data);
//保存压缩后的数据把低地址数据放在高八位高地址数据放在第八位
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>=72000)
{
i=0;
}
if(j>=36000)
{
j=0;
brd_led_disable(BRD_LED0);//放音
brd_led_disable(BRD_LED2);
brd_led_toggle(BRD_LED1);
for(k=0;k<72000;k++)
{
if(k%2==0)
temp2=(buffer[l]>>8)&0x0ff;
else
{
temp2=buffer[l]&0x0ff;
l++;
}
if(l>=36000)
l=0;
data1=alaw2data(temp2);
while(!
MCBSP_XRDY(HANDSET_CODEC)){};
*(volatileu16*)DXR1_ADDR(HANDSET_CODEC)=data1*4;
}
brd_led_disable(BRD_LED0);
brd_led_disable(BRD_LED1);
brd_led_toggle(BRD_LED2);//放音结束
for(m=0;m<3;m++)delay(1000);
for(m=0;m<36000;m++)buffer[m]=0;
}
}
}
1)初始化DSK:
if(brd_init(100))
return;
2)初始化A/D50C程序:
/*获取设置DAC的句柄*/
hHandset=codec_open(HANDSET_CODEC);//Acquirehandletocodec/*设置DAC的工作参数*/
codec_dac_mode(hHandset,CODEC_DAC_15BIT);//DACin15-bitmode
codec_adc_mode(hHandset,CODEC_ADC_15BIT);//ADCin15-bitmode
codec_ain_gain(hHandset,CODEC_AIN_12dB);//6dBgainonanaloginputtoADC
codec_aout_gain(hHandset,CODEC_AOUT_MINUS_6dB);
//-6dBgainonanalogoutputfromDAC
codec_sample_rate(hHandset,SR_16000);//16KHzsamplingrate
}
3)闪灯程序:
for(m=6;m>0;m--)
{
brd_led_toggle(BRD_LED0);
/*brd_delay_msec(1000);*/
delay(1000);
brd_led_toggle(BRD_LED1);
/*brd_delay_msec(1000);*/
delay(1000);
brd_led_toggle(BRD_LED2);
/*brd_delay_msec(1000);*/
delay(1000);
}
4)语音信号采集与回放程序
//判断MCBSP是否做好接收准备
while(!
MCBSP_RRDY(HANDSET_CODEC)){};
//从A/D读取转换数据
data=*(volatileu16*)DRR1_ADDR(HANDSET_CODEC);
temp1=data2alaw(data);//temp1=data2ulaw(data);
//将数据写入D/A转换器
data1=alaw2data(temp2);
while(!
MCBSP_XRDY(HANDSET_CODEC)){};
*(volatileu16*)DXR1_ADDR(HANDSET_CODEC)=data1*4;
5)数据存储与处理
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
}
Iif(k%2==0)
temp2=(buffer[l]>>8)&0x0ff;
else
{
temp2=buffer[l]&0x0ff;
l++;
}
4.2a律压缩子函数
/*****************************a律压缩***********************************/
unsignedchardata2alaw(intdata)
{
unsignedchari,sign,achord,astep;
unsignedintoutput,absol,temp;
temp=absol=abs(data);
sign=(data>=0)?
1:
0;//判定符号:
正数=1,负数=0
for(i=0;i<16;i++)//确定temp中出现1的最高位
{
output=temp&0x8000;
if(output)break;//temp左移i位后最高位为1
temp<<=1;
}
achord=11-i;//段值
if(achord<=0)
{
achord=0;
astep=(absol>>1)&0x0F;//段值为0,将absol左移1位得到量化值
}
else
astep=(absol>>achord)&0x0F;//段值不为0,将absol左移
achord<<=4;//achord位得量化值
output=achord+astep;//输出值的绝对值
if(absol>4095)
//超过最大值4095,输出最大值0x7f
output=0x7F;
if(sign)
returnoutput^=0xFF;//返回含有符号信息的输出值
else
returnoutput^=0x7F;
}
4.3a律解压缩子函数
/*******************************a律解压缩*********************************/
intalaw2data(unsignedcharinput)
{
unsignedcharsign,achord,astep;
unsignedinttemp;
intdata;
temp=input^0xFF;//得到含有符号信息的压缩值
sign=(temp&0x80)>>7;//符号位
achord=(temp&0x70)>>4;//段值
astep=temp&0x0F;//量化值
astep<<=1;
if(!
achord)//段值为0,输出值为量化值左移1位后加1
data=astep+1;
else
{
data=astep+33;//扩展后数值中的6位非零值
data<<=achord-1;
}
if(sign)
return-data;//有符号的扩展值
else
returndata;
}
4.4延时子函数
//延时
voiddelay(intperiod)
{
inti,j;
for(i=0;i{
for(j=0;j>1;j++);
}
}
4.55402.cmd文件
实验中还需要添加5402.cmd文件,5402.cmd文件及其解释:
MEMORY
{
PAGE0:
VECS:
origin=0080h,length=0080h/*内部程序RAM*/
PRAM:
origin=0100h,length=0FFFh/*内部程序RAM*/
PAGE1:
SCRATCH:
origin=1000h,length=0020h/*ScratchPadDataRAM*/
DMARAM:
origin=1020h,length=0300h/*DMA缓存*/
DATA:
origin=1320h,length=0080h/*内部数据RAM*/
STACK:
origin=1400h,length=0500h/*堆栈内存空间*/
INRAM:
origin=1900h,length=0100h/*内部数据RAM*/
HPRAM0:
origin=1A00h,length=0002h/*HPI*/
HPRAM1:
origin=1A02h,length=0280h/*HPI*/
HPRAM2:
origin=1C82h,length=0280h/*HPI*/
EXRAM:
origin=1F10h,length=0EA00h/*外部内存*/
}
SECTIONS
{
.cinit>PRAMPAGE0
.text>PRAMPAGE0
.vectors>VECSPAGE0
init_var>PRAMPAGE0
detect>PRAMPAGE0
vrcprg>PRAMPAGE0
matprg>PRAMPAGE0
.stack>STACKPAGE1
.trap>SCRATCHPAGE1
.const>EXRAMPAGE1
.data>EXRAMPAGE1
.bss>EXRAMPAGE1
.cio>EXRAMPAGE1
.switch>EXRAMPAGE1
tables>EXRAMPAGE1
var>EXRAMPAGE1
svctab>EXRAMPAGE1/*SS_VLSPtable*/
vctab>EXRAMPAGE1/*VLSPtable*/
uvctab>EXRAMPAGE1/*UVLSPtable*/
cuvtab>EXRAMPAGE1/*Stochasticcodebook*/
cdbktab>EXRAMPAGE1/*variouscodebooktables*/
logtab>EXRAMPAGE1/*tableforlog2*/
powtab>EXRAMPAGE1/*tableforpow2*/
hamtab>EXRAMPAGE1/*tableforhamming*/
lgwtab>EXRAMPAGE1/*tableforlagwindow*/
acostab>EXRAMPAGE1/*tableforarccos*/
sqrtab>EXRAMPAGE1/*tableforsquareroot*/
acbtab>EXRAMPAGE1/*tableforthresholdsinacb*/
pm03tab>EXRAMPAGE1/*tableforx^(-0.3)computation*/
costab>EXRAMPAGE1/*tableforcosine*/
V23>INRAMPAGE1
FSK>INRAMPAGE1
hpibuff0>HPRAM0PAGE1
hpibuff1>HPRAM1PAGE1
hpibuff2>HPRAM2PAGE1
dma_buff>DMARAM