張云勇+燕飛
針對VoIP交換機語音網關的需求,實現了基于XDAIS標準的G.729A算法。結合TI DSP處理器C55x的特點對算法進行優化,實現單片TMS320VC5510中12路語音編解碼,在此基礎上完成了支持96路話音的VoIP語音網關的設計,并已成功應用到多種型號的軍用語音交換機中。
DSP XDAIS G.729A VoIP 語音網關
Design of VoIP Voice Gateway Based on G.729A Algorithm of XDAIS
ZHANG Yun-yong1, YAN Fei2
(1. China Electronics Technology Group Corporation No.7 Research Institute, Guangzhou 510310, China;
2. Sichuan Electric Vocational and Technical College, Chengdu 610072, China)
The G.729A algorithm based on XDAIS is realized to satisfy the demands for the voice gateway of VoIP switch. The algorithm is optimized combined with C55X platform of TI DSP processor to realize 12-channel voice encoding and decoding in a single TMS320VC5510. Based on this result, a VoIP voice gateway supporting 96-channel voice is completed, and it has applied to military voice switches with several types.
DSP XDAIS G.729A VoIP voice gateway
1 引言
隨著互聯網通信的發展,VoIP(Voice over Internet Protocol,互聯網協議的語音承載)技術發展到現在已經相當成熟,其實質是一種利用終端對語音數據進行采集及還原,由IP網絡傳輸分組語音數據包的語音通信技術。語音壓縮編碼是VoIP技術的重要組成部分,ITU-T(國際電信聯盟電信標準化部)定義的G.729、G.723是VoIP的主要編碼格式。然而傳統的電話交換網絡以其話音質量好、延時小等特點仍然不可替代,因此VoIP交換機需要與PSTN(Public Switched Telephone Network,公共交換電話網絡)互聯。故通常的VoIP交換機需要大容量的語音網關單元實現語音編解碼功能。相對于G.729,G.729A進一步降低了算法復雜度,實際應用較廣。本文討論基于TI(德州儀器)公司的DSP(Digital Signal Processor,數字信號處理器)C55x平臺上實現XDAIS(eXpressDSP Algorithm Interface Standard,eXpressDSP算法接口標準)架構的G.729A算法及其優化,在此基礎上給出了VoIP大容量交換機語音網關的設計方案。
2 XDAIS架構的G.729A算法實現
為了便于第三方廠商開發通用DSP算法程序,TI制定了XDAIS程序架構。該架構可解決算法模塊間資源共享及程序兼容性問題,使得在同一DSP上實現不同算法或相同算法的多通道應用更容易。為了實現G.729A算法在多通道語音網關上的應用,按照XDAIS程序架構對算法進行封裝是非常有效的方法。
2.1 XDAIS架構
XDAIS標準架構示意圖如圖1所示:
圖1 XDAIS標準架構示意圖[1]
XDAIS標準定義了三層規則:第一層是包含了所有DSP算法編程適用的通用編程規則,如C調用、可重入等;第二層規則使得所有算法可以在單一DSP系統上協調地運行,包括程序的封裝、標識、命名、內存管理等;第三層規則與使用的DSP系列硬件資源相關,包括中斷、內存、寄存器等。第三層以下是各廠商開發的算法,XDAIS對此不作規定[1]。
符合XDAIS標準的算法必須實現一個標準接口,即IALG接口。該接口提供的功能包括對系統存儲資源的管理、算法實例的建立、初始化和終止對象。這些功能體現在一個IALG_Fxns的結構體中,也稱V表,在這個結構體中定義了算法接口需要的標準函數,其中除了algAlloc()、a1gInit()和algFree()是必須的外,其它的函數是可選的。algAlloc()實現內存分配;algInit()用來初始化算法實例對象;algFree()在銷毀算法實例對象后釋放存儲空間。除了IALG,XDAIS還要定義一個算法實例接口,該接口包含了算法的實現,是算法接口的一個實例[2]。算法提供者需要在此實例的基礎上添加特定的算法代碼,完成算法的封裝。
2.2 G.729A算法封裝
IALG只是一個算法接口框架,具體的算法還要由IALG派生而來。針對G.729A算法,首先實例化以下結構:
typedef struct IG729A_Fxns {
IALG_Fxns ialg;/* IG729A extends IALG */
XDAS_Void (*apply)(IG729A_Handle handle,…);
} IG729A_Fxns;
結構體第一項即是對IALG的一個實例,第二項函數apply()是算法的應用程序入口。endprint
為了區分不同廠商的算法模塊,XDAIS規定了算法的命名規則,通常為“
#define IALGFXNS \
&G729A_CETC7_IALG, /* module ID*/ \
NULL, /* activate*/ \
G729A_CETC7_alloc, /* algAlloc*/ \
G729A_CETC7_control, /* control*/ \
NULL, /* deactivate*/ \
G729A_CETC7_free, /* free*/ \
G729A_CETC7_initObj, /* init*/ \
G729A_CETC7_moved, /* moved*/ \
NULL /* numAlloc*/ \
/* module_vendor_interface */
IG729A_Fxns G729A_CETC7_IG729A = {
IALGFXNS,
G729A_CETC7_apply,
};
其中,G729A_CETC7_IG729A即為基于XDAIS的G.729A算法程序框架的一個實例,修改實例中對應的G729A_CETC7_initObj()、G729A_CETC7_alloc()、G729A_CETC7_free()、G729A_CETC7_apply()等函數可以實現程序框架與目標算法代碼的連接。
2.3 G.729A算法實現
G.729是ITU-T制定的基于CS-ACELP算法的語音編碼標準[3],其編碼速率為8kbit/s,是對電話寬帶語音信號編碼的標準,也是目前應用廣泛的VoIP語音數字信號處理標準[4]。
ITU-T提供了基于PC平臺的G.729A算法C語言評估代碼。但由于評估代碼是PC通用的單任務程序,未考慮硬件實現平臺、程序效率、多通道應用等因素,因此不能直接使用,需要對程序進行移植。
通常程序移植首先要考慮基本數據類型的兼容。G.729A算法程序代碼中用到了三種基本數據類型Word32、Word16及Flag,針對DSP C55x平臺需要定義如下:
typedef long int Word32;
typedef short int Word16;
typedef int Flag.
此外,內存資源的使用也是算法移植的關鍵,這是實現算法多通道應用的必要條件。針對單任務的算法代碼,將其中的所有全局變量及靜態內存定義成一個結構G729_BUF,這個結構包含了G.729A算法需要的所有存儲資源,在算法例化時進行內存動態分配。XDAIS架構中的函數G729A_CETC7_alloc()、G729A_CETC7_free()完成G729_BUF結構的內存分配和釋放。
最后,算法移植的最重要內容是實現算法代碼和XDAIS架構的接口。這主要涉及函數G729A_CETC7_initObj()和G729A_CETC7_apply(),前者完成算法的初始化,后者完成XDAIS架構算法的接口。
初始化的實現方法是在函數G729A_CETC7_initObj()中添加以下代碼:
st=(G729_BUF *)G729A->G729_st_mem;
Init_Pre_Process();
Init_Coder_ld8a();
Init_Decod_ld8a();
Init_Post_Filter();
Init_Post_Process();
變量st是一個G729_BUF結構的全局指針,指向算法例化時在函數G729A_CETC7_alloc()中分配的內存空間;其余調用的函數是G.729A算法的初始化代碼。
算法的接口實現方法是在函數G729A_CETC7_apply()中調用G.729A算法的編碼及解碼函數,包括以下內容:
//編碼調用函數
Pre_Process(st->new_speech, L_FRAME);
Coder_ld8a(st->prm);
prm2bits_ld8k_rfc( st->prm, dataOut);
//解碼調用函數
bits2prm_ld8k_rfc( dataIn, &st->parm[1]);
Decod_ld8a(st->parm, st->synth, st->Az_dec, st->T2);
Post_Filter(st->synth, st->Az_dec, st->T2); Post_Process(st->synth, L_FRAME);
通過封裝的算法代碼可以鏈接成庫文件,應用程序調用算法時只需包含庫文件和相應的頭文件,目標代碼直接鏈接庫函數,算法代碼不用被再次編譯,這保證了模塊化設計及算法的一致性。以下是應用程序調用算法的代碼實例:
G729A_Handle handle[n];//定義n通道算法句柄
IG729A_Fxns fxns[n];
fxns[n]=G729A_CETC7_IG729A;//例化算法
handle[n]=G729A_create(&fxns[n], NULL);//創建算法
…
G729A_CETC7_apply(handle[n],…);//調用算法
…
G729A_delete(handle[n]);//釋放算法(如果需要)
3 G.729A算法優化
按以上方法封裝的算法仿真測試需要12.3ms才能完成一幀話音的編解碼,而G.729標準規定的話音幀為10ms/幀[3],顯然算法效率太低,無法滿足實時話音的要求,必須對算法進行優化。
采用匯編代碼對C進行替換是常用的程序優化方法,而G.729A算法包含了30多個文件,全部實現替換工作量很大,因此對算法代碼進行分析,找出算法中最底層的基本運算函數,由內而外,先從子函數開始優化。由于算法中很多基本算子函數被多次循環調用,是制約程序效率的主要因素,這些函數主要包含在文件BASIC_OP.C中,所以優化的主要內容就是對這個文件中的基本算子函數進行全匯編替換。
除了編程優化外,編譯選項的優化也是很重要的。以下編譯選項對程序效率有較大影響,需要在CCS程序工程中添加這些選項[5]:
-o3:最高的優化級別,能顯著提高程序效率;
-pm:程序級優化;
-op2:調用優化,此選項要避免在匯編程序中調用C中的函數和全局變量;
-oi100:編譯器自動內聯小于100行的函數。
通過以上優化措施,程序效率可達到0.83ms/幀,占用DSP動態存儲空間4.6kB/通道。TMS320VC5510工作主頻為200M,可以算出優化后的算法編解碼一幀需要CPU處理能力為16.7(mega cycles)/s。
4 VoIP語音網關設計
VoIP網絡通常采用G.729A話音編碼,為了實現VoIP終端和其它話音網絡(如PSTN、移動電話等)互通,需要在VoIP交換機中實現語音網關來完成G.729A話音到PCM(Pulse Code Modulation,脈沖編碼調制)話音的轉換。VoIP語音網關的實現原理如圖2所示。
網絡處理器為Freescale公司的MPC8280,完成IP網絡及話音控制功能;DSP為TMS320VC5510,實現G.729A算法;FPGA為Altera公司的EP1C3,完成DSP的McBSP接口到2M話音群的接入。
從VoIP網絡來的話音幀由網絡處理器通過MPC8280的Local Bus(本地總線)和DSP的HPI(Host Port Interface,主機接口)送給DSP進行解碼,解碼后的PCM話音通過McBSP給FPGA完成2M話音群的時隙插入,網絡處理器通過MPC8280的MCC從2M群提取話音。反之為編碼的信號流程。
根據以上原理設計的VoIP語音網關單元包含了16片DSP,完成了96通道的G.729A語音編解碼,話音清晰可懂。根據目前應用結果,證明了基于XDAIS標準G.729A算法的高效、可靠及易擴展性,達到了設計的預期效果。
5 結束語
本文基于XDAIS架構的G.729A算法解決了在同一DSP處理器上實現多路G.729A算法的問題,并對算法進行了優化,理論上可實現一片TMS320VC5510上12通道的G.729A編解碼。標準的XDAIS架構使得算法移植性強,很容易將算法應用到其它設備中,縮短產品的開發周期。VoIP語音網關的實現使得這一算法得到了實際應用,目前該語音網關已應用于多種型號的軍用交換機中,并且運行穩定。
參考文獻:
[1] Texas Instruments. TMS320 DSP Algorithm Standard Rules and Guidelines User's Guide[Z]. SPRU352G, 2007.
[2] 司群,臧英新,陶友傳,等. TMS320DSP算法標準(XDAIS)及參考構架RF5綜述[J]. 艦船電子工程, 2006,26(2): 27-31.
[3] ITU-T Recommendation G.729. Coding of Speech at 8kbit/s Using Conjugate-Structure Algebraic-Code-Excited Linear-Prediction(CS-ACELP)[S]. 2013.
[4] 肖玉梅. 淺談VoIP技術中的語音編碼技術及其在DSP上的實現[J]. 經營管理者, 2011(13): 298-300.
[5] Texas Instruments. TMS320C55x Optimizing C/C++ CompilerUser's Guide[Z]. SPRU281F, 2003.endprint
handle[n]=G729A_create(&fxns[n], NULL);//創建算法
…
G729A_CETC7_apply(handle[n],…);//調用算法
…
G729A_delete(handle[n]);//釋放算法(如果需要)
3 G.729A算法優化
按以上方法封裝的算法仿真測試需要12.3ms才能完成一幀話音的編解碼,而G.729標準規定的話音幀為10ms/幀[3],顯然算法效率太低,無法滿足實時話音的要求,必須對算法進行優化。
采用匯編代碼對C進行替換是常用的程序優化方法,而G.729A算法包含了30多個文件,全部實現替換工作量很大,因此對算法代碼進行分析,找出算法中最底層的基本運算函數,由內而外,先從子函數開始優化。由于算法中很多基本算子函數被多次循環調用,是制約程序效率的主要因素,這些函數主要包含在文件BASIC_OP.C中,所以優化的主要內容就是對這個文件中的基本算子函數進行全匯編替換。
除了編程優化外,編譯選項的優化也是很重要的。以下編譯選項對程序效率有較大影響,需要在CCS程序工程中添加這些選項[5]:
-o3:最高的優化級別,能顯著提高程序效率;
-pm:程序級優化;
-op2:調用優化,此選項要避免在匯編程序中調用C中的函數和全局變量;
-oi100:編譯器自動內聯小于100行的函數。
通過以上優化措施,程序效率可達到0.83ms/幀,占用DSP動態存儲空間4.6kB/通道。TMS320VC5510工作主頻為200M,可以算出優化后的算法編解碼一幀需要CPU處理能力為16.7(mega cycles)/s。
4 VoIP語音網關設計
VoIP網絡通常采用G.729A話音編碼,為了實現VoIP終端和其它話音網絡(如PSTN、移動電話等)互通,需要在VoIP交換機中實現語音網關來完成G.729A話音到PCM(Pulse Code Modulation,脈沖編碼調制)話音的轉換。VoIP語音網關的實現原理如圖2所示。
網絡處理器為Freescale公司的MPC8280,完成IP網絡及話音控制功能;DSP為TMS320VC5510,實現G.729A算法;FPGA為Altera公司的EP1C3,完成DSP的McBSP接口到2M話音群的接入。
從VoIP網絡來的話音幀由網絡處理器通過MPC8280的Local Bus(本地總線)和DSP的HPI(Host Port Interface,主機接口)送給DSP進行解碼,解碼后的PCM話音通過McBSP給FPGA完成2M話音群的時隙插入,網絡處理器通過MPC8280的MCC從2M群提取話音。反之為編碼的信號流程。
根據以上原理設計的VoIP語音網關單元包含了16片DSP,完成了96通道的G.729A語音編解碼,話音清晰可懂。根據目前應用結果,證明了基于XDAIS標準G.729A算法的高效、可靠及易擴展性,達到了設計的預期效果。
5 結束語
本文基于XDAIS架構的G.729A算法解決了在同一DSP處理器上實現多路G.729A算法的問題,并對算法進行了優化,理論上可實現一片TMS320VC5510上12通道的G.729A編解碼。標準的XDAIS架構使得算法移植性強,很容易將算法應用到其它設備中,縮短產品的開發周期。VoIP語音網關的實現使得這一算法得到了實際應用,目前該語音網關已應用于多種型號的軍用交換機中,并且運行穩定。
參考文獻:
[1] Texas Instruments. TMS320 DSP Algorithm Standard Rules and Guidelines User's Guide[Z]. SPRU352G, 2007.
[2] 司群,臧英新,陶友傳,等. TMS320DSP算法標準(XDAIS)及參考構架RF5綜述[J]. 艦船電子工程, 2006,26(2): 27-31.
[3] ITU-T Recommendation G.729. Coding of Speech at 8kbit/s Using Conjugate-Structure Algebraic-Code-Excited Linear-Prediction(CS-ACELP)[S]. 2013.
[4] 肖玉梅. 淺談VoIP技術中的語音編碼技術及其在DSP上的實現[J]. 經營管理者, 2011(13): 298-300.
[5] Texas Instruments. TMS320C55x Optimizing C/C++ CompilerUser's Guide[Z]. SPRU281F, 2003.endprint
handle[n]=G729A_create(&fxns[n], NULL);//創建算法
…
G729A_CETC7_apply(handle[n],…);//調用算法
…
G729A_delete(handle[n]);//釋放算法(如果需要)
3 G.729A算法優化
按以上方法封裝的算法仿真測試需要12.3ms才能完成一幀話音的編解碼,而G.729標準規定的話音幀為10ms/幀[3],顯然算法效率太低,無法滿足實時話音的要求,必須對算法進行優化。
采用匯編代碼對C進行替換是常用的程序優化方法,而G.729A算法包含了30多個文件,全部實現替換工作量很大,因此對算法代碼進行分析,找出算法中最底層的基本運算函數,由內而外,先從子函數開始優化。由于算法中很多基本算子函數被多次循環調用,是制約程序效率的主要因素,這些函數主要包含在文件BASIC_OP.C中,所以優化的主要內容就是對這個文件中的基本算子函數進行全匯編替換。
除了編程優化外,編譯選項的優化也是很重要的。以下編譯選項對程序效率有較大影響,需要在CCS程序工程中添加這些選項[5]:
-o3:最高的優化級別,能顯著提高程序效率;
-pm:程序級優化;
-op2:調用優化,此選項要避免在匯編程序中調用C中的函數和全局變量;
-oi100:編譯器自動內聯小于100行的函數。
通過以上優化措施,程序效率可達到0.83ms/幀,占用DSP動態存儲空間4.6kB/通道。TMS320VC5510工作主頻為200M,可以算出優化后的算法編解碼一幀需要CPU處理能力為16.7(mega cycles)/s。
4 VoIP語音網關設計
VoIP網絡通常采用G.729A話音編碼,為了實現VoIP終端和其它話音網絡(如PSTN、移動電話等)互通,需要在VoIP交換機中實現語音網關來完成G.729A話音到PCM(Pulse Code Modulation,脈沖編碼調制)話音的轉換。VoIP語音網關的實現原理如圖2所示。
網絡處理器為Freescale公司的MPC8280,完成IP網絡及話音控制功能;DSP為TMS320VC5510,實現G.729A算法;FPGA為Altera公司的EP1C3,完成DSP的McBSP接口到2M話音群的接入。
從VoIP網絡來的話音幀由網絡處理器通過MPC8280的Local Bus(本地總線)和DSP的HPI(Host Port Interface,主機接口)送給DSP進行解碼,解碼后的PCM話音通過McBSP給FPGA完成2M話音群的時隙插入,網絡處理器通過MPC8280的MCC從2M群提取話音。反之為編碼的信號流程。
根據以上原理設計的VoIP語音網關單元包含了16片DSP,完成了96通道的G.729A語音編解碼,話音清晰可懂。根據目前應用結果,證明了基于XDAIS標準G.729A算法的高效、可靠及易擴展性,達到了設計的預期效果。
5 結束語
本文基于XDAIS架構的G.729A算法解決了在同一DSP處理器上實現多路G.729A算法的問題,并對算法進行了優化,理論上可實現一片TMS320VC5510上12通道的G.729A編解碼。標準的XDAIS架構使得算法移植性強,很容易將算法應用到其它設備中,縮短產品的開發周期。VoIP語音網關的實現使得這一算法得到了實際應用,目前該語音網關已應用于多種型號的軍用交換機中,并且運行穩定。
參考文獻:
[1] Texas Instruments. TMS320 DSP Algorithm Standard Rules and Guidelines User's Guide[Z]. SPRU352G, 2007.
[2] 司群,臧英新,陶友傳,等. TMS320DSP算法標準(XDAIS)及參考構架RF5綜述[J]. 艦船電子工程, 2006,26(2): 27-31.
[3] ITU-T Recommendation G.729. Coding of Speech at 8kbit/s Using Conjugate-Structure Algebraic-Code-Excited Linear-Prediction(CS-ACELP)[S]. 2013.
[4] 肖玉梅. 淺談VoIP技術中的語音編碼技術及其在DSP上的實現[J]. 經營管理者, 2011(13): 298-300.
[5] Texas Instruments. TMS320C55x Optimizing C/C++ CompilerUser's Guide[Z]. SPRU281F, 2003.endprint