MATLAB仿真——PCM编码——通信原理实验

 PCM编码仿真比较简单,我这里给出了实验代码和结果图

一、实验原理

 二、实验代码

clear;
clc;
T=0.0005;
t=-0.01:T:0.01;
fs=2000;
sdt=1/fs;
t1=-0.01:sdt:0.01;
xt=cos(2*pi*30*t)+sin(2*pi*120*t);
st=cos(2*pi*30*t1)+sin(2*pi*120*t1);
max = max(abs(st));
% 原始信号
figure;
subplot(2,1,1);plot(t,xt);title('原始信号');grid on;
subplot(2,1,2);stem(t1,st,'.');title('抽样信号');grid on;


pcm_encode = PCMcoding(st);
figure;
stairs(pcm_encode);%绘制信号的阶梯图
axis([0 20 -0.1 1.1]);
title('PCM 编码');
grid on;

function code=PCMcoding(S)
    z=sign(S);                                %判断S的正负
    MaxS=max(abs(S));                         %求S的最大值 
    S=abs(S/MaxS);                            %归一化
    Q=2048*S;                                 %量化
    code=zeros(length(S),8);                  %PCM编码存储矩阵
    %%
    % 段落码判断程序
    for i=1:length(S)
        if (Q(i)>128)&&(Q(i)<=2048)
        code(i,2)=1;            %在第五段与第八段之间,段位码第一位都为"1"
        end
        if (Q(i)>32)&&(Q(i)<=128)||(Q(i)>512)&&(Q(i)<=2048)
        code(i,3)=1;            %在第三四七八段内,段位码第二位为"1"
        end
        if (Q(i)>16)&&(Q(i)<=32)||(Q(i)>64)&&(Q(i)<=128)||(Q(i)>256)&&(Q(i)<=512)||(Q(i)>1024)&&(Q(i)<=2048)
        code(i,4)=1;            %在二四六八段内,段位码第三位为"1"
        end
    end

    %%
    % 段内码判断程序
    N=zeros(length(S));                              
    for i=1:length(S)
        N(i)=bin2dec(num2str(code(i,2:4)))+1;        %找到code位于第几段,bin2dec将二进制整数的文本表示转换为双精度值,
    end

    a=[0,16,32,64,128,256,512,1024];                 %13折线各段起始对应的量化单位数
    b=[1,1,2,4,8,16,32,64];                          %除以16,得到每段的最小量化间隔
    for i=1:length(S)  
        q=ceil((Q(i)-a(N(i)))/b(N(i)));              %求出在段内的位置,ceil将 X 的每个元素四舍五入到大于或等于该元素的最接近整数
        if q==0
            code(i,(5:8))=[0,0,0,0];                 %如果输入为零则输出"0"
        else k=dec2bin(q-1,4);                       %将字符数组或字符串转换为数值数组,编码段内码为二进制,dec2bin将十进制整数转换为其二进制表示字符向量
            code(i,5)=str2num(k(1));
            code(i,6)=str2num(k(2));
            code(i,7)=str2num(k(3));
            code(i,8)=str2num(k(4));
        end
        
        %符号位的判断
        if z(i)>0
            code(i,1)=1;
        elseif z(i)<0
            code(i,1)=0;
        end                                        
    end

    code = reshape(code', 1, []);
end

三、实验结果 

 

 

  • 7
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WHS-_-2022

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值