基于TMS320C5416的G.729語(yǔ)音編解碼算法的優(yōu)化和實(shí)現(xiàn)
2.2 進(jìn)行C語(yǔ)言優(yōu)化
基于G.729標(biāo)準(zhǔn)的聲碼器最終在定點(diǎn)TMS320C5416上實(shí)時(shí)實(shí)現(xiàn)。在定點(diǎn)TMS320C5416內(nèi),浮點(diǎn)數(shù)是通過(guò)將小數(shù)點(diǎn)固定在特定位置來(lái)表示的,這是定點(diǎn)TMS320C5416的局限之一。為了區(qū)分小數(shù)的不同值域,使用了Q-格式。不同的Q-格式在于小數(shù)點(diǎn)的位置不同,因此整數(shù)域也不同。當(dāng)兩個(gè)數(shù)相乘時(shí),會(huì)產(chǎn)生一個(gè)特殊的符號(hào)位。如:兩個(gè)Q4數(shù)相乘, 需要附加一個(gè)左移的操作以去除這個(gè)多余的符號(hào)位,乘積應(yīng)該是一個(gè)Q9格式的。如果DSP中的FRST位被置位,這個(gè)去除多余符號(hào)位的移位操作能夠自動(dòng)完成。對(duì)于16位數(shù)的乘法運(yùn)算,應(yīng)該得到32 位的乘積。但是,由于只需要16位的積,該32位乘積中只有高16位被存儲(chǔ)下來(lái),積的低16位被丟棄。為了達(dá)到高準(zhǔn)確性,在連續(xù)的乘法運(yùn)算過(guò)程中(如卷積),應(yīng)該一直保持32位的計(jì)算結(jié)果,只對(duì)最終的計(jì)算結(jié)果進(jìn)行丟棄低16位的截短操作。為了達(dá)到更高的準(zhǔn)確性,在這一操作過(guò)程中會(huì)使用到一種雙重精度格式, 這種格式僅僅出現(xiàn)在使用單精度不夠,而又不必要使用32位精度的時(shí)候。兩個(gè)32位數(shù)相乘,只需要32位的乘積,而不是64位,不過(guò)注意到TMS320C5416是16位的,所以在雙重精度格式中,32位整數(shù)分為高位字和低位字。高、低位字中都含有符號(hào)位,以進(jìn)行快乘運(yùn)算。其格式如下:
L_32=hi_word16+lo_word1
Hi_word=L_32>>16
Lo_word=L_32-hi_word>>1
當(dāng)累加器中的數(shù)值超過(guò)一定范圍時(shí)將會(huì)產(chǎn)生溢出。在G.729算法標(biāo)準(zhǔn)中, 累加器的值被限定在80000000~7FFFFFFF之內(nèi)――即最小負(fù)數(shù)和最大正數(shù)。不過(guò)在TMS320C5416中,如果將PMST寄存器中的OVM置位,則溢出會(huì)得到自動(dòng)處理。
2.3 內(nèi)聯(lián)指令的應(yīng)用和C程序中嵌入?yún)R編語(yǔ)句
由于語(yǔ)音編碼的特點(diǎn),編解碼函數(shù)都是由一些基本的加減乘除簡(jiǎn)單函數(shù)組織而成,這些函數(shù)定義在BASIC OP.C和OPER_32B.C兩個(gè)文件中,如果能夠?qū)@些簡(jiǎn)單函數(shù)進(jìn)行內(nèi)聯(lián)指令(intrinsic)的優(yōu)化,就能達(dá)到事半功倍的效果。內(nèi)聯(lián)指令是匯編指令的直接映射,具有很高的效率。例如:
#define muh_ r(varl,var2) _mpylir(varl,var2)
#define L_ add(L_var1,L_var2) _sadd(L_var1,L_var2)
#define L_ muh(var1,var2) _smpy(var1,var2)
在C程序中嵌入?yún)R編語(yǔ)句的方法比較簡(jiǎn)單,只需在匯編語(yǔ)句的左右加上一個(gè)引號(hào),然后用小括弧將匯編語(yǔ)句括住,并在括弧前加上ASM標(biāo)識(shí)符,例如ASM(“匯編語(yǔ)句”)。采用這種方法一方面可以在C程序中實(shí)現(xiàn)用C語(yǔ)言無(wú)法實(shí)現(xiàn)的一些硬件控制功能,如修改中斷控制寄存器、中斷使能或屏蔽、讀取狀態(tài)寄存器和中斷標(biāo)志寄存器等;另一方面,也可以用這種方法在C程序中的關(guān)鍵部分用匯編語(yǔ)句代替C語(yǔ)言以優(yōu)化程序。而采用這種方法的缺點(diǎn)是比較容易破壞C環(huán)境,因?yàn)镃編譯器在編譯嵌入了匯編語(yǔ)句的C程序時(shí)并不檢查或分析所嵌入的匯編語(yǔ)句。采用這種方法需要注意以下幾點(diǎn):
(1)不要破壞C環(huán)境,因?yàn)镃編譯器并不檢查和分析嵌入的匯編語(yǔ)句。
(2)匯編語(yǔ)句不要改變C程序中變量的值,不要在匯編語(yǔ)句中加入?yún)R編器而改變匯編環(huán)境。
在簡(jiǎn)化算法的基礎(chǔ)上,使用CCS提供的C優(yōu)化器進(jìn)行C語(yǔ)言優(yōu)化,同時(shí)還使用內(nèi)聯(lián)函數(shù)和匯編優(yōu)化。
3 G.729在TMS320C5416上的實(shí)現(xiàn)
3.1 TMS320C5416的體系結(jié)構(gòu)和應(yīng)用
TMS320C5416(以下簡(jiǎn)稱C5416)是TI公司最近推出的一款高性價(jià)比的通用l6位定點(diǎn)DSP芯片,它的內(nèi)核CPU基本組成與TMS320C54X系列一樣。C5416的單指令周期為6.25 RS,每秒執(zhí)行的指令數(shù)為160×106,指令系統(tǒng)豐富并具有很多多功能指令,使用了6級(jí)指令流水線結(jié)構(gòu),這些都很適合實(shí)現(xiàn)低時(shí)延的G.729聲碼器。采用一個(gè)40bit ALU、128K×16bit片內(nèi)RAM(包括64KB的片內(nèi)DARAM和64KB的片內(nèi)SARAM)、3個(gè)獨(dú)立的l6bit數(shù)據(jù)內(nèi)存總線、1個(gè)程序內(nèi)存總線、3個(gè)MCBSP、6信道DMA控制器、1個(gè)8/l6位并行增強(qiáng)主機(jī)端口接口及2個(gè)l6bit計(jì)時(shí)器。
在TMS320C5416中通過(guò)PCM3002進(jìn)行語(yǔ)音信號(hào)的A/D和D/A轉(zhuǎn)換,PCM3002使用兩個(gè)串行通道,一個(gè)用于控制內(nèi)部寄存器,另外一個(gè)用于數(shù)據(jù)傳輸。在系統(tǒng)板TMS320C5416中默認(rèn)的語(yǔ)音信號(hào)的抽樣率是48kHz,通過(guò)修改PCM3002的內(nèi)部控制寄存器,設(shè)定PCM3002信號(hào)的抽樣率。為了滿足G.729編碼的要求,PCM3002信號(hào)的抽樣率為8 000Hz。為了充分利用DSP進(jìn)行信號(hào)處理,通過(guò)使用MCBSP和DMA把抽樣的數(shù)據(jù)送入DMA的緩沖區(qū)中,當(dāng)緩沖區(qū)滿時(shí)產(chǎn)生一次中斷,DSP把DMA的緩沖區(qū)中的數(shù)據(jù)讀入DSP中進(jìn)行處理,然后把處理過(guò)的數(shù)據(jù)送入DMA發(fā)送緩沖區(qū)。
3.2 G.729在TMS320C5416的實(shí)現(xiàn)
G.729的處理過(guò)程中采用塊處理技術(shù)如圖3所示。按照G.729標(biāo)準(zhǔn),每塊(幀)由80個(gè)樣本組成,最初80個(gè)樣本被存起來(lái),處理過(guò)程中有兩個(gè)操作是同時(shí)進(jìn)行的。在處理塊L中數(shù)據(jù)的同時(shí),存儲(chǔ)L+1塊的數(shù)據(jù)。
評(píng)論