什么是g711
g711是一种由国际电信联盟制定的一套语音压缩标准,主要用于电话语音通信,而人声最大频率一般在3.4kHz,所以只要以8k的采样频率对人声进行采样,就可以保证完全还原原始声音。
g711的起压缩率为1:2,即把16位 数据压缩成8位,所以g711相比pcm数据,数据量会小一半
g711的内容是将一个13bit或14bit的样本编码成一个8bit的样本。
g711的分类
g711标准主要分两种压缩方法:a-law和mu-law
G711的内容是将14bit(uLaw)或者13bit(aLaw)采样的PCM数据编码成8bit的数据流,播放的时候在将此8bit的数据还原成14bit或者13bit进行播放,不同于MPEG这种对于整体或者一段数据进行考虑再进行编解码的做法,G711是波形编解码算法,就是一个sample对应一个编码,所以压缩比固定为:
8/14 = 57% (uLaw)
8/13 = 62% (aLaw)
G.711就是语音模拟信号的一种非线性量化, bitrate 是64kbps. 详细的资料可以在ITU 上下到相关的spec,下面主要列出一些性能参数:
G.711(PCM方式)
• 采样率:8kHz(其他采样率的g711都是非标准的,实际开发需要确认是否支持除8k外的采样率)
• 信息量:64kbps/channel
• 理论延迟:0.125msec
• 品质:MOS值4.10
算法原理
A-law的公式如下,一般采用A=87.6
画出图来则是如下图,用x表示输入的采样值,F(x)表示通过A-law变换后的采样值,y是对F(x)进行量化后的采样值。
由此可见在输入的x为高值的时候,F(x)的变化是缓慢的,有较大范围的x对应的F(x)最终被量化为同一个y,精度较低。相反在低声强区域,也就是x为低值的时候,F(x)的变化很剧烈,有较少的不同x对应的F(x)被量化为同一个y。意思就是说在声音比较小的区域,精度较高,便于区分,而声音比较大的区域,精度不是那么高。
对应解码公式(即上面函数的反函数):
G711A(A-LAW)压缩十三折线法
g711a输入的是13位(S16的高13位),这种格式是经过特别设计的,便于数字设备进行快速运算。
1、取符号位并取反得到s
2、获取强度位eee,获取方法如图所示
3、获取高位样本位wxyz
4、组合为seeewxyz,将seeewxyz逢偶数为取补数,编码完毕
A-law如下表计算,第一列是采样点,共13bit,最高位为符号位。对于前两行,折线斜率均为1/2,跟负半段的相应区域位于同一段折线上,对于3到8行,斜率分别是1/4到1/128,共6段折线,加上负半段对应的6段折线,总共13段折线,这就是所谓的A-law十三段折线法。
示例:
输入pcm数据为1234,二进制对应为(0000 0100 1101 0010)
二进制变换下排列组合方式(0 00001 0011 010010)
1、获取符号位最高位为0,取反,s=1
2、获取强度位00001,查表,编码制应该是eee=011
3、获取高位样本wxyz=0011
4、组合为10110011,逢偶数位取反为11100110,得到E62+23
u-law也叫g711u,使用在北美和日本,输入的是14位,编码算法就是查表,计算出:基础值+平均偏移值 没啥复杂算法,就是基础值+平均偏移值,
μ-law的公式如下,μ取值一般为255
相应的μ-law的计算方法如下表
示例:
输入pcm数据为1234
1、取得范围值,查表得 +2014 to +991 in 16 intervals of 64
2、得到基础值为0xA0
3、得到间隔数为64
4、得到区间基本值2014
5、当前值1234和区间基本值差异2014-1234=780
6、偏移值=780/间隔数=780/64,取整得到12
7、输出为0xA0+12=0xAC
和A-law画在同一个坐标轴中就能发现A-law在低强度信号下,精度要稍微高一些。
以上是两种算法的连续条件下的计算公式,实际应用中,我们确实可以用浮点数计算的方式把F(x)结果计算出来,然后进行量化,但是这样一来计算量会比较大,实际上对于A-law(A=87.6时),是采用13折线近似的方式来计算的,而μ-law(μ=255时)则是15段折线近似的方式。