1. 程式人生 > >g.729a 音訊編解碼演算法

g.729a 音訊編解碼演算法

        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)聲道數:
有單聲道和雙聲道之分。雙聲道又稱為立體聲,在硬體中要佔兩條線路,音質、音色好,但立體聲數字化後所佔空間比單聲道多一倍。

        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