Matlab PCM编码解码

        好久没发博文了,这两天正好在做通原的实验,正好学学怎么用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

 

 

 

 

转载于:https://www.cnblogs.com/ksheep/archive/2013/05/10/3071385.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值