一、实验原理

PCM,Pulse Code Modulation(脉冲编码调制),即把从模拟信号抽样、量化、编码成为二迚制符号的基本过程, 称为脉冲编码调制。

模拟信号的数字化过程:

1、抽样 – 时间离散:时间连续的信号 -> 时间离散、幅度连续的信号;

• 抽样定理(香农采样定律、奈奎斯特采样定律):设时间连续信号f(t),其最高截止频率为fm, 如果用时间间隔为 ≤ 1 2 的开关信号对f(t)迚行抽样时,则f(t)就可被样值信号唯一地表示。

• 这样可以只传输这些离散的抽样值,接收端就能恢复原模拟信号。

• 例:典型电话信号的最高频率通常限制在3400Hz,而抽样频率通常采用8000Hz。

模拟信号抽样及频谱:

2、量化与编码

•量化:一个连续幅度值的无限数集合 -> 一个 离散幅度值的有限数集合。

• 编码:将量化后的信号编码形成一个二迚制 码组输出。国际标准化的PCM码组是用八位 码组代表一个抽样值。

• 均匀量化:量化间隔保持不变。

• 非均匀量化:根据信号的不同区间来确定量 化间隔 • 非均匀量化优势:当输入信号具有非均匀分 布;改善了小信号时的信噪比。

二、A律13折线法

• 1位:极性正负

• 2-4位:段落码,非均匀量化

• 5-8位:段内码,均匀量化


三、pcm编码与解码

题目:对于给定的语音文件进行a律13折线编码,观察原音频信号波形、抽样后音频信号波形、编码后的数据、解码后的数据。

(1)读取语音文件进行抽样量化

%%读取本地wav文件filePath='Windows XP 关机.wav';[y,Fs]=audioread(filePath);y=y'; %转置yCh1=y(1,:);%取一个声道figuredt=1/Fs;t=0:dt:(length(yCh1)-1)*dt;plot(t,yCh1);title('wav音频信号波形');

(2)a律13折线编码

sampleVal=8000;%8k抽样率[sampleData,a13_moddata]=PCM_13Encode(yCh1,Fs,sampleVal);save('encode_data01.mat','a13_moddata');figuredt1=1/sampleVal;t1=0:dt1:(length(sampleData)-1)*dt1;plot(t1,sampleData);title('wav音频信号抽样后的波形');figureplot(a13_moddata);title('编码后的bit数据');

(3)13折线具体编码

在这里我们采用以下引用方式;

function [sampleData,a13_moddata] = PCM_13Encode(inputData,Fs,sampleVal)[ a13_moddata ] = a_13coding( sampleData );

a13_moddata 函数:

function[ a13_moddata ] = a_13coding( x )n=length(x);a13_moddata=zeros(1,n*8);for bb=1:nIs=x(1,bb);if Is>1||Is0C(1)=1 ;%判断抽样值的正负end% the polarity determins C(1)abIs=abs(Is);if 0a+(k-1)*q && Is<=a+k*qfour=dec2bin(k-1,4);four=str2num(four(:))';elseendendend

(4)pcm解码

clcclearsampleVal=8000; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%读取编码数据 mat文件data =load('a02.mat') ;%读取mat 文件a13_moddata=data.a13_moddata; %获取mat文件a13_moddata的数据%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%PCM 13折线解码 [outData] = PCM_13Decode( a13_moddata );figuredt1=1/sampleVal;t1=0:dt1:(length(outData)-1)*dt1;plot(t1,outData);title('解码还原后的语音波形');%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%将语音数据写入音频WAV文件writeData=[outData;outData]';%复制声道1数据到声道2,并转置writeFilePath='decode_data02.wav';audiowrite(writeFilePath,writeData,sampleVal); 

(5)解码函数

解码引用PCM_13Decode函数,其中具体代码为:

function[outData] = PCM_13Decode( inputData )n=length(inputData);outData=zeros(1,n/8);MM=zeros(1,8);for kk=1:n/8MM(1:8)=inputData(1,(kk-1)*8+1:kk*8); %取得8位PCM码temp=MM(2)*2^2+MM(3)*2+MM(4) ; %将8位PCM码的第2~4位二进制数转化为10进制(三位二进制转十进制)%用于判断抽样值在哪个段落内% 段落序号i=1if temp==0q=1;%段内量化间隔a=0;%段落起始电平end% 段落序号i=2 if temp==1q=1;a=16;end% 段落序号i=3if temp==2q=2;a=32;end% 段落序号i=4if temp==3q=4;a=64;end% 段落序号i=5if temp==4q=8;a=128;end% 段落序号i=6if temp==5q=16;a=256;end% 段落序号i=7if temp==6q=32;a=512;end% 段落序号i=8if temp==7q=64;a=1024;endA= MM(5)*2^3+MM(6)*2^2+MM(7)*2+MM(8);%8位PCM码的第5~8位二进制数转化为10进制%用于判断抽样值量化级数 R=(a+A*q+q/2)/2048;%取量化间隔中点值进行译码ifMM(1)==0%判断极性R=-R;endoutData(1,kk)=R;%译码后数据endend

以上就是pcm基于A律13折线的编码与解码的全部模块了,放到一起就可以运行了,记得把文件名改成自己的,然后放到同一目录中。