音频编码G711校验

G711编码

     G711它是国际电信联盟ITU-T定制出来的一套语音压缩标准,它代表了对数PCM(logarithmic pulse-code modulation)抽样标准,主要用于电话。它主要用脉冲编码调制对音频采样,采样率为8k每秒。它利用一个 64Kbps 未压缩通道传输语音讯号。 起 压缩率为1:2, 即把16位 数据压缩成8位。G.711是主流的 波形声音编解码器。
    G.711 标准下主要有两种压缩算法。一种是&micro -law algorithm (又称often u-law, ulaw, mu-law),主要运用于北美和日本;另一种是A-law algorithm,主要运用于欧洲和世界其他地区。其中,后者是特别设计用来方便计算机处理的。

校验

     使用的是CRC32,全称是循环冗余校验

以CRC16为例:     

    思路:取一个字符(8bit),逐位检查该字符,如果为1,crc^crc_mul;同时,如果原本crc最高位是1,那么crc^crc_mul后左移1位,否则只是左移一位。计算完一个字符后,装入下一个字符。

#include<stdio.h>

 

#define crc_mul 0x1021 //生成多项式

 

unsigned int cal_crc(unsigned char *ptr, unsigned char len)
{
unsigned char i;
unsigned int crc=0;
while(len-- != 0)
{
for(i=0x80; i!=0; i>>=1)
{
if((crc&0x8000)!=0)
{
crc<<=1;
crc^=(crc_mul);
}else{
crc<<=1;
}
if((*ptr&i)!=0)
{
crc ^= (crc_mul);
}
}
ptr ++;
}
return (crc);
}

 

int main()
{
unsigned char i[8] = {0x00,0x00,0x00,0x00,0x06,0x0d,0xd2,0xe3};
unsigned int crc;
crc=cal_crc(i,8);
return 0;

/*结果:7123dbc0*/

CRC校验码的手动计算示例

生成多项式:G(X)=X4+X3+1,要求出二进制序列10110011的CRC校验码。

(1)G(X)=X4+X3+1,二进制比特串为11001;(有X的几次方,对应的2的几次方的位就是1)

(2)因为校验码4位,所以10110011后面再加4个0,得到101100110000,用“模2除法”(其实就是亦或^)即可得出结果;

 

                                            图 CRC校验码计算示例

 (3)CRC^101100110000得到101100110100。发送到接收端;

 (4)接收端收到101100110100后除以11001(以“模2除法”方式去除),余数为0则无差错;

CRC校验原理

在k位信息码后再拼接r位的校验码,报文编码长度为n位,因此,这种编码又叫(n,k)码。

定理:对于一个给定的(n,k)码,可以证明,存在一个最高次幂为n=k+r的多项式G(x),存在且仅存在一个R次多项式G(x),使得

其中:

m(x) :k次信息多项式,

r(x) :r-1次校验多项式,

g(x):生成多项式:

发送方通过指定的G(x)产生r位的CRC校验码,接收方则通过该G(x)来验证收到的报文码的CRC校验码是否为0。

    假设发送信息用信息多项式C(X)表示,将C(x)左移r位,则可表示成C(x)*2r,这样C(x)的右边就会空出r位校验码的位置,做除法(模2除),得到的余数R就是校验码。发送的CRC编码是,验证接收到的报文编码是否至正确,依然是做模2除:

CRC的生成多项式

    生成多项式的选取应满足以下条件:

    a、生成多项式的最高位和最低位必须为1。

    b、当被传送信息(CRC码)任何一位发生错误时,被生成多项式做模2除后,应该使余数不为0。

    c、不同位发生错误时,应该使余数不同。

    d、对余数继续做模2除,应使余数循环。

猜你喜欢

转载自blog.csdn.net/sws_looper/article/details/79642565