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[N]={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;
}