PCM编码译码仿真

一、实验目的

1.熟悉PCM(脉冲编码调制)原理。

2.掌握编写PCM(脉冲编码调制)程序的要点。

3.掌握使用Matlab调制仿真的要点。

二、实验内容

1.根据PCM(脉冲编码调制)原理,设计源程序代码。

2.通过Matlab软件仿真给定模拟信号编码后的波形。

3. 对比给的原始信号波形和译码后的波形。

三、实验原理

1.脉冲编码调制

脉冲编码调制在通信系统中是一种对模拟信号数字化的取样技术,将模拟信号变换为数字信号的编码方式。 PCM的实现主要包括三个步骤完成:抽样、量化、编码。分别完成时间上离散、幅度上离散、及量化信号的二进制表示。根据CCITT的建议,为改善小信号量化性能,采用压扩非均匀量化,有两种建议方式,分别为A律和律方式,本设计采用了A律方式。由于A律压缩实现复杂,常使用13折线法编码,采用非均匀量化PCM编码示意图如图1所示

图1 PCM编码示意图

2.抽样:在一系列离散点上,对信号抽取样值称为抽样。其模拟信号的抽样过程如图2所示。

图2 模拟信号的抽样过程图

3.非均匀量化

图3 非均匀13折线压缩特性曲线

图4 非均匀13折线编码原理图

在实际应用中,量化器设计好后,量化电平数M和量化间隔都是确定的。量化噪声Nq 也是确定的。但是,信号的强度会影响信号量噪比,当信号小时,信号量噪比也就越小。因此,均匀量化器对小输入信号很不利,为了克服这个缺点,以改善小信号时的信号量噪比,采用下述的非均匀量化方式。

   在非均匀量化中,量化间隔是随信号抽样值的不同而变化的。信号抽样值小时,量化间隔也小;信号抽样值大时,量化间隔也大,非均匀量化的实现方法有两种:一种是北美和日本采用的μ律压扩,一种是欧洲和我国采用的A律压扩,常采用的近似算法是13折线法,该算法的压缩特性图如图3所示。

信号小时,Δ小,信号大时,Δ大。一般语音信号,信号幅度小出现的概率大,信号幅度大出现的概率小。通过非均匀量化,使得平均信噪比增大。

13折线A律PCM的非线性编码方法具体过程如表1所示。

在13折线法中采用的折叠码有8位。其中一位c1 表示量化值的极性正负,后7位分为段落码和段内码两部分。用于表示量化值的绝对值。其中第2~4位(c2~c4)是段落码,5~8位(c5~c8)为段内码,可以表示每一段落内的16种量化电平。段内码代表的16个量化电平是均匀分布的,因此,这7位码总共能表示27=128种量化值。编码方法如下所示:

极性码   段落码    段内码

            C1       C2C3C4      C5C6C7C8

(1)将量化区间[a,b]分为4096个小段

(2)正半轴2048个小段,负半轴2048个小段

(3)每个小段用Δ表示

表1 非均匀13折线编码原理

四、程序设计

    1. 首先给定一个模拟信号。

    2. 根据PCM(脉冲编码调制)原理,对模拟信号进行抽样,得到离散信号, 然后进行非均匀量化编码 ,采用13折线法。

    3. 在Matlab当中进行操作时,首先要画出经过PCM调制的模拟信号波形。    

4. 将经过PCM调制的信号叠加上一个高斯白噪声信道,然后,根据非均匀量化译码原理,得到译码后的波形,即原始的模拟信号。

五、设计流程

1. 输入一个模拟信号,根据奈奎斯特定理,进行抽样,得到时间上离散的模拟信号。

2. 根据非均匀量化编码(13折线法),设定模拟信号各个段的段落码和段内码。并画出量化编码后的波形。

3. 根据非均匀量化编码(13折线法)的逆向思想,即不同的段落码和段内码分别对应不同的电平值,最终得到译码后的模拟信号,然后画出译码后的模拟信号的波形。

六、源程序代码

%建立原信号

T=0.002;     %取时间间隔为0.002

t=-0.1:T:0.1;   %时域间隔dt为间隔从-0.1到0.1画图

