日韩欧美自拍在线观看-欧美精品在线看片一区二区-高清性视频一区二区播放-欧美日韩女优制服另类-国产精品久久久久久av蜜臀-成人在线黄色av网站-肥臀熟妇一区二区三区-亚洲视频在线播放老色-在线成人激情自拍视频

在TMS320C6x系列DSP上G.729A算法的優(yōu)化

出處:davidli88 發(fā)布于:2008-09-23 11:26:36

  語音通信是現(xiàn)代多媒體通信中一個重要的組成部分,語音壓縮又是實現(xiàn)低速率語音通信的關(guān)鍵技術(shù)。國際電信聯(lián)盟(ITU)于1996年提出了一種共軛結(jié)構(gòu)代數(shù)碼激勵線性預(yù)測(CS-ACELP)的語音編碼算法—G.729。該算法在8kbits碼率下具有較好的語音編碼質(zhì)量,且延遲較短,因此在IP電話、移動通信、多媒體網(wǎng)絡(luò)通信以及各種手持設(shè)備中具有廣泛應(yīng)用。G.729A是在G.729基礎(chǔ)上進行了一部分簡化,使得編碼的復(fù)雜度降低,對硬件的要求更低,而編碼質(zhì)量并沒有明顯降低[1][2][3]。

  2.G.729A的DSP軟件開發(fā)流程

  在編寫和調(diào)試C6000程序時,為了使C6000代碼獲得的性能,我們需要按照軟件編程的3個階段進行,每個階段完成的任務(wù)如下[4]:

  階段:開始可以不考慮C6000的有關(guān)知識,完全根據(jù)任務(wù)編寫C語言程序。在CCS環(huán)境下用C6000的代碼產(chǎn)生工具,編譯產(chǎn)生在C6000內(nèi)運行的代碼,證明其功能正確。然后再用CCS的調(diào)試工具,如debug和profiler等,分析確定代碼可能存在的、影響性能的低效率段。為進一步改進代碼性能,需要進入第二階段。

  第二階段:利用內(nèi)聯(lián)函數(shù)、CCS編譯選項和其他具體優(yōu)化方法改進C語言程序。重復(fù)階段,檢查所產(chǎn)生的C6000代碼性能。如果產(chǎn)生的代碼仍不能達到所期望的性能,則進入第三階段。

  第三階段:從C語言程序中抽出對性能影響很大的程序段,用線性匯編重新編寫,再用匯編優(yōu)化器優(yōu)化,鏈接,直到達到所期望的性能要求。

  具體到G.729A標準編解碼器的實時要求,第三階段是工作的重點,而且線性匯編的重新編寫要求對程序代碼和DSP的特性有充分的了解。

  3.       G.729A代碼的剖析

  CCS集成開發(fā)環(huán)境為軟件開發(fā)人員提供了高效的開發(fā)、調(diào)試工具。特別是它提供了評價器( profiler)的優(yōu)化工具,通過收集在指定代碼區(qū)間程序執(zhí)行的統(tǒng)計性能,分析確定程序中各個段、各個子函數(shù)所花費的處理器時間,從而把程序的優(yōu)化集中在對程序性能影響的代碼段上去[5]。其兩種不同的測試方法是:

 ?。?) 在需要測定復(fù)雜度的程序段的開頭和結(jié)尾處設(shè)定兩個斷點,打開時鐘窗口,運行程序。在個斷點處執(zhí)行停止,這時雙擊時鐘窗口使之清0,接著繼續(xù)執(zhí)行程序,在第二個斷點處停止,這時,時鐘窗口顯示的值便是該段代碼的復(fù)雜度。這在測試程序中一個函數(shù)的復(fù)雜度是非常有用的。

 ?。?) 先打開統(tǒng)計窗口,在需要測試的程序段頭尾設(shè)置統(tǒng)計點((Probe Point)。程序運行結(jié)束后,統(tǒng)計窗口內(nèi)該程序段后面的統(tǒng)計值便是該代碼段的復(fù)雜度。這種方法較簡單,統(tǒng)計點自動收集統(tǒng)計信息,無需手工干涉,這在測定程序多段代碼的復(fù)雜度是非常有用。

  4.       線性匯編的優(yōu)化

  線性匯編是TI提供的一種匯編語言,其指令系統(tǒng)和匯編語言的指令系統(tǒng)完全相同,但在編寫時不需要指定寄存器和操作單元,也不需要考慮延時的問題,因此編寫線性匯編相對要容易一些 [6]。

  經(jīng)過階段和第二階段的優(yōu)化后,音頻編碼程序在DM642上的運行狀況有了很大改善,但是經(jīng)測試仍然沒有到達實時效果,而語言的效率幾乎發(fā)揮到了,測試的速度達到了36.5幀/s,是未優(yōu)化之前的10倍。這時,我們采用線性匯編語言重新編寫C代碼的低效率段程序,進一步提高程序的執(zhí)行效率和充分利用DM642的硬件資源,終按設(shè)計要求在DM642實時實現(xiàn)G.729A編碼。在前面的DSP開發(fā)流程已經(jīng)提過,DSP開發(fā)的一個手段是用匯編重寫C代碼,它是可以既提高程序執(zhí)行速度又可以減少程序體積的方法。由于針對并行處理器編寫匯編的難度很大,一般采取的是混合編程的方法,即程序的主要部分用C代碼,部分耗時較大的函數(shù)可以用線性匯編改寫。

  在編寫線性匯編優(yōu)化代碼的過程中,為了提高代碼執(zhí)行效率,我們需要遵循以下原則[7]:

 ?。?)寫并行代碼:通過使用匯編指令并行執(zhí)行的方法減少循環(huán)內(nèi)的執(zhí)行周期數(shù),優(yōu)化線性匯編代碼。這里的關(guān)鍵問題是弄清指令相關(guān)性,只有不相關(guān)的指令才能并行執(zhí)行。辨別指令是否相關(guān),可以使用相關(guān)圖。

 ?。?)處理跳轉(zhuǎn)指令和轉(zhuǎn)移指令:匯編程序的一大特點就是頻繁地跳轉(zhuǎn),當滿足不同的條件時,要求程序進行不同的操作,或跳到相應(yīng)的位置。對于“大于”、“大于等于”、“小于”、“小于等于”等較為接近的邏輯判斷和處理,應(yīng)慎重對待,否則將產(chǎn)生邏輯性錯誤,并且很難調(diào)試。當發(fā)生溢出需進行相應(yīng)處理時,這種現(xiàn)象尤為突出。

  (3)盡量減少循環(huán)體內(nèi)的指令數(shù):G.729A的算法實現(xiàn),有許多是在循環(huán)內(nèi)部完成的,有些地方如固定碼本搜索過程中,為了確定四個非0脈沖的位置和幅度,還用到了多重循環(huán)。在循環(huán)內(nèi)部,特別是在嵌套較深的循環(huán)內(nèi)部,減少一條指令可以大大降低程序的操作次數(shù)。例如,對于一個每重循環(huán)8次的四重嵌套循環(huán),在內(nèi)層循環(huán)每減少一條指令,整個程序可以少執(zhí)行84=4096語句。因此在設(shè)計程序時,能夠放在循環(huán)體外執(zhí)行的語句,盡量放在循環(huán)體外執(zhí)行。

  (4)展開程序體:在一定條件下,盡量展開程序,以減少子程序的調(diào)用和返回次數(shù),犧牲空間換取時間。

  G.729A算法中的LPC模塊、LSP量化及激勵碼本搜索耗時多,為進一步提高代碼效率,對相關(guān)計算、FIR濾波等部分函數(shù)用線性匯編語言進行了改寫,并用畫相關(guān)圖等方法有針對性的進行優(yōu)化。經(jīng)匯編優(yōu)化器優(yōu)化后,代碼效率比C語言直接編譯有明顯提高。

  5.  優(yōu)化工作的創(chuàng)新點

  在對G.729A的優(yōu)化中,本文在前人研究成果的基礎(chǔ)上,針對TMS320DM642 DSP系列芯片提出了一些有價值的新方法。這些創(chuàng)新點在不同程度上提高了代碼的優(yōu)化速度和執(zhí)行效率,在語音編解碼的DSP實時實現(xiàn)中起到了關(guān)鍵性作用。下面,以舉例的方式闡明一些經(jīng)典的方法。

  5.1 繪制分析圖,掌握函數(shù)結(jié)構(gòu)

  對于一個語句較多、結(jié)構(gòu)復(fù)雜的函數(shù),為了充分了解其邏輯結(jié)構(gòu)和語句的相關(guān)性,我們通常采用畫分析圖的方法。分析圖的形式比較靈活,可以根據(jù)具體的情況選用不同的制圖工具。在編寫線性匯編的時候,需要考慮存取數(shù)組中的元素,數(shù)據(jù)打包操作和數(shù)據(jù)相關(guān)性等問題,分析圖有助于正確處理這些問題。

  在對函數(shù)Cor_h_X( )優(yōu)化過程中,我們遇到了一定的困難,原因在于其中有一個雙層的循環(huán)體,內(nèi)層的次數(shù)與外層有關(guān),外層的循環(huán)次數(shù)為40,并且循環(huán)內(nèi)部的語句有先后的相關(guān)性。這樣的結(jié)構(gòu)如果用循環(huán)展開的方法將會用到大量的寄存器,數(shù)目超出了64個,需要開辟額外的內(nèi)存空間去存放臨時變量,而讀寫內(nèi)存會消耗較多的時間,因此這樣執(zhí)行效率不會有充分的提高。對此,我們利用分析圖描述了函數(shù)中關(guān)鍵代碼的數(shù)組X[ ],h[ ]的使用情況,如圖1所示:

