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

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;
}

  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值