摘 要:以TMS320C6203為硬件平臺,設計了高速G.729ab多通道聲碼器。使用純匯編指令與C語言結合優(yōu)化編程提高核心編解碼算法效率,實時支持最大31個話路語音的G.729ab編解碼。利用TMS320C6203的在片外設McBSP提供聲碼器連接PSTN的標準E1接口,設計了用于分組數據收發(fā)的RTP協(xié)議接口,利用TMS320C6203的HPI接口方式與上層處理器連接,使得聲碼器可靈活地應用于媒體網關。
關鍵詞:G.729ab; 指令優(yōu)化; McBSP; RTP接口
中圖分類號:TN912.3文獻標識碼:A
文章編號:1004-373X(2010)15-0104-03
G.729ab Codec Design and Its Application in Media Gateway
LIAO Yan-na
(Xi'an University of Posts Telecommunications, Xi’an 710121, China)
Abstract: A high speed multi-channel G.729ab codec was designed on TMS320C6203 hardware platform. The pure assemble instruction combined with C language are used to improve the effectiveness of codec algorithm, 31 G.729ab channels are supplied real-timely. The multi-channel buffered serial port(McBSP) of C6203 is disposed as E1 interface to PSTN. The host processor interface of C6203 was designed to provide a real-time protocol connection. This codec can be used in media gateway conveniently.
Keywords: G.729ab; instruction optimization; McBSP; RTP interface
收稿日期:2010-03-16
基金項目:陜西省自然科學基金資助項目(2009JM8015);陜西省教育廳專項科研計劃資助項目(09JK730)
在VoIP媒體網關設備中,語音壓縮編碼是其關鍵技術之一。在ITU-T發(fā)布的應用于VoIP的語音壓縮編解碼標準中,G.729是應用較為廣泛的一種。G.729采用“共軛結構代數碼本激勵線性預測編碼”(CS-ACELP)算法[1],算法幀長為10 ms,編碼后速率為8 Kb/s。G.729有兩個附件:附件A給出一種低復雜度的算法,可應用于多媒體同步語音和數據;附件B在標準算法的基礎上增加了靜音檢測壓縮算法以降低平均傳輸率,包括靜音檢測(VAD)和舒適噪音產生(CNG)[2]。文獻[1]對G.729語音壓縮編碼算法的具體原理中有詳盡的描述,本文的論述重點在算法的匯編語言優(yōu)化、聲碼器的DSP硬件接口設計,以及其在媒體網關中的應用。
1 G.729ab編解碼核心算法優(yōu)化
本文選擇TI公司的TMS320C6203芯片為核心,實現(xiàn)G.729ab聲碼器設計。TMS320C62xx系列DSP的集成開發(fā)環(huán)境Code Composer Studio(簡稱CCS)支持標準C語言和匯編混合編程的方式編程,為了提高編解碼算法的效率,本文對ITU_T的標準G.729ab的C語言原碼進行匯編指令優(yōu)化設計。同時,對于上層編解碼器控制函數,采用C語言開發(fā),以提高聲碼器的可維護性[3]。
C62xx采用6級流水線結構,提供了A,B兩組(共32個)通用寄存器,8個功能單元(.L1,.L2,.S1,.S2,.M1,.M2,.D1和.D2),最多同時可以有8條指令處在不同的執(zhí)行階段并行[4]。流水線結構是DSP實現(xiàn)高速運算的重要技術。由于不同指令的指令周期不同,需要在多周期指令后插入足夠的NOP(空操作)指令,以避免流水線沖突[5]。
在G.729ab的標準C代碼中,有大量的循環(huán)體。循環(huán)控制的關鍵跳轉指令B,需要等待5個指令周期,大量的NOP操作將降低代碼的效率。為了提高循環(huán)效率,可以合理安排指令順序,在一個匯編循環(huán)體內完成多個C循環(huán)的運算的流水線操作。用匯編指令實現(xiàn)如下簡單的for循環(huán)求信號能量的程序段為例:
for (i=0;i<80;i++)
Eng = Eng+src[i]* src[i];
上述示例可使用如下匯編程序段實現(xiàn):
LOOP: LDH* B10++[2],A10
|| SMPY A10,A10,A11
|| SADDA11,A12,A12
||[A1]SUB B0,1,B0
||[A1]B LOOP
|| CMPGTB0,0,A1
如上優(yōu)化后,循環(huán)體LOOP僅為一個周期,在這一個周期中有6條并行運行的指令。其中,內存讀取指令LDH需4個周期,故乘法指令SMPY是將向前追溯4個循環(huán)周期的內存讀取結果相乘。同理,SMPY指令需2個周期,故SADD指令是將2個循環(huán)周期之前的相乘結果相加。B0和A1配合用于循環(huán)控制,在等待跳轉指令B有效的5個延時周期內,依次進行隨后的后一循環(huán)的取數,前第3個循環(huán)的相乘,前一個循環(huán)的求和、循環(huán)控制和跳轉指令,依次類推。上述優(yōu)化實現(xiàn)了最優(yōu)循環(huán)效率。
本設計優(yōu)化后核心編解碼算法代碼完全符合ITU-T G.729ab標準,并通過了ITU-T的所有測試矢量。使用300 MHz主頻的TMS320C6203實現(xiàn)聲碼器,單片可支持31路G.729ab算法。
2 聲碼器的DSP硬件接口設計
在媒體網關中,聲碼器的功能是實現(xiàn)PSTN的E1語音信號和數據網分組語音壓縮信號之間的編解碼轉化。利用TMS320C6203片內固化設置的McBSP接口(多通道緩存串行接口)與HPI接口(主處理器接口),可以實現(xiàn)DSP與E1總線、以及數據網上層處理器的連接。結構示意圖如圖1所示。
圖1 聯(lián)合多通道聲碼器硬件結構示意圖
TM320C6203通過內置McBSP與EDMA(Enhanced Directory Memory Access,增強型直接內存訪問)控制器配合,可實現(xiàn)與E1標準接口的鏈接。設置McBSP的接收/發(fā)送控制寄存器[6](R/XCR),使串口按照標準E1數據格式進行數據收發(fā);設置串口管腳控制寄存器(PCR),控制串口采用外部E1總線的時鐘和幀同步信號;設置串口控制寄存器(SPCR),控制串口的R/XINT(收/發(fā)中斷)由EDMA響應。
TMS320C6203支持16個EDMA通道,其12~15通道可用于響應串口收、發(fā)中斷[7]。以串口接收數據為例:本設計中設計了乒、乓兩個串口數據接收緩存區(qū)。串口寄存器中的數據通過EDMA模式緩存到乒緩存區(qū),當乒緩存區(qū)滿時,EDMA參數重載,控制切換,將數據緩存至乓緩存區(qū),同時給出EDMA中斷,通知CPU讀取一幀數據。通過McBSP接口發(fā)送數據的過程完全類似。
聲碼器通過DSP的HPI接口與上層處理器連接,實現(xiàn)數據網分組語音壓縮信號的收發(fā)。在HPI接口中,設計了以太網數據發(fā)送/接收緩存區(qū),并為每個緩存區(qū)設計了RP(Read Pointer,讀指針)和WP(Write Pointer,寫指針),用于控制上層處理器和DSP之間的編碼數據交互。同時上層處理器通過HPI接口向聲碼器發(fā)送指令,控制通道的打開或關閉。
3 在媒體網關中的應用設計
聲碼器內部的主控程序采用定時中斷方式訪問HPI接口,根據上層處理器的指令打開或關閉通道。同時主程序使用輪詢方式處理從E1接口來的PCM話音信號;根據相應的通道工作狀態(tài)設置編解碼算法參數,將話音信號壓縮編碼;編碼后的語音數據,通過HPI接口輸出到上層處理器,進入數字網絡。使用完全類似的輪詢處理方式,逆向處理從來自數字網絡的編碼數據。
由于數字網絡屬于分組通信,必須有合適的多媒體實時流網絡傳輸協(xié)議以保證語音的連貫性。在聲碼器的HPI接口控制程序中,設計了一個提供給上層處理器的RTP(Real-time Transport Protocol,實時傳輸協(xié)議)接口,用于完成編碼和解碼數據包的輸出和輸入及相應的RTP成幀、解幀功能,具體功能設計如下:
RTP打包和發(fā)送:RTP包由具有固定格式的包頭和數據部分組成[8]。將編碼后的語音數據,按照RTP打包參數的要求組織RTP頭和RTP凈荷。RTP包頭中的關鍵字段為SN(Sequence Number,序列號)和TS(Time Stamp,時間戳)。SN用于對RTP包進行排序。每發(fā)送一個RTP數據包,SN加1。TS用于標識RTP數據包中第一個字節(jié)采樣時的時刻,以語音樣本為單位遞增;對于語音包和靜音壓縮包,TS增值一致。另外,RTP包頭中的PT(Payload Type,負載類型)字段用于指示RTP凈荷的數據編碼格式。在RFC3550[6]中規(guī)定了標準音頻載荷類型: G.729編碼對應的PT為18。
由于RTP包頭中沒有長度字段,故對RTP包進行了外部擴展:將打好的RTP包作為凈荷,附加上RTP包數據長度、通道號,組成“以太網數據包”。針對C6203的32位尋址的HPI總線接口,設計以太網數據包格式如圖2所示。
圖2 以太網數據包的格式
RTP包發(fā)送:即寫“以太網數據包”至“以太網數據發(fā)送緩存區(qū)”。首先根據該緩存區(qū)的讀寫指針判斷剩余空間;如寫空間不夠,則放棄此次寫操作,該數據包同時被丟棄。如寫空間足夠,則將數據包寫入發(fā)送緩存區(qū),并更新寫指針。上層處理器根據該緩存區(qū)的讀寫指針判斷該緩存區(qū)內是否有新數據,并進行讀操作,以及更新讀指針。
RTP包接收、排序和緩存:分組通信需要考慮語音的防抖動處理。本文通過設置靜態(tài)抖動緩沖區(qū)實現(xiàn)去抖動。首先根據“以太網數據接收緩存區(qū)” 的讀寫指針判斷是否有新的數據包到來,如果有,則將該數據包根據RTP的SN和TS排列在相應通道的RTP緩存隊列中。重復上述過程直至將“以太網數據接收緩存區(qū)”中所有的數據包讀完,然后更新該緩存區(qū)的DSP讀指針。對于每個通道的RTP緩存隊列,當緩存語音數據到達預先定義的閾值K時,給出標志允許該通道開始進行語音數據解碼。如果數據分組有抖動延遲,則解碼語音可繼續(xù)保持K時間單位不被打斷。
4 結 語
在純匯編并行優(yōu)化的基礎上設計了高效的G.729ab聲碼器;利用TMS320C6203的在片外設McBSP實現(xiàn)了連接PSTN的標準E1接口;設計了用于分組數據收發(fā)的RTP協(xié)議接口,利用TMS320C6203的
HPI接口方式與上層處理器連接,使聲碼器可靈活應用于媒體網關。
參考文獻
[1]劉為超,黎福海.G.729在DSP應用中代碼優(yōu)化研究[J].現(xiàn)代電子技術,2005,28(5):59-61.
[2]王偉,王偉達,郭恒業(yè).G.729A語音壓縮算法分析及DSP實現(xiàn)[J].計算機工程與應用,2007(8):99-102.
[3]廖延娜,陳新富,孫健,等.一種多通道聯(lián)合聲碼器及其實現(xiàn)方法:中國,03114586[P].2005-01-26.
[4]卞紅雨,紀祥春.TMS320C6000系列DSP的CPU與外設[M].北京:清華大學出版社,2007.
[5]Texas Instruments Incorporated. TMS320C62x DSP CPU and instruction set reference guide[M]. Texas: Texas Instruments, 2006.
[6]Texas Instruments Incorporated. TMS320C6000 DSP multichannel buffered serial port(McBSP) refercend guide[M]. Texas: Texas Instruments, 2006.
[7]Texas Instruments Incorporated. TMS320C6000 DSP enhanced direct Memory access(EDMA) controller reference guide[M]. Texas: Texas Instruments, 2004.
[8]SCHULZRINNE H, CASNER S, FREDERICK R. RTP:a transport protocol for real-time applocations, RFC3550[S]. New York: Columbia University, 2003.