cor_h_X( )函數(shù)分析圖(部分)

  圖1 cor_h_X( )函數(shù)分析圖(部分)

  圖1直觀地反映了數(shù)組16位h[ ]和16位X[ ]之間的乘加關(guān)系,從函數(shù)cor_h_X( )中可知,兩個數(shù)組的乘積之和要對應(yīng)的保存在臨時數(shù)組32位Y[ ]中。通過研究此分析圖,我們發(fā)現(xiàn)h[ ]與X[ ]中的一些元素進行乘積和處理之后就不再被使用,那么存儲這些元素的寄存器可以存放中間結(jié)果(Y[]的元素),這樣就可節(jié)省寄存器的使用個數(shù),免去了開辟內(nèi)存空間和中間變量的存取指令。

  對于函數(shù)cor_h_X( ),利用上述思想編寫線性匯編,只需要定義57個寄存器就可以完成所用的操作,存取指令從1760條優(yōu)化到30條,僅為原來的1/60。同時執(zhí)行速度從390072個時鐘減少到35871個,降為原來的1/10。

  繪制的分析圖可以包含相關(guān)圖,相關(guān)表等,使資源安排更加合理。該方法在其他函數(shù)的改寫中也多次使用到。

  5.2 功能相似的函數(shù)或代碼段合并為一個函數(shù)

  線性匯編在提高代碼效率的同時也成倍的增加了代碼尺寸,以上述cor_h_X( )為例,它在該寫后代碼尺寸從660條增大到7776條(該數(shù)據(jù)由CCS剖析工具分析所得)。在工程應(yīng)用中,對于有限的內(nèi)存程序區(qū),我們會適當減少程序占用的空間。合并功能相似的函數(shù)可以達到這一要求。

  在LSP量化處理中,源代碼中給出了2個LSP選擇函數(shù):Lsp_select_1( )和Lsp_select_2( ),而我們發(fā)現(xiàn)它們具有相同的功能和相似的結(jié)構(gòu),因此,在對兩者的線性匯編改寫中,我們只需編寫一個函數(shù)(命名為Lsp_select)即可實現(xiàn)LSP量化處理中這兩個模塊的功能。

  另外,在對于一些數(shù)組拷貝,數(shù)組初始化的代碼,我們同樣可以用此方法,編寫一個函數(shù)實現(xiàn),這樣可以在提高執(zhí)行效率的同時,減少程序占用的內(nèi)存空間。

  5.3 多個循環(huán)合并為一個循環(huán)

  C代碼改寫線性匯編的時候,我們常常會發(fā)現(xiàn),只要作一些調(diào)整,兩個或多個循環(huán)完成的操作完全可以由一個循環(huán)來完成。以LPC子模塊240點加窗語音的自相關(guān)計算Autocorr()函數(shù)為例,經(jīng)過優(yōu)化改寫的C代碼(部分)如下:

  for(i=0; i<L_WINDOW; i++)  //個循環(huán)體

  y[i] = (_smpy(x[i], hamwindow[i])+0x00008000L)>>16;

  sum = 1;                   //避免為0的情況

  for(i=0; i<L_WINDOW; i++)  //第二個循環(huán)體

  sum = _sadd(sum,_smpy(y[i], y[i]));

  這段代碼包含了兩個for循環(huán),在CCS中直接編譯運行并行度很差,利用線性匯編重寫代碼。我們發(fā)現(xiàn)兩個循環(huán)體的循環(huán)次數(shù)均為60(L_WINDOW=60),所處理的數(shù)組不同,并且兩個循環(huán)沒有相關(guān)性,可以把和第二個循環(huán)合并成一個循環(huán)。前者的功能是對語音信號進行加窗;后者是實現(xiàn)乘累加(Mac)。兩者合并后采用線性匯編編寫,其代碼如下:

  mvk 60,i  //設(shè)置循環(huán)次數(shù)

  loop1: lddw *ham++,hamih:hamil  //hamwindow[]指針

  lddw *x++,xih:xil  //x[]指針

  smpy2 hamil,xil,yi1:yi0  //兩對16位操作數(shù)相承,并行執(zhí)行

  smpy2 hamih,xih,yi3:yi2

  sadd yi0,con0x8000,yi0

  sadd yi1,con0x8000,yi1

  sadd yi2,con0x8000,yi2

  sadd yi3,con0x8000,yi3

  packh2 yi1,yi0,yl  //數(shù)據(jù)打包技術(shù)

  packh2 yi3,yi2,yh

  stdw yh:yl,*y++  //雙字存取,提高執(zhí)行效率

  smpy2 yl,yl,yi1:yi0

  sadd sum0,yi1,sum0

  sadd sum0,yi0,sum0

  smpy2 yh,yh,yi3:yi2

  sadd sum0,yi3,sum0

  sadd sum0,yi2,sum0

  add i,-1,i

  [i]   b loop1  //把和第二個循環(huán)合成一個大循環(huán),減少轉(zhuǎn)移次數(shù)

  產(chǎn)生的匯編代碼并行流水性能大大增加,耗費的時鐘周期數(shù)從1310000減少到15000,少于改編前的1/8。

  6.       結(jié)束語

  關(guān)于編解碼器執(zhí)行的時鐘周期,在線性匯編改寫前后,文件版本通過CCS的profiler剖析工具得知:每10幀(100ms)從159700000降至68500000,僅為原來的42%。硬件版本進行測試得:編解碼的幀數(shù)提高到了88幀/s以上,鑒于編碼、解碼的時間比例為5:1,所以,本系統(tǒng)編碼已經(jīng)達到100幀/s,完全符合實時通信的要求。
  


  
