gold matlab 编解码_Matlab PCM编码解码

本文介绍了如何使用Matlab进行脉冲编码调制(PCM)的编码和解码过程,包括13折线量化、A率编码和解码,详细展示了相关MATLAB代码实现。
摘要由CSDN通过智能技术生成

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

2、量化,13折线量化:

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

解码后与编码比较:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值