PCM编码及解码的仿真1.仿真原理及思路在PCM中,对模拟信号进行抽样、量化,将量化的信号电平值转化为对应的二进制码组的过程称为编码,其逆过程称为译码或解码。从理论上看,任何一个可逆的二进制码组均可用于PCM。但是目前最常见的二进制码有三类:二进制自然码(NBC)、折叠二进制码组(FBC)、格雷二进制码(RBC)。在PCM中实际采用的是折叠二进制码。图1A律13折线由表1可见,如果把16个量化级分成两部分:0~7的8个量化级对于于负极性样值脉冲,8~15的8个量化级对应于正极性样值脉冲。自然二进制码就是一般的十进制正整数的二进制表示,在16个量化级中:4216,采用4位码元表示为:312b、222b、132b、042b的有无组合来构成。比如第11个量化级可表示为3101120228021其对应的码组可表示为:1011,其余依次类推。本程序中采用自然码的编码方式。表1自然码、折叠码、格雷码样值脉冲极性量化级自然二进制码b1b2b3b4折叠二进制码b1b2b3b4格雷码b1b2b3b4正极性部分15141312111098111111101101110010111010100110001111111011011100101110101001100010001001101110101110111111011100负极性部分76543210011101100101010000110010000100000000000100100011010001010110011101000101011001100010001100010000CCITT建议的PCM编码规则,电话语音信号的频带为300~3400Hz,抽样速率为8sfkHz,对每个抽样值进行A律或者律对数压缩非均匀量化及非线性编码,每个样值用八位二进制代码表示,这样,每路标准话路的比特率为64kbps。表3.5.2中给出的是信号正值的编码,负值编码是对称的,其绝对值与此表相同。整个信号动态范围共分13个段落,各段落的量化间隔都不同,并且有2的倍数关系。每个段落内位均匀分层量化,共16层。每个样值用8比特来表示,即12345678[][][]bbbbbbbb。这8比特分为三部分:1b为极性码,0代表负值,1代表正值。24[~]bb称为段落码,表示段落的号码,其值为0~7,代表8个段落。5678[]bbbb表示每个段落内均匀分层的位置,其值为0~15,代表一段落内的16个均匀量化间隔。在PCM解码时,根据八比特码确定某段落内均匀分层的位置,然后去其量化间隔的中间值作为量化电平。本程序首先产生一个正弦信号,并对其进行采样量化,生成一个幅值矩阵;然后利用编码子函数对此矩阵中的每个元素按照A律13折线编码规则编码,并产生一个输出码组矩阵;最后利用解码子函数对输出码组矩阵解码,并画出编码前与解码后的波形图。2.程序流程图3.仿真程序及运行结果仿真程序:%实验四:PCM编码及解码仿真clearall;closeall;globaldttdfNt=0:0.01:10;x=sin(t);v=max(x);xx=x/v;%normalizesxx=floor(xx*4096);产生正弦信号画出波形采样量化编码译码画出波形图2A律十三折线编码译码流程图y=pcm_encode(sxx);yy=pcm_decode(y,v);drawnowfigure(1)set(1,'Position',[10,350,600,200])%设定窗口位置及大小plot(t,x)title('samplesequence');figure(2)set(2,'Position',[10,50,600,200])%设定窗口位置及大小plot(t,yy)title('pcmdecodesequence');编码子程序:function[out]=pcm_encode(x)%xencodetopcmcoden=length(x);%-4096x4096fori=1:nifx(i)0out(i,1)=1;elseout(i,1)=0;endifabs(x(i))=0&abs(x(i))32out(i,2)=0;out(i,3)=0;out(i,4)=0;step=2;st=0;elseif32=abs(x(i))&abs(x(i))64out(i,2)=0;out(i,3)=0;out(i,4)=1;step=2;st=32;elseif64=abs(x(i))&abs(x(i))128out(i,2)=0;out(i,3)=1;out(i,4)=0;step=4;st=64;elseif128=abs(x(i))&abs(x(i))256out(i,2)=0;out(i,3)=1;out(i,4)=1;step=8;st=128;elseif256=abs(x(i))&abs(x(i))512out(i,2)=1;out(i,3)=0;out(i,4)=0;step=16;st=256;elseif512=abs(x(i))&abs(x(i))1024out(i,2)=1;out(i,3)=0;out(i,4)=1;step=32;st=512;elseif1024=abs(x(i))&abs(x(i))2048out(i,2)=1;out(i,3)=1;out(i,4)=0;step=64;st=1024;elseif2048=abs(x(i))&abs(x(i))4096out(i,2)=1;out(i,3)=1;out(i,4)=1;step=128;st=2048;endifabs(x(i))==4096out(i,2:8)=[1111111];elsetmp=floor((abs(x(i))-st)/step);t=dec2bin(tmp,4)-48;%函数dec2bin输出的是ASCII字符串,48对应0out(i,5:8)=t(1:4);endendout=reshape(out',1,8*n);解码子程序:function[out]=pcm_decode(in,v)%decodetheinputpcmcode%in:inputthepcmcode8bitssample%v:quantizedleveln=length(in);in=reshape(in',8,n/8)';slot(1)=0;slot(2)=32;slot(3)=64;slot(4)=128;slot(5)=256;slot(6)=512;slot(7)=1024;slot(8)=2048;step(1)=2;step(2)=2;step(3)=4;step(4)=8;step(5)=16;step(6)=32;step(7)=64;step(8)=128;fori=1:n/8ss=2*in(i,1)-1;tmp=in(i,2)*4+in(i,3)*2+in(i,4)+1;st=slot(tmp);dt=(in(i,5)*8+in(i,6)*4+in(i,7)*2+in(i,8))*step(tmp)+0.5*step(tmp);out(i)=ss*(st+dt)/4096*v;end4.程序结果:图3PCM编码、解码仿真结果5.实验结果分析从上图可以看出,该程序能将正弦信号正确采样量化编码解码。正弦信号经A律13折线编码解码后,两条曲线基本一致。此图可以清晰地看出当信号幅度较小时,解码后的波形是平滑的曲线,而当信号幅度较大时(比如波峰和波谷附近)可以看到细小的锯齿状波形,此现象说明了A率13折线编码当输入信号小时,段落小,量化级间隔小;当输入信号大时,段落大,量化级间隔大的特点,可以有效减低小信号的量化误差。