張正文,張永杰,王 耿
(湖北工業大學電氣與電子工程學院,湖北 武漢430068)
G.729算法復雜度較大,實時性效果不好,但是隨著運算能力很強的DSP快速發展及對各種優化方法的研究,該算法已經成為當前中、低速率語音編碼中的主流算法[1].該算法處理的輸入信號需是經8kHz采樣編碼產生16位線性PCM的語音信號,編碼處理后輸出速率為8kbps的2進制bit流,壓縮比例約為16∶1.在DSP利用該算法處理語音信號時,需由通訊模塊對語音信號進行采集及必要的處理,如信號放大、A/D等.編碼后的bit流經存儲傳輸后可通過相應的解碼程序恢復出高質量的語音信號.目前,G.729編譯碼器已被廣泛用于數據通信的各個領域,如 H.323及IP Phone等[2].
系統總體框架圖見圖1,語音信號通過線路輸入或麥克風輸入,經TLV320AIC23芯片采集預處理轉換,生成符合G.729算法處理的16位的線性PCM.DSP通過片上MCBSP0對TLV320AIC23芯片進行控制,通過MCBSP1與TLV320AIC23芯片進行數據交換.PC機通過JTAG口將程序燒錄進DSP,16位的PCM語音信號通過 MCBSP1進入DSP后經壓縮編碼算法處理生成bit流,bit流經MCBSP1傳至外部通信系統或模塊,用于傳輸或存儲,在解碼端通過相應的G.729算法解碼程序還原語音.若是在單片DSP上驗證算法的正確性及重構語音質量的失真度,可將bit流經解碼程序解碼后將數據回傳給TLV320AIC23芯片,經D/A及放大后回放重建語音.

圖1 系統框架圖
系統搭載在北京達盛公司DSP實驗箱上,該實驗板DSP最小系統帶有JTAG口,配有配套的數據線及仿真器,且有現成電源及語音輸入輸出口,故硬件設計主要是TLV320AIC23與DSP的接口設計.TLV320AIC23芯片是TI公司推出的一款高性能立體聲音頻編解碼器芯片,內置耳機輸出放大器,支持麥克風及線路輸入兩種輸入方式,且對輸入和輸出都具有可編程的增益調節[3].TLV320AIC23的ADC和DAC部件高度集成在芯片內部,可以在8~96kHz的頻率范圍內提供16bit、20bit、24bit和32bit的采樣.故語音信號經TLV320AIC23采集后可產生采樣率為8kHz的16位線性PCM信號,提供符合算法處理的輸入信號.TLV320AIC23的引腳可以分為信號輸入輸出引腳、控制引腳、數據傳輸引腳及電源引腳等,其中信號輸入輸出引腳及電源引腳連接比較簡單,參考芯片資料中的典型電路即可連接完成,控制引腳有4個,分別是SCLK、CS、SDIN、MODE,該4管腳主要是用來協調主機DSP對TLV320AIC23的初始化,數據傳輸引腳有5 個,分 別 是 BCLK、LRCIN、LRCOUT、DIN、DOUT,這些引腳用來與主機DSP進行語音數據的交換.主機DSP的6個多通道緩沖串口引腳也可以分為控制引腳和數據引腳,控制引腳主要是時鐘發送接收引腳BCLKX、BCLKR和幀發送接收引腳BFSX、BFSR,數據引腳是BDX、BDR,根據芯片資料及DSP管腳的功能,TLV320AIC23與主機DSP引腳連接設計見圖2、圖3.


TLV320AIC23芯片的初始化及工作過程都是通過軟件控制實現的,DSP接收、處理及發送數據亦是由軟件控制.軟件設計采用傳統的模塊化、結構化程序設計思想,程序可分為DSP初始化、MCBSP0與TLV320AIC23芯片通信、MCBSP1與TLV320AIC23芯片的數據交換、G.729編碼程序、G.729解碼程序等五大模塊(圖4).
編碼器處理的對象是每一10ms的語音幀,即80個采樣點,每一幀信號又均分為2子幀.對每一幀信號,進行分析提取相關模型及激勵參數,對參數進行編碼即可.為減少運算中的溢出現象,預處理階段,將輸入信號的幅值進行折半處理,并用截止頻率為140Hz的高通濾波過濾低頻噪聲.線性預測分析階段,先將樣點數據加窗再求自相關系數,并進行60Hz帶寬擴展修正自相關系數,然后利用所得系數經Levinson–Durbin算法處理即可得到線性預測系數.為便于量化及插值,須將預測系數轉換成線譜對,然后用線譜對系數進行量化與插值,最后又將線譜對系數還原成線性預測系數.加權使用的是未經量化的線性預測系數[4].自適應碼本分析搜索范圍是通過開環基因分析得到的,以減少碼本搜索復雜度.自適應碼本和固定碼本搜索對每一子幀都進行.之后,利用下一子幀更新合成濾波器和加權濾波器的參數,最后對所得參數按照一定順序編碼,具體的bit分配見表1.