關(guān)鍵詞:在TMS320C6x系列DSP上G.729A算法的優(yōu)化15000100MS40961760TMS320DM6421996C6000DM642

版權(quán)與免責聲明

凡本網(wǎng)注明“出處:維庫電子市場網(wǎng)”的所有作品,版權(quán)均屬于維庫電子市場網(wǎng),轉(zhuǎn)載請必須注明維庫電子市場網(wǎng),http://www.hbjingang.com,違反者本網(wǎng)將追究相關(guān)法律責任。

本網(wǎng)轉(zhuǎn)載并注明自其它出處的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點或證實其內(nèi)容的真實性,不承擔此類作品侵權(quán)行為的直接責任及連帶責任。其他媒體、網(wǎng)站或個人從本網(wǎng)轉(zhuǎn)載時,必須保留本網(wǎng)注明的作品出處,并自負版權(quán)等法律責任。

如涉及作品內(nèi)容、版權(quán)等問題,請在作品發(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關(guān)權(quán)利。

廣告
OEM清單文件: OEM清單文件
*公司名:
*聯(lián)系人:
*手機號碼:
QQ:
有效期:

掃碼下載APP,
一鍵連接廣大的電子世界。

在線人工客服

買家服務(wù):
賣家服務(wù):
技術(shù)客服:

0571-85317607

網(wǎng)站技術(shù)支持

13606545031

客服在線時間周一至周五
9:00-17:30

關(guān)注官方微信號,
第一時間獲取資訊。

建議反饋

聯(lián)系人:

聯(lián)系方式:

按住滑塊,拖拽到最右邊
>>
感謝您向阿庫提出的寶貴意見,您的參與是維庫提升服務(wù)的動力!意見一經(jīng)采納,將有感恩紅包奉上哦!