基于TMS320C6201的G.723.1多通道語(yǔ)音編解碼的實(shí)現
2008/06/03
當前,Voice over IP(VoIP)技術(shù)正在不斷普及,通過(guò)Internet的語(yǔ)音通信量也日漸增加。目前VoIP中使用的低碼率語(yǔ)音壓縮標準主要有G.723.1和G.729兩種。隨著(zhù)VoIP技術(shù)的不斷發(fā)展,要求產(chǎn)品的集成度與性能進(jìn)一步提高,利用新一代高性能DSP芯片,實(shí)現單片DSP處理多路語(yǔ)音信號,是今后的發(fā)展趨勢。本文根據C6201芯片的特點(diǎn),作了大量針對G.723.1標準本身的優(yōu)化,降低了運算量,滿(mǎn)足了多路信號的實(shí)時(shí)實(shí)現。
1 G.723.1標準介紹
G.723.1標準是ITU組織于1996年推出的一種低碼率編碼算法。主要用于對語(yǔ)音及其他多媒體聲音信號的壓縮,如可視電話(huà)系統、數字傳輸系統和高質(zhì)語(yǔ)音壓縮系統等。
G.723.1標準可在6.3kbps和5.3kbps兩種碼率下工作。其中,高碼率算法具有較高的重建語(yǔ)音質(zhì)量,而低碼率算法的計算復雜度則較低。與一般的低碼率語(yǔ)音編碼算法一樣,G.723.1標準采用線(xiàn)性預測的合成分析法(Analysis-by-Synthesis)。對激勵信號進(jìn)行量化時(shí),高碼率算法采用多脈沖最大似然量化(MP-MLQ),而低碼率算法則采用算術(shù)碼本激勵線(xiàn)性預測(ACELP)。目前,G.723.1已經(jīng)能在多種DSP芯片上實(shí)現,如美國TI公司的TMS320C5x、TMS320C54x和朗訊科技公司的DSP16xx等。
G.723.1編碼器能對以8kHz采樣的話(huà)帶語(yǔ)音信號進(jìn)行壓縮,其結構框圖見(jiàn)圖1(a)。從圖中可以看出,編碼器是基于線(xiàn)性預測合成分析法原理,其目的是最小化感知加權誤差信號。為了降低碼率,G.723.1采用了較長(cháng)的幀尺寸,每幀240個(gè)樣值,即30毫秒幀長(cháng)。每幀輸入信號首先通過(guò)一階高通濾波器濾除直流分量,然后將之分成四個(gè)60個(gè)樣值的子幀,每個(gè)子幀獨立進(jìn)行LPC分析。為了提高LPC系數的連續性,采用了長(cháng)度為180個(gè)樣值的重疊窗,即同時(shí)包含前后兩個(gè)子幀,這使算法引入60個(gè)樣值的超前時(shí)延,因此算法的總時(shí)延為37.5毫秒。LPC系數用線(xiàn)性譜頻率(LSF)表示,LSF參數采用預測分裂矢量量化,只對第四子幀進(jìn)行。為了提高量化感知質(zhì)量,高通濾波后的語(yǔ)音信號需通過(guò)共振峰感知加權濾波器和諧振峰噪聲整形濾波器以生成初始目標信號。前者參數由各子幀的未量化LPC系數構成,后者通過(guò)對每?jì)勺訋M(jìn)行開(kāi)環(huán)基音周期估計得到,其中基音周期的范圍為18到142個(gè)樣值。lpc合成濾波器、共振峰感知加權濾波器和諧振峰噪聲整形濾波器用于系統零輸入響應計算和最佳激勵估計。G.723.1編碼器還包括一個(gè)五階基音預測器,其參數根據開(kāi)環(huán)基音估計值和脈沖響應進(jìn)行閉環(huán)基音搜尋得到。在進(jìn)行最佳激勵估計時(shí),需從初始目標信號中減去系統零輸入響應和基音預測器貢獻以得到最終目標信號,然后針對高低碼率分別采用MP-MLQ和ACELP方法進(jìn)行量化。其中LSF參數、基音值和激勵參數需傳送給解碼器。
解碼器首先根據得到的LSF參數重建LPC合成濾波器,然后根據基音值和激勵參數得到自適應碼本激勵信號和固定碼本激勵信號。為了提高重建語(yǔ)音的主觀(guān)質(zhì)量,解碼器還包括一個(gè)后濾波器,后濾波器由共振峰和基音后濾波器組成。激勵信號依次通過(guò)基音后濾波器、合成濾波器和共振峰后濾波器合成重建語(yǔ)音,其結構框圖見(jiàn)圖1(b)。