圖4 軟件設計流程總體圖
解碼過程相對簡單.首先將參數提取出來,對每一子幀,將線譜對系數進行插值并轉化為線性預測系數;然后將自適應碼本和固定碼本乘上增益后的激勵信號,將激勵信號通過線性預測合成濾波器重構語音,加上自適應后濾波和高通濾波等后處理完成語音重建.

表1 壓縮編碼bit分配表
為了實現系統的實時性,需對ITU提供的G.729源代碼進行系列優化,優化程度可分算法級、C語言級及匯編器級優化.算法級優化主要可進行以下工作.
其一,取消5ms前瞻:在LP分析階段,原算法中有5ms數據的前瞻,在運算中可將這5ms的數據全部用0來代替,可節省很多計算量.
其二,開環基因搜索采用粗化搜索方式,即在計算相關系數時,將原算法中的搜索步長增加為2,即將

用

代替,其中,k=20,21,…,143,可節約一半時間,再者由于連續語音數據幀中的基音延時值變化較小,當變化小到一定范圍,就可不必搜索,直接用前一幀的值代替.判斷的方法是先確定一個比較的閾值η,然后將相關的計算結果與閥值進行比較,只有當計算值大于閾值時才需搜索,其中閾值由一段普通話語音測出.經大量實驗,筆者將η設為50 331 604,而每幀的計算值Fi利用線譜對(LSP)系數按公式計算得出:

其中wk取值為0.02,0.04,0.04,0.04,0.04,0.09,0.10,0.05,0.07,0.05,采用 Q15格式表示;lspi(k)是第i幀的第k個系數.
其三,在所有的乘法運算中,舍棄運算結果為0的運算項.
其四,固定碼本搜索算法改為脈沖序列重置法:即先將40個可能的脈沖位置依次代入式(1),計算出單個脈沖的貢獻值,然后在同一軌道中按照貢獻值大小重新排序,選擇重置后每個軌道的前四個脈沖位置進行搜索.國外學者Nam Kyu Ha經研究其統計命中率已達95%以上,且該算法搜索次數僅為4×4×4×4×2=512[5].

C語言級及匯編器級優化方式主要有:省略不必要的溢出判斷;將性質相同的函數排列在一起,利于編譯器將其編譯成具有平行運算結構的代碼;調用循環時,使循環體盡可能短,并且盡量避免轉移判斷語句;合并指令數較少的函數,如自相關函數、加窗函數等,可節省對堆棧的操作時間;對于指令數與調用次數都較少的函數,在函數名前加一個關鍵字inline,編譯時比較省時,是一種空間換時間的優化手段.在PC機中,算法實現的軟件平臺是CCS2.0,可以利用一些基于這個平臺的成熟的優化方法,如Intrinsic函數的使用、CCS的C/C++編譯器的選項打開,編譯時采用Release模式,排除Debug信息等,這些優化方法對提高系統性能的影響較大.
將優化后的程序通過仿真器與JTAG口下載到DSP中,將自己錄制的一段語音通過PC機線路輸入給TLV320AIC23輸入接口,通過該系統編解碼后可以還原失真度尚能接受的重建語音,原始語音與重建語音的波形圖見圖5、圖6.若對編解碼程序及系統進行一系列深度優化,效果可達更佳,有待進一步努力.


[1]鄒 翼.基于DSP的G_729語音編碼的研究與實現[D].長沙:湖南大學圖書館,2009.
[2]陳明義,龔玉蓉.基于TMS320VC5509DSP通信系統的 G.729算法實現[J].信息技術,2007(2):95-96.
[3]Stereo Audio CODEC,8to 96kHz,With Integrated Headphone Amplifier TLV320AIC23Data Manu[J].Texal Instruments,2001(6):22-43.
[4]International Telecommunication Union.Recommendation G.729:Coding of speech at 8kbit/s using conjugate structure algebraic code excited linear prediction(CS-ACELP)[EB/OL].(2007 – 01)http://www.itu.int/rec/T-REC-G.729-200701-I/en.
[5]呂治國.G.729標準碼本搜索算法分析及優化[J].電聲技術,2008,32(9):46-48.