DSP语音压缩设计.docx
《DSP语音压缩设计.docx》由会员分享,可在线阅读,更多相关《DSP语音压缩设计.docx(20页珍藏版)》请在冰点文库上搜索。
DSP语音压缩设计
设计报告
项目名称:
DSP应用系统
题目:
语音压缩技术研究
专业班级:
电子信息工程1102
学生姓名:
学号:
指导教师:
2014年6月5日
目录
一、概述………………………………………………………………………………1
二、研究内容…………………………………………………………………………1
三、研究方案、算法原理说明………………………………………………………1
四、程序设计、调试与结果分析……………………………………………………5
五、总结………………………………………………………………………………10
参考文献……………………………………………………………………………11
一、概述
当今的通信应该是人与人之间方便快捷、可多种手段实现信息交换的形式。
其中,通过语音传递信息是人类最重要的、最有效和最方便的通信方式,因此语音通信在现代数字通信系统中占有重要的地位。
随着信息社会的快速发展,通信信道资源变得非常宝贵,各种语音压缩编码技术应运而生。
高速数字信号处理器的出现,使得语音编码算法可以实时的实现,并且带动语音压缩技术得到了突飞猛进的发展。
另外,移动通信技术飞速发展,已经越来越深入的渗透到每个人的生活当中,对讲机系统随着移动通信技术也迅速发展着,在公安、交通运输等多个领域得到广泛的应用。
低速率语音编码以及在此基础上的数字对讲机技术已成为数字通信中的一个重要的研究领域。
本文首先介绍了一种多带激励语音(MBE)低速率编码算法,这种算法在很大范围内改善了解码合成后的语音质量,而算法的复杂度并没有明显增加。
它不仅在低速率上能恢复出音质比传统声码器好得多的语音(可达到2.4kbps或更低的编码速率),而且具有良好的自然度和容忍环境噪声的能力,是目前较为理想的低速率语音编码方案。
在低速率的语音编码基础之上,本文又提出了几种窄带数据加密技术的方案,并对这几种数字对讲方案进行了分析和仿真。
语音压缩技术指的是对原始数字音频信号流运用适当的数字信号处理技术,在不损失有用信息量,或所引入损失可忽略的条件下,降低(压缩)其码率,也称为压缩编码。
它必须具有相应的逆变换,称为解压缩或解码。
音频信号在通过一个编解码系统后可能引入大量的噪声和一定的失真。
数字信号的优势是显而易见的,而它也有自身相应的缺点,即存储容量需求的增加及传输时信道容量要求的增加。
本次实验采用DSPC5402实验板实现语音信号的压缩解压的。
SEED-VC5402DSK实验板上集成了SRAM,FLASH,音频输入输出接口等部件。
这些外设为我们提供了极大的方便。
语音信号的幅度(发音强度)并非均匀分布,由于小信号占的比例比大信号大很多,因此可以进行非均匀量化。
达到这一目标的基本做法是,对大信号使用大的量化间隔,而小信号则使用小的台阶。
ITU-TG.711建议的PCMA律和µ律语音压缩标准可以分别将13比特和14比特压缩为8比特,达到语音压缩的目的。
二、研究内容
1、设计要求及目标
基本部分:
(1)使用DSP实现语音压缩和解压缩的基本算法,算法类型自定,例如可以采用G.711、G.729等语音压缩算法。
(2)采用A/D转换器从MIC输入口实时采集语音信号,进行压缩后存储到DSP的片内和片外RAM存储器中,存储时间不小于10秒。
(3)存储器存满之后,使用DSP进行实时解压缩,并从SPEAKER输出口进行回放输出。
(4)使用指示灯对语音存储和回放过程进行指示。
使用多种算法进行语音的压缩、存储和解压缩,比较它们之间的优缺点。
三、研究方案、算法原理说明
(1)语音算法与芯片特点
在本项目中,我们选择了DSP集团的语音压缩最新算法TripleRateCoder,其压缩比达到了46:
1,且音质良好,MOS指标达到了3.98.
该算法的基本思想是:
首先将语音分为若干小段,由于语音信号的谱变化是一个缓变量,因此在每一小段内信号是平稳变化的.然后用一个数字滤波器和一个激励函数来表示这一段时域波形的离散采样序列.在实际算法中是采用了一个十阶的线性预测滤波器,计算时还将每一帧分为4个子帧,每一子帧的滤波器系数矢量由上一帧和本帧数据计算得到,而最后一子帧的滤波器系数矢量则由矢量分解预测法得到;激励函数采用的是伪随机多脉冲激励函数,由最大似然算法得到.对每一帧计算得到滤波器系数矢量和函数生成元后,将这些系数再压缩打包就得到了最后的语音压缩数据.当对语音压缩数据进行解压时,首先将打包的数据展开,然后建立起线性预测滤波器,将重新生成的伪随机多脉冲激励函数输入滤波器,这样在滤波器的输出端就可得到被恢复的语音信号序列了.
该算法的实时运算需要22MIPS以上的运算速度,为此DSP集团将DSP内核和算法代码集成在D6571系列芯片内,以满足除PC用户以外的更广泛应用.D6571原理框图如图1所示,其本身可直接外挂并管理4兆位的flash,8K采样速率时在2.8KB的数据率下可提供25分钟的回放时间.该芯片具备工业标准的编解码器接口,可直接与串行PCM接口的音频编解码芯片相连,如美国国家半导体的TP3054或韩国三星半导体的KS8620.D6571可外接两片音频编解码芯片,上电后可用设置命令对外接音频编解码芯片的工作模式进行设置.例如:
设置外接芯片的时钟是外同步还是自同步;设置外接芯片处于输出方式还是输入方式等.
根据实际开发经验,我们认为D6571芯片与其它公司所提供的某些DSP内核芯片相比,其最大的优点是几乎不需要任何开发工具或软件就可使用.因为该芯片的数据是双向的,既可由上位机将压缩后的语音数据通过它解压转变成语音,也可输入语音通过它进行实时压缩后传送给上位机.这就大大方便了长回放时间语音开发用户的使用.更何况目前许多语音压缩芯片对语音数据的管理是不公开的,例如:
某些数字录音电话的语音压缩芯片.
(2)系统构成
与语音处理有关的系统构成如图2所示.
语音数据存放在一片32兆位的flash中,采用三星的K29W3200,这是一种8位并行接口的闪存,并行接口有利于提高代码效率和满足实时性要求.
在语音数据的压缩和回放过程中,D6571和flash之间的数据吞吐均通过上位机进行.上位机采用89C52.系统还有64×64的点阵液晶模块ACM6464等外围设备.所有的设备均使用一条公共的8位数据总线,即CPU的P0口;P2口的六根口线用于键盘管理;P3口的两根口线作为两条串口线;这样用于外设管理的口线还剩余16根可用.系统实际使用了其中的14根线:
与flash管理有关的使用6根,与D6571有关的使用4根,还有4根用于液晶显示管理.
音频编解码接口芯片采用一片TP3054,TP3054工作所需的同步脉冲、采样时钟、数据信号等只需要与D6571的四根控制线相连即可得到.
(3)系统开发
本系统的语音开发分为上载、数据合成及下载三个过程.上载是指获得语音压缩数据;数据合成是指将全系统的数据按一定的结构组织成一个文件;下载是指仪器装配出厂时将文件烧录到flash中.这三个过程均通过PC机进行.由于系统板上MCU的串行信号直接输出的是TTL电平,因此,本系统的语音开发唯一需要另外制作的硬件就是使用一片MAX232来完成与PC机之间的电平转换.
D6571具有16位宽度的总线,但也允许以分时方式使用8位总线,这时上位机须用HL信号表示送上总线的是高8位还是低8位;而当D6571主动将数据送上总线时,会发出ACK信号通知上位机读取数据.HRD和HWR则是读和写的控制线.由于TripleRateCoder算法是按30毫秒分帧采样,然后再进行分析压缩的,因此无论是读取压缩数据还是回送压缩数据,均必须在一帧之内完成,否则D6571会自行进入休眠状态.向D6571输送语音数据的过程如下:
首先送出解压控制命令,然后接收一个回送状态字,状态字中包含了当前帧所需要的字节数,上位机就连续送出规定数目的数据,待一帧处理完毕后,D6571会继续送出状态字.如此循环就可连续回放出语音了.而利用D6571进行语音压缩的数据处理过程正好相反,状态字中包含的是当前帧压缩所得到的字节数,上位机就应连续接收规定数目的数据.
上载时,首先要得到的是各个语音段的压缩数据.作为准备工作,先用PC机的录音机工具将我们所需的语音录制成WAV文件.然后对MCU和PC机分别编写共同配合工作的两段程序来完成以下功能:
PC机通过声卡播放声音给D6571;89C52控制D6571进行语音压缩并读回压缩数据,然后通过串口线回送给PC机,PC机则将每段的压缩数据存盘.
由于每段语音播放时均要有一定的中文点阵字符显示,数据合成的任务就是要将每段数据加上索引和字符点阵数据后再合成为一个完整的近32兆位的二进制文件.文件形成时为了使数据定位和读出编程方便,数据块以flash的页为单位,一页为528字节.
下载工作则较简单,在设备出厂前直接使用系统89C52的串口将数据合成形成的文件下载到闪存中即可.
D6571的压缩率极高,使用和开发也比较方便.因此尽管本系统的语音容量长达200分钟,但系统整体设计十分简洁、经济,几乎不需调试.主要开发工作是MCU和PC机的一些程序开发使用C51和VB编程,开发速度也比较快.
由于D6571的控制命令很丰富,系统用户界面的软件是很容易编写的.例如,由于该芯片具有30阶的音量控制命令,我们未添任何硬件就为设备增加了数字音量控制功能.D6571的控制命令还包含自动增益控制、变速回放、数字滤波器等更加高级的命令,因此,它几乎可应用于任何语音场合.
(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
在扩展前,u律码字再次反转。
低位的有效比特原是丢弃的,但是为了减少精度损失,用中间值近似。
为了简化,扩展后的码字符号左溢。
U率二进制解码表
压缩过的码字
偏值的输入
段值,量化值
比特:
6543210
比特:
1211109876543210
000abcd
00000001abcd1
001abcd
0000001abcd10
010abcd
000001abcd100
011abcd
00001abcd1000
100abcd
0001abcd10000
101abcd
001abcd100000
110abcd
01abcd1000000
111abcd
1abcd10000000
5、程序设计思路及流程图
思路:
DSP程序设计应包括用户程序、存储器配置程序。
为了实现语音信号的采集与回放,先将语音信号采集,运用a律压缩算法将信号压缩并存入存贮器中,当放音开始时运用a律解压算法将信号解压并从存储器中释放出来,实现语音的回放。
流程图:
2、
3、
4、
5、
6、
7、
8、
9、
10、
11、
四、程序设计、调试与结果分析
1、程序设计
(1)用2812dsp实现语音的A率压缩解压有两种方法:
a、使用多通道缓冲串口(McBSP)的缩展器
在多缓冲通道串口(McBSP)内部装置了硬件电路,支持A律格式缩展器,对数据进行压缩与扩展,A律缩展器允许14比特的动态范围。
首先描述一下McBSP硬件如何能够同时处理A律,如图显示的是McBSP缩展器硬件工作流程。
在接受端,McBSP接收压缩的、非线性的数据然后扩展为线性数据写道CPU或DMA,在发送端,从CPU或DMA得到的线性数据在发送前必须按着A律压缩。
RSRRBRRJUSTDRR
DLB模式非DSB模式
b、用软件实现
主程序的功能是从McBSP的接收通道读取A/D转换的值,然后经过压缩解压后将其发送到McBSP的发送通道,构成AD50CODEC模拟输入和输出通道的自环,是否能接收到A/D转换的数据是通过查询串口1的接收标志RRDY来进行的,程序为:
while
(1)
{
while(!
MCBSP_RRDY(HANDSET_CODEC)){};
data=*(volatileint*)DRR1_ADDR(HANDSET_CODEC);
temp1=data2alaw(data);
data=alaw2data(temp2);
*(volatileint*)DXR1_ADDR(HANDSET_CODEC)=data;
}
(2)实验程序及相关功能解释如下
/*头文件*/
#include
#include
#include
#include
/*声明函数*/
voiddelay(s16period);
unsignedchardata2alaw(int);
intalaw2data(unsignedchar);
/*定义变量*/
HANDLEhHandset;
intdata0;
intdata1;
longi,j=0;
longk,l=0;
unsignedinttemp1;
unsignedchartemp2;
unsignedintm;
unsignedintbuffer[50000];
/*主程序*/
voidmain()
{
s16cnt1=2;s16cnt2=10;
if(brd_init(100))//初始化DSK板,失败退出
return;
while(cnt1--)//指示灯依次先亮后灭
{
brd_led_toggle(BRD_LED0);
delay(1000);
brd_led_toggle(BRD_LED1);
delay(1000);
brd_led_toggle(BRD_LED2);
delay(1000);
}
/*AD50的初始化*/
hHandset=codec_open(HANDSET_CODEC);//初始化串口1,设置成功返回codec的句柄放在变量hHandset中
codec_dac_mode(hHandset,CODEC_DAC_15BIT);//15bitD/A转换
codec_adc_mode(hHandset,CODEC_ADC_15BIT);//15bitA/D转换
codec_ain_gain(hHandset,CODEC_AIN_6dB);//输入6dB增益
codec_aout_gain(hHandset,CODEC_AOUT_MINUS_12dB);//输出-12dB增益
codec_sample_rate(hHandset,SR_8000);//8K采样率
while
(1)
{
brd_led_disable(BRD_LED1);//关闭led1
brd_led_disable(BRD_LED2);//关闭led2
brd_led_toggle(BRD_LED0);//录音指示灯亮
while(!
MCBSP_RRDY(HANDSET_CODEC)){};//采集语音信号
data0=*(volatileu16*)DRR1_ADDR(HANDSET_CODEC);
temp1=data2alaw(data0);//A律压缩
/*存储压缩后的数据*/
i=i+1;
if(i%2==1)
{
buffer[j]=(temp1<<=8);
}
else
{
buffer[j]=(buffer[j]|temp1);j++;
}
if(i>=100000)
{
i=0;
}
if(j>=50000)
{
j=0;
brd_led_disable(BRD_LED0);brd_led_disable(BRD_LED2);
while(cnt2--)//灯闪烁
{
brd_led_toggle(BRD_LED1);
/*brd_delay_msec(1000);*/
delay(2000);
}
cnt2=10;
brd_led_disable(BRD_LED0);//放音指示灯亮
brd_led_disable(BRD_LED1);
brd_led_toggle(BRD_LED2);
/*取出压缩数据*/
for(k=0;k<100000;k++)
{
if(k%2==0)
temp2=(buffer[l]>>8)&0x0ff;
else
{
temp2=buffer[l]&0x0ff;
l++;
}
if(l>=50000)
l=0;
data1=alaw2data(temp2);//解压缩数据
while(!
MCBSP_XRDY(HANDSET_CODEC)){};//输出解压后的数据
*(volatileu16*)DXR1_ADDR(HANDSET_CODEC)=data1*4;
}
delay(2000);
for(m=0;m<50000;m++)buffer[m]=0;//buffer清零
}
}
}
/*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;
}
/*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;
}
2、实验现象及波形输出
连接好SEED-VC5402DSK试验板和计算机的通信,通电后首先进行复位,然后启动CCS,编译、下载。
运行编写的程序会看到DSK板上的3个指示灯依次点亮,熄灭之后就开始进行采集语音信号了。
当第一个灯亮时,开始在J5端采集音频信号,采集完后,第一个灯灭,第二个灯亮闪烁5次,第三个灯亮时J6端耳机开始放音,就会听到刚才储存的8秒左右的音频信号。
放完音后,第一个灯右开始亮,程序进入下一轮录音、压缩、存储、解压、放音循环。
压缩前后以及解压后输出波形
/*u率压缩子程序*/
unsignedchardata2ulaw(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=10-i;//求出段值
if(achord<=