G.729與G.723語音編碼介紹及優化

語音編碼分成波形編碼、參數編碼和混合編碼.波形編碼就是語音信號形成的波形進行處理和加工,參數編碼是以語音信號產生的數字模型爲基礎,求出其模型參數,然後按照這些參數還原數字模型,合成語音。混合編碼是綜合了波形編碼和參數編碼的長處,在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進行優化,不過也取得了相當可觀的效果,優化後的效率比優化前提高了一倍,如果再做更深層次的算法優化相信會有更高的提升。

 
發佈了5 篇原創文章 · 獲贊 2 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章