當前位置:首頁 > 嵌入式 > 嵌入式教程
[導讀] G.723.1算法在DSP上的優(yōu)化

1 引言

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

  2 G.723.1算法的復雜度分析

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

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

  3 代碼的優(yōu)化

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

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

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

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

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

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

  if(cond){

  if((src 1*src2<<1)!=0x80000000)

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

  else

  dst=0x7ffffff;

  }

  else

  nop;

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

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

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

  (1)使用內聯函數(intrinsics)

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

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

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


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

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

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

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

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

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

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

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

  3.3匯編編程的優(yōu)化

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

  經過以上的優(yōu)化后,音頻編碼程序在DM642上的運行狀況有了很大改善,但是經測試仍然沒有到達可以接收的程度,而高級語言的效率幾乎發(fā)揮到了極致,所以在具體分析耗時大的模塊特點后,采用線性匯編語言重新編寫C代碼的低效率段程序,迸一步提高程序的執(zhí)行效率。

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

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

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

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

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

  經匯編優(yōu)化器優(yōu)化后,代碼效率比C語言直接編譯有明顯提高。

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

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

  (1)編寫連接命令文件.cmd

  明確了系統(tǒng)的程序和數據映射地址后,編寫連接器命令文件將部分調用次數較多的函數、堆棧段、數據段放入內存:cmd文件內容如下:

  一L\evmdm642_echocfg.cmd //連接CCS提供的連接命令文件

  SECTIONS

  {

 ?。畉ahles>SDRAM

 ?。甤init>ISRAM   //將變量初值表放入內存

  . far >SDRAM

 ?。甤onst>ISRAM //將常數段放入內存

 ?。畃init>SDRAM

  . tin >SDRAM

 ?。畉ext>SDRAM

 ?。畉est >ISRAM

  }

  一levmdm642bsl.lib     //連接庫文件

  一levmdm642_edma_aic23.164    //連接驅動程序的庫文件

  一lc6xlx_edma_mcasp.J64   //連接串口McASP的庫文件

  其中.test是筆者在C程序內用#pragma CODE_SECTION或DATA_SECTION自定義的段。

  (2)高速緩沖寄存器Cache的使用

  Cache即高速緩存,是位于CPU和片內存儲器之間的規(guī)模小速度快的存儲器。Cache的工作原理是保存CPU中最常用的數據。當Cache中保存著CPU要讀寫的數據時,CPU直接訪問Cache。由于Cache的速度與CPU相當,CPU能在零等待狀態(tài)下迅速地實現數據存取。只有在Cache中不舍有CPU所需的數據時CPU才去訪問片內存儲器。因此Cache的有效利用對整個程序速度的提高有著舉足輕重的作用。在主函數中加入以下代碼,使Cache使能:

  CACHE_clean  (CACHE_L2ALL,0,0};  //清除Cache內原有內容

  CACHE_setL2Mode  (CACHE_64KCACHE);  //設置Cache的大小為64K

  CACHE_enableCaching  (CACHE_EMIFA_CE00);  //Cache使能

  添加以上代瑪后,測試速度由原來的20幀/s提高到了400幀/s。提高了將近20倍。

  5 結束語

  本文詳緇分紹了G.723.1標準的DSP代碼優(yōu)化工作,重點描述了代碼優(yōu)化的方法和本課題的創(chuàng)新點.對于算法中的一些函數提出了獨創(chuàng)性改寫方法。基于線性匯編的優(yōu)化以及Cache的有效利用使本課題的工作取得了顯著成果,在沒有降低音質的情況下,實現了DSP的語音實時編解碼。

  本文作者創(chuàng)新點:在對G.723.1的優(yōu)化中,針對TMS320DM 642 DSP系列芯片提出了一些有價值的新方法。例如:編寫連接命令文件.cmd和高速緩沖寄存器Cache的使用。這些創(chuàng)新點在不同程度上提高了代碼的優(yōu)化速度和執(zhí)行效率,在語音編解碼的DSP實時實現中起到了關鍵性作用。

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯系該專欄作者,如若文章內容侵犯您的權益,請及時聯系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或將催生出更大的獨角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數字化轉型技術解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關鍵字: AWS AN BSP 數字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術公司SODA.Auto推出其旗艦產品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關鍵字: 汽車 人工智能 智能驅動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務中斷的風險,如企業(yè)系統(tǒng)復雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務連續(xù)性,提升韌性,成...

關鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據媒體報道,騰訊和網易近期正在縮減他們對日本游戲市場的投資。

關鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數據產業(yè)博覽會開幕式在貴陽舉行,華為董事、質量流程IT總裁陶景文發(fā)表了演講。

關鍵字: 華為 12nm EDA 半導體

8月28日消息,在2024中國國際大數據產業(yè)博覽會上,華為常務董事、華為云CEO張平安發(fā)表演講稱,數字世界的話語權最終是由生態(tài)的繁榮決定的。

關鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應對環(huán)境變化,經營業(yè)績穩(wěn)中有升 落實提質增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務引領增長 以科技創(chuàng)新為引領,提升企業(yè)核心競爭力 堅持高質量發(fā)展策略,塑強核心競爭優(yōu)勢...

關鍵字: 通信 BSP 電信運營商 數字經濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術學會聯合牽頭組建的NVI技術創(chuàng)新聯盟在BIRTV2024超高清全產業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現場 NVI技術創(chuàng)新聯...

關鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯合招商會上,軟通動力信息技術(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關鍵字: BSP 信息技術
關閉
關閉