<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于TMS320C6201的G.723.1多通道語音編解碼的實(shí)現(xiàn)

          基于TMS320C6201的G.723.1多通道語音編解碼的實(shí)現(xiàn)

          作者: 時(shí)間:2008-06-02 來源:嵌入式開發(fā)網(wǎng) 收藏

            3.1.2 提高寄存器的利用率

          本文引用地址:http://www.ex-cimer.com/article/83480.htm

            芯片內(nèi)部的運(yùn)算單元運(yùn)行效率非常高,但如果寄存器和數(shù)據(jù)總線之間的數(shù)據(jù)交換頻繁,將使的執(zhí)行效率大打折扣。因?yàn)?a class="contentlabel" href="http://www.ex-cimer.com/news/listbylabel/label/DSP">DSP在進(jìn)行內(nèi)存操作時(shí),往往需要若干周期的延遲,如Load指令要有4個(gè)周期的延遲,Store指令需要2個(gè)周期的延遲。為了減少耗時(shí)的內(nèi)存操作,可以在程序進(jìn)入循環(huán)體之前,將要頻繁使用的數(shù)據(jù)預(yù)先放入寄存器,然后反復(fù)調(diào)用,實(shí)踐證明這種方法可以提高一部分效率。

            3.1.3 使用內(nèi)在函數(shù)(Intrinsic)

            內(nèi)在函數(shù)是在某些C6201DSP的匯編指令前加上“_”構(gòu)成它可以方便地實(shí)現(xiàn)某些需若干C語句才能實(shí)現(xiàn)的功能。它是一種非常簡便高效的優(yōu)化方法,它的調(diào)用格式和普通C函數(shù)一樣,但在編譯時(shí)編譯器會(huì)自動(dòng)將Intrinsic用對應(yīng)的匯編指令替代。C6201指令集中絕大多數(shù)的運(yùn)算邏輯指令都可以這樣使用,比如飽和絕對值、飽和加、飽和減、飽和乘、兩個(gè)字中的對應(yīng)半字同時(shí)加或同時(shí)減、兩個(gè)字中的對應(yīng)半字同時(shí)乘或交叉乘、歸一化及位操作等。經(jīng)過此步優(yōu)化后,大部分循環(huán)體都可以生成較為有效的流水內(nèi)核(piplinedkernel)。用Intrinsic替代G.723.1原先的C代碼,運(yùn)算量下降為原來的1/10。

            3.1.4 對算法的冗余部分合理精簡

            經(jīng)過檢查,發(fā)現(xiàn)ITU-T G.723.1的C代碼存在冗余部分。象6.3k碼率的MP-MLQ搜索模塊中,只需要用到偶數(shù)位置的脈沖響應(yīng)的自相關(guān),所以對奇數(shù)位置的脈沖響應(yīng)自相關(guān)計(jì)算可以省略。

            另外,在G.723.1標(biāo)準(zhǔn)中存在大量的10階FIR和10階IIR濾波器運(yùn)算,如編碼部分的感知加權(quán)、零輸入響應(yīng)、解碼部分綜合濾波器和后濾波等,FIR和IIR的通用形式可以表示為:

            每次循環(huán),FIR濾波器內(nèi)存要用新的輸入值更新,IIR濾波器內(nèi)存要用新的輸出值更新,使用按標(biāo)準(zhǔn)提供的算法,要專門用一個(gè)10階循環(huán)更新內(nèi)存。如果用一個(gè)10單位大小的循環(huán)緩存區(qū),每次用新值覆蓋最老的樣值,動(dòng)態(tài)調(diào)整循環(huán)緩存區(qū)的頭指針,可以節(jié)省原先用于內(nèi)存更新的cycle。

            3.2 匯編級優(yōu)化

            由于C編譯器只能完成70%的工作且對于復(fù)雜的循環(huán),C編譯器無法生成高效率的代碼,所以對運(yùn)算量大的模塊只能用手寫匯編。

            3.2.1 字長優(yōu)化

           ?。茫叮玻埃钡淖珠L為32位,它支持按字節(jié)、半字、字存取。對于16位的數(shù)組,當(dāng)它在內(nèi)存中連續(xù)排列時(shí),用32位讀寫指令LDW或STW替代16位讀寫指令LDH或STH,循環(huán)次數(shù)可減少一半。另外,C6201的匯編指令支持兩個(gè)32位寄存器的高16位和低16位之間互乘,結(jié)果分別放到不同的寄存器中,互不影響。具體指令為SMPY(L×L)、SMPYH(H×H)、SMPYHL(H×L)和SMPYLH(L×H)。通過字長優(yōu)化,可以大大提高程序的運(yùn)行效率。必須注意的是,在使用字長優(yōu)化時(shí),數(shù)組在內(nèi)存中的位置必須對齊32位邊界。

            3.2.2 對外循環(huán)的優(yōu)化

            C6201的C編譯器對多重循環(huán)的最內(nèi)層一般能較好地優(yōu)化到一句到兩句,但對外循環(huán)的優(yōu)化效率則差很多。手寫匯編時(shí),可以先將內(nèi)循環(huán)展開,再把外循環(huán)的指令并入其中,可以減少所耗費(fèi)的cycle數(shù)。

           ?。茫叮玻埃钡难h(huán)一般分前導(dǎo)(Prolog)、內(nèi)核(Kernel)及排空(Epilog)三部分。代碼的并行程度從Prolog開始不斷提高,Kernel內(nèi)的并行程度最高,Epilog與Prolog相反,并行性逐漸降低。在多重循環(huán)中,如果盡量把內(nèi)循環(huán)前導(dǎo)部分的指令與填入排空部分未用的單元,一起執(zhí)行,可以在執(zhí)行本次循環(huán)的排空語句的同時(shí)執(zhí)行下次循環(huán)的前導(dǎo)語句。這樣可不多花cycle而提高整個(gè)循環(huán)的效率。

            4 實(shí)現(xiàn)結(jié)果

            經(jīng)過C語言級和匯編級的多種優(yōu)化,最后實(shí)現(xiàn)了一路G.723.1的編解碼需要花費(fèi)10.6MCPS,整個(gè)代碼的程序空間為208K byte(程序中包括了部分c6201的庫函數(shù)),數(shù)據(jù)空間為8K byte,碼本大?。玻埃?byte,多通道的上下文數(shù)據(jù)為1.48K byte。200MHz的C6201每秒可以實(shí)時(shí)編解碼16路語音信號。所有代碼全部通過了ITU-T測試矢量的測試。表1是各主要模塊的運(yùn)算量。

          表1 G.723.1各主要模塊運(yùn)算量

            本文提出的利用C6201 DSP進(jìn)行ITU-T G.723.1全雙工實(shí)時(shí)多通道語音編解碼的實(shí)現(xiàn)。該實(shí)現(xiàn)可以在IP電話、視頻會(huì)議中得到廣泛應(yīng)用。


          上一頁 1 2 下一頁

          關(guān)鍵詞: VoIP DSP 語音編碼

          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();