PCM/ADPCM编译码实验一、实验原理和电路说明PCM/ADPCM编译码模块将来自用户接口模块的模拟信号进行PCM/ADPCM编译码,该模块采用MC145540集成电路完成PCM/ADPCM编译码功能。该器件工作前通过显示控制模块将其配置成直接PCM或ADPCM模式,使其具有以下功能:1、对来自接口模块发支路的模拟信号进行PCM编码输出。2、将输入的PCM码字进行译码(即通话对方的PCM码字),并将译码之后的模拟信号送入用户接口模块。电路工作原理如下:PCM/ADPCM编译码模块中,由收、发两个支路组成,在发送支路上发送信号经U501A运放后放大后,送入U502的2脚进行PCM/ADPCM编码。编码输出时钟为BCLK(256KHz),编码数据从语音编译码集成电路U502(MC145540)的20脚输出(DT_ADPCM1),FSX为编码抽样时钟(8KHz),晶振U503(20.48MHz)。编码之后的数据结果送入后续数据复接模块进行处理,或直接送到对方PCM/ADPCM译码单元。在接收支路中,收数据是来自解数据复接模块的信号(DT_ADPCM_MUX),或是直接来自对方PCM/ADPCM编码单元信号(DT_ADPCM2),在接收帧同步时钟FSX(8KHz)与接收输入时钟BCLK(256KHz)的共同作用下,将接收数据送入U502中进行PCM/ADPCM译码。译码之后的模拟信号经运放U501B放大缓冲输出,送到用户接口模块中。收PCM码字U502PCM编译码器发PCM码字至用户接口8KHz同步256KHz时钟图1PCM模块电路组成框图跳线器K501测试信号至用户接口TP504TP505TP506TP502TP501TP503跳线器LOOPADPCM2MUXK504-+K502TN······-+K503TN······NT二、实验内容及现象记录与分析1.准备工作:加电后,将KB03置于左端PCM编码位置,此时MC145540工作在PCM编码状态。将K501设置在右边。2.PCM/ADPCM编码信号输出时钟和抽样时钟信号观测①输出时钟和抽样时钟即帧同步时隙信号观测:测量、分析和掌握PCM编码抽样时钟信号与输出时钟的频率、占空比以及它们之间的对应关系等。记录与分析:上图中上方CH1黄色波形为PCM编码信号抽样时钟,CH2蓝色波形为输出时钟。由图中右侧测量数据可见,抽样信号频率为8kHz,输出时钟信号频率为256kHz(见下图CH2频率,上图测得为260.4kHz存在误差,因为时间轴选取得太密)。由上图可以看出,蓝色输出时钟信号占空比为50%。一个抽样时钟高电平内有8个输出时钟周期,一个抽样时钟低电平内有24个输出时钟周期,推得黄色抽样时钟信号占空比为25%,输出时钟信号与抽样时钟信号都是方波且具有相同的相位。下图为相应的芯片时序图:PCM对电平进行256级量化,即对于每一个采样点进行8bit的编码,抽样信号为8kHz则编译码信号的频率应为64kHz。而实际中并不是整个抽样周期间隔都用来传输这8bit,只用周期的1/4来发送数据,所以抽样时钟上的占空比为25%。此举为实际应用中对信号进行多路复用提供了条件。所以输出时钟为64kHz的4倍,即256kHz。②抽样时钟信号与PCM编码数据测量:分析和掌握PCM编码输出数据与抽样时钟信号及输出时钟的对应关系。记录与分析:上图中黄色CH1信号为抽样时钟信号,蓝色CH2信号为PCM编码输出信号。可见当抽样时钟信号为高电平时,PCM编码有输出,当抽样时钟为低电平时,PCM编码输出恒为低电平。由上文已知抽样时钟高电平内有8个输出时钟周期,所以PCM编码输出信号一次输出对应8个输出时钟周期。由上图可见PCM编码输出信号的下降沿不是垂直的,而是倾斜下滑的。由上文芯片时序图知DT的最后一个比特数据只占半个周期。如果最后一个比特是0则对PCM编码输出无影响,如果最后一个比特是1,那么在后半个周期电平会被下拉至0,则PCM编码输出信号出现下降沿不垂直而是倾斜的情况。③在ADPCM编码状态。重复上述步骤:比较PCM编码和ADPCM编码时序,码元传送速率上的区别。记录与分析:黄色CH1信号为ADPCM编码信号抽样时钟,蓝色CH2信号为输出时钟。前者为8kHz,后者为256kHz,与PCM情况相同。由上图可见,ADPCM的输出时钟占空比与PCM相同,仍为50%,而抽样时钟高电平只对应4个输出时钟周期,所以占空比只有PCM的一半,即12.5%,而采样频率8kHz并没有变,也就是每个采样点由原来PCM的采样8bit变为采样4bit。则码元速率由PCM的64kHz降为32kHz。相应的芯片时序图见下图:ADPCM编码信号与PCM类似,见下图:两者区别在于ADPCM编码信号在一个抽样时钟高点平内只输出4bit,而不是PCM编码的8bit。3.PCM编码①分析和掌握PCM编码输出数据与抽样时钟信号(同步沿、脉冲宽度)及输出时钟的对应关系。由于是对1kHz信号进行8KHz采样,因此必须记录下连续的8个编码数据。记录与分析:测得连续8个输出值为:NO1:10100111NO2:10001110NO3:10001101NO4;10011110NO5;00100111NO6:00001110NO7:00001101NO8;00011110可以发现点1、2、3、4与5、6、7、8对应互为相反数,即点n与点n+4除第一位符号位不同外,其余7位数字完全相同,也即每半个周期对应4个抽样点。与8kHz对1kHz信号进行抽样的条件相符。由于点数太多,不一一展开,选取2个点作为例子:这是NO1:10100111这是NO5:00100111②由测量数据,按照A律13折线或u律15折线编码规则通过matlab计算恢复正弦波形:要求编写matlab程序将所测量的PCM编码数据按照G.711标准中的A律和u律编码规则恢复为电平值,按A律和u律需分别绘出至少3张图:PCM编码数据恢复后的波形图及其频谱图。将采样点插值后得到平滑正弦波形图。Matlab程序与分析:A律:设计思路:PCM编码分为三段,第1位为符号位,2-4位为段落码,5-8位为电平码,由下图可知对应关系。根据上图对应关系,将PCM编码的符号位、段落码、电平码分别提取,乘以对应倍数加上每段的起始电平值得到对应的恢复电平值。注意上表中段落码将000和010合并为了同一区域。实际上000和001对应的段落起始电平不同,程序中要进行区分。遇到的问题及解决办法:(1)在分别将每种段落码情况下的恢复电平值分类的时候,我发现A律的表格给出的是7种情况,因为段落码000和001对应的是同一种电平码倍数,但是实际情况有8种(000-111),因为000和001对应的起始电平值是不同的。我一开始完全按照A律表格写的分类方法得到的恢复值如果电平码相同的话在000和001两种段落码情况下是一样的。后来自己算出了001的起始电平值为33,增加了一种分类情况。(2)一开始直接用fft变换之后就画出的频域图,感觉很不正常,输入信号1kHz的分量竟然比3kHz分量还要小。如下图:感觉像是进行了叠加。后来发现fft和频率点好像不是完全线性对应的,需要在FFT之后再使用fftshift和取绝对值对结果进行调整。(3)恢复波形时使用巴特沃斯低通滤波器的参数选择一开始我不知道该怎么选。因为从频谱上能看到有很大的3000Hz的分量,所以如果以3k代入算出的参数[b,a]=butter(4,3000/(8000*10/2));得到的波形不是个正弦波,如下图:改为1k滤去3kHz分量的话,[b,a]=butter(4,1000/(8000*10/2));得到恢复波形就是个比较好看的正弦波了。matlab程序:closeallclearall%清屏S=[10100111;10001110;10001101;10011110;00100111;00001110;00001101;00011110];temp=zeros(1,8);%创建临时0矩阵fori=1:1:8code=S(i,:);%依次取入抽样点mesg1=4*(~code(2))+code(3)*2+(~code(4));%提取段落码,注意A律要求所有偶数位为反mesg2=8*(~code(5))+4*(~code(6))+2*(~code(7))+(~code(8));%提取电平码mesg3=(-1)^(code(1)+1);%判断符号switch(mesg1)%根据段落码、电平码和符号算出恢复电平case0temp(i)=mesg3*(2*mesg2+1);case1temp(i)=mesg3*(33+2*mesg2+1);%注意段落码为1时与0的不同在于起始电平为33case2temp(i)=mesg3*(66+4*mesg2);case3temp(i)=mesg3*(132+8*mesg2);case4temp(i)=mesg3*(264+16*mesg2);case5temp(i)=mesg3*(528+32*mesg2);case6temp(i)=mesg3*(1056+64*mesg2);case7temp(i)=mesg3*(2112+128*mesg2);endendtemp2=[temp,temp,temp,temp,temp];%延拓form=1:40temp3(10*m)=temp2(m);%插入0点进行调整endj=0.000125:0.000125:0.005;subplot(3,1,1);stem(j,temp2);%画出时域波形title('PCM-G.711-Alawby101180166')xlabel('时域');axis([0,0.0025,-3500,3500]);fz=8000;tz=1/fz;%设定抽样频率df=0.5;[M,m,df]=fftseq(temp2,tz,df);%利用实验1中的fftseq进行傅里叶变换M=M/fz;r=[0:df:df*length(m)-df]-fz/2;subplot(3,1,2);plot(r,abs(fftshift(M)));%画出频域波形xlabel('频域');[b,a]=butter(4,1000/(8000*10/2));%4阶巴特沃斯滤波器x=filter(b,a,temp3);subplot(3,1,3);j1=0.0000125:0.0000125:0.005;%作图域disp(j1);plot(j1,x);%画出恢复的正弦波形axis([0,0.005,-500,500]);xlabel('恢复波形');运行结果如下图:从上图频域波形中可以看出,A律编码规则得到的抽样波形有很大的3kHz频谱分量。用4阶巴特沃斯滤波器截止频率4kHz滤波恢复的波形如下图:明显3kHz分量影响很严重,与正弦波输入信号差距较大。要用1kHz截止频率才能得到比较好的正弦波恢复波形。而语音话路一般为3400Hz,所以A律编码规则可能不适合于语音信道使用。u律:设计思路:做完A律之后再做u律就简单多了,参照pdf中u律编码对应关系,修改一下A律仿真程序中的系数即可。遇到的问题及解决方法:因为做过A律之后问题已经大部分解决了,u律上遇到最大的问题就是提取段落码和电平码时哪些位要取反的问题,A律是偶数位进行取反,u律与A律不同,我一开始取错了,得到结果如下图:后来改正了,2、3、4位(即段落码)不取反,其他位取反就得到了正确结果。matlab程序:closeallclearall%清屏S=[10100111;10001110;10001101;10011110;00100111;00001110;00001101;00011110];temp=zeros(1,8);%创建临时0矩阵fori=1:1:8code=S(i,:);%依次取入抽样点mesg1=4*(code(2))+code(3)*2+(code(4));%提取段落码mesg2=8*(~code(5))+4*(~code(6))+