3 標準的實(shí)現
用C6201實(shí)現G.723.1標準的最大優(yōu)勢在于它極強的并行處理能力,用一塊DSP可以實(shí)現多路語(yǔ)音的壓縮,大大簡(jiǎn)化了硬件的設計。C6201是TI公司推出的第一種支持C編譯器的DSP芯片。通常,C編譯器能完成整個(gè)工作的70%,而30%的進(jìn)一步優(yōu)化必須通過(guò)手寫(xiě)匯編來(lái)實(shí)現,所以對整個(gè)程序的優(yōu)化分為C語(yǔ)言級和匯編語(yǔ)言級兩部分。
3.1 C語(yǔ)言級的優(yōu)化
3.1.1 循環(huán)展開(kāi)(loop-unrolling)
使用具有并行能力的DSP開(kāi)發(fā)軟件時(shí),一個(gè)重要的思想就是充分利用DSP的字長(cháng)和數目眾多的運算單元,盡量把循環(huán)體展開(kāi)。通過(guò)增加每次循環(huán)中執行的指令數來(lái)減少總的循環(huán)次數,可使得在同樣的時(shí)鐘周期內能運行更多的指令,提高了循環(huán)的效率。

3.1.2 提高寄存器的利用率
DSP芯片內部的運算單元運行效率非常高,但如果寄存器和數據總線(xiàn)之間的數據交換頻繁,將使DSP的執行效率大打折扣。因為DSP在進(jìn)行內存操作時(shí),往往需要若干周期的延遲,如Load指令要有4個(gè)周期的延遲,STORE指令需要2個(gè)周期的延遲。為了減少耗時(shí)的內存操作,可以在程序進(jìn)入循環(huán)體之前,將要頻繁使用的數據預先放入寄存器,然后反復調用,實(shí)踐證明這種方法可以提高一部分效率。
3.1.3 使用內在函數(Intrinsic)
內在函數是在某些C6201DSP的匯編指令前加上“_”構成它可以方便地實(shí)現某些需若干C語(yǔ)句才能實(shí)現的功能。它是一種非常簡(jiǎn)便高效的優(yōu)化方法,它的調用格式和普通C函數一樣,但在編譯時(shí)編譯器會(huì )自動(dòng)將Intrinsic用對應的匯編指令替代。C6201指令集中絕大多數的運算邏輯指令都可以這樣使用,比如飽和絕對值、飽和加、飽和減、飽和乘、兩個(gè)字中的對應半字同時(shí)加或同時(shí)減、兩個(gè)字中的對應半字同時(shí)乘或交叉乘、歸一化及位操作等。經(jīng)過(guò)此步優(yōu)化后,大部分循環(huán)體都可以生成較為有效的流水內核(piplinedkernel)。用Intrinsic替代G.723.1原先的C代碼,運算量下降為原來(lái)的1/10。
3.1.4 對算法的冗余部分合理精簡(jiǎn)
經(jīng)過(guò)檢查,發(fā)現ITU-TG.723.1的C代碼存在冗余部分。象6.3K碼率的MP-MLQ搜索模塊中,只需要用到偶數位置的脈沖響應的自相關(guān),所以對奇數位置的脈沖響應自相關(guān)計算可以省略。
另外,在G.723.1標準中存在大量的10階FIR和10階IIR濾波器運算,如編碼部分的感知加權、零輸入響應、解碼部分綜合濾波器和后濾波等,FIR和IIR的通用形式可以表示為:


