DSP

g.729a 音频编解码算法

2019-07-13 16:29发布

        g.729 spirit dsp定义:
                                                                                     音频压缩编码
           1、什么是语音编码技术?其发展与现状是怎样的?
答:
语音信号的数字化传输,一直是通信的发展方向之一。采用低速率语音编码技术进行语音传输比语音信号模拟传输有诸多优点,现代通信的发展趋势决定了语音编码技术的两大突出优势:
  • 大大节省了带宽。从最初的PCM64k编码到现在标准语音压缩协议,如G.723编码速率为5.3K或6.3Kbps;G.729编码速率为8Kbps。还有未形成协议标准但更低的编码速率已有成熟的算法可以实现,如AMBE、CELP、RELP、VSELP、MELP、MP-MLQ、LPC-10等多种语音压缩算法,最低编码速率达到2.4kbps,有些算法已在包括第三代移动通信系统(3G)的多个领域得到应用。
  • 便于实现与IP融合。Internet的成功运用使得与IP的融合已成必然的发展趋势。分组语音即将分组交换的概念与语音传输相结合,使得语音信息更易于接入IP网。而分组语音的关键技术之一就是语音编码技术,低速率的语音编码技术对语音信息的实时性有更好的保证。采用分组语音传输的网络,其传输的语音信息本身就是分组数据包,这样的语音信息在接入Internet时将是非常的方便。

    语音编码既可用软件也可用硬件的方法实现。软件实现就是将压缩算法用软件方法实现,这样做的好处是成本低、修改方便灵活,但处理速度较慢,不易保证处理的实时性。采用硬件实现就是将语音压缩算法固化到专用DSP芯片中,这样处理速度快,便于实时处理。
    2、1.1.2 什么是G.711编码?
    答:
    G.711建议一种典型的采用PCM波形编码的压缩编解码方法,可以获得较高的语音质量,但数据压缩率低。

            G.711建议描述了PCM的μ律(A律)压缩,如下图所示: 
          
            采样率为8kHz,12bit线性A/D变换为数字信号,再经过对数PCM后压缩为8bit,一路音频为64kbit/s。
                                                                  音频压缩技术

    1、音频信号的指标有哪些?
    答:
    1)频带宽度:音频信号的频带越宽,所包含的音频信号分量越丰富,音质越好。 
             
            2)动态范围:动态范围越大,信号强度的相对变化范围越大,音响效果越好。   
            
            3)信噪比:信噪比SNR(Signal to Noise Ratio)是有用信号与噪声之比的简称。 噪音可分为环境噪音和设备噪音。信噪比越大,声音质量越好。 
                    
            4)主观度量法:人的感觉机理对声音的度量最有决定意义。感觉上的、主观上的测试是评价声音质量不可缺少的部分。当然,可靠的主观度量值是较难获得的。


    2、 什么是音频数字音频原理?
     答:  由于音频信号是一种连续变化的模拟信号,而计算机只能处理和记录二进制的数字信号,因此,由自然音源而得的音频信号必须经过一定的变化和处理,变成二进制数据后才能送到计算机进行再编辑和存贮。
        
            PCM(Pulse Code Modulation)脉冲编码调制是一种模数转换的最基本编码方法。它把模拟信号转换成数字信号的过程称为模/数转换,它主要包括:
  • 采样:在时间轴上对信号数字化;
  • 量化:在幅度轴上对信号数字化;
  • 编码:按一定格式记录采样和量化后的数字数据。 
   
        编码的过程首先用一组脉冲采样时钟信号与输入的模拟音频信号相乘,相乘的结果即输入信号在时间轴上的数字化。然后对采样以后的信号幅值进行量化。最简单的量化方法是均衡量化,这个量化的过程由量化器来完成。对经量化器A/D变换后的信号再进行编码,即把量化的信号电平转换成二进制码组,就得到了离散的二进制输出数据序列x ( n ),n表示量化的时间序列,x ( n )的值就是n时刻量化后的幅值,以二进制的形式表示和记录。

              3、数字音频的技术指标有哪些?
       
 答:
        1)采样频率:
采样频率是指一秒钟内采样的次数。采样频率的选择应该遵循奈奎斯特(Harry Nyquist)采样理论(如果对某一模拟信号进行采样,则采样后可还原的最高信号频率只有采样频率的一半,或者说只要采样频率高于输入信号最高频率的两倍,就能从采样信号系列重构原始信号)。 

        根据该采样理论,CD激光唱盘采样频率为44kHz,可记录的最高音频为22kHz,这样的音质与原始声音相差无几,也就是我们常说的超级高保真音质。通信系统中数字电话的采用频率通常为8kHz,与原4k带宽声音一致的。

        2)量化位数:
量化位是对模拟音频信号的幅度轴进行数字化,它决定了模拟信号数字化以后的动态范围。由于计算机按字节运算,一般的量化位数为8位和16位。量化位越高,信号的动态范围越大,数字化后的音频信号就越可能接近原始信号,但所需要的存贮空间也越大。 

    

        3)声道数:
有单声道和双声道之分。双声道又称为立体声,在硬件中要占两条线路,音质、音 {MOD}好,但立体声数字化后所占空间比单声道多一倍。

        4)编码算法:
编码的作用其一是采用一定的格式来纪录数字数据,其二是采用一定的算法来压缩数字数据以减少存贮空间和提高传输效率。压缩算法包括有损压缩和无损压缩;有损压缩指解压后数据不能完全复原,要丢失一部分信息。压缩编码的基本指标之一就是压缩比,它通常小于1。压缩越多,信息丢失越多、信号还原后失真越大。根据不同的应用,应该选用不同的压缩编码算法。 
        
        5)数据率及数据文件格式:数据率为每秒bit数,它与信息实时传输有直接关系,而其总数据量又与存储空间有直接关系。
