• Matlab PCM编码解码 k


            好久没发博文了,这两天正好在做通原的实验,正好学学怎么用Live Writer。

            通常我们会把模拟信号抽样、量化,直到最后变换成二进制符号的集成过程称为脉冲编码调制(Pulse Code Modulation),实现的主要包括三个步骤:抽样(sampling)、量化(quantization)和编码(coding)。

             1、Sampling

              Matlab仿真过程中选定模拟信号sin(4*t),按抽样定理,抽样频率只需高于模拟信号最高频率的两倍即可,但是实际情况下会大于两倍的模拟最高频率。

            

             2、Quantization

             量化方法包括:均匀量化和非均匀量化。这里主要讨论非均匀量化,并模拟A率压缩,通过13折现近似实现。

    代码如下:

    %13折线量化
    function y=zhe13(x) 
    x=x/max(x); 
    z=sign(x);
    x=abs(x); 
    for i=1:length(x) 
        if ((x(i)>=0)&x(i)<1/64)      
            y(i)=16*x(i);      
        else if ((x(i)>=1/64)&x(i)<1/32)
                y(i)=8*x(i)+1/8;       
            else if ((x(i)>=1/32)&x(i)<1/16)  
                    y(i)=4*x(i)+2/8;       
                else if ((x(i)>=1/16)&x(i)<1/8)    
                        y(i)=2*x(i)+3/8;       
                    else if ((x(i)>=1/8)&x(i)<1/4) y(i)=x(i)+4/8;          
                        else if ((x(i)>=1/4)&x(i)<1/2)   
                                y(i)=(1/2)*x(i)+5/8;       
                            else y(i)=(1/4)*x(i)+6/8;    
                            end
                        end
                    end;
                end;
            end;
        end;
    end; 
    y=z.*y;

         

           3、Coding

           编码包括A率13折线编码和解码两个过程,具体原理可参考樊昌信所著《通信原理》第六版中‘模拟信号的数字传输’一章。

    代码如下,包括A率13折线编码和A率13折线解码:

    % A率13折线编码 
    function CodeofPCM = C_CodeofPCM(A_Crent,Amax) 
    %% 极性
    Jixing = 1; 
    if A_Crent<0     
        Jixing=0; 
    end
    Jixing = dec2bin(Jixing,1);
    %% 段号  
    DuanHao = 0; 
    A_Crentmaxto1 = floor(abs(A_Crent)/Amax*2048); 
    LinghuaJG = 0; %分段操作 
    if A_Crentmaxto1 < 16    
        DuanHao = 0;   
        DuanluoQS = 0;    
        LinghuaJG = 1; 
    elseif A_Crentmaxto1 < 32   
        DuanHao = 1;    
        DuanluoQS = 16;   
        LinghuaJG = 1;
    elseif A_Crentmaxto1 < 64  
        DuanHao = 2;   
        DuanluoQS = 32;
        LinghuaJG = 2; 
    elseif A_Crentmaxto1 < 128    
        DuanHao = 3;    
        DuanluoQS = 64;  
        LinghuaJG = 4;
    elseif A_Crentmaxto1 < 256  
        DuanHao = 4;   
        DuanluoQS = 128;
        LinghuaJG = 8; 
    elseif A_Crentmaxto1 < 512    
        DuanHao = 5;     
        DuanluoQS = 256; 
        LinghuaJG = 16;
    elseif A_Crentmaxto1 < 1024 
        DuanHao = 6;    
        DuanluoQS = 512;   
        LinghuaJG = 32;
    else
        DuanHao = 7;     
        DuanluoQS = 1024;  
        LinghuaJG = 64; 
    end
    DuanHao = dec2bin(DuanHao,3); 
    %% 段内码 
    if A_Crentmaxto1 == 2048    
        A_Crentmaxto1 = A_Crentmaxto1-1; 
    end
    DuanNeima1 = floor((A_Crentmaxto1-DuanluoQS)/LinghuaJG);
    DuanNeima  = dec2bin(DuanNeima1,4); 
    %% PCM码组 CodeofPCM 
    PCM = strcat(Jixing,DuanHao, DuanNeima); 
    CodeofPCM = str2num(PCM);
    
    % A率13折线解码 
    function A_Crent=D_CodeofPCM(CodeofPCM) 
    CodeofPCM_int = CodeofPCM;
    %% 极性判断  
    Jixing = 1; 
    if floor(CodeofPCM_int/10^7) == 0   
        Jixing = -1; 
    end
    %% 段号 
    DuanHao = floor(mod(abs(CodeofPCM_int),10^7)/10^4); 
    DuanHao = num2str(DuanHao); 
    DuanHao = bin2dec(DuanHao); 
    switch DuanHao  
        case 0    
            DuanluoQS=0;        
            LinghuaJG=1;   
        case 1     
            DuanluoQS=16;   
            LinghuaJG=1;   
        case 2       
            DuanluoQS=32;   
            LinghuaJG=2;    
        case 3        
            DuanluoQS=64;      
            LinghuaJG=4;   
        case 4   
            DuanluoQS=128;    
            LinghuaJG=8;   
        case 5     
            DuanluoQS=256;    
            LinghuaJG=16;  
        case 6       
            DuanluoQS=512;    
            LinghuaJG=32;   
        case 7        
            DuanluoQS=1024;   
            LinghuaJG=64; 
    end
    %%段内码提取
    DuanNeima = mod(abs(CodeofPCM_int),10^4); 
    DuanNeima = num2str(DuanNeima); 
    DuanNeima = bin2dec(DuanNeima); 
    absofA_Crent = DuanluoQS + LinghuaJG*DuanNeima + 0.5*LinghuaJG; 
    A_Crent=absofA_Crent*Jixing/2048;

        PCM具体实现:

        1、选取模拟信号x = sin(4*t),抽样频率为10Hz,得到:

    1

       2、量化,13折线量化:

    2

       3、编码:

       编码得到:

          Columns 1 through 8

           11111110    11111011    11101110     1111001     1111101     1111111     1111111     1111111

         Columns 9 through 16

           1111101     1111010    10000000    11111010    11111101    11111111    11111111    11111111

         Columns 17 through 21

            11111101    11111001     1101110     1111011     1111110

        解码后与编码比较:

    3

  • 相关阅读:
    Windows 7 X64平台编译LLVM+clang
    web前后端分离漏洞分析防御
    微信小程序中显示html富文本的方法
    微信小程序上拉加载下拉刷新
    微信小程序横向滚动
    微信小程序中的自定义组件 以及 相关的坑
    一款易用、高可定制的vue翻页组件 vo-pages
    vue调用高德地图:vue-amap
    Vue 前端md5加密
    js手机号码中间用星号代替。银行卡后四位之外改为星号
  • 原文地址:https://www.cnblogs.com/ksheep/p/3071385.html
Copyright © 2020-2023  润新知