您的位置:首页 > 编程语言 > C语言/C++

A率13折线PCM编码的C语言实现

2016-04-17 12:15 489 查看
PCM的A律13折线编码的码组一般由8位码组成,其码组中的码位安排如表3所示。其码位安排的规律,由高位到低位依次是极性码(1位)、段落码(3位)、段内码(4位),段内码又称为电平码。

1)极性码。1位极性码有“1”、“0”两种状态,正好分别代表信号的正负两种极性。

2)段落码。在13折线编码中,压扩特性一共分为13段直线,正极性方向是7段,这是因为第一、二两段斜率相同,连成了一段。但是,为了便于理解,现在仍然将其看作两段,按照8段来分析。根据M = 2n,表示8段只需3位码即可。段落码与各段的关系如表4所示。

3)段内码。段内码具体确定取样值脉冲属于哪一个量化级。

下面本人在VC++6.0平台下实现该编码的C程序:

#include<iostream>

#include<string>

#include<cmath>

using namespace std;

#define N 7

int parCode
={16,32,64,128,256,512,1024};

int parInsideCode[N+1]={1,1,2,4,8,16,32,64};

int parInsideSart[N+1]={0,16,32,64,128,256,512,1024};

int flag=-1;

void parJudge(string &result,int testNum)

{

int low=0,high=N,mid;

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

{

mid=(low+high) / 2;

if(testNum>=parCode[mid])

{

result=result+'1';

low=mid+1;

flag=mid;

}

else

{

result=result+'0';

high=mid-1;

flag=mid-1;

}

}

}

void parInsideJudge(string &result,int testNum,int parStart,int parSpace)

{

int low=0,high=17,mid=8;

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

{

int cost=parStart+parSpace*mid;

if(cost>testNum)

{

result=result+'0';

high=mid;

mid=(low+high)/2;

}

else

{

result=result+'1';

low=mid;

mid=(low+high)/2;

}

}

}

int main()

{

//freopen("Data.in", "r", stdin);

//freopen("Data.out", "w", stdout);

int testNum;

while(cin>>testNum)

{

string result;

cout<<"The signal sampling value: "<<testNum<<endl;;

if(testNum<0)

result=result+'0';

else

result=result+'1';

testNum=fabs(testNum);//去符号

parJudge(result,testNum);//判断段码

//处理段内码

int parSeq=flag+1;

int parStart=parInsideSart[parSeq];

int parSpace=parInsideCode[parSeq];

parInsideJudge(result,testNum,parStart,parSpace);

cout<<"The a law 13 line code: ";

cout<<result<<endl;

//量化误差

int sum=0;

int j;

for(j=4;j<N+1;j++)

if(result[j]=='1')

sum=sum+pow(2,7-j);

int errorNum=fabs((parStart+sum*parSpace+parSpace/2)-testNum);

cout<<"The quantization error: "<<errorNum<<endl;

cout<<endl;

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: