<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > G.723.1標準算法在DSP上的優(yōu)化

G.723.1標準算法在DSP上的優(yōu)化

作者: 時(shí)間:2012-02-18 來(lái)源:網(wǎng)絡(luò ) 收藏

1 引言

本文引用地址:http://dyxdggzs.com/article/149632.htm

  是刪組織于1996年推出的一種低碼率的語(yǔ)音編碼,也是目前該組織頒布的語(yǔ)音壓縮中碼率最低的一種。主要用于對語(yǔ)音及其它多媒體聲音信號的壓縮,目前在一些數字音視頻傳輸、高質(zhì)量語(yǔ)音壓縮等系統中都得到廣泛應用。

  2 的復雜度分析

  將G.723.1移植到TMS320C64xx后,就可借助TI集成開(kāi)發(fā)工具CCS(Code Composer Studio)的Profile功能來(lái)評估其各個(gè)子程序或函數的執行運算量,從而把程序的集中在對程序性能影響最大的代碼上去。

  通過(guò)分析可以看出,在G.723.1的編解碼中,碼本搜索所花費的運算量是比較大的,如Find_Best(),Find_Fcbk(),Find_Acbk():另外,在LPC分析和LSP參數的計算上也有運算量比較大的,如Comp_Lpc(),Lsp_Qnt(),Lsp_Svq()。

  3 代碼的

  代碼的工作有兩大目的:一是執行速度提高,實(shí)現實(shí)時(shí);二是盡量不擴大程序體積(Code Size),使之在內存允許的范圍內。顯然,兩者存在一定的矛盾,當今超大規模集成電路的發(fā)展使RAM資源不再是系統的瓶頸,因此該部分工作的主要任務(wù)是怎樣提高執行速度。代碼的優(yōu)化工作主要在CCS環(huán)境中進(jìn)行。優(yōu)化的原則是要充分考慮C64xx處理器超長(cháng)指令字、多個(gè)運算單元和深度流水線(xiàn)的結構特點(diǎn),以及避免過(guò)多的讀寫(xiě)內存指令和程序轉移指令,充分發(fā)揮其強大的運算能力。具體方法包括(次序有先后):

  3.1基本運算集的優(yōu)化

  G.723.1算法程序是用定點(diǎn)運算完成浮點(diǎn)運算,為了防止定點(diǎn)運算時(shí)可能溢出,許多運算需要進(jìn)行飽和判斷,為此程序專(zhuān)門(mén)定義了基本運算集,實(shí)現諸如飽和加法、飽和乘法、除法和移位等操作。在程序中這些操作調用相當頻繁,經(jīng)CCS的profile工具測試,基本運算函數集的調用占用了95%以上的CPU時(shí)間。因此,我們要從基本運算集的優(yōu)化開(kāi)始。在熟悉掌握C64xx指令集的前提下,分析基本運算集中各個(gè)函數完成的悉掌握C64xx指令集的前提下,分析基本運算集中各個(gè)函數完成的功能和對全局變量產(chǎn)生的影響,用C64xx指令取而代之或加以改編。其中包括對跳轉和流水線(xiàn)的優(yōu)化討論、對乘積的飽和調整和全局變量OveRFlow的相關(guān)操作。

  由于基本運算集以函數形式存在,兩次跳轉f函數的調用與返回1必不可少,將引起流水線(xiàn)的兩次打斷,表現為12個(gè)指令周期的占用。將這嶁基本運算函數集改成宏的形式,即將基本運算內嵌(inline)至lJ調用程序中,由此町以消除跳轉和流水線(xiàn)打斷帶來(lái)的指令周期占用,提高執行速度。雖然這樣做增加了代碼長(cháng)度,多占用了一些內存,但由于基本運算函數體積均較小,再經(jīng)過(guò)一定的代碼優(yōu)化,在程序體積上的犧牲幾乎町以忽略。

  基本運算的函數定義在BASIC.C文件里面,如果能夠對這些簡(jiǎn)單甬數進(jìn)行內聯(lián)指令(intrinsic)的優(yōu)化,就能達到事半功倍的效果。內聯(lián)指令是匯編指令的直接映射,具有很高的效率。與此同時(shí)帶來(lái)的一個(gè)問(wèn)題是溢出保護位Overflow的判斷,這是基本函數里用來(lái)標識溢出的全局變量,它的作用等同于CSR(Control Status Register)寄存器的SAT(Saturation)位,當數據溢出時(shí),SAT位被系統自動(dòng)設置為1,所以編解碼函數里對Overflow的判斷可以轉化成對SAT位的判斷。引用CSR寄存器時(shí)需要在最開(kāi)始的時(shí)候聲明extem cregister volatile ansigned int CSR。

  C64xx指令提供了飽和乘法指令SMPY,實(shí)現1616位的乘法與飽和結果調整,其執行操作如下:

  if(cond){

  if((src 1*src21)!=0x80000000)

  dst=((src 1*src2)1);

  else

  dst=0x7ffffff;

  }

  else

  nop;

  將原指令中的乘法指令改為SMPY.就可以完成乘法和飽和調整兩種計算,這樣可以省去飽和調整3條指令。與此類(lèi)似,其它的飽和運算,C64xx都提供了相應的指令實(shí)現,將普通運算指令替換為飽和運算指令,飽和結果調整部分的運算均可以省去。

  3.2主程序的優(yōu)化

  主程序的優(yōu)化手段主要采用了以下幾種方法:

  (1)使用內聯(lián)函數(intrinsics)

  內聯(lián)函數是可直接映射為C64xx指令的特殊函數,它在指令前加上_”表示。例如:

  #define L_add(L_var1,L_var2) _sadd(L_var1,L_var2)

  #define L_mult(var1,vat2) _smpy(var1,var2)


  等,基本函數的內聯(lián)優(yōu)化需要對原函數的定義和內聯(lián)指令都比較熟悉。

  使用內聯(lián)函數代替相應的C語(yǔ)句是一種非常簡(jiǎn)便高效的優(yōu)化方法。如上面提到的飽和乘法,在C語(yǔ)句中。我們通常要使用兩個(gè)嵌套的條件判斷語(yǔ)句來(lái)檢查結果是否溢出,而指令int_smpy(int a.int b) 則在完成乘b的運算后,再做一次飽和處理,這樣一條指令就可完成C語(yǔ)言中多條語(yǔ)句才能完成的計算,可以節省很多時(shí)鐘周期。

  (2)循環(huán)展開(kāi)(loop—unrolling)

  程序中的有很多的雙重循環(huán)和多暈循環(huán)(比如代數碼本搜索計算),由于C64xx優(yōu)化器在優(yōu)化時(shí)只在最內層循環(huán)中形成一個(gè)指令流水(最多可以達到8級流水),這樣循環(huán)語(yǔ)句就不能充分利用軟件流水線(xiàn),而且對于內部循環(huán)次數較少的情況,消耗在prolog和eplog上的時(shí)鐘周期也不可忽視。針對這種情況,一個(gè)有效的辦法就是將雙重或多重循環(huán)展開(kāi),降低循環(huán)次數。這樣雖然代碼長(cháng)度增加了,但有更多的運算能夠參加到pipeline中。由于減少了流水線(xiàn)排空和提高了功能單元的利用率,程序執行速度會(huì )大大提高。

  (3)減少分支和調用指令,減少判斷指令

  程序中的分支、調用以及判斷指令會(huì )引起程序的跳轉,而每個(gè)跳轉指令都有5個(gè)延遲間隙。因此延長(cháng)了程序執行時(shí)間;另外,循環(huán)內跳轉也會(huì )使軟件流水受到阻塞,降低了代碼執行效率。優(yōu)化中,可以使用內嵌、合并判斷語(yǔ)句來(lái)減少判斷次數或用邏輯指令替代判斷的方法盡可能的消除中斷流水線(xiàn)指令帶來(lái)的影響。

  (4)使用字或雙字存取和計算

  C64xx系列是32位CPU,當16位數據在內存中連續存放時(shí),可利用uint_amem4(void*ptr)或double _amemd8 (void*ptr)指令進(jìn)行字或雙字數據的讀取或存貯。這樣每次可同時(shí)存取2個(gè)或4個(gè)16位數據,由于從內存執行取數操作需要4個(gè)delay,所以減少存取次數可以節省大量的時(shí)鐘同期;同時(shí),可利用C64xx指令集中特有的打包指令_pack2(unsigned a,unsigned b),_packh2(unsigned a,unsigned b)等將兩個(gè)16位數打包成一個(gè)32位數,在進(jìn)行乘、加計算時(shí)則利用_add 2(int a,int b)、_mpy2(int a,int b)同時(shí)完成兩組16位數的加法和乘法,效率比單純16位數的加法和乘法提高一倍。


上一頁(yè) 1 2 下一頁(yè)

關(guān)鍵詞: 優(yōu)化 DSP 算法 標準 G.723.1

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>