1 引言
G.723.1是刪組織于1996年推出的一種低碼率的語音編碼算法標準,也是目前該組織頒布的語音壓縮標準中碼率最低的一種標準。G.723.1主要用于對語音及其它多媒體聲音信號的壓縮,目前在一些數(shù)字音視頻傳輸、高質(zhì)量語音壓縮等系統(tǒng)中都得到廣泛應用。
2 G.723.1算法的復雜度分析
將G.723.1移植到TMS320C64xx后,就可借助TI集成開發(fā)工具CCS(Code Composer Studio)的Profile功能來評估其各個子程序或函數(shù)的執(zhí)行運算量,從而把程序的優(yōu)化集中在對程序性能影響最大的代碼上去。
通過分析可以看出,在G.723.1的編解碼算法中,碼本搜索所花費的運算量是比較大的,如Find_Best(),F(xiàn)ind_Fcbk(),F(xiàn)ind_Acbk():另外,在LPC分析和LSP參數(shù)的計算上也有運算量比較大的,如Comp_Lpc(),Lsp_Qnt(),Lsp_Svq()。
3 代碼的優(yōu)化
代碼優(yōu)化的工作有兩大目的:一是執(zhí)行速度提高,實現(xiàn)實時;二是盡量不擴大程序體積(Code Size),使之在內(nèi)存允許的范圍內(nèi)。顯然,兩者存在一定的矛盾,當今超大規(guī)模集成電路的發(fā)展使RAM資源不再是系統(tǒng)的瓶頸,因此該部分工作的主要任務是怎樣提高執(zhí)行速度。代碼的優(yōu)化工作主要在CCS環(huán)境中進行。優(yōu)化的原則是要充分考慮C64xx處理器超長指令字、多個運算單元和深度流水線的結(jié)構(gòu)特點,以及避免過多的讀寫內(nèi)存指令和程序轉(zhuǎn)移指令,充分發(fā)揮其強大的運算能力。具體方法包括(次序有先后):
3.1基本運算集的優(yōu)化
G.723.1算法程序是用定點運算完成浮點運算,為了防止定點運算時可能溢出,許多運算需要進行飽和判斷,為此程序?qū)iT定義了基本運算集,實現(xiàn)諸如飽和加法、飽和乘法、除法和移位等操作。在程序中這些操作調(diào)用相當頻繁,經(jīng)CCS的profile工具測試,基本運算函數(shù)集的調(diào)用占用了95%以上的CPU時間。因此,我們要從基本運算集的優(yōu)化開始。在熟悉掌握C64xx指令集的前提下,分析基本運算集中各個函數(shù)完成的悉掌握C64xx指令集的前提下,分析基本運算集中各個函數(shù)完成的功能和對全局變量產(chǎn)生的影響,用C64xx指令取而代之或加以改編。其中包括對跳轉(zhuǎn)和流水線的優(yōu)化討論、對乘積的飽和調(diào)整和全局變量OveRFlow的相關操作。
由于基本運算集以函數(shù)形式存在,兩次跳轉(zhuǎn)f函數(shù)的調(diào)用與返回1必不可少,將引起流水線的兩次打斷,表現(xiàn)為12個指令周期的占用。將這嶁基本運算函數(shù)集改成宏的形式,即將基本運算內(nèi)嵌(inline)至lJ調(diào)用程序中,由此町以消除跳轉(zhuǎn)和流水線打斷帶來的指令周期占用,提高執(zhí)行速度。雖然這樣做增加了代碼長度,多占用了一些內(nèi)存,但由于基本運算函數(shù)體積均較小,再經(jīng)過一定的代碼優(yōu)化,在程序體積上的犧牲幾乎町以忽略。
基本運算的函數(shù)定義在BASIC.C文件里面,如果能夠?qū)@些簡單甬數(shù)進行內(nèi)聯(lián)指令(intrinsic)的優(yōu)化,就能達到事半功倍的效果。內(nèi)聯(lián)指令是匯編指令的直接映射,具有很高的效率。與此同時帶來的一個問題是溢出保護位Overflow的判斷,這是基本函數(shù)里用來標識溢出的全局變量,它的作用等同于CSR(Control Status Register)寄存器的SAT(Saturation)位,當數(shù)據(jù)溢出時,SAT位被系統(tǒng)自動設置為1,所以編解碼函數(shù)里對Overflow的判斷可以轉(zhuǎn)化成對SAT位的判斷。引用CSR寄存器時需要在最開始的時候聲明extem cregister volatile ansigned int CSR。
C64xx指令提供了飽和乘法指令SMPY,實現(xiàn)16"16位的乘法與飽和結(jié)果調(diào)整,其執(zhí)行操作如下:
if(cond){
if((src 1*src2<<1)!=0x80000000)
dst=((src 1*src2)<<1);
else
dst=0x7ffffff;
}
else
nop;
將原指令中的乘法指令改為SMPY.就可以完成乘法和飽和調(diào)整兩種計算,這樣可以省去飽和調(diào)整3條指令。與此類似,其它的飽和運算,C64xx都提供了相應的指令實現(xiàn),將普通運算指令替換為飽和運算指令,飽和結(jié)果調(diào)整部分的運算均可以省去。
作者:王偉 黃俊恒 來源:微計算機信息