資料介紹
1 引言
G.723.1是刪組織于1996年推出的一種低碼率的語音編碼算法標(biāo)準(zhǔn),也是目前該組織頒布的語音壓縮標(biāo)準(zhǔn)中碼率最低的一種標(biāo)準(zhǔn)。G.723.1主要用于對(duì)語音及其它多媒體聲音信號(hào)的壓縮,目前在一些數(shù)字音視頻傳輸、高質(zhì)量語音壓縮等系統(tǒng)中都得到廣泛應(yīng)用。
2 G.723.1算法的復(fù)雜度分析
將G.723.1移植到TMS320C64xx后,就可借助TI集成開發(fā)工具CCS(Code Composer Studio)的Profile功能來評(píng)估其各個(gè)子程序或函數(shù)的執(zhí)行運(yùn)算量,從而把程序的優(yōu)化集中在對(duì)程序性能影響最大的代碼上去。
通過分析可以看出,在G.723.1的編解碼算法中,碼本搜索所花費(fèi)的運(yùn)算量是比較大的,如Find_Best(),F(xiàn)ind_Fcbk(),F(xiàn)ind_Acbk():另外,在LPC分析和LSP參數(shù)的計(jì)算上也有運(yùn)算量比較大的,如Comp_Lpc(),Lsp_Qnt(),Lsp_Svq()。
3 代碼的優(yōu)化
代碼優(yōu)化的工作有兩大目的:一是執(zhí)行速度提高,實(shí)現(xiàn)實(shí)時(shí);二是盡量不擴(kuò)大程序體積(Code Size),使之在內(nèi)存允許的范圍內(nèi)。顯然,兩者存在一定的矛盾,當(dāng)今超大規(guī)模集成電路的發(fā)展使RAM資源不再是系統(tǒng)的瓶頸,因此該部分工作的主要任務(wù)是怎樣提高執(zhí)行速度。代碼的優(yōu)化工作主要在CCS環(huán)境中進(jìn)行。優(yōu)化的原則是要充分考慮C64xx處理器超長指令字、多個(gè)運(yùn)算單元和深度流水線的結(jié)構(gòu)特點(diǎn),以及避免過多的讀寫內(nèi)存指令和程序轉(zhuǎn)移指令,充分發(fā)揮其強(qiáng)大的運(yùn)算能力。具體方法包括(次序有先后):
3.1基本運(yùn)算集的優(yōu)化
G.723.1算法程序是用定點(diǎn)運(yùn)算完成浮點(diǎn)運(yùn)算,為了防止定點(diǎn)運(yùn)算時(shí)可能溢出,許多運(yùn)算需要進(jìn)行飽和判斷,為此程序?qū)iT定義了基本運(yùn)算集,實(shí)現(xiàn)諸如飽和加法、飽和乘法、除法和移位等操作。在程序中這些操作調(diào)用相當(dāng)頻繁,經(jīng)CCS的profile工具測(cè)試,基本運(yùn)算函數(shù)集的調(diào)用占用了95%以上的CPU時(shí)間。因此,我們要從基本運(yùn)算集的優(yōu)化開始。在熟悉掌握C64xx指令集的前提下,分析基本運(yùn)算集中各個(gè)函數(shù)完成的悉掌握C64xx指令集的前提下,分析基本運(yùn)算集中各個(gè)函數(shù)完成的功能和對(duì)全局變量產(chǎn)生的影響,用C64xx指令取而代之或加以改編。其中包括對(duì)跳轉(zhuǎn)和流水線的優(yōu)化討論、對(duì)乘積的飽和調(diào)整和全局變量OveRFlow的相關(guān)操作。
由于基本運(yùn)算集以函數(shù)形式存在,兩次跳轉(zhuǎn)f函數(shù)的調(diào)用與返回1必不可少,將引起流水線的兩次打斷,表現(xiàn)為12個(gè)指令周期的占用。將這嶁基本運(yùn)算函數(shù)集改成宏的形式,即將基本運(yùn)算內(nèi)嵌(inline)至lJ調(diào)用程序中,由此町以消除跳轉(zhuǎn)和流水線打斷帶來的指令周期占用,提高執(zhí)行速度。雖然這樣做增加了代碼長度,多占用了一些內(nèi)存,但由于基本運(yùn)算函數(shù)體積均較小,再經(jīng)過一定的代碼優(yōu)化,在程序體積上的犧牲幾乎町以忽略。
基本運(yùn)算的函數(shù)定義在BASIC.C文件里面,如果能夠?qū)@些簡單甬?dāng)?shù)進(jìn)行內(nèi)聯(lián)指令(intrinsic)的優(yōu)化,就能達(dá)到事半功倍的效果。內(nèi)聯(lián)指令是匯編指令的直接映射,具有很高的效率。與此同時(shí)帶來的一個(gè)問題是溢出保護(hù)位Overflow的判斷,這是基本函數(shù)里用來標(biāo)識(shí)溢出的全局變量,它的作用等同于CSR(Control Status Register)寄存器的SAT(Saturation)位,當(dāng)數(shù)據(jù)溢出時(shí),SAT位被系統(tǒng)自動(dòng)設(shè)置為1,所以編解碼函數(shù)里對(duì)Overflow的判斷可以轉(zhuǎn)化成對(duì)SAT位的判斷。引用CSR寄存器時(shí)需要在最開始的時(shí)候聲明extem cregister volatile ansigned int CSR。
C64xx指令提供了飽和乘法指令SMPY,實(shí)現(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)整兩種計(jì)算,這樣可以省去飽和調(diào)整3條指令。與此類似,其它的飽和運(yùn)算,C64xx都提供了相應(yīng)的指令實(shí)現(xiàn),將普通運(yùn)算指令替換為飽和運(yùn)算指令,飽和結(jié)果調(diào)整部分的運(yùn)算均可以省去。
3.2主程序的優(yōu)化
主程序的優(yōu)化手段主要采用了以下幾種方法:
?。?)使用內(nèi)聯(lián)函數(shù)(intrinsics)
內(nèi)聯(lián)函數(shù)是可直接映射為C64xx指令的特殊函數(shù),它在指令前加上”_”表示。例如:
#define L_add(L_var1,L_var2) _sadd(L_var1,L_var2)
#define L_mult(var1,vat2) _smpy(var1,var2)
等,基本函數(shù)的內(nèi)聯(lián)優(yōu)化需要對(duì)原函數(shù)的定義和內(nèi)聯(lián)指令都比較熟悉。
使用內(nèi)聯(lián)函數(shù)代替相應(yīng)的C語句是一種非常簡便高效的優(yōu)化方法。如上面提到的飽和乘法,在C語句中。我們通常要使用兩個(gè)嵌套的條件判斷語句來檢查結(jié)果是否溢出,而指令int_smpy(int a.int b) 則在完成乘b的運(yùn)算后,再做一次飽和處理,這樣一條DSP指令就可完成C語言中多條語句才能完成的計(jì)算,可以節(jié)省很多時(shí)鐘周期。
?。?)循環(huán)展開(loop—unrolling)
程序中的有很多的雙重循環(huán)和多暈循環(huán)(比如代數(shù)碼本搜索計(jì)算),由于C64xx優(yōu)化器在優(yōu)化時(shí)只在最內(nèi)層循環(huán)中形成一個(gè)指令流水(最多可以達(dá)到8級(jí)流水),這樣循環(huán)語句就不能充分利用軟件流水線,而且對(duì)于內(nèi)部循環(huán)次數(shù)較少的情況,消耗在prolog和eplog上的時(shí)鐘周期也不可忽視。針對(duì)這種情況,一個(gè)有效的辦法就是將雙重或多重循環(huán)展開,降低循環(huán)次數(shù)。這樣雖然代碼長度增加了,但有更多的運(yùn)算能夠參加到pipeline中。由于減少了流水線排空和提高了功能單元的利用率,程序執(zhí)行速度會(huì)大大提高。
(3)減少分支和調(diào)用指令,減少判斷指令
程序中的分支、調(diào)用以及判斷指令會(huì)引起程序的跳轉(zhuǎn),而每個(gè)跳轉(zhuǎn)指令都有5個(gè)延遲間隙。因此延長了程序執(zhí)行時(shí)間;另外,循環(huán)內(nèi)跳轉(zhuǎn)也會(huì)使軟件流水受到阻塞,降低了代碼執(zhí)行效率。優(yōu)化中,可以使用內(nèi)嵌、合并判斷語句來減少判斷次數(shù)或用邏輯指令替代判斷的方法盡可能的消除中斷流水線指令帶來的影響。
G.723.1是刪組織于1996年推出的一種低碼率的語音編碼算法標(biāo)準(zhǔn),也是目前該組織頒布的語音壓縮標(biāo)準(zhǔn)中碼率最低的一種標(biāo)準(zhǔn)。G.723.1主要用于對(duì)語音及其它多媒體聲音信號(hào)的壓縮,目前在一些數(shù)字音視頻傳輸、高質(zhì)量語音壓縮等系統(tǒng)中都得到廣泛應(yīng)用。
2 G.723.1算法的復(fù)雜度分析
將G.723.1移植到TMS320C64xx后,就可借助TI集成開發(fā)工具CCS(Code Composer Studio)的Profile功能來評(píng)估其各個(gè)子程序或函數(shù)的執(zhí)行運(yùn)算量,從而把程序的優(yōu)化集中在對(duì)程序性能影響最大的代碼上去。
通過分析可以看出,在G.723.1的編解碼算法中,碼本搜索所花費(fèi)的運(yùn)算量是比較大的,如Find_Best(),F(xiàn)ind_Fcbk(),F(xiàn)ind_Acbk():另外,在LPC分析和LSP參數(shù)的計(jì)算上也有運(yùn)算量比較大的,如Comp_Lpc(),Lsp_Qnt(),Lsp_Svq()。
3 代碼的優(yōu)化
代碼優(yōu)化的工作有兩大目的:一是執(zhí)行速度提高,實(shí)現(xiàn)實(shí)時(shí);二是盡量不擴(kuò)大程序體積(Code Size),使之在內(nèi)存允許的范圍內(nèi)。顯然,兩者存在一定的矛盾,當(dāng)今超大規(guī)模集成電路的發(fā)展使RAM資源不再是系統(tǒng)的瓶頸,因此該部分工作的主要任務(wù)是怎樣提高執(zhí)行速度。代碼的優(yōu)化工作主要在CCS環(huán)境中進(jìn)行。優(yōu)化的原則是要充分考慮C64xx處理器超長指令字、多個(gè)運(yùn)算單元和深度流水線的結(jié)構(gòu)特點(diǎn),以及避免過多的讀寫內(nèi)存指令和程序轉(zhuǎn)移指令,充分發(fā)揮其強(qiáng)大的運(yùn)算能力。具體方法包括(次序有先后):
3.1基本運(yùn)算集的優(yōu)化
G.723.1算法程序是用定點(diǎn)運(yùn)算完成浮點(diǎn)運(yùn)算,為了防止定點(diǎn)運(yùn)算時(shí)可能溢出,許多運(yùn)算需要進(jìn)行飽和判斷,為此程序?qū)iT定義了基本運(yùn)算集,實(shí)現(xiàn)諸如飽和加法、飽和乘法、除法和移位等操作。在程序中這些操作調(diào)用相當(dāng)頻繁,經(jīng)CCS的profile工具測(cè)試,基本運(yùn)算函數(shù)集的調(diào)用占用了95%以上的CPU時(shí)間。因此,我們要從基本運(yùn)算集的優(yōu)化開始。在熟悉掌握C64xx指令集的前提下,分析基本運(yùn)算集中各個(gè)函數(shù)完成的悉掌握C64xx指令集的前提下,分析基本運(yùn)算集中各個(gè)函數(shù)完成的功能和對(duì)全局變量產(chǎn)生的影響,用C64xx指令取而代之或加以改編。其中包括對(duì)跳轉(zhuǎn)和流水線的優(yōu)化討論、對(duì)乘積的飽和調(diào)整和全局變量OveRFlow的相關(guān)操作。
由于基本運(yùn)算集以函數(shù)形式存在,兩次跳轉(zhuǎn)f函數(shù)的調(diào)用與返回1必不可少,將引起流水線的兩次打斷,表現(xiàn)為12個(gè)指令周期的占用。將這嶁基本運(yùn)算函數(shù)集改成宏的形式,即將基本運(yùn)算內(nèi)嵌(inline)至lJ調(diào)用程序中,由此町以消除跳轉(zhuǎn)和流水線打斷帶來的指令周期占用,提高執(zhí)行速度。雖然這樣做增加了代碼長度,多占用了一些內(nèi)存,但由于基本運(yùn)算函數(shù)體積均較小,再經(jīng)過一定的代碼優(yōu)化,在程序體積上的犧牲幾乎町以忽略。
基本運(yùn)算的函數(shù)定義在BASIC.C文件里面,如果能夠?qū)@些簡單甬?dāng)?shù)進(jìn)行內(nèi)聯(lián)指令(intrinsic)的優(yōu)化,就能達(dá)到事半功倍的效果。內(nèi)聯(lián)指令是匯編指令的直接映射,具有很高的效率。與此同時(shí)帶來的一個(gè)問題是溢出保護(hù)位Overflow的判斷,這是基本函數(shù)里用來標(biāo)識(shí)溢出的全局變量,它的作用等同于CSR(Control Status Register)寄存器的SAT(Saturation)位,當(dāng)數(shù)據(jù)溢出時(shí),SAT位被系統(tǒng)自動(dòng)設(shè)置為1,所以編解碼函數(shù)里對(duì)Overflow的判斷可以轉(zhuǎn)化成對(duì)SAT位的判斷。引用CSR寄存器時(shí)需要在最開始的時(shí)候聲明extem cregister volatile ansigned int CSR。
C64xx指令提供了飽和乘法指令SMPY,實(shí)現(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)整兩種計(jì)算,這樣可以省去飽和調(diào)整3條指令。與此類似,其它的飽和運(yùn)算,C64xx都提供了相應(yīng)的指令實(shí)現(xiàn),將普通運(yùn)算指令替換為飽和運(yùn)算指令,飽和結(jié)果調(diào)整部分的運(yùn)算均可以省去。
3.2主程序的優(yōu)化
主程序的優(yōu)化手段主要采用了以下幾種方法:
?。?)使用內(nèi)聯(lián)函數(shù)(intrinsics)
內(nèi)聯(lián)函數(shù)是可直接映射為C64xx指令的特殊函數(shù),它在指令前加上”_”表示。例如:
#define L_add(L_var1,L_var2) _sadd(L_var1,L_var2)
#define L_mult(var1,vat2) _smpy(var1,var2)
等,基本函數(shù)的內(nèi)聯(lián)優(yōu)化需要對(duì)原函數(shù)的定義和內(nèi)聯(lián)指令都比較熟悉。
使用內(nèi)聯(lián)函數(shù)代替相應(yīng)的C語句是一種非常簡便高效的優(yōu)化方法。如上面提到的飽和乘法,在C語句中。我們通常要使用兩個(gè)嵌套的條件判斷語句來檢查結(jié)果是否溢出,而指令int_smpy(int a.int b) 則在完成乘b的運(yùn)算后,再做一次飽和處理,這樣一條DSP指令就可完成C語言中多條語句才能完成的計(jì)算,可以節(jié)省很多時(shí)鐘周期。
?。?)循環(huán)展開(loop—unrolling)
程序中的有很多的雙重循環(huán)和多暈循環(huán)(比如代數(shù)碼本搜索計(jì)算),由于C64xx優(yōu)化器在優(yōu)化時(shí)只在最內(nèi)層循環(huán)中形成一個(gè)指令流水(最多可以達(dá)到8級(jí)流水),這樣循環(huán)語句就不能充分利用軟件流水線,而且對(duì)于內(nèi)部循環(huán)次數(shù)較少的情況,消耗在prolog和eplog上的時(shí)鐘周期也不可忽視。針對(duì)這種情況,一個(gè)有效的辦法就是將雙重或多重循環(huán)展開,降低循環(huán)次數(shù)。這樣雖然代碼長度增加了,但有更多的運(yùn)算能夠參加到pipeline中。由于減少了流水線排空和提高了功能單元的利用率,程序執(zhí)行速度會(huì)大大提高。
(3)減少分支和調(diào)用指令,減少判斷指令
程序中的分支、調(diào)用以及判斷指令會(huì)引起程序的跳轉(zhuǎn),而每個(gè)跳轉(zhuǎn)指令都有5個(gè)延遲間隙。因此延長了程序執(zhí)行時(shí)間;另外,循環(huán)內(nèi)跳轉(zhuǎn)也會(huì)使軟件流水受到阻塞,降低了代碼執(zhí)行效率。優(yōu)化中,可以使用內(nèi)嵌、合并判斷語句來減少判斷次數(shù)或用邏輯指令替代判斷的方法盡可能的消除中斷流水線指令帶來的影響。
下載該資料的人也在下載
下載該資料的人還在閱讀
更多 >
- PCM語音編解碼及原理圖下載 13次下載
- DSP芯片實(shí)現(xiàn)語音編解碼技術(shù)的設(shè)計(jì)方案 18次下載
- 基于TMS320C6201的G.723.1多通道語音編解碼分析 1次下載
- 多制式語音編解碼算法的DSP設(shè)計(jì) 3次下載
- 詳解G.723.1算法在DSP上的優(yōu)化 0次下載
- 基于DSP的語音編解碼算法G.723.1優(yōu)化分析 0次下載
- 基于DSP的G.723.1語音編碼算法實(shí)現(xiàn)方案分析 1次下載
- G.7xx語音編解碼模塊及在AD218X上的實(shí)現(xiàn) 0次下載
- 在DSP上G.729A算法的優(yōu)化
- G.726語音編解碼器在SoPC中的實(shí)現(xiàn)
- 三代移動(dòng)通信變速率語音編解碼AMR-WB+算法優(yōu)化
- G7231算法在DSP上的優(yōu)化
- G.726語音編解碼器在SoPC中的實(shí)現(xiàn)
- 基于TMS320C6713的G.723.1語音編解碼的實(shí)時(shí)實(shí)
- G.723.1 語音壓縮算法的分析及DSP實(shí)現(xiàn)
- MAXQ3120在編解碼應(yīng)用中的應(yīng)用 674次閱讀
- 基于TMS320C6203 DSP芯片實(shí)現(xiàn)G.729ab聲碼器的應(yīng)用方案 2874次閱讀
- 新唐科技語音頻段編解碼器簡介 2171次閱讀
- SinoV-100AI單網(wǎng)口單FXS IAD語音網(wǎng)關(guān)詳細(xì)參數(shù)介紹 2399次閱讀
- 淺談SinoV-200I 2FXS IAD語音網(wǎng)關(guān) 2138次閱讀
- 淺析基于嵌入式DSP的流媒體解決方案 1160次閱讀
- 詳解DSP和FPGA在汽車電子中的廣泛應(yīng)用 1919次閱讀
- 基于TI Soc OMAP4430異構(gòu)多核處理器的H264編解碼 1640次閱讀
- 關(guān)于音頻編解碼器EVS及用好要做的準(zhǔn)備工作詳解 5880次閱讀
- 音頻的編解碼簡述及其優(yōu)化方法 4242次閱讀
- FFMPEG視頻編解碼流程 H.264硬件編解碼實(shí)現(xiàn) 1.8w次閱讀
- 分析了各主流編解碼器的優(yōu)勢(shì)與不足,并對(duì)編解碼器的選擇給出建議 1.4w次閱讀
- 數(shù)字視頻編解碼技術(shù)回顧及展望 1047次閱讀
- 音頻編解碼器技術(shù) 4925次閱讀
- 基于DSP的雙通道數(shù)字語音監(jiān)錄器設(shè)計(jì) 1231次閱讀
下載排行
本周
- 1電子電路原理第七版PDF電子教材免費(fèi)下載
- 0.00 MB | 1489次下載 | 免費(fèi)
- 2單片機(jī)典型實(shí)例介紹
- 18.19 MB | 91次下載 | 1 積分
- 3S7-200PLC編程實(shí)例詳細(xì)資料
- 1.17 MB | 27次下載 | 1 積分
- 4筆記本電腦主板的元件識(shí)別和講解說明
- 4.28 MB | 18次下載 | 4 積分
- 5開關(guān)電源原理及各功能電路詳解
- 0.38 MB | 9次下載 | 免費(fèi)
- 6基于AT89C2051/4051單片機(jī)編程器的實(shí)驗(yàn)
- 0.11 MB | 4次下載 | 免費(fèi)
- 7基于單片機(jī)和 SG3525的程控開關(guān)電源設(shè)計(jì)
- 0.23 MB | 3次下載 | 免費(fèi)
- 8基于單片機(jī)的紅外風(fēng)扇遙控
- 0.23 MB | 3次下載 | 免費(fèi)
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234313次下載 | 免費(fèi)
- 2PADS 9.0 2009最新版 -下載
- 0.00 MB | 66304次下載 | 免費(fèi)
- 3protel99下載protel99軟件下載(中文版)
- 0.00 MB | 51209次下載 | 免費(fèi)
- 4LabView 8.0 專業(yè)版下載 (3CD完整版)
- 0.00 MB | 51043次下載 | 免費(fèi)
- 5555集成電路應(yīng)用800例(新編版)
- 0.00 MB | 33562次下載 | 免費(fèi)
- 6接口電路圖大全
- 未知 | 30319次下載 | 免費(fèi)
- 7Multisim 10下載Multisim 10 中文版
- 0.00 MB | 28588次下載 | 免費(fèi)
- 8開關(guān)電源設(shè)計(jì)實(shí)例指南
- 未知 | 21539次下載 | 免費(fèi)
總榜
- 1matlab軟件下載入口
- 未知 | 935053次下載 | 免費(fèi)
- 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
- 78.1 MB | 537791次下載 | 免費(fèi)
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420026次下載 | 免費(fèi)
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234313次下載 | 免費(fèi)
- 5Altium DXP2002下載入口
- 未知 | 233045次下載 | 免費(fèi)
- 6電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191183次下載 | 免費(fèi)
- 7十天學(xué)會(huì)AVR單片機(jī)與C語言視頻教程 下載
- 158M | 183277次下載 | 免費(fèi)
- 8proe5.0野火版下載(中文版免費(fèi)下載)
- 未知 | 138039次下載 | 免費(fèi)
評(píng)論
查看更多