我自己对音频编码一些理解 语音编码分成波形编码、参数编码和混合编码.波形编码就是语音信号形成的波形进行处理和加工,参数编码是以语音信号产生的数字模型为基础,求出其模型参数,然后按照这些参数还原数字模型,合成语音。混合编码是综合了波形编码和参数编码的长处,在4-16kbps的速率上进行高质量的语音合成。例如多脉冲激励线性预测编码(MPLPC),码本激励线性预测编码(CELP)都是混合编码。     人耳的听觉范围在20-20KHZ,根本抽样定律要保证声音不失真,就必须用44KHZ左右采样频率,但是人说话的范围在300-3400HZ,所以就用8KHZ主要对人声采样。    波形编码前,首先对模拟语音信号进行采样,然后对采样结果进行幅度量化,再进行二进制编码。
   参数编码则是对数字模型的参数进行求值,目前常用的是无损声管离散时间模型,该模型综合了人声的最重要三个因素:声门,激励和辐射。这三个因素都可以用数学函数表达。再加上在语音信号的非均匀性和相关性,非均匀性表现在小幅度信号出现的概率较大,相关性表现在相邻的两个样本点相关和相隔基音周期之间的两个样本点也相关。线性预测就时利用了相关性从原来的语音信号计算出现在的信号。而且人在正常的交谈中有50%的时间是静音,只在听对方讲话,语音检测VAD就是用来判断是否是静音,而柔和噪声再生CNG就是用来产生一个“好听”的静音传给对方,    G.729与G.723是ITU制定的适用于IP电话语音编码,因为其高质量,低码率而得到广泛应用,下面分别做介绍:    G.729是ITU制定通过的8kbps的语音编码协议,换算成字节才1k,它采用共轭结构的算术码激励线性预测(CS-ACELP)。
   G.723也是ITU制定的,不过它是双速率语音编码,它可以工作在5.3kbps和6.3kbps两个方式上,相应分别采用代数码激励线性预测(ACELP)和多脉冲最大似能量化(MP-MLQ)。     在ITU上注册一个帐号便可以下载现实的C源代码和描述文档,在VC 6下编译并运行,却发现编码效率太低,编码时间基本上是优化后5-6倍。ITU的源代码中采用的是最基本的运算,而且没有做过任何优化,所以效率极度低下。在优化之前先推荐一款调试软件DevPartner Studio Professional,它能进行错误分析和性能分析,功能强大,操作简单。     通过DevPartner对源代码进行分析发现无论是G.729还是G.723大部分运算都集中在basic_op.c的函数中,basic_op.c里面都是些基本运算,L_mac(),L_mult(),L_add()和sature()又占用basic_op.c中的绝大部分运算。所以优化也应该集中在这几个函数中。在basic_op.c有个溢出标志位overflow,很多基本函数多对其判断浪费了很多时间,其实可以直接去掉,使用时直接判断结果时候为最大值即可知道是否溢出,对basic_op.c的函数采用MMX指令优化,使用其饱和特性可以减掉很多判断溢出的操作,
下面给出一个加法的例子
Word16 add(Word16 var1,Word16 var2)
{
 _asm{
  movd mm0,var1;
  movd mm1,var2;
  paddsw mm0,mm1;
  movd eax,mm0;
  emms;
 }
}
   源代码中太多的函数调用,比如L_mac就调用了L_mult和L_add函数,如果直接把L_mult和L_add代码填入L_mac中则可以省去很多函数调用浪费的时间,ITU的代码中为了详细的描述算法有很多类似循环没有合并,将其合并也可以提高效率,并且有些在循环体内的运算也可以提到循环体外,对于用For()控制的循环次数最好使用参数,这样编译器可以将循环解开。
    因为本人能力和精力有限,仅仅是在源代码的层面上对G.729和G.723进行优化,不过也取得了相当可观的效果,优化后的效率比优化前提高了一倍,如果再做更深层次的算法优化相信会有更高的提升。以上是用wffy的分析方法,当然用vtune分析也是这个结果,有时间试下DevPartner Studio Professional。 g729a 程序结构分析  
  Algorithm: G.729 is an 8 kbps Conjugate-Structure Algebraic-Code-Excited Linear Prediction (CS-ACELP) speech compression algorithm approved by ITU-T. G.729 Annex A is a reduced complexity version of the G.729 coder. G.729 AB speech coder was developed for use in multimedia simultaneous voice and data applications. The coder processes signals with 10 ms frames and has a 5 ms look-ahead which results in a total of 15 ms algorithmic delay. The input/output of this algorithm is 16 bit linear PCM samples. Forward error correction (FEC) can be incorporated in the algorithm to achieve noise immunity of the data stream by including control bits into speech frames. Corresponding solution was developed (G.729AB + FEC) for Intel x86 platform (fixed point C-code) and it can be ported to DSP or RISC platforms on request.

Features: Fully bit exact with ITU-T G.729 AB 8 Kbps encoded bit stream rate Discontinuous transmission support (DTX) using Voice Activity Detection (VAD) and Comfort Noise Generation (CNG) Direct interface with PCM 8KHz sampled data. Both sample-by-sample and block based processing supported Very simple application interface Compliant with TI's eXpressDSP standard. Code is reentrant, supports multithreading and dynamic memory allocation Can be easily ported to any DSP or RISC platform