基于PCM的语音信号编码的译码摘要本设计是基于PCM的语音信号编码和译码性能分析,从计算机的麦克风录取一段语音信号,录制时间为12秒,并对录下的语音信号进行时域分析。其主要内容是将模拟的语音信号数字化,具体分三步抽样、量化、编码。以PCM编码和译码原理,在MATLAB下对该段语音进行PCM编码(以A律编码规则进行编码)和译码,并比较了与未编码波形的差别。关键词:脉冲编码调制;编码;译码;语音信号1前言实际中的信源通常是模拟的,如电视信号、麦克风拾取的语音信号等。为了能够使模拟信号在数字通信系统中传输,特别是能够和其他数字信号一起在宽带综合业务数字通信网中同时传输,需要将模拟信号进行数字化。数字化的过程一般由抽样、量化、编码组成。其中,抽样要保证不丢失原始信息,而量化要满足一定的质量,最后编码解决信号的表示。该设计则是在MATLAB平台下,依据脉冲编码调制原理对实际的语音信号进行PCM编码和译码。脉冲编码调制(PCM,PulseCodeModulation)在通信系统中完成将语音信号数字化功能。是一种对模拟信号数字化的取样技术,将模拟信号变换为数字信号的编码方式,特别是对于音频信号。PCM对信号每秒钟取样8000次;每次取样为8个位,总共64kbps。PCM的实现主要包括三个步骤完成:抽样、量化、编码。分别完成时间上离散、幅度上离散、及量化信号的二进制表示。根据CCITT的建议,为改善小信号量化性能,采用压扩非均匀量化,有两种建议方式,分别为A律和律方式。欧洲和我国大陆采用A律,北美、日本和其他一些国家和地区采用律。本设计采用了A律方式,由于A律压缩实现复杂,常使用13折线法编码,采用非均匀量化PCM编码。基于PCM的语音信号编码与译码性能分析,就是将一段模拟信号进行数字化,并通过对实际语音信号进行PCM编码和译码来掌握PCM编码和译码原理及其实现方法,提高我们综合应运基础知识能力和计算机编程能力,为今后的学习和工作积累经验。2一基本原理1.1脉冲编码原理通常把从模拟信号抽样、量化,直到变换成为二进制符号的基本过程,成为脉冲编码调制(PCM,PulseCodeModulation),简称脉冲调制。PCM是一种对模拟信号数字化的取样技术,是一种将模拟信号变换为数字信号的编码方式。根据CCITT的建议,为改善小信号量化性能,采用压扩非均匀量化,有两种建议方式,分别为A律和律方式。本设计采用了A律方式,采用非均匀量化PCM编码示意图如下图1-1所示:图1-1PCM原理框图语音输入低通滤波、瞬时压缩抽样量化编码信道再生、解码、解调瞬时扩张、低通滤波话音输出31.1.1抽样原理所谓抽样,就是对模拟信号进行周期性扫描,把时间上连续的信号变成时间上离散的信号。该模拟信号经过抽样后还应当包含原信号中所有信息,也就是说能无失真的恢复原模拟信号。它的抽样速率的下限是由抽样定理确定的。在一个频带限制在(0,)hf内的时间连续信号()ft,如果以1/2hf的时间间隔对它进行抽样,那么根据这些抽样值就能完全恢复原信号。或者说,如果一个连续信号()ft的频谱中最高频率不超过hf,当抽样频率2shff时,抽样后的信号就包含原连续的全部信息[1]。抽样定理在实际应用中应注意在抽样前后模拟信号进行滤波,把高于二分之一抽样频率的频率滤掉。这是抽样中必不可少的步骤。1.1.2量化原理从数学上来看,量化就是把一个连续幅度值的无限数集合映射成一个离散幅度值的有限数集合。如图2所示,量化器Q输出L个量化值ky,Lk,,3,2,1。ky常称为重建电平或量化电平。当量化器输入信号幅度x落在kx与1kx之间时,量化器输出电平为ky。这个量化过程可以表达为[1]:,}{)(1kkkyxxxQxQyLk,,3,2,1(1-1)这里kx称为分层电平。通常:kkkxx1(1-2)其中k称为量化间隔。模拟信号的量化分为均匀量化和非均匀量化。由于均匀量化存在的主要缺点是:无论抽样值大小如何,量化噪声的均方根值都固定不变。因此,当信号()mt较小时,则信号量化噪声功率比也就很小,这样,对于弱信号时的量化信噪比就难以达到给定的要求[2]。通常,把满足信噪比要求的输入信号取值范围定义为动态范围,可见,均匀量化时的信号动态范围将受到较大的限制。为了克服这个缺点,实际中,往往采用非均匀量化。非均匀量化是根据信号的不同区间来确定量化间隔的。对于信号取值小的区间,其量化间隔v也小;反之,量化间隔就大。它与均匀量化相比,有两个突出的优点。首先,当输入量化器的信号具有非均匀分布的概率密度(实际中常常4是这样)时,非均匀量化器的输出端可以得到较高的平均信号量化噪声功率比;其次,非均匀量化时,量化噪声功率的均方根值基本上与信号抽样值成比例。因此量化噪声对大、小信号的影响大致相同,即改善了小信号时的量化信噪比。实际中,非均匀量化的实际方法通常是将抽样值通过压缩再进行均匀量化。通常使用的压缩器中,大多采用对数式压缩。广泛采用的两种对数压缩律是压缩律和A压缩律。美国采用压缩律,我国和欧洲各国均采用A压缩律,因此,PCM编码方式采用的也是A压缩律。模拟信号的量化过程如图1-2所示[3]:图1-2模拟信号的量化1.1.3编码原理所谓编码就是把量化后的信号变换成代码,其相反的过程称为译码。当然,这里的编码和译码与差错控制编码和译码是完全不同的,前者是属于信源编码的范畴。在现有的编码方法中,若按编码的速度来分,大致可分为两大类:低速编码和高速编码。通信中一般都采用第二类。编码器的种类大体上可以归结为三类:逐次比较型、折叠级联型、混合型。在逐次比较型编码方式中,无论采用几位码,一般均按极性码、段落码、段内码的顺序排列。下面结合13折线的量化来加以说明。在13折线法中,无论输入信号是正是负,均按8段折线(8个段落)进行编码。若用8位折叠二进制码来表示输入信号的抽样量化值,其中用第一位表示量化值的极性,其余七位(第二位至第八位)则表示抽样量化值的绝对大小。具体的做法是:用第二至第四位表示段落码,它的8种可能状态来分别代表8个段落的起点电平。其它四位表示段内码,它的16种可能状态来分别代表每一段落的16个均匀划分的量化级。这样处理的结果,8个段落被划分成128个量化级。段落码和8个段落之间的关系如表1-1所示[1];段内码与16个量化级之间的关系见表1-2所示[1]:模拟入yx量化器量化值5表1-1段落码表1-2段内码段落序号段落码段落范围量化间隔段内码量化间隔段内码81111024-2048151111701117110512-1024141110601106101256-512131101501015100128-25612110040100401164-12811101130011301032-6410101020010200116-32910011000110000-168100000000语音PCM抽样频率是8KHZ,每个量化样值对应一个8位二进制码,故语音数字编码信号的速率为8bits×8kHz=64kb/s[4].量化噪声随级数的增多和极差的缩小而缩小。量化级数增多即样值个数增多,就要求更长的二进制编码。因此,量化噪声随二进制编码的位数增多而减少,即随数字编码信号的速率提高而减少。自然界中的声音非常复杂,波形极其复杂,通常我们采用的是脉冲代码调制编码,即PCM编码。PCM通过抽样、量化、编码三个步骤将连续变化的模拟信号转换为数字编码。1.1.4译码原理PCM译码器是实现PCM编码的逆系统。其中各模块功能如下[5]:D/A转换器:用来实现与A/D转换相反的过程,实现数字量转化为模拟量,从而达到译码最基本的要求,也就是最起码的步骤。瞬时扩张器:实现与瞬时压缩器相反的功能,由于采用A律压缩,扩张也必须采用A律瞬时扩张器。低通滤波器:由于采样脉冲不可能是理想冲激函数会引入孔径失真,量化时也会带来量化噪声,及信号再生时引入的定时抖动失真,需要对再生信号进行幅度及相位的补偿,同时滤除高频分量,在这里使用与编码模块中相同的低通滤波器。61.2A律13折线原理实际中,非均匀量化的实际方法通常是将抽样值通过压缩再进行均匀量化。通常使用的压缩器中,大多采用对数式压缩。广泛采用的两种对数压缩律是压缩律和A压缩律。美国采用压缩律,我国和欧洲各国均采用A压缩律,因此,PCM编码方式采用的也是A压缩律。所谓A压缩律也就是压缩器具有如下特性的压缩律[1]:AXAAxy10,ln1(1-3)11,ln1ln1XAAAxy(1-4)其中87.6A。A律压扩特性是连续曲线,A值不同压扩特性亦不同,在电路上实现这样的函数规律是相当复杂的。实际中,往往都采用近似于A律函数规律的13折线(A=87.6)的压扩特性。在这个设计之中所用着的PCM编码正是采用这种压扩特性来编码的。图1-2示出了这种压扩特性,表1-3列出了13折线时的x值与计算x值的比较。图1-213折线特征7表1-3计算值x与A律13折线时x值的比较y0818283848586871x012816.6016.3014.15179.7193.3198.111按折线分段时的x012816413211618141211段落12345678斜率161684212141表1-3中第二行的x值是根据87.6A时计算得到的,第三行的x值是13折线分段时的值。可见,13折线各段落的分界点与87.6A曲线十分逼近,同时x按2的幂次分割有利于数字化[1]。8二程序设计2.1程序流程图在MATLAB平台下,对录入的语音信号现进行PCM编码,然后对已经编码了的语音信号进行PCM译码,其整个过程的程序流程图如下图2-1所示:图2-1主函数流程图2.1.1PCM编码函数设计流程图在MATLAB平台下,对录入的语音信号现进行PCM编码,其中PCM的实现主要包括三个步骤完成:抽样、量化、编码。具体编码函数设计的流程图如下图2-2所示:开始语音信源PCM编码PCM解码结束量化9图2-2PCM编码函数流程图2.1.2PCM译码函数设计流程图图2-3PCM译码函数流程图输入码组提取符号判断段落位置判断段内位置判断符号位输出开始结束输入信号判断符号归一化和量化段落判断段内判断输出开始结束102.2详细程序代码2.2.1主程序closeall;clearall;y=wavred(‘cang.wav’)figure(1)plot(y)title(‘原始语音信号波形图’)N=1001;[M]=wavread('cang.wav');S=M(2000:3000);%语音信源Figure(2)plot(S,'r');holdon;%画出编码前信号xlabel('时间')%x坐标名ylabel('幅值')%y坐标名gridon%添加网格axissquare%将图形设置为正方形t1=pcm1(S);%调用编码函数figure(3)plot(t1);%画出译码后信号title('PCM编码前信号');%标题xlabel('时间')%x坐标名ylabel('幅值')%y坐标名gridon%添加网格axissquare%将图形设置为正方形t2=tqm(t1);%将N行8列矩阵转换为1行8*N列的矩阵的函数t3=tqn(t2);%将8*N行1列的矩阵转换为N行8列矩阵的函数t4=pcm2(t3);%调用译码函数figure(4)plot(t4);%画出译码后信号title('PCM译码后信号');%标题xlabel('时间')%x坐标名ylabel('幅值')%y坐标名11gridon%添加网格axissquare%将图形设置为正方形2.2.2A律十三折线PCM编码函数functionY=pcm1(S)z=sign(S);%判断S的正负Max=max(abs(S));%求S的最大值S=abs(S/Max);%归一化Q=2048*S;%量化Y=zeros(length(S),8);%存储矩阵(全零)%%段落码判断%%form=1:length(S)ifQ(m)128&