第五講 G.729A語(yǔ)音編碼 TMS320VC5416 DSP實(shí)時(shí)實(shí)現(xiàn)(下) |
Lesson 5 Realization of G.729A Voice Coding Arithmetic by TMS320VC5416 DSP |
清華大學(xué)電子工程系、微波與數(shù)字通信國(guó)家重點(diǎn)實(shí)驗(yàn)室 崔慧娟 |
ITU-T G.729 8kb/s CS—ACELP簡(jiǎn)介 國(guó)際電信聯(lián)盟(ITU-T)于1995年11月正式通過(guò)了G.729。 ITU-T建議G.729也被稱作“共軛結(jié)構(gòu)代數(shù)碼本激勵(lì)線性預(yù)測(cè)編碼方案”(CS-ACELP),它是當(dāng)前較新的一種語(yǔ)音壓縮標(biāo)準(zhǔn)。96年ITU-T又制定了G.729的簡(jiǎn)化方案G.729A,主要降低了計(jì)算的復(fù)雜度以便于實(shí)時(shí)實(shí)現(xiàn),因此目前使用的都是G.729A。
圖1 G.729A編碼器原理圖
圖2 G.729A解碼器原理圖
程序編制 DSP開(kāi)發(fā)工具一般都提供C編譯器,可以直接將寫(xiě)好的C語(yǔ)言程序轉(zhuǎn)換成DSP匯編語(yǔ)言程序,但效率非常低。G.729A算法C語(yǔ)言程序用編譯器轉(zhuǎn)成匯編語(yǔ)言程序運(yùn)行所需要的運(yùn)算量超過(guò)2000個(gè)MIPS(每秒百萬(wàn)條指令),根本無(wú)法實(shí)時(shí)運(yùn)行,因此必須手工編寫(xiě)匯編程序。 程序的調(diào)試 程序的調(diào)試也是一項(xiàng)很費(fèi)時(shí)的工作。ITU-T針對(duì)G.729A提供了8組測(cè)試碼,只要通過(guò)了這8組測(cè)試碼,就可以認(rèn)為程序基本正確了,這8組測(cè)試碼分別針對(duì)程序中的不同位置而設(shè)定如下: algthm - 算法中的條件部分 采用的調(diào)試步驟是首先針對(duì)測(cè)試碼中最短的algthm.in的第一幀邊編程邊調(diào)試,也就是每編好一個(gè)函數(shù),就將algthm.in的第一幀通過(guò)該函數(shù)后的輸出數(shù)據(jù)和C語(yǔ)言的相應(yīng)輸出數(shù)據(jù)相比較,并針對(duì)出現(xiàn)的錯(cuò)誤修改函數(shù)內(nèi)容,由于對(duì)剛編完的函數(shù)進(jìn)行調(diào)試,對(duì)函數(shù)結(jié)構(gòu)和指令記憶會(huì)比較清晰。這樣,當(dāng)編碼器完成后,algthm.in的第一幀也就基本通過(guò)了。然后再繼續(xù)調(diào)試第二幀,當(dāng)?shù)诙䦷餐ㄟ^(guò)后,程序中所剩的錯(cuò)誤也就不多了。等到通過(guò)了第10幀,就可以開(kāi)始大規(guī)模地進(jìn)行仿真了。對(duì)于解碼部分,由于程序比較短,就采用了先把全部程序編完,再進(jìn)行調(diào)試的方法。 程序的優(yōu)化 編碼模塊與解碼模塊是按照G.729編解碼器的C語(yǔ)言定點(diǎn)源程序改寫(xiě)的,雖然定點(diǎn)的C語(yǔ)言程序已經(jīng)為DSP的實(shí)現(xiàn)作了一定的優(yōu)化,但為在一個(gè)DSP芯片上實(shí)現(xiàn)盡量多路的編解碼,必須根據(jù)C54x芯片的功能和特點(diǎn)對(duì)程序進(jìn)行一定的優(yōu)化。在編寫(xiě)DSP程序時(shí),要想提高運(yùn)行效率,就要充分利用C54x DSP芯片具有的各種硬件資源,并適當(dāng)?shù)貙?duì)程序結(jié)構(gòu)進(jìn)行一定調(diào)整,采用的主要方法有以下幾種: 充分利用各種延時(shí) C54x芯片指令中的跳轉(zhuǎn)、循環(huán)、調(diào)用子函數(shù)等指令都有延時(shí)的格式如B[D],BC[D],RPT[D],RPTB[D],CALL[D],CC[D],RET[D],RC[D]等,這些指令允許利用他們執(zhí)行過(guò)程中的等待周期預(yù)先執(zhí)行一兩條其他指令,適當(dāng)調(diào)整程序結(jié)構(gòu)就可以充分利用這些等待周期,從而提高程序執(zhí)行速度。 充分利用塊指令循環(huán)功能 C54x DSP芯片還提供了塊指令循環(huán)功能,此功能可以大大地提高執(zhí)行循環(huán)的速度,但是此功能只能在一重循環(huán)中使用,因?yàn)樗惶峁┝艘粋(gè)循環(huán)記數(shù)寄存器BRC,所以在遇到多重循環(huán)時(shí)就要盡量把這個(gè)功能用在最里層的循環(huán)中,最里層循環(huán)是執(zhí)行次數(shù)最多的循環(huán)。 利用DSP芯片提供的各種寄存器 適當(dāng)?shù)乩酶鞣N寄存器也能顯著地提高程序的執(zhí)行速度。特別是當(dāng)一個(gè)函數(shù)在程序中被頻繁地調(diào)用,它的賦值可以減少執(zhí)行時(shí)鐘周期。 利用指令中的移位功能 C54x DSP在做賦值和數(shù)值運(yùn)算之前可以自動(dòng)對(duì)操作數(shù)進(jìn)行一定位數(shù)的移位,這樣就可以將移位運(yùn)算和其它運(yùn)算結(jié)合到一條指令中。另外,利用這種移位功能可以代替一些乘數(shù)為2的冪乘法,雖然有這樣的限制,但是在許多濾波器和函數(shù)中確實(shí)有這樣的運(yùn)算,帶立即數(shù)的乘法需要兩個(gè)指令周期,而移位只需一個(gè)指令周期,并且如果條件允許還可以將其結(jié)合到其它指令中,從而大大節(jié)省運(yùn)算量。 利用DELAY指令進(jìn)行賦值操作 另外,在程序中有大量的賦值操作,即將一個(gè)內(nèi)存變量的值賦給另一個(gè)內(nèi)存變量。特別是在搜索碼本的時(shí)候有大量的賦值操作,并且賦值的兩個(gè)變量是固定的。一般的方法是將第一個(gè)變量讀入到累加器或寄存器TREG中,再將累加器的值賦到第二個(gè)變量中。此過(guò)程要用兩條單周期指令。C54x提供了一個(gè)移動(dòng)緩沖區(qū)的指令DELAY,可以在一個(gè)指令周期內(nèi)將內(nèi)存單元的值復(fù)制到它后面的相鄰的內(nèi)存單元內(nèi)。雖然DELAY指令一般是用來(lái)移動(dòng)緩沖區(qū)的,但只要在給變量分配內(nèi)存時(shí)將需要賦值的變量相鄰分配,就可以在一個(gè)指令周期內(nèi)完成賦值操作。 利用寄存器代替某些臨時(shí)變量 程序中往往有很多的臨時(shí)變量,有的臨時(shí)變量應(yīng)用到自始至終,但是有的臨時(shí)變量只是在程序中的某段區(qū)域使用,只是暫時(shí)做數(shù)據(jù)存儲(chǔ)之用,對(duì)這類變量就可以酌情使用寄存器代替。由于對(duì)寄存器可以直接進(jìn)行操作,而不需要進(jìn)行取數(shù)、存數(shù)操作,從而可以大大提高程序運(yùn)行速度。 盡量利用尋址寄存器 C54x提供了八個(gè)尋址寄存器AR0-AR7,使用它們可以進(jìn)行尋址操作,并且可以控制它們的值隨著指令執(zhí)行而增減。充分利用它們進(jìn)行尋址可以顯著提高運(yùn)行速度。
運(yùn)算量統(tǒng)計(jì) 在對(duì)某一幀實(shí)際語(yǔ)音的處理過(guò)程中,編解碼器算法的,各個(gè)部分運(yùn)算量所占比例顯示在表1中。運(yùn)算量較大的部分是LSP系數(shù)的矢量量化與激勵(lì)碼本(自適應(yīng)碼本和隨機(jī)碼本)的搜索。這兩個(gè)部分的運(yùn)算量大約占全部編解碼運(yùn)算量的80%以上。 儲(chǔ)量統(tǒng)計(jì) G.729a算法所用的存儲(chǔ)量情況見(jiàn)表2。
結(jié)束語(yǔ) 本文介紹了采用TI公司TMS320VC5416實(shí)現(xiàn)ITU-T G.729A 8kb/s CS-ACELP語(yǔ)音壓縮編碼,所采用的設(shè)計(jì)思路、程序調(diào)試和程序優(yōu)化的方法對(duì)用其它DSP芯片實(shí)現(xiàn)語(yǔ)音壓縮編碼算法也有參考意義。 |









