PCM基本工作原理

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

PCM基本工作原理

脉冲调制就是把一个时间连续,取值连续的模拟信号变换成时间离散,取值离散的数字信号后在信道中传输.脉冲编码调制就是对模拟信号先抽样,再对样值幅度量化,编码的过程.

所谓抽样,就是对模拟信号进行周期性扫描,把时间上连续的信号变成时间上离散的信号.该模拟信号经过抽样后还应当包含原信号中所有信息,也就是说能无失真的恢复原模拟信号.它的抽样速率的下限是由抽样定理确定的.在该实验中,抽样速率采用8Kbit/s.

所谓量化,就是把经过抽样得到的瞬时值将其幅度离散,即用一组规定的电平,把瞬时抽样值用最接近的电平值来表示.

一个模拟信号经过抽样量化后,得到已量化的脉冲幅度调制信号,它仅为有限个数值.

所谓编码,就是用一组二进制码组来表示每一个有固定电平的量化值.然而,实际上量化是在编码过程中同时完成的,故编码过程也称为模/数变换,可记作A/D.

PCM的原理如图5-1所示.话音信号先经防混叠低通滤波器,进行脉冲抽样,变成8KHz重复频率的抽样信号(即离散的脉冲调幅PAM信号),然后将幅度连续的PAM信号用"四舍五入"办法量化为有限个幅度取值的信号,再经编码后转换成二进制码.对于电话,CCITT规定抽样率为8KHz,每抽样值编8位码,即共有28=256个量化值,因而每话路PCM编码后的标准数码率是64kb/s.为解决均匀量化时小信号量化误差大,音质差的问题,在实际中采用不均匀选取量化间隔的非线性量

化方法,即量化特性在小信号时分层密,量化间隔小,而在大信号时分层疏,量化间隔大.

在实际中广泛使用的是两种对数形式的压缩特性:A律和律.A律PCM 用于欧洲和我国,律用于北美和日本.

#include"stdio.h"

#include"iomanip.h"

#include"math.h"

#include"time.h"

#include"fstream.h"

#include"iostream.h"

int code1[9];

int code2[8];

int s[8];

void main()

{

void dlm(int n);

void dnm(int x,int m,int n);

int ipre(int x,int y[8]);

void jiema1();

void jiema2();

long int c,temp;

int x;

time_t Nowtime;

Nowtime=time(0);

for(int j=0;j<5;j++)

{

for(int i=0;i<8;i++)

{

temp=cos(Nowtime+i/10.0)*128*16;

if(temp>0)

code1[0]=1;

else {code1[0]=0;temp=fabs(temp);}

if(temp>=0 && temp<16) {dlm(0);dnm(temp,0,1);}

if(temp>=16 && temp<32)

{dlm(1);dnm(temp,16,1);}

if(temp>=32 && temp<64)

{dlm(2);dnm(temp,32,2);}

if(temp>=64 && temp<128)

{dlm(3);dnm(temp,64,4);}

if(temp>=128 && temp<256)

{dlm(4);dnm(temp,128,8);}

if(temp>=256 && temp<512)

{dlm(5);dnm(temp,256,16);}

if(temp>=512 && temp<1024)

{dlm(6);dnm(temp,512,32);}

if(temp>=1024 && temp<2048)

{dlm(7);dnm(temp,1024,64);}

for(int j=0;j<8;j++)

{

printf("%d",code1[j]);

}

printf("\n");

ofstream

fout("bianma.txt",ios::app); //写出编码到bianma.txt

for(j=0;j<8;j++)

{

fout<

}

fout<

ofstream

fout1("out.txt",ios::app); //写出完整编码结果到out.txt

fout1<<"系统时

间:"<

值:"<

编码:";

for(j=0;j<8;j++)

{

fout1<

}

fout1<

}

Nowtime++;

}

printf("\n~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~*~ *~*~\n\n");

printf("从键盘输入编码请按: 1\n从文件读取编码请按:

2\n");

scanf("%d",&x);

if(x==1)

jiema2();

else

jiema1();

printf("\n----此程序1秒钟取10份,若想取8000份可自行更改----\n\n");

}

void dlm(int n) //段落码

{

switch(n)

{

case 0:code1[1]=0;code1[2]=0;code1[3]=0;break;

case 1:code1[1]=0;code1[2]=0;code1[3]=1;break;

case 2:code1[1]=0;code1[2]=1;code1[3]=0;break;

case 3:code1[1]=0;code1[2]=1;code1[3]=1;break;

case 4:code1[1]=1;code1[2]=0;code1[3]=0;break;

case 5:code1[1]=1;code1[2]=0;code1[3]=1;break;

case 6:code1[1]=1;code1[2]=1;code1[3]=0;break;

case 7:code1[1]=1;code1[2]=1;code1[3]=1;break; default:break;

}

}

void dnm(int x,int m,int n) //段内码

{

相关文档
最新文档