在TMS320C6x系列DSP上G.729A算法的優(yōu)化
發(fā)布時(shí)間:2008/9/23 0:00:00 訪問次數(shù):864
語音通信是現(xiàn)代多媒體通信中一個(gè)重要的組成部分,語音壓縮又是實(shí)現(xiàn)低速率語音通信的關(guān)鍵技術(shù)。國際電信聯(lián)盟(itu)于1996年提出了一種共軛結(jié)構(gòu)代數(shù)碼激勵(lì)線性預(yù)測(cs-acelp)的語音編碼算法—g.729。該算法在8kbits碼率下具有較好的語音編碼質(zhì)量,且延遲較短,因此在ip電話、移動(dòng)通信、多媒體網(wǎng)絡(luò)通信以及各種手持設(shè)備中具有廣泛應(yīng)用。g.729a是在g.729基礎(chǔ)上進(jìn)行了一部分簡化,使得編碼的復(fù)雜度降低,對硬件的要求更低,而編碼質(zhì)量并沒有明顯降低[1][2][3]。
2.g.729a的dsp軟件開發(fā)流程
在編寫和調(diào)試c6000程序時(shí),為了使c6000代碼獲得最好的性能,我們需要按照軟件編程的3個(gè)階段進(jìn)行,每個(gè)階段完成的任務(wù)如下[4]:
第一階段:開始可以不考慮c6000的有關(guān)知識(shí),完全根據(jù)任務(wù)編寫c語言程序。在ccs環(huán)境下用c6000的代碼產(chǎn)生工具,編譯產(chǎn)生在c6000內(nèi)運(yùn)行的代碼,證明其功能正確。然后再用ccs的調(diào)試工具,如debug和profiler等,分析確定代碼可能存在的、影響性能的低效率段。為進(jìn)一步改進(jìn)代碼性能,需要進(jìn)入第二階段。
第二階段:利用內(nèi)聯(lián)函數(shù)、ccs編譯選項(xiàng)和其他具體優(yōu)化方法改進(jìn)c語言程序。重復(fù)第一階段,檢查所產(chǎn)生的c6000代碼性能。如果產(chǎn)生的代碼仍不能達(dá)到所期望的性能,則進(jìn)入第三階段。
第三階段:從c語言程序中抽出對性能影響很大的程序段,用線性匯編重新編寫,再用匯編優(yōu)化器優(yōu)化,鏈接,直到達(dá)到所期望的性能要求。
具體到g.729a標(biāo)準(zhǔn)編解碼器的實(shí)時(shí)要求,第三階段是工作的重點(diǎn),而且線性匯編的重新編寫要求對程序代碼和dsp的特性有充分的了解。
3. g.729a代碼的剖析
ccs集成開發(fā)環(huán)境為軟件開發(fā)人員提供了高效的開發(fā)、調(diào)試工具。特別是它提供了評價(jià)器( profiler)的優(yōu)化工具,通過收集在指定代碼區(qū)間程序執(zhí)行的統(tǒng)計(jì)性能,分析確定程序中各個(gè)段、各個(gè)子函數(shù)所花費(fèi)的處理器時(shí)間,從而把程序的優(yōu)化集中在對程序性能影響最大的代碼段上去[5]。其兩種不同的測試方法是:
。1) 在需要測定復(fù)雜度的程序段的開頭和結(jié)尾處設(shè)定兩個(gè)斷點(diǎn),打開時(shí)鐘窗口,運(yùn)行程序。在第一個(gè)斷點(diǎn)處執(zhí)行停止,這時(shí)雙擊時(shí)鐘窗口使之清0,接著繼續(xù)執(zhí)行程序,在第二個(gè)斷點(diǎn)處停止,這時(shí),時(shí)鐘窗口顯示的值便是該段代碼的復(fù)雜度。這在測試程序中一個(gè)函數(shù)的復(fù)雜度是非常有用的。
。2) 先打開統(tǒng)計(jì)窗口,在需要測試的程序段頭尾設(shè)置統(tǒng)計(jì)點(diǎn)((probe point)。程序運(yùn)行結(jié)束后,統(tǒng)計(jì)窗口內(nèi)該程序段后面的統(tǒng)計(jì)值便是該代碼段的復(fù)雜度。這種方法較簡單,統(tǒng)計(jì)點(diǎn)自動(dòng)收集統(tǒng)計(jì)信息,無需手工干涉,這在測定程序多段代碼的復(fù)雜度是非常有用。
4. 線性匯編的優(yōu)化
線性匯編是ti提供的一種匯編語言,其指令系統(tǒng)和匯編語言的指令系統(tǒng)完全相同,但在編寫時(shí)不需要指定寄存器和操作單元,也不需要考慮延時(shí)的問題,因此編寫線性匯編相對要容易一些 [6]。
經(jīng)過第一階段和第二階段的優(yōu)化后,音頻編碼程序在dm642上的運(yùn)行狀況有了很大改善,但是經(jīng)測試仍然沒有到達(dá)實(shí)時(shí)效果,而高級語言的效率幾乎發(fā)揮到了極致,測試的速度達(dá)到了36.5幀/s,是未優(yōu)化之前的10倍。這時(shí),我們采用線性匯編語言重新編寫c代碼的低效率段程序,進(jìn)一步提高程序的執(zhí)行效率和充分利用dm642的硬件資源,最終按設(shè)計(jì)要求在dm642實(shí)時(shí)實(shí)現(xiàn)g.729a編碼。在前面的dsp開發(fā)流程已經(jīng)提過,dsp開發(fā)的最后一個(gè)手段是用匯編重寫c代碼,它是唯一可以既提高程序執(zhí)行速度又可以減少程序體積的方法。由于針對并行處理器編寫匯編的難度很大,一般采取的是混合編程的方法,即程序的主要部分用c代碼,部分耗時(shí)較大的函數(shù)可以用線性匯編改寫。
在編寫線性匯編優(yōu)化代碼的過程中,為了提高代碼執(zhí)行效率,我們需要遵循以下原則[7]:
(1)寫并行代碼:通過使用匯編指令并行執(zhí)行的方法減少循環(huán)內(nèi)的執(zhí)行周期數(shù),優(yōu)化線性匯編代碼。這里的關(guān)鍵問題是弄清指令相關(guān)性,只有不相關(guān)的指令才能并行執(zhí)行。辨別指令是否相關(guān),可以使用相關(guān)圖。
(2)處理跳轉(zhuǎn)指令和轉(zhuǎn)移指令:匯編程序的一大特點(diǎn)就是頻繁地跳轉(zhuǎn),當(dāng)滿足不同的條件時(shí),要求程序進(jìn)行不同的操作,或跳到相應(yīng)的位置。對于“大于”、“大于等于”、“小于”、“小于等于”等較為接近的邏輯判斷和處理,應(yīng)慎重對待,否則將產(chǎn)生邏輯性錯(cuò)誤,并且很難調(diào)試。當(dāng)發(fā)生溢出需進(jìn)行相應(yīng)處理時(shí),這種現(xiàn)象尤為突出。
。3)盡量減少循環(huán)體內(nèi)的指令數(shù):g.729a的算法實(shí)現(xiàn),有許多是在循環(huán)內(nèi)部完成的,有些地方如固定碼本搜索過程中,為了確定四個(gè)非0脈沖的位置和幅度,還用到了多重循環(huán)。在循環(huán)內(nèi)部,特別是在嵌套較深的循環(huán)內(nèi)部,減少一條指令可以大大降低程序的操作次數(shù)。例如,對于一個(gè)每重循環(huán)8次的四重嵌套循環(huán),在最內(nèi)層循環(huán)每減少一條指令,整個(gè)程序可以少執(zhí)行84=4096語句。因此在設(shè)計(jì)程序時(shí),能夠放在循環(huán)體外執(zhí)行的語句,盡量放在
語音通信是現(xiàn)代多媒體通信中一個(gè)重要的組成部分,語音壓縮又是實(shí)現(xiàn)低速率語音通信的關(guān)鍵技術(shù)。國際電信聯(lián)盟(itu)于1996年提出了一種共軛結(jié)構(gòu)代數(shù)碼激勵(lì)線性預(yù)測(cs-acelp)的語音編碼算法—g.729。該算法在8kbits碼率下具有較好的語音編碼質(zhì)量,且延遲較短,因此在ip電話、移動(dòng)通信、多媒體網(wǎng)絡(luò)通信以及各種手持設(shè)備中具有廣泛應(yīng)用。g.729a是在g.729基礎(chǔ)上進(jìn)行了一部分簡化,使得編碼的復(fù)雜度降低,對硬件的要求更低,而編碼質(zhì)量并沒有明顯降低[1][2][3]。
2.g.729a的dsp軟件開發(fā)流程
在編寫和調(diào)試c6000程序時(shí),為了使c6000代碼獲得最好的性能,我們需要按照軟件編程的3個(gè)階段進(jìn)行,每個(gè)階段完成的任務(wù)如下[4]:
第一階段:開始可以不考慮c6000的有關(guān)知識(shí),完全根據(jù)任務(wù)編寫c語言程序。在ccs環(huán)境下用c6000的代碼產(chǎn)生工具,編譯產(chǎn)生在c6000內(nèi)運(yùn)行的代碼,證明其功能正確。然后再用ccs的調(diào)試工具,如debug和profiler等,分析確定代碼可能存在的、影響性能的低效率段。為進(jìn)一步改進(jìn)代碼性能,需要進(jìn)入第二階段。
第二階段:利用內(nèi)聯(lián)函數(shù)、ccs編譯選項(xiàng)和其他具體優(yōu)化方法改進(jìn)c語言程序。重復(fù)第一階段,檢查所產(chǎn)生的c6000代碼性能。如果產(chǎn)生的代碼仍不能達(dá)到所期望的性能,則進(jìn)入第三階段。
第三階段:從c語言程序中抽出對性能影響很大的程序段,用線性匯編重新編寫,再用匯編優(yōu)化器優(yōu)化,鏈接,直到達(dá)到所期望的性能要求。
具體到g.729a標(biāo)準(zhǔn)編解碼器的實(shí)時(shí)要求,第三階段是工作的重點(diǎn),而且線性匯編的重新編寫要求對程序代碼和dsp的特性有充分的了解。
3. g.729a代碼的剖析
ccs集成開發(fā)環(huán)境為軟件開發(fā)人員提供了高效的開發(fā)、調(diào)試工具。特別是它提供了評價(jià)器( profiler)的優(yōu)化工具,通過收集在指定代碼區(qū)間程序執(zhí)行的統(tǒng)計(jì)性能,分析確定程序中各個(gè)段、各個(gè)子函數(shù)所花費(fèi)的處理器時(shí)間,從而把程序的優(yōu)化集中在對程序性能影響最大的代碼段上去[5]。其兩種不同的測試方法是:
。1) 在需要測定復(fù)雜度的程序段的開頭和結(jié)尾處設(shè)定兩個(gè)斷點(diǎn),打開時(shí)鐘窗口,運(yùn)行程序。在第一個(gè)斷點(diǎn)處執(zhí)行停止,這時(shí)雙擊時(shí)鐘窗口使之清0,接著繼續(xù)執(zhí)行程序,在第二個(gè)斷點(diǎn)處停止,這時(shí),時(shí)鐘窗口顯示的值便是該段代碼的復(fù)雜度。這在測試程序中一個(gè)函數(shù)的復(fù)雜度是非常有用的。
(2) 先打開統(tǒng)計(jì)窗口,在需要測試的程序段頭尾設(shè)置統(tǒng)計(jì)點(diǎn)((probe point)。程序運(yùn)行結(jié)束后,統(tǒng)計(jì)窗口內(nèi)該程序段后面的統(tǒng)計(jì)值便是該代碼段的復(fù)雜度。這種方法較簡單,統(tǒng)計(jì)點(diǎn)自動(dòng)收集統(tǒng)計(jì)信息,無需手工干涉,這在測定程序多段代碼的復(fù)雜度是非常有用。
4. 線性匯編的優(yōu)化
線性匯編是ti提供的一種匯編語言,其指令系統(tǒng)和匯編語言的指令系統(tǒng)完全相同,但在編寫時(shí)不需要指定寄存器和操作單元,也不需要考慮延時(shí)的問題,因此編寫線性匯編相對要容易一些 [6]。
經(jīng)過第一階段和第二階段的優(yōu)化后,音頻編碼程序在dm642上的運(yùn)行狀況有了很大改善,但是經(jīng)測試仍然沒有到達(dá)實(shí)時(shí)效果,而高級語言的效率幾乎發(fā)揮到了極致,測試的速度達(dá)到了36.5幀/s,是未優(yōu)化之前的10倍。這時(shí),我們采用線性匯編語言重新編寫c代碼的低效率段程序,進(jìn)一步提高程序的執(zhí)行效率和充分利用dm642的硬件資源,最終按設(shè)計(jì)要求在dm642實(shí)時(shí)實(shí)現(xiàn)g.729a編碼。在前面的dsp開發(fā)流程已經(jīng)提過,dsp開發(fā)的最后一個(gè)手段是用匯編重寫c代碼,它是唯一可以既提高程序執(zhí)行速度又可以減少程序體積的方法。由于針對并行處理器編寫匯編的難度很大,一般采取的是混合編程的方法,即程序的主要部分用c代碼,部分耗時(shí)較大的函數(shù)可以用線性匯編改寫。
在編寫線性匯編優(yōu)化代碼的過程中,為了提高代碼執(zhí)行效率,我們需要遵循以下原則[7]:
。1)寫并行代碼:通過使用匯編指令并行執(zhí)行的方法減少循環(huán)內(nèi)的執(zhí)行周期數(shù),優(yōu)化線性匯編代碼。這里的關(guān)鍵問題是弄清指令相關(guān)性,只有不相關(guān)的指令才能并行執(zhí)行。辨別指令是否相關(guān),可以使用相關(guān)圖。
(2)處理跳轉(zhuǎn)指令和轉(zhuǎn)移指令:匯編程序的一大特點(diǎn)就是頻繁地跳轉(zhuǎn),當(dāng)滿足不同的條件時(shí),要求程序進(jìn)行不同的操作,或跳到相應(yīng)的位置。對于“大于”、“大于等于”、“小于”、“小于等于”等較為接近的邏輯判斷和處理,應(yīng)慎重對待,否則將產(chǎn)生邏輯性錯(cuò)誤,并且很難調(diào)試。當(dāng)發(fā)生溢出需進(jìn)行相應(yīng)處理時(shí),這種現(xiàn)象尤為突出。
。3)盡量減少循環(huán)體內(nèi)的指令數(shù):g.729a的算法實(shí)現(xiàn),有許多是在循環(huán)內(nèi)部完成的,有些地方如固定碼本搜索過程中,為了確定四個(gè)非0脈沖的位置和幅度,還用到了多重循環(huán)。在循環(huán)內(nèi)部,特別是在嵌套較深的循環(huán)內(nèi)部,減少一條指令可以大大降低程序的操作次數(shù)。例如,對于一個(gè)每重循環(huán)8次的四重嵌套循環(huán),在最內(nèi)層循環(huán)每減少一條指令,整個(gè)程序可以少執(zhí)行84=4096語句。因此在設(shè)計(jì)程序時(shí),能夠放在循環(huán)體外執(zhí)行的語句,盡量放在
熱門點(diǎn)擊
- MIPS推出首個(gè)集成DSPASE的24KE&
- 在TMS320C6x系列DSP上G.729A
- 二維DCT編碼的DSP實(shí)現(xiàn)與優(yōu)化
- DSP48A操作簡介
- Spartan-3-ADSP DSP48A單
- 32位DSP兩級cache的結(jié)構(gòu)設(shè)計(jì)
- 基于McBSP的雙DSP間高速通信
- 應(yīng)用DSP48E的乘法擴(kuò)展
- 基于DM642的運(yùn)動(dòng)估計(jì)算法的研究與實(shí)現(xiàn)
- DSP與PC機(jī)的無線交換調(diào)制模塊設(shè)計(jì)
推薦技術(shù)資料
- 業(yè)余條件下PCM2702
- PGM2702采用SSOP28封裝,引腳小而密,EP3... [詳細(xì)]
- 100A全集成電源模塊R
- Teseo-VIC6A GNSS車用精準(zhǔn)定位
- 高效先進(jìn)封裝工藝
- 模數(shù)轉(zhuǎn)換器 (Analog-to-Digit
- 集成模數(shù)轉(zhuǎn)換器(ADC)
- 128 通道20 位電流數(shù)字轉(zhuǎn)換器̴
- 多媒體協(xié)處理器SM501在嵌入式系統(tǒng)中的應(yīng)用
- 基于IEEE802.11b的EPA溫度變送器
- QUICCEngine新引擎推動(dòng)IP網(wǎng)絡(luò)革新
- SoC面世八年后的產(chǎn)業(yè)機(jī)遇
- MPC8xx系列處理器的嵌入式系統(tǒng)電源設(shè)計(jì)
- dsPIC及其在交流變頻調(diào)速中的應(yīng)用研究