语音编解码介绍和dsp实现
0赞
发表于 10/26/2011 8:34:51 PM
阅读(19025)
VoIP中G.729与G.711的部分资料
由于用上了VoIP网关设备,在设置界面里关于语音压缩的设置里有5种标准可选,分别是G.711-uLaw、G.711-aLaw、G.723-53k、G.723-63k、G729,G.711和G.729是企业VoIP部署中非常流行的两种编解码器。与通过G.729编码的语音流相比,G.711音质表现出色。G.711通常用于不存在带宽问题的LAN环境,带宽需求约为80kbps,其中包括开销带宽。G.729通常用于带宽有限的WAN环境,带宽需求约为30kbps。
G.711是语音模拟信号的一种非线性量化,细分有二种:G.711 A-law 和 G.711 u-law。不同的国家和地方都会选取一种作为自己的标准。G.711 bitrate 是64kbps。详细的资料可以在ITU 上下到相关的spec,下面主要列出一些性能参数:
- G.711(PCM方式:PCM=脉码调制 :Pulse Code Modulation)
- 采样率:8kHz
- 信息量:64kbps/channel
- 理论延迟:0.125msec
- 品质:MOS值4.10
G.723.1是一个双速率的语音编码器,是ITU-T建议的应用于低速率多媒体服务中语音或其它音频信号的压缩算法;其目标应用系统包括H.323、H.324等多媒体通信系统,目前该算法已成为IP电话系统中的必选算法之一;编码器的帧长为30ms,还有7.5ms的前瞻,编码器的算法时延为37.5ms;编码器首先对语音信号进行传统电话带宽的滤波(基于G.712),再对语音信号用传统8000-Hz速率进行抽样(基于G.711),并变换成16 bit线性PCM码作为该编码器的输入。
在解码器中对输出进行逆操作来重构语音信号;高速率编码器使用多脉冲最大似然量化(MP-MLQ),低速率编码器使用代数码激励线性预测(ACELP)方法,编码器和解码器都必须支持此两种速率,并能够在帧间对两种速率进行转换。此系统同样能够对音乐和其他音频信号进行压缩和解压缩,但它对语音信号来说是最优的;采用了执行不连续传输的静音压缩,这就意味着在静音期间的比特流中加入了人为的噪声。除了预留带宽之外,这种技术使发信机的调制解调器保持连续工作,并且避免了载波信号的时通时断。
G.729采用的算法是共轭结构的代数码激励线性预测(CSACELP),是基于CELP编码模型的算法;能够实现很高的语音质量(长话音质)和很低的算法延世;算法帧长为10ms,编码器含5ms前瞻,算法时延15ms;其重建语音质量在大多数工作环境下等同于32kb/s的ADPCM(G.726),MOS分大于4.0;编码时输入16bitPCM语音信号,输出2进制比特流;译码时输入为2进制比特流,输出16bitPCM语音信号;在语音信号8KHz取样的基础上,16bit线性PCM后进行编码,压缩后数据速率为8Kbps;具有相当于16:1的压缩率。
G.729系列在当前的VOIP得到广泛的应用,且相关分支较多,可以直接从ITU网上得到source code和相关文档。
- G.729(CS-ACELP方式:Conjugate Structure Algebraic Code Excited Linear Prediction)
- 采样率:8kHz
- 信息量:8kbps/channel
- 帧长:10msec
- 理论延迟:15msec
- 品质:MOS值3.9
下面是语音编解码g.711的源码
void alaw_compress(
- Word16 *linbuf,
- Word16 *logbuf,
- Word16 lseg
- )
- {
- Word16 ix, iexp ;
- Word16 n ;
- for ( n = 0 ; n lseg ; n ++ )
- {
- ix = linbuf[n] 0 ? (~linbuf[n]) >> 4 : (linbuf[n]) >> 4;
- /* 0 = ix 2048 */
- /* 1's complement for negative values */
- if (ix > 15)
- {
- iexp = 1; /* first step: */
- while (ix > 16 + 15) /* find mantissa and exponent */
- {
- ix >>= 1;
- iexp++;
- }
- ix -= 16; /* second step: remove leading '1' */
- ix += iexp < 4; /* now compute encoded value */
- }
- if (linbuf[n] >= 0)
- ix |= (0x0080); /* add sign bit */
- logbuf[n] = ix ; /* toggle even bits */
- }
- return ;
- }
- /*
- FUNCTION NAME: alaw_expand
- DESCRIPTION: ALaw decoding rule according CCITT Rec. G.711.
- PROTOTYPE: void alaw_expand(long lseg, short *logbuf, short *linbuf)
- PARAMETERS:
- lseg: (In) number of samples
- logbuf: (In) buffer with compressed samples (8 bit right justified,
- without sign extension)
- linbuf: (Out) buffer with linear samples (13 bits left justified)
- RETURN VALUE: none.
- */
- void alaw_expand(
- Word16 *linbuf,
- Word16 *logbuf,
- Word16 lseg
- )
- {
- Word16 ix, mant, iexp;
- Word16 n;
- for (n = 0; n lseg; n++)
- {
- ix = logbuf[n] ; /* re-toggle toggled bits */
- ix &= (0x007F); /* remove sign bit */
- iexp = ix >> 4; /* extract exponent */
- mant = ix & (0x000F); /* now get mantissa */
- if (iexp > 0)
- mant = mant + 16; /* add leading '1', if exponent > 0 */
- mant = (mant < 4) + (0x0008); /* now mantissa left justified and */
- /* 1/2 quantization step added */
- if (iexp > 1) /* now left shift according exponent */
- mant = mant < (iexp - 1);
- linbuf[n] = logbuf[n] > 127 ? mant : -mant;/* invert, if negative sample */
- }
- return ;
- }
