高速G.729ab聲碼器設(shè)計(jì)及其在媒體網(wǎng)關(guān)中的應(yīng)用
TMS320C6203支持16個(gè)EDMA通道,其12~15通道可用于響應(yīng)串口收、發(fā)中斷。以串口接收數(shù)據(jù)為例:本設(shè)計(jì)中設(shè)計(jì)了乒、乓兩個(gè)串口數(shù)據(jù)接收緩存區(qū)。
串口寄存器中的數(shù)據(jù)通過(guò)EDMA模式緩存到乒緩存區(qū),當(dāng)乒緩存區(qū)滿(mǎn)時(shí),EDMA參數(shù)重載,控制切換,將數(shù)據(jù)緩存至乓緩存區(qū),同時(shí)給出EDMA中斷,通知CPU讀取一幀數(shù)據(jù)。通過(guò)McBSP接口發(fā)送數(shù)據(jù)的過(guò)程完全類(lèi)似。
聲碼器通過(guò)DSP的HPI接口與上層處理器連接,實(shí)現(xiàn)數(shù)據(jù)網(wǎng)分組語(yǔ)音壓縮信號(hào)的收發(fā)。在HPI接口中,設(shè)計(jì)了以太網(wǎng)數(shù)據(jù)發(fā)送/接收緩存區(qū),并為每個(gè)緩存區(qū)設(shè)計(jì)了RP(Read Pointer,讀指針)和WP(Write Pointer,寫(xiě)指針),用于控制上層處理器和DSP之間的編碼數(shù)據(jù)交互。同時(shí)上層處理器通過(guò)HPI接口向聲碼器發(fā)送指令,控制通道的打開(kāi)或關(guān)閉。
3 在媒體網(wǎng)關(guān)中的應(yīng)用設(shè)計(jì)
聲碼器內(nèi)部的主控程序采用定時(shí)中斷方式訪問(wèn)HPI接口,根據(jù)上層處理器的指令打開(kāi)或關(guān)閉通道。同時(shí)主程序使用輪詢(xún)方式處理從E1接口來(lái)的PCM話音信號(hào);根據(jù)相應(yīng)的通道工作狀態(tài)設(shè)置編解碼算法參數(shù),將話音信號(hào)壓縮編碼;編碼后的語(yǔ)音數(shù)據(jù),通過(guò)HPI接口輸出到上層處理器,進(jìn)入數(shù)字網(wǎng)絡(luò)。使用完全類(lèi)似的輪詢(xún)處理方式,逆向處理從來(lái)自數(shù)字網(wǎng)絡(luò)的編碼數(shù)據(jù)。
由于數(shù)字網(wǎng)絡(luò)屬于分組通信,必須有合適的多媒體實(shí)時(shí)流網(wǎng)絡(luò)傳輸協(xié)議以保證語(yǔ)音的連貫性。在聲碼器的HPI接口控制程序中,設(shè)計(jì)了一個(gè)提供給上層處理器的RTP(Real-time Transport Protocol,實(shí)時(shí)傳輸協(xié)議)接口,用于完成編碼和解碼數(shù)據(jù)包的輸出和輸入及相應(yīng)的RTP成幀、解幀功能,具體功能設(shè)計(jì)如下:
RTP打包和發(fā)送:RTP包由具有固定格式的包頭和數(shù)據(jù)部分組成。將編碼后的語(yǔ)音數(shù)據(jù),按照RTP打包參數(shù)的要求組織RTP頭和RTP凈荷。 RTP包頭中的關(guān)鍵字段為SN(Sequence Number,序列號(hào))和TS(Time Stamp,時(shí)間戳)。SN用于對(duì)RTP包進(jìn)行排序。每發(fā)送一個(gè)RTP數(shù)據(jù)包,SN加1。TS用于標(biāo)識(shí)RTP數(shù)據(jù)包中第一個(gè)字節(jié)采樣時(shí)的時(shí)刻,以語(yǔ)音樣本為單位遞增;對(duì)于語(yǔ)音包和靜音壓縮包,TS增值一致。另外,RTP包頭中的PT(Payload Type,負(fù)載類(lèi)型)字段用于指示RTP凈荷的數(shù)據(jù)編碼格式。在RFC3550中規(guī)定了標(biāo)準(zhǔn)音頻載荷類(lèi)型:G.729編碼對(duì)應(yīng)的PT為18。
由于RTP包頭中沒(méi)有長(zhǎng)度字段,故對(duì)RTP包進(jìn)行了外部擴(kuò)展:將打好的RTP包作為凈荷,附加上RTP包數(shù)據(jù)長(zhǎng)度、通道號(hào),組成“以太網(wǎng)數(shù)據(jù)包”。針對(duì)C6203的32位尋址的HPI總線接口,設(shè)計(jì)以太網(wǎng)數(shù)據(jù)包格式如圖2所示。本文引用地址:http://m.butianyuan.cn/article/166506.htm
RTP包發(fā)送:即寫(xiě)“以太網(wǎng)數(shù)據(jù)包”至“以太網(wǎng)數(shù)據(jù)發(fā)送緩存區(qū)”。首先根據(jù)該緩存區(qū)的讀寫(xiě)指針判斷剩余空間;如寫(xiě)空間不夠,則放棄此次寫(xiě)操作,該數(shù)據(jù)包同時(shí)被丟棄。如寫(xiě)空間足夠,則將數(shù)據(jù)包寫(xiě)入發(fā)送緩存區(qū),并更新寫(xiě)指針。上層處理器根據(jù)該緩存區(qū)的讀寫(xiě)指針判斷該緩存區(qū)內(nèi)是否有新數(shù)據(jù),并進(jìn)行讀操作,以及更新讀指針。
RTP包接收、排序和緩存:分組通信需要考慮語(yǔ)音的防抖動(dòng)處理。本文通過(guò)設(shè)置靜態(tài)抖動(dòng)緩沖區(qū)實(shí)現(xiàn)去抖動(dòng)。首先根據(jù)“以太網(wǎng)數(shù)據(jù)接收緩存區(qū)”的讀寫(xiě)指針判斷是否有新的數(shù)據(jù)包到來(lái),如果有,則將該數(shù)據(jù)包根據(jù)RTP的SN和TS排列在相應(yīng)通道的RTP緩存隊(duì)列中。重復(fù)上述過(guò)程直至將“以太網(wǎng)數(shù)據(jù)接收緩存區(qū)”中所有的數(shù)據(jù)包讀完,然后更新該緩存區(qū)的DSP讀指針。對(duì)于每個(gè)通道的RTP緩存隊(duì)列,當(dāng)緩存語(yǔ)音數(shù)據(jù)到達(dá)預(yù)先定義的閾值K時(shí),給出標(biāo)志允許該通道開(kāi)始進(jìn)行語(yǔ)音數(shù)據(jù)解碼。如果數(shù)據(jù)分組有抖動(dòng)延遲,則解碼語(yǔ)音可繼續(xù)保持K時(shí)間單位不被打斷。
4 結(jié)語(yǔ)
在純匯編并行優(yōu)化的基礎(chǔ)上設(shè)計(jì)了高效的G.729ab聲碼器;利用TMS320C6203的在片外設(shè)McBSP實(shí)現(xiàn)了連接PSTN的標(biāo)準(zhǔn)E1接口;設(shè)計(jì)了用于分組數(shù)據(jù)收發(fā)的RTP協(xié)議接口,利用TMS320C6203的HPI接口方式與上層處理器連接,使聲碼器可靈活應(yīng)用于媒體網(wǎng)關(guān)。
評(píng)論