zyh_126

语音编解码介绍和dsp实现

0
阅读(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(   

  1.     Word16 *linbuf,   
  2.     Word16 *logbuf,   
  3.     Word16 lseg   
  4. )   
  5. {   
  6.     Word16 ix, iexp ;   
  7.     Word16 n ;   
  8.    
  9.     for ( n = 0 ; n  lseg ; n ++ )   
  10.     {   
  11.         ix = linbuf[n]  0 ? (~linbuf[n]) >> 4 : (linbuf[n]) >> 4;   
  12.         /* 0 = ix  2048 */   
  13.         /* 1's complement for negative values */   
  14.    
  15.         if (ix > 15)   
  16.         {   
  17.             iexp = 1;               /* first step: */   
  18.             while (ix > 16 + 15) /* find mantissa and exponent */   
  19.             {   
  20.                 ix >>= 1;   
  21.                 iexp++;   
  22.             }   
  23.             ix -= 16;               /* second step: remove leading '1' */   
  24.             ix += iexp < 4;      /* now compute encoded value */   
  25.         }   
  26.    
  27.         if (linbuf[n] >= 0)   
  28.             ix |= (0x0080);         /* add sign bit */   
  29.         logbuf[n] = ix ;            /* toggle even bits */   
  30.     }   
  31.    
  32.     return ;   
  33. }   
  34.    
  35.    
  36. /* 
  37.    FUNCTION NAME: alaw_expand  
  38.    DESCRIPTION: ALaw decoding rule according CCITT Rec. G.711.  
  39.    PROTOTYPE: void alaw_expand(long lseg, short *logbuf, short *linbuf)  
  40.    PARAMETERS:  
  41.      lseg:  (In)  number of samples  
  42.      logbuf:    (In)  buffer with compressed samples (8 bit right justified,  
  43.                       without sign extension)  
  44.      linbuf:    (Out) buffer with linear samples (13 bits left justified)  
  45.   
  46.    RETURN VALUE: none.  
  47. */   
  48. void alaw_expand(   
  49.     Word16 *linbuf,   
  50.     Word16 *logbuf,   
  51.     Word16 lseg   
  52. )   
  53. {   
  54.     Word16 ix, mant, iexp;   
  55.     Word16 n;   
  56.    
  57.     for (n = 0; n  lseg; n++)   
  58.     {   
  59.         ix = logbuf[n] ;                /* re-toggle toggled bits */   
  60.         ix &= (0x007F);                 /* remove sign bit */   
  61.         iexp = ix >> 4;                   /* extract exponent */   
  62.         mant = ix & (0x000F);           /* now get mantissa */   
  63.         if (iexp > 0)   
  64.             mant = mant + 16;           /* add leading '1', if exponent > 0 */   
  65.    
  66.         mant = (mant < 4) + (0x0008);    /* now mantissa left justified and */   
  67.         /* 1/2 quantization step added */   
  68.         if (iexp > 1)        /* now left shift according exponent */   
  69.             mant = mant < (iexp - 1);   
  70.    
  71.         linbuf[n] = logbuf[n] > 127 ? mant : -mant;/* invert, if negative sample */   
  72.     }   
  73.    
  74.     return ;   
  75. }