每次循環(huán),FIR濾波器內存要用新的輸入值更新,IIR濾波器內存要用新的輸出值更新,使用按標準提供的算法,要專(zhuān)門(mén)用一個(gè)10階循環(huán)更新內存。如果用一個(gè)10單位大小的循環(huán)緩存區,每次用新值覆蓋最老的樣值,動(dòng)態(tài)調整循環(huán)緩存區的頭指針,可以節省原先用于內存更新的cycle。
3.2 匯編級優(yōu)化
由于C編譯器只能完成70%的工作且對于復雜的循環(huán),C編譯器無(wú)法生成高效率的代碼,所以對運算量大的模塊只能用手寫(xiě)匯編。
3.2.1 字長(cháng)優(yōu)化
C6201的字長(cháng)為32位,它支持按字節、半字、字存取。對于16位的數組,當它在內存中連續排列時(shí),用32位讀寫(xiě)指令LDW或STW替代16位讀寫(xiě)指令LDH或STH,循環(huán)次數可減少一半。另外,C6201的匯編指令支持兩個(gè)32位寄存器的高16位和低16位之間互乘,結果分別放到不同的寄存器中,互不影響。具體指令為SMPY(LxL)、SMPYH(HxH)、SMPYHL(HxL)和SMPYLH(LxH)。通過(guò)字長(cháng)優(yōu)化,可以大大提高程序的運行效率。必須注意的是,在使用字長(cháng)優(yōu)化時(shí),數組在內存中的位置必須對齊32位邊界。
3.2.2 對外循環(huán)的優(yōu)化
C6201的C編譯器對多重循環(huán)的最內層一般能較好地優(yōu)化到一句到兩句,但對外循環(huán)的優(yōu)化效率則差很多。手寫(xiě)匯編時(shí),可以先將內循環(huán)展開(kāi),再把外循環(huán)的指令并入其中,可以減少所耗費的cycle數。
C6201的循環(huán)一般分前導(Rorlog)、內核(Kernel)及排空(Epilog)三部分。代碼的并行程度從Rrolog開(kāi)始不斷提高,Kernel內的并行程度最高,Epilog與Prolog相反,并行性逐漸降低。在多重循環(huán)中,如果盡量把內循環(huán)前導部分的指令與填入排空部分未用的單元,一起執行,可以在執行本次循環(huán)的排空語(yǔ)句的同時(shí)執行下次循環(huán)的前導語(yǔ)句。這樣可不多花cycle而提高整個(gè)循環(huán)的效率。
4 實(shí)現結果
經(jīng)過(guò)C語(yǔ)言級和匯編級的多種優(yōu)化,最后實(shí)現了一路G.723.1的編解碼需要花費10.6MCPS,整個(gè)代碼的程序空間為208K byte(程序中包括了部分c6201的庫函數),數據空間為8K byte,碼本大小20k byte,多通道的上下文數據為1.48K byte。200MHz的C6201每秒可以實(shí)時(shí)編解碼16路語(yǔ)音信號。所有代碼全部通過(guò)了ITU-T測試矢量的測試。表1是各主要模塊的運算量。
表1 G.723.1各主要模塊運算量

本文提出的利用C6201 DSP進(jìn)行ITU-TG.723.1全雙工實(shí)時(shí)多通道語(yǔ)音編解碼的實(shí)現。該實(shí)現可以在IP電話(huà)、視頻會(huì )議中得到廣泛應用。
嵌入式開(kāi)發(fā)網(wǎng)
相關(guān)鏈接:
亚洲精品网站在线观看不卡无广告,国产a不卡片精品免费观看,欧美亚洲一区二区三区在线,国产一区二区三区日韩
天柱县|
元谋县|
昌都县|
怀仁县|
新建县|
包头市|
略阳县|
沁阳市|
玛曲县|
东山县|
杂多县|
娱乐|
建宁县|
家居|
南宫市|
泽普县|
图片|
宁城县|
藁城市|
吉水县|
泗阳县|
当涂县|
湟中县|
枣阳市|
花垣县|
安陆市|
昆山市|
商南县|
同江市|
庆阳市|
卢氏县|
辛集市|
逊克县|
阳信县|
桃园县|
云霄县|
清新县|
玛沁县|
凤庆县|
新巴尔虎左旗|
定远县|
http://444
http://444
http://444
http://444
http://444
http://444