一、G.729編碼器介紹 G.729是電信聯盟(ITU,InternationalecommunicationUnion)于1996年推出的采用共軛結構-代數碼激勵線性預測(CS-ACELP,Conjugate-StructureAlgebraic-Code-ExcitedLinear-Predication)技術的具有8kbit/s碼率的語音編碼算法建議,該算法是以語音編碼方案中的碼激勵線性預測(CELP,CodeExcitedLinearPredication)技術為基礎提出的,其原理如圖1所示。
G.729是一種單聲道語音信號的壓縮編碼算法,模擬信號經過話帶濾波器后,按8KHz的頻率采樣并轉換成16bit的線性PCM信號(即128kbit/s的碼流),這就是圖中所示的G.729編碼器的輸入語音信號。G.729編碼器以10ms的輸入幀(80個采樣點)為單位進行編碼。G.729編碼器的輸出為8kbit/s的碼流,因此其壓縮比高達16:1。而經G.729解碼器還原后的聲音質量卻達到了相當高的水準,其主觀平均得分(MOS,MeanOpinionScore)在4分以上(MOSzui高得分為5分),屬于良好級別,人的耳朵幾乎察覺不到聲音有失真的情況,音質與碼率為64kbit/s的G.711編碼標準相近,而占用的帶寬僅為G.711的1/8。另外G.729編碼算法的延時較小,在15ms左右。
雖然G.729具有較低的碼率、較高的還原音質和較小的延時等優點,但是由于其存在算法復雜度大和數據存儲量大的固有缺陷,在早期并沒有得到廣泛的實際應用。后來隨著超大規模集成電路VSLI工藝的進步,極大地推動數字信號處理器(DSP)技術的發展,各大廠商紛紛推出了各具特色的高性能DSP,也大大降低了實現G.729語音編碼算法的成本。目前,G.729已經廣泛應用于諸如、會議電視、數字音視頻監控等領域。
二、TrimediaTM1300處理器
TM1300處理器是Philips公司推出的一款32位性能優良的多媒體處理芯片,特別針對數字視頻和音頻應用進行了優化,集成了視頻輸入/輸出接口、音頻輸入/輸出接口、IIC接口、PCI接口、SDRAM控制器等外圍設備接口,極大地簡化了外圍電路的設計,提高了系統的穩定性、可靠性,降低了系統的總體成本。因此TM1300處理器在音視頻處理卡、多媒體嵌入式設備中得到了廣泛的應用。
TM1300處理器*的的多媒體處理性能得益于其核心CPU、多媒體操作指令集和存儲器體系結構的設計。TM1300的核心是32位的超長指令字結構(VLIW,Very-LongInstructionWord)的處理器,內部有11種共27個執行單元,在每一個時鐘周期內zui多可以同時安排5個執行單元進行5個操作,如圖2所示。
TM1300的指令
TM1300有一整套專門針對多媒體運算的DSP操作指令,每一個操作可以執行多個算術運算,比如操作UIFIR8UU(a,b)包括4個乘法運算和1個加法運算,這使TM1300具有強大的多媒體數據處理能力。而這些DSP操作指令都可以在C程序中直接調用,大大方便了編程。TM1300處理器內部含有128個通用寄存器,這些寄存器不是分段的,所有操作都能使用這些寄存器。TM1300使用32位線性尋址,尋址能力達到4GB,同時為了解決高速VLIWCPU和低速外存SDRAM之間的數據交換瓶頸,TM1300內部集成了16KB的高速數據緩存和32KB的高速指令緩存(CACHE),以確保VLIWCPU的全速運行。TM1300的二進制運行代碼以壓縮的格式存放在SDRAM和指令CACHE中,壓縮的代碼一方面可以提高指令CACHE的命中率,另一方面可以減少指令CACHE與SDRAM之間的數據交換。指令CACHE中有一個專門的指令解壓機構,它負責解壓縮指令并以224位的數據位寬向VLIWCPU提供指令。而其數據CACHE是雙端口的,其數據位寬達64位,并且VLIWCPU與緩存之間是以CPU的運行頻率交換數據的。
TM1300處理器的音頻輸入單元(AI)外接A/D轉換器,支持1個或2個聲道的音頻輸入采樣,每個采樣點可以設為8位或16位,可以工作在主模式或從模式,支持標準立體聲IIS格式和左對齊格式,采樣的數據通過雙DMA通道直接存放在SDRAM中,通過中斷方式通知CPU,減輕了CPU的負擔。
三、G.729在TM1300上的優化、實現 電信聯盟ITU在推出G.729編解碼器算法的建議的同時,給出了G.729算法的一種軟件參考實現,也給出了一組測試向量,用以驗證軟件的正確性。該軟件采用移植性較好的ANSIC語言編寫的,因此可以在許多硬件平臺上編譯、運行。但是由于軟件采用的是16位定點運算,而且沒有針對任何硬件平臺做任何優化,也沒有考慮并行運算,所以要充分發揮32位的TM1300CPU的強勁性能,降低實現成本,必須經過大量的優化工作。代碼優化過程是一個不斷調整改造程序、利用測試向量驗證正確性和查看系統資源消耗(主要指CPU占用率和所需內存)的過程,我們主要做了下列優化工作。
1、參考軟件采用的是16位定點運算,而TM1300是32位的處理器,因此我們把2個
16位的音頻采樣數據合成一個32位的數據,把絕大部分程序改造成32位定點運算的程序。
2、參考軟件中包含了一組用函數實現的基本操作,包括16位加法、減法、乘法、取飽和、左移、右移等函數,從程序運行的角度看,這些基本函數效率十分低,而且不利于提高程序的并行度。我們利用TM1300的DSP操作指令把大部分這種函數改成單操作指令。如原來的16位加法函數:
Word16add(Word16var1,Word16var2)
{
Word16var_out;
Word32L_somme;
L_somme=(Word32)var1+var2;
var_out=sature(L_somme);
return(var_out);
其中sature()又是‘取飽和’函數,把32位帶符號整數轉換成16位帶符號整數。利用TM1300的DSP操作指令,我們把它改成下面這樣一個宏定義:
#defineadd(var1,var2)((Word16)DSPIDUALADD((var1),(var2)))
3、充分利用TM1300的128個通用寄存器,函數的臨時變量盡量不要使用數組,而是直接用單個整數,因為TM1300編譯器把數組編譯成內存方式的變量,而單個整數的臨時變量則用寄存器來保存,這樣不但提高了運行速度,也有利于提高數據CACHE的命中率。
4、通過調整程序的流程來盡量提高程序的并行度,特別是耗時的函數,如改變循環的次數、步長等。TM1300的軟件開發工具SDE中包含有測試函數并行度的工具,可以查看單個函數的并行度。我們知道TM1300的zui高并行度為5,即1個時鐘周期執行5個操作,經過我們的優化,G.729編碼器的幾個重點函數的并行度達到了4.2以上。
5、在C語言程序中,直接調用TM1300的匯編指令,特別是針對多媒體運算的DSP操作,盡量選用能并行執行的操作。
6、充分使用TM1300的2個高速緩存:指令CACHE和數據CACHE,提高CACHE的命中率。對于程序,在不影響并行度的前提下,使程序盡量小,避免程序的大范圍跳轉,這樣可以提高指令CACHE的效率;TM1300的數據CACHE是以64字節為單位的,即每次從SDRAM讀入數據或把數據調出數據CACHE,至少是64個字節,因此在許多地方,我們對數據的存放位置進行了重新調整,使讀入CACHE的數據能被CPU充分利用。
通過上述優化措施,我們花比較低的代價在TM1300DSP上實現了G.729編碼器算法。在DSP主頻為175MHZ、SDRAM頻率為140MHZ的TM1300硬件平臺上,G.729編碼器完成實時語音編碼的CPU占用率為8%左右,并且通過了所有測試向量的驗證。
參考文獻
1、ITU-TRecommendationG.729,CodingofSpeechAt8kbit/sUsingConjugate-StructureAlgebraic-Code-ExcitedLinear-Prediction(CS-ACELP)
2、TriMediaTM1300DataBook