语音编码算法的研究.docx
《语音编码算法的研究.docx》由会员分享,可在线阅读,更多相关《语音编码算法的研究.docx(22页珍藏版)》请在冰点文库上搜索。
语音编码算法的研究
中南民族大学
毕业论文(设计)
学院:
电子信息工程学院
专业:
电子信息工程年级:
2008
题目:
ADPCM语音编码算法研究
学生姓名:
刘浪涛学号:
08071209
指导教师姓名:
周城职称:
讲师
2012年5月25日
中南民族大学本科毕业论文(设计)原创性声明
本人郑重声明:
所呈交的论文是本人在导师的指导下独立进行研究所取得的研究成果。
除了文中特别加以标注引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写的成果作品。
本人完全意识到本声明的法律后果由本人承担。
作者签名:
年月日
注:
本页放在学位论文封面后,目录前面
目录
摘要1
Abstract1
1引言2
2ADPCM简介2
3差分PCM2
3.1脉冲编码调制(PCM)2
3.2差分脉冲编码调制(DPCM)3
4增量调制及自适应增量调制4
4.1增量调制(DM)4
4.2自适应增量调制(ADM)5
5自适应差分脉冲编码调制5
6实验及其结果6
6.1设计框架7
6.2主程序说明7
6.3Adpcm_encoder和adpcm_decoder函数说明8
6.4实验结果8
7总结9
致谢10
参考文献10
附件11
附件1main.m(主程序)11
附件2Adpcm_encoder.m(编码子程序)13
附件3Adpcm_decoder.m(解码子程序)15
ADPCM语音编码算法研究
摘要:
为了满足数字通信及其他商业应用的需求,语音压缩编码技术得到迅速发展。
语音编码的目的是在保持可以接受的失真的情况下采用进可能少的比特数表示语音。
为了降低传输或存储的费用,就必须对其进行压缩,以提高传输或存储的效率。
本文讨论PCM,DPCM,DM,ADM与ADPCM的压缩算法原理以及算法的实现。
运用MATLAB实现ADPCM的编码和解码算法,通过实验进一步证实ADPCM算法既能够有效的压缩语音,又能还原出高质量的语音。
关键词:
语音压缩;脉冲编码调制;自适应增量调制;自适应差分脉冲编码调制;MATLAB
TheResearchofADPCMSpeechCodingAlgorithm
Abstract:
Inordertomeettheneedsofdigitalcommunicationandothercommercialapplication,voicecompressiontechnologyhasrapidlydeveloped.Thepurposeofthespeechcodingistouseasmallnumberofbitstoshowthevoiceinkeepingtheacceptablethedistortion.Inordertoreducethecostoftransmissionorstorage,wemustcarryonthecompression.ThistexthasmainlydiscussedtheprincipleandtherealizationofPCM,DPCM,DM,ADMandADPCMcompressionalgorithm.UsingMATLABtoachievethecodinganddecodingalgorithmofADPCM,ThroughtheexperimentADPCMalgorithmcannotonlycompressthevoiceeffectivelybutalsorestorethehighqualityvoice.
Keywords:
SpeechCompression;PulseCodeModulation;AdaptiveDeltaModulation;AdaptiveDifferentialPulseCodeModulation;MATLAB
1引言
数字技术的出现与应用为人类带来深远的影响,数字信号的优势是显而易见的。
但它也有自身相应的缺点,即存储容量需求的增加及传输时信道容量要求的增加[1]。
以CD为例,其采样率为44.1KHz,量化精度为16比特,则1分钟的立体声音频信号需占约10M字节的存储容量。
所有这些比特都不是必需的,研究发现,直接采用PCM码流进行存储和传输存在非常大的冗余度[2]。
对声音至少可进行4:
1压缩,即只用25%的数字量保留所有的信息。
因而,为利用有限的资源,压缩技术从一出现便受到广泛的重视。
本文介绍PCM,DPCM以及DM,ADM的基础算法,最后着重阐述基于ADPCM的语音压缩算法[3]。
2ADPCM简介
ADPCM是自适应差分脉冲编码调制的简称,最早使用于数字通信系统中。
该算法利用了语音信号样点间的相关性,并针对语音信号的非平稳特点,使用了自适应预测和自适应量化这两种核心算法,将声音流中每次采样的16bit数据以4bit存储,所以压缩比为1:
4。
由于压缩/解压缩算法非常简单,所以ADPCM是一种低空间消耗,高质量、高效率声音获取的好途径。
ADPCM主要是针对连续的波形数据的,保存的是波形的变化情况,以达到描述整个波形的目的。
从80年代起,有CCITT公布的G.721建议到后来的G.726建议,分别针对不同速率或不同要求的ADPCM提出了不同的算法,这些算法的实质都是基于自适应预测和自适应量化这两个方面的。
本次ADPCM演示程序使用的是一种被称为IMA-ADPCM的算法。
该算法中对于量化步长的调整使用了极为简单的查表方法,对于一个输入的PCM值X(n),将其与前一时刻的X(n-1)预测值做差值得到d(n),然后根据当前的量化步长对d(n)进行编码,再用此sample点的编码值调整量化步长,同时还要得到当前sample点的预测值以供下一sample点编码使用。
通过此算法可将原始数据编码成4bit的码流,一个符号位和三个幅度位。
该算法较简单,通过查表简化了运算。
当前,这种IMA-ADPCM算法以其简单实用的特点广泛应用到数字音乐盒和数字录音笔中。
3差分PCM
3.1脉冲编码调制(PCM)
脉冲编码调制(PulseCodeModulation,简称PCM)是使用最为广泛的调制方法[4]。
在PCM的调制过程中,将输入的模拟信号进行取样,量化和编码。
这种方法通过用脉冲编码来代表取样后的模拟信号的幅度。
即用二进制的大小来代表取样后的信号幅度。
在接收端再将这些编码的二进制数还原为原来的模拟信号。
分为均匀量化编码和非均匀量化编码。
在数字语音中,一般采用非均匀量化调制,具体过程见图1。
图1PCM系统原理图
3.2差分脉冲编码调制(DPCM)
差分PCM(DifferentialPCM)记录的不是信号的绝对大小而是相对大小。
因为信号相对大小的变化通常要比信号本身要小,码位用得也就少。
模拟信号波形的平均值从一个样值到另一个样值得改变是很小的,如果取样频率足够高,大多数连续的样值之间会有很大的相关性。
差分系统就是利用这种信息的冗余,不记录信号的大小,而是记录相邻值之间差值得大小。
差分编码采用预测编码技术,从输入中减去预测值,然后对预测误差进行量化,最终的编码就是预测值与实际值之间的差值。
解码器用以前的数据对当前样值进行预测,然后用误差编码重构原始样值。
这种方法使用的比特数较少,但它的性能决定于预测编码方法以及它对信号变化的适应能力。
DPCM的结构框图如图2所示,图中X(n)是输入语音信号,Xr(n)是重构的语音信号,Xp(n-1)是预测信号,d(n)是预测误差信号。
图中,差分信号d(n)是离散输入信号X(n)和预测器输出的估算值Xp(n-1)之差。
注意,Xp(n-1)是对X(n)的预测值,而不是过去样本的实际值。
DPCM系统实际上就是对这个差值d(n)进行量化编码,用来补偿过去编码中产生的量化误差。
重构信号Xr(n)是由逆量化器产生的量化差分信号dq(n),与对过去样本信号的估算值Xp(n-1)求和得到。
它们的和,即Xr(n)作为预测器确定下一个信号估算值的输入信号。
图2DPCM的工作原理
4增量调制及自适应增量调制
4.1增量调制(DM)
DPCM对输入信号与预测值之差进行编码。
当取样的频率提高时,样值之间的变化减小,样值之间的相对性变强。
增量调制(DeltaModulation,简称为DM)是一种特殊简化的DPCM,只用了1bit的量化器,它采用较高的取样频率和1比特的编码。
图3所示为DM的工作原理。
因为只能用一个量化级来代表样值的变化,为了跟踪信号的变化,必须使用高的取样频率,一般要求在200kHz以上。
因此编码反映的只是差分本身,而不是原始的信号。
而且在DM中,当语音波形幅度发生急剧变化时,译码波形不能充分跟踪这种急剧的变化而必然产生失真,这称为斜率过载。
而在没有语音的无声状态时,或者信号幅度为固定值时,量化输出
都将呈现0,1交替的序列。
这种噪声称为颗粒噪声,它给人粗糙的噪声感觉[5]。
图3使用1比特差分码进行编码的△调制
4.2自适应增量调制(ADM)
一般情况下,人的感觉不易觉察过载噪声,而颗粒噪声对音质影响比较大,所以要将△的幅值取得足够小。
但是△取得小,过载噪声就会增大,因而这时必须增加采样频率,以减少各个采样值之间的语音信号变化。
然而如果提高采样频率,那么信息压缩的效果就会降低。
兼顾这两方面的要求,应采用随输入波形自适应的改变△大小的自适应编码方式,使△值随信号平均斜率而变化:
斜率大时,△自动增大;反之则减小。
这就是自适应增量调制(AdaptiveDM,简称ADM)[6]。
如图3所示,这个方法的原理是:
在语音信号的幅值变化不太大的区间内,取小的△值来抑制颗粒噪音;在幅值变化大的地方,取大的△值来减小过载噪音。
其增量幅度的确定方法为,首先在颗粒噪音不产生大的影响的前提下,确定最小的△幅值。
在同样的符号持续产生的情况下,将△幅值增加到原来的2倍。
即,当+△,+△这样持续增加时,如果下一个残差信号还是相同的符号,那么再将△幅值增加一倍,如此下去,并且确定好某一个最大的△幅值上限,只要在这个最大的△幅值以内同样的符号持续产生,就将△幅值继续增加下去。
如果相反,残差信号值为异号时,就将前面的幅值△设为原来的1/2,重新以△/2为幅值。
也就是说,如果同样的符号持续产生两次以上,在第三次时就将△幅值增加一倍,如果产生异号,将△幅值减小1/2。
而且,当异号持续产生而减小△幅值时,一直减小到以最初确定的最小的△幅值为下限为止。
这种ADM算法中,它的采样率至少是16KHz。
图4连续0和1引起增量步长的改变
5自适应差分脉冲编码调制
自适应差分脉冲编码调制(AdaptiveDifferentialPulseCode
Modulation简称为ADPCM)用预测编码来压缩数据量。
它结合了ADM的差分信号与PCM的二进制码的方法,是一种性能比较好的波形编码[7]。
它的核心想法是:
①利用自适应的思想改变量化阶的大小,即使用小的量化阶(step-size)去编码小的差值,使用大的量化阶去编码大的差值;②使用过去的样本值估算下一个输入样本的预测值,使实际样本值和预测值之间的差值总是最小。
它的编码简化框图如图5所示。
ADPCM的线性预测滤波器传输函数P(z)是自适应的改变的,以适应输入语音信号自相关函数的变化,除此之外它与图1的DPCM并无别的区别。
图5发送端量化器的输出为:
(1)
反馈环路的输出为:
(2)
于是得到:
(3)
而它的重构信号为:
(4)
即它是原始语音信号的重建,仅仅引入量化噪声E(z),E(z)是e(n)的z变换。
接收端的P(z)是根据受到的反射系数的码字,经过解码和Levinson递推运算得到的,这就不可避免地会引入量化误差。
为了保证发送端的P(z)与接收端的完全相同,在发送端也采用由反射系数码字经解码和Levinson递推运算得到P(z)。
这样做保持了与接收端的预测器在性能上的完全一致。
图5ADPCM的工作原理
6实验及其结果
6.1设计框架
程序总体框架如图6所示;
图6程序总体框架
6.2主程序说明
主程序文件名为main.m,它调用了两个用户自定义函数:
adpcm_encoder和adpcm_decoder,其整体流程图如图7所示;
图7程序总体框架
6.3Adpcm_encoder和Adpcm_decoder函数说明
在编码程序中,得到4位的code,其中第1位是符号位,后3位是幅度位。
所以整个的编码过程中,首先要进行的就是正负符号位的判断;接着,通过3次的bitshift进行差值的大小判断,从而确定index以及相应step_table(index),即量化步长;得到量化步长后,通过它计算出I(k);然后通过I(k),通过与之前相逆的过程求得Dq(k),进而计算Se(k)和Sr(k),确定新的index和step_table(index)。
Index_table和step_table(index)分别是16×1和89×1的矩阵,里面的数值要事先写到程序中,以供查表使用。
6.4实验结果
为描述ADPCM的压缩算法性能,这里给出一段录音。
录音数据为“a”经过cooledit处理,保证原始待处理语音为16比特,格式为.wav,采样频率为44100Hz。
原始波形如图8所示;
图8原始声音波形
经过ADPCM编码后语音信号波形如图9所示;
图9ADPCM编码后语音信号波形
经过ADPCM解码后的语音信号波形如图10所示;
图10ADPCM解码后的语音信号波形
可看出语音信号非常接近,而且从波形恢复出来的声音效果与原始声音几乎没有区别,人耳无法辨别[8]。
7总结
新的通信方式和计算机网络的飞速发展,对语音信号的编码传输提出了新的要求。
在新一代的网络中,希望能充分利用信号源的特征和信道的统计复用性,改变以往信源一般输出是恒定速率码流的特点,而以具有不同速率的分层编码和变速编码,作为新的信源编码系统。
ADPCM算法思路清晰,软件编程实现方便,具有良好的语音跟踪性能,能够很好地压缩语音信号,从而大大缩减数据存储空间,并且提高数据的传输速度。
ADPCM算法目前已成为很受用的语言压缩算法之一。
ADPCM算法既能够有效的压缩语音,又能还原出高质量的语音。
致谢
四年前,这个校园是我的梦想。
四年后,微笑回首来路,一幕幕,宛在昨天。
人生就是如此吧,每个段落结束的时候,我们总会感慨时光飞逝。
四年的求学生涯在师长、亲友的大力支持下,走得辛苦却也收获满囊,在论文即将付梓之际,思绪万千,心情久久不能平静。
伟人、名人为我所崇拜,可是我更急切地要把我的敬意和赞美献给一位平凡的人,我的导师。
我不是您最出色的学生,而您却是我最尊敬的老师。
您治学严谨,学识渊博,思想深邃,视野雄阔,为我营造了一种良好的精神氛围。
授人以鱼不如授人以渔,置身其间,耳濡目染,潜移默化,使我不仅接受了全新的思想观念,树立了宏伟的学术目标,领会了基本的思考方式,从论文题目的选定到论文写作的指导,经由您悉心的点拨,再经思考后的领悟,常常让我有“山重水复疑无路,柳暗花明又一村”。
感谢我的爸爸妈妈,焉得谖草,言树之背,养育之恩,无以回报,你们永远健康快乐是我最大的心愿。
在论文即将完成之际,我的心情无法平静,从开始进入课题到论文的顺利完成,有多少可敬的师长、同学、朋友给了我无言的帮助,在这里请接受我诚挚谢意!
最后再一次感谢所有在毕业设计中曾经帮助过我的良师益友和同学,以及在设计中被我引用或参考的论著的作者。
参考文献
[1]赵力.语音信号处理[M].北京:
机械工业出版社,2003年.
[2]姚天任.数字语音处理[M].武汉:
华中科技大学出版社,2003年.
[3]钱亚生,冯重熙.自适应差分脉冲调制_ADPCM[J].电信科学,1987年.(04):
29-34,(05):
21-26.
[4]樊昌信,曹丽娜.通信原理[M].北京:
国防工业出版社,2008年.
[5]胡航.语音信号处理[M].黑龙江:
哈尔滨工业大学出版社,2002年.
[6]韩纪庆,张磊,郑铁然.语音信号处理[M].北京:
清华大学出版社,2004年.
[7]陈溯.ADPCM语音压缩编码的分析与仿真[J].中国西部科技,2008年,07(32):
51-53.
[8]廖广锐,刘萍.基于ADPCM的语音压缩算法研究[J].计算机与数学工程,2007年,07(35):
39-41.
[9]张志勇,杨祖樱.MATLAB教程[M].北京:
北京航空航天大学出版社,2006年.
附件
附件1main.m(主程序)[9]
%ADPCM演示程序
%变量说明:
y原始语音信号
%cADPCM编码信号
%cn编码信号与AGWN叠加的信号
%cf叠加信号取整得到的信号
%ydADPCM解码信号
clear;
ifnargin<1;
action='initialized';
end;
[fname,pname]=uigetfile('.wav','选择原始声音文件');
file=[pname,fname];
fs=44100;
y=wavread(file);
disp('----------------------------------------------');
disp('注意:
本程序是ADPCM的演示程序!
!
');
disp('----------------------------------------------');
disp('按任意键播放原始声音信号!
!
');
disp('----------------------------------------------');
pause
sound(y,fs);
disp('按任意键显示原始声音波形!
!
');
disp('----------------------------------------------');
pause
figure
(1);
plot(y);
title(['声音波形']);
xlabel(['采样点数']);
gridon;
c=adpcm_encoder(y);%ADPCM编码
disp('按任意键显示ADPCM编码后波形!
!
');
disp('----------------------------------------------');
pause
figure
(2);
plot(c);
title(['编码波形']);
xlabel(['采样点数']);
gridon;
disp('按任意键播放编码后的语音信号!
!
');
disp('----------------------------------------------');
pause
sound(c,fs);
cn=awgn(c,300,'measured');%模拟信道传输,加入高斯白噪声。
disp('按任意键播放编码信号通过模拟信道后的语音信号!
!
');
disp('----------------------------------------------');
pause
sound(cn,fs);
cf=round(cn);%对cn进行取整滤波
yd=adpcm_decoder(cf);%ADPCM解码
disp('按任意键显示ADPCM解码后语音信号波形!
!
');
disp('----------------------------------------------');
pause
figure(3);
plot(yd);
title(['解码后信号波形']);
xlabel(['采样点数']);
gridon;
disp('按任意键播放解码后的语音信号!
!
');
disp('----------------------------------------------');
pause
sound(yd,fs);
%计算误码率
n=0;
ne=0;
fori=1:
length(yd);
if(round(yd(i))~=round(y(i)))
n=n+1;
end
end
ne=(n/(length(yd)))*100;
disp('按任意键计算信道误码率!
!
');
disp('----------------------------------------------');
pause
disp('误码率为:
');
disp(ne);
disp('----------------------------------------------');
disp('本次ADPCM演示程序完毕,谢谢使用!
!
');
disp('----------------------------------------------');
附件2Adpcm_encoder.m(编码子程序)[9]
functionadpcm_y=adpcm_encoder(raw_y)%ADPCM编码子程序
IndexTable=[-1,-1,-1,-1,2,4,6,8,
-1,-1,-1,-1,2,4,6,8];
StepSizeTable=[7,8,9,10,11,12,13,14,16,17,19,21,23,25,28,31,34,37,41,45,50,55,60,66,73,80,88,97,107,118,130,143,157,173,190,209,230,253,279,307,337,371,408,449,494,544,598,658,724,796,876,963,1060,1166,1282,1411,1552,1707,1878,2066,2272,2499,2749,3024,3327,3660,4026,4428,4871,5358,5894,6484,7132,7845,8630,9493,10442,11487,12635,13899,15289,16818,18500,20350,22385,24623,27086,29794,32767];
prevsample=0;
previndex=1;
raw_y=32767*raw_y;%16-bitoperation
Ns=length(raw_y);
n=1;
while(n<=Ns)
predsample=prev