xt=cos(2*pi*30*t)+sin(2*pi*65*t);  %xt方程

%采样:时间连续信号变为时间离散模拟

%信号

fs=500;   %抽样fs>=2fc,每秒钟内的抽样点数

                 %目前等于或大于2fc个

sdt=1/fs;                 %频域采样间隔0.002

t1=-0.1:sdt:0.1;      %以sdt为间隔从-0.1到0.1画图

st=cos(2*pi*30*t)+sin(2*pi*65*t); %离散的抽样函数

figure(1);

subplot(3,1,1);

plot(t,xt);title('原始信号');   %画出原始的信号图,进行对比

grid on      %画背景

subplot(3,1,2);

stem(t1,st,'.');title('量化信号');    %这里画出来的是抽样后的离散图

title('抽样信号');

grid on %画背景

%量化过程

n=length(st);     %取st的长度为n

M=max(st);

C=(st/M)*2048;   %c1(极性码)c2c3c4(段落码)c5c6c7c8(段内电平码)

code=zeros(1,8);    %产生i*8的零矩阵

for i=1:n        %if循环语句

    if C(i)>=0     %极性码c1

      code(i,1)=1;   %代表正值

    else

      code(i,1)=0;   %代表负值

end

%这里就是量化的过程,划分成几个不等的段,然后用码元来代替,也就是俗称编码

if abs(C(i))>=0&&abs(C(i))<16

    code(i,2)=0;code(i,3)=0;code(i,4)=0;step=1;start=0;

elseif 16<=abs(C(i))&&abs(C(i))<32

    code(i,2)=0;code(i,3)=0;code(i,4)=1;step=1;start=16;

elseif 32<=abs(C(i))&&abs(C(i))<64

    code(i,2)=0;code(i,3)=1;code(i,4)=0;step=2;start=32;

elseif 64<=abs(C(i))&&abs(C(i))<128

    code(i,2)=0;code(i,3)=1;code(i,4)=1;step=4;start=64;

elseif 128<=abs(C(i))&&abs(C(i))<256

     code(i,2)=1;code(i,3)=0;code(i,4)=0;step=8;start=128;

elseif 256<=abs(C(i))&&abs(C(i))<512

     code(i,2)=1;code(i,3)=0;code(i,4)=1;step=16;start=256;

elseif 512<=abs(C(i))&&abs(C(i))<1024

     code(i,2)=1;code(i,3)=1;code(i,4)=0;step=32;start=512;

elseif 1024<=abs(C(i))&&abs(C(i))<2048

     code(i,2)=1;code(i,3)=1;code(i,4)=1;step=64;start=1024;

end

B=floor((abs(C(i))-start)/step);   %段内码编码floor取整(四舍五入)

t=dec2bin(B,4)-48     %dec2bsin定义将B变为4位2进制码,-48改变格式

code(i,5:8)=t(1:4);      %输出段内码

end

code=reshape(code',1,8*n);    %reshape代表重新塑形

subplot(3,1,3);stem(code,'.');axis([1 64 0 1]);   %这里我们先取前面八个点编码输出,输出时候有64个点

title('编码信号');

grid on

y=awgn(code,5);

figure(2);

stem(y,'.');axis([1 64 0 3]);

title('叠加加性高斯信号的信号');

% function[out] = pcm_decode(code, v)

% decode the codeput pcm code

% code:codeput the pcm code 8 bits sample

% V:quantized level

n=length(code);

code=reshape(code',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;

for i=1:n/8

    ss=2*code(i,1)-1;

    tmp=code(i,2)*4+code(i,3)*2+code(i,4)+1;

    st=slot(tmp);

    dt=(code(i,5)*8+code(i,6)*4+code(i,7)*2+code(i,8))*step(tmp)+0.5*step(tmp);

    v=1;

    r(i)=ss*(st+dt)/4096*v;

end

T=0.002;

t=-0.1:T:0.1;

figure(3);

subplot(1,1,1);

plot(t,r);title('译码后的原始信号');

grid on

七、MATLAB绘制波形

  • 21
    点赞
  • 189
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值