王春柳,陳德宏,申星海
(1.河海大學(xué) 文天學(xué)院 電氣信息工程系,安徽 馬鞍山 243031;2.安徽工業(yè)大學(xué) 電氣與信息工程學(xué)院,安徽 馬鞍山 243002)
G.729.1算法的改進(jìn)與DSP全匯編優(yōu)化設(shè)計
王春柳1,陳德宏2,申星海2
(1.河海大學(xué) 文天學(xué)院 電氣信息工程系,安徽 馬鞍山 243031;2.安徽工業(yè)大學(xué) 電氣與信息工程學(xué)院,安徽 馬鞍山 243002)
在G.729.1寬帶語音編碼算法中,時域混疊編碼器的譜包絡(luò)編碼根據(jù)幀內(nèi)子帶的相關(guān)性,采用差分霍夫曼編碼來減少編碼的比特分配。針對相鄰幀對應(yīng)子帶的譜包絡(luò)存在相關(guān)性,給出了在原有譜包絡(luò)編碼模式的基礎(chǔ)上,增加一種幀間對應(yīng)子帶差分霍夫曼編碼的模式來進(jìn)一步減少譜包絡(luò)的編碼比特數(shù),從而提高合成語音的質(zhì)量。由于G.729.1可以根據(jù)信道的特征隨時調(diào)整編碼速率以取得更好的寬帶語音質(zhì)量,這使得該編碼算法具有很高的復(fù)雜度。為了能在數(shù)字信號處理器 (digital signal processor, DSP)上實時實現(xiàn)G.729.1,結(jié)合TMS320VC5505數(shù)字信號處理器對G.729.1算法采用全匯編實現(xiàn),并對匯編后的G.729.1代碼做了進(jìn)一步的匯編優(yōu)化,優(yōu)化后的G.729.1算法在保證了高質(zhì)量語音輸出的同時,提高了編碼效率,實現(xiàn)了對語音信號的實時處理。
寬帶語音;G.729.1; 譜包絡(luò)編碼;差分霍夫曼編碼;匯編優(yōu)化
G.729.1作為ITU-T提出的嵌入式寬帶語音編碼標(biāo)準(zhǔn)能夠根據(jù)各個終端設(shè)備的能力及傳輸鏈路的傳輸能力,靈活地對編碼比特流進(jìn)行截斷,使得編碼器具有可分級性。它被廣泛應(yīng)用于分組語音傳輸、高質(zhì)量的視頻或音頻會議、網(wǎng)絡(luò)擁塞控制及各種多媒體通信系統(tǒng)中[1-3]。它提供了在8~32 kbit/s之間的12種可選速率,并且用戶可以根據(jù)信道的實際狀況對碼流速率作相應(yīng)調(diào)整,這種根據(jù)網(wǎng)絡(luò)狀況靈活調(diào)整比特率的方法使G.729.1具有較好的適應(yīng)能力,避免了網(wǎng)絡(luò)擁塞,提高了整體服務(wù)質(zhì)量。
圖1 TDAC編碼原理框圖Fig.1 Block diagram of the TDAC encoder
由圖1可以看出,TDAC編碼器對低頻端重建加權(quán)差值譜信號和高頻譜信號進(jìn)行譜合并,組成了全頻帶的譜信號。對全頻帶譜信號先進(jìn)行粗編碼,即對變換后的譜系數(shù)(320)組成18個子帶,每個子帶先進(jìn)行譜包絡(luò)編碼,然后再細(xì)量化,即對每個子帶的各個譜系數(shù)再進(jìn)行球形矢量量化。由于TDAC編碼器分配的總比特數(shù)是一定的,因此,子帶譜包絡(luò)編碼分配的比特數(shù)越少,對子帶各個譜系數(shù)分配的比特數(shù)就越多,細(xì)節(jié)描述就更準(zhǔn)確,得到的語音質(zhì)量就越高。G.729.1中的譜包絡(luò)編碼利用幀內(nèi)18個子帶的相關(guān)性,對一幀內(nèi)的相鄰子帶進(jìn)行差分去相關(guān),而幀內(nèi)相鄰子帶差分之后的譜包絡(luò)能量往往集中在較小的動態(tài)范圍內(nèi),即采用不等長霍夫曼編碼,可以進(jìn)一步降低編碼比特數(shù)。
本文根據(jù)語音幀與幀對應(yīng)子帶之間的譜包絡(luò)具有很大的相關(guān)性,可以利用幀與幀對應(yīng)子帶的相關(guān)性,進(jìn)行差分去相關(guān)處理,對幀間對應(yīng)子帶差分后的信號采用霍夫曼編碼也可以減少譜包絡(luò)的比特分配,然而對不同種類的語音信號,對幀內(nèi)相鄰子帶采用差分霍夫曼編碼模式所分配的比特數(shù)和對語音的相鄰幀對應(yīng)子帶采用差分霍夫曼編碼模式分配的比特數(shù)各有優(yōu)劣,因此,為了使用分配比特數(shù)較少的模式,可以同時保留這2種模式,對每一幀的譜包絡(luò)編碼都計算這2種模式的編碼比特數(shù),采用1 bit來選擇編碼比特數(shù)較小的那種模式,有利于解碼端恢復(fù)譜包絡(luò)的編碼模式。
由于G.729.1可以根據(jù)信道的特征隨時調(diào)整編碼速率以取得更好的寬帶語音質(zhì)量,這使得該編碼算法具有較高的復(fù)雜度。在工程應(yīng)用中,為了達(dá)到實時處理的目的,文獻(xiàn)[6]采用DM642對G.729.1進(jìn)行簡單的算法優(yōu)化和C語言級別上的優(yōu)化,但該優(yōu)化沒有充分利用DSP C6000系列的結(jié)構(gòu)特點,優(yōu)化效率不高,且C6000系列價格昂貴,因此,采用該系列DSP對G.729.1進(jìn)行處理,性價比不高。文獻(xiàn)[7]采用ARM926EJ為核心的S3C2450處理器對G.729.1進(jìn)行C語言函數(shù)結(jié)構(gòu)和部分匯編優(yōu)化相結(jié)合的優(yōu)化方式,但這種優(yōu)化的可移植性較差,不利于工程應(yīng)用中的直接封裝使用。本文利用C55x系列DSP的低功耗,對數(shù)字信號處理快的特點,在TMS320VC5505 DSP芯片上給出了一種便于編寫、調(diào)試的G.729.1全匯編開發(fā)方案。通過對G.729.1編解碼算法的匯編編寫、調(diào)試,并進(jìn)一步對G.729.1匯編代碼做匯編優(yōu)化,如并行指令、循環(huán)體優(yōu)化、流水線優(yōu)化等。匯編優(yōu)化后的G.729.1代碼可實時處理,并且在工程應(yīng)用中可直接封裝使用并為后續(xù)G.729.1算法的優(yōu)化研究奠定了基礎(chǔ)。
1.1 G.729.1譜包絡(luò)編碼
(1)
得到18個譜包絡(luò)后,對每個譜包絡(luò)參數(shù)進(jìn)行5bit均勻標(biāo)量量化,其限定量化結(jié)果為-11~+20的32個可能的數(shù)值,為了防止譜包絡(luò)log_rms(j)的值過多地超出限定范圍,對其進(jìn)行了溢出處理,進(jìn)而得到索引rms_index(j)表示為
rms_index(j)=round(1/2log_rms(j)),
j=0,…,17
(2)
(2)式中;log_rms(j)為第j個譜包絡(luò);rms_index(j)為第j個量化的譜包絡(luò)。
量化后的全頻帶包絡(luò)分為2個子矢量:第1個子矢量是rms_index(0)~rms_index(9),該10維的子矢量為低頻帶包絡(luò);第2個矢量是rms_index(10)~rms_index(17),該8維的子矢量為高頻帶包絡(luò)。這2個子矢量的編碼在差分霍夫曼編碼(模式0)和直接自然二進(jìn)制編碼(模式1)之間進(jìn)行自適應(yīng)轉(zhuǎn)換。這是由于差分霍夫曼編碼可使平均編碼比特數(shù)變小,而直接自然二進(jìn)制編碼用于限制最壞情況的比特數(shù)。
該差分霍夫曼編碼在幀內(nèi)的譜包絡(luò)之間進(jìn)行編碼,一般包括以下4個步驟。
步驟1對取值為[-11,20]的第1個索引rms_index(0)進(jìn)行5 bit的自然二進(jìn)制編碼。
步驟2計算相鄰子帶的差分索引和飽和標(biāo)識satur。
diff_index(j)=rms_index(j)-
rms_index(j-1),j=1,…,9
(3)
(4)
(3)-(4)式中:rms_index(j)為第j個量化的譜包絡(luò);diff_index(j)為2個相鄰譜包絡(luò)的差值索引;satur為飽和標(biāo)志位。
步驟3如果satur=0,對于j=1,...,9的低頻差分索引diff_index(j)采用查表法進(jìn)行差分霍夫曼編碼,其霍夫曼表參見文獻(xiàn)[1]。
步驟4如果satur=1或者差分霍夫曼編碼的比特數(shù)大于45,則對rms_index(1),…,rms_index(9)進(jìn)行步驟1所述的自然二進(jìn)制編碼,并令satur=1。
1.2 譜包絡(luò)編碼的改進(jìn)
G.729.1中的譜包絡(luò)編碼利用幀內(nèi)18個子帶的相關(guān)性,對一幀內(nèi)的相鄰子帶進(jìn)行差分去相關(guān),而幀內(nèi)相鄰子帶差分之后的譜包絡(luò)能量往往集中在較小的動態(tài)范圍內(nèi),從而降低編碼比特數(shù)。對常出現(xiàn)的小信號用短碼表示,不常出現(xiàn)的大信號用長碼表示,即采用不等長霍夫曼編碼,可以進(jìn)一步降低編碼比特數(shù)。
由于譜包絡(luò)編碼分配的比特數(shù)與MDCT系數(shù)分配比特數(shù)的總和是固定的,共351 bit,而MDCT系數(shù)精度越高對語音頻譜細(xì)節(jié)的描述就越準(zhǔn)確,得到的語音質(zhì)量就越好。如果希望MDCT系數(shù)的比特分配越多,這就意味著譜包絡(luò)編碼分配的比特數(shù)越少越好,那么如何進(jìn)一步減少譜包絡(luò)編碼的比特數(shù)呢?一般情況下,語音幀之間的譜包絡(luò)存在很大的相關(guān)性,因此,可采用對幀間對應(yīng)子帶進(jìn)行差分去相關(guān),之后對去除相關(guān)性的對應(yīng)子帶信號采用霍夫曼編碼進(jìn)一步減少譜包絡(luò)的比特分配。文獻(xiàn)[8]表明,對不同種類的語音信號,G.729.1所采用的幀內(nèi)相鄰子帶進(jìn)行差分霍夫曼編碼模式所分配的比特數(shù)和本文所提的語音的相鄰幀對應(yīng)子帶采用差分霍夫曼編碼模式分配的比特數(shù)各有優(yōu)劣,因此,為了確定哪種模式分配的比特數(shù)較少,本文采用同時保留這2種模式的方法,對每幀的譜包絡(luò)編碼都計算這2種模式的編碼比特數(shù),然后進(jìn)行比較,用1 bit來選擇編碼比特數(shù)較小的那種模式,從而可使譜包絡(luò)編碼保持較少的分配比特數(shù)。
譜包絡(luò)編碼的具體步驟如下。
步驟1利用(1)式和(2)式計算連續(xù)相鄰幀的18個子帶的譜包絡(luò)值,并計算連續(xù)幀的對應(yīng)子帶譜包絡(luò)的差分為
diff(t,j)=rms_index(t,j)-rms_index(t-1,j)
(5)
(5)式中:rms_index(t,j)是第t幀第j個子帶的量化譜包絡(luò);diff(t,j)為相鄰幀對應(yīng)子帶譜包絡(luò)的差值索引。
步驟2對每幀得到各個譜包絡(luò)的差值進(jìn)行霍夫曼編碼,并計算分配的比特數(shù)。
步驟3比較幀內(nèi)相鄰子帶譜包絡(luò)編碼比特分配和相鄰幀對應(yīng)子帶譜包絡(luò)編碼比特分配,采用1 bit進(jìn)行模式選擇,哪種比特數(shù)少,則采用哪種模式,并輸出模式選擇標(biāo)志位。具體譜包絡(luò)編碼流程如圖2所示。
本文采用ITU-T提供的測試矢量tstseq1.in作為輸入語音,對G.729.1語音壓縮編碼進(jìn)行驗證,統(tǒng)計了1 000幀的語音信號。結(jié)果表明,采用改進(jìn)的譜包絡(luò)編碼使得該部分的編碼比特數(shù)減5 bit左右。由于TDAC編碼器分配的總比特數(shù)是一定的,改進(jìn)的子帶譜包絡(luò)編碼分配的比特數(shù)減少了5 bit,則表明對子帶各個譜系數(shù)分配的比特數(shù)就多了5 bit,細(xì)節(jié)描述就更準(zhǔn)確。通過采用ITU-T推出的WB_PESQ軟件系統(tǒng)對1 000幀的測試矢量tstseq1.in所合成語音的質(zhì)量進(jìn)行評估[9],實驗表明,該譜包絡(luò)方法比原來的譜包絡(luò)編碼方法所得到的感知語音質(zhì)量評價(perceptual evaluation of speech quality, PESQ)得分由原來的4.05提高到4.11,合成語音質(zhì)量所提高。
圖2 改進(jìn)的譜包絡(luò)編碼流程圖Fig.2 Flow of improved spectral envelope coding
由于該方法在原有編碼的基礎(chǔ)上增加了對相鄰幀對應(yīng)子帶的差分霍夫曼編碼模式,因此,TDAC編碼器算法的復(fù)雜度有所增加,執(zhí)行一幀的運算量由2 714 111 clock提高到2 759 413 clock,算法復(fù)雜度提高了1.67%。由于G.729.1算法本身的運算量較為龐大,而TDAC編碼器算法的復(fù)雜度只占G.729.1算法中的16.8%,因此,該部分算法復(fù)雜度對G.729.1整體算法的復(fù)雜度并沒有太大影響。但G.729.1的龐大的運算量影響其在工程上的實時實現(xiàn),本文對G.729.1采用全匯編優(yōu)化設(shè)計,解決了實時處理的問題。
TMS320VC5505是TI公司生產(chǎn)的16位定點DSP,在數(shù)字音頻設(shè)備、軟件無線電、便攜式醫(yī)療設(shè)備等領(lǐng)域得到廣泛應(yīng)用[10]。如果直接將C語言編寫的G.729.1編解碼算法加載到C55x DSP開發(fā)平臺進(jìn)行編譯,那么執(zhí)行一個語音超幀(20 ms)需要47 642 993個時鐘周期。對于TMS320VC5505的主頻為100 MHz,則執(zhí)行一個語音超幀需要476.4 ms,無法達(dá)到語音實時處理的目的。因此,為了能在C55x上實時實現(xiàn)G.729.1算法,本文對G.729.1進(jìn)行全匯編編寫和優(yōu)化。而一個合理的開發(fā)設(shè)計方案對程序的編寫和最后的調(diào)試有著至關(guān)重要的作用。本課題利用CCS3.3軟件開發(fā)平臺,開發(fā)一款能夠在DSP上實時處理的G.729.1寬帶語音編碼代碼,其總體開發(fā)流程如圖3所示。
圖3 基于DSP的G.729.1匯編開發(fā)總方案流程圖Fig.3 Flow of G.729.1 assembly development based on DSP
圖3描述了G.729.1總體開發(fā)方案流程。該方案首先把C代碼移植到CCS環(huán)境中,并解決移植過程出現(xiàn)的接口不匹配問題;然后對移植成功的C代碼進(jìn)行整體架構(gòu)的分析,制定整個代碼的開發(fā)方案,同時對各個模塊C代碼進(jìn)行參數(shù)精度和算法描述的解讀,制定各個模塊的匯編方案,匯編編寫并調(diào)試各模塊代碼,最后為了進(jìn)一步提高匯編優(yōu)化效率,從各方面對匯編代碼進(jìn)行優(yōu)化。
2.1 代碼的移植
由于G.729.1的源C文件是在Visual C++平臺上編寫的,由于CCS3.3對標(biāo)準(zhǔn)C不是百分之百完全兼容的,因此,需要進(jìn)行一定的修改才能將G.729.1算法移植到CCS3.3中。通過修改并在CCS3.3上編譯通過,移植成功后才可以進(jìn)行下一步的匯編編寫和優(yōu)化工作。
標(biāo)準(zhǔn)C代碼在CCS3.3平臺移植過程中存在的3個不足之處。
1)標(biāo)準(zhǔn)C代碼的main函數(shù)是帶參數(shù)的,這些參數(shù)可自動判斷輸入文件為什么類型,在CCS3.3中無法執(zhí)行,因而需要將其改為不帶參數(shù)的main函數(shù),人工輸入文件類型。
2)標(biāo)準(zhǔn)C代碼中的數(shù)據(jù)導(dǎo)入方式是通過fread語句從數(shù)據(jù)文件中讀入數(shù)據(jù),在CCS3.3中,fread讀一個16位整數(shù)時,只能讀出16位整數(shù)的一個字節(jié),這種方式讀入的數(shù)據(jù)格式不對,解決辦法有:①如果數(shù)據(jù)文件是.data格式,直接裝載到數(shù)據(jù)區(qū);②對于其他格式的數(shù)據(jù)文件,可以通過tool工具欄中的Memory Save/Load Utility工具將數(shù)據(jù)讀入指定數(shù)據(jù)區(qū);③可以通過fread將一個16位數(shù)據(jù)讀2次,并需要編程將2個讀出的8位合并成一個完整的16位數(shù)據(jù)。
3)源C程序移植到CCS3.3上,不僅要加入源文件,而且要與C運行庫進(jìn)行連接。由于C5505 有小模式(small memory model)和大模式(large memory model)之分,模式的選擇決定C運行庫的選擇,在大存儲器模式下,數(shù)據(jù)指針是23位,并在存儲器中占用2個字,大存儲器模式支持?jǐn)?shù)據(jù)的不嚴(yán)格存放,代碼段和數(shù)據(jù)段的長度和位置不會受到一定數(shù)據(jù)頁的限制,本文中在編譯器中設(shè)置-ml,選擇大模式。大模式對應(yīng)的C運行庫為rts55x.1ib。
將G.729.1源C文件載入TI 公司提供的集成開發(fā)環(huán)境C55xx Rev3.0 CPU Cycle Accurate Simulator。輸入語音信號,經(jīng)編解碼,將解碼得到的信號通過集成開發(fā)環(huán)境CCS3.3中Tools菜單條中的Memory Save/Load Utility來保存。其中,輸入的語音信號為ITU-T提供的測試語音test1_16k.in,將移植后的G.729.1編解碼輸出的.bit文件和.out 文件與之提供的測試文件逐比特進(jìn)行對比,完全一致,并通過Cool Edit Pro v2.0 進(jìn)行試聽,直到和原始測試文件聽不出任何不同,說明移植成功。
2.2 全匯編的編寫設(shè)計與調(diào)試
由于G.729.1程序規(guī)模較大,為了實現(xiàn)其全匯編編寫,需要制定一個合理的全匯編實現(xiàn)方案。本文結(jié)合C55x匯編語言和算法代碼的特點,在保證標(biāo)準(zhǔn)C代碼的結(jié)構(gòu)架構(gòu)不變的情況下,對C代碼結(jié)構(gòu)框架下的各個模塊逐個進(jìn)行匯編語言編寫,保證每個階段匯編替代的正確性,完成整個算法的全匯編實現(xiàn)。為了使程序結(jié)構(gòu)清晰,利于修改和調(diào)試,這種將復(fù)雜的算法分解為各個單獨的程序模塊分別實現(xiàn),可使編程變得相對容易,但也要求對C程序代碼非常熟悉,并對匯編指令了解透徹。這種思路雖然花費的時間較長,但易于在調(diào)試中發(fā)現(xiàn)和改正錯誤。
由于G.729.1包含的模塊眾多,而各個模塊匯編代碼編寫的順序并不是隨意的,而是根據(jù)函數(shù)之間的關(guān)系以及它們的復(fù)雜度大小制定的,編寫順序如下。
1)對于同一分支的函數(shù),因為子函數(shù)的編寫和調(diào)試比較容易,所以,先替換子函數(shù),即內(nèi)層函數(shù),在保證子函數(shù)的正確性后,再替換父函數(shù),即為外層函數(shù),采用由內(nèi)而外的替換順序,從而降低代碼開發(fā)和調(diào)試難度。
2)由于執(zhí)行一次G.729.1源代碼編的時間較長,對于同一層次的函數(shù),由它們的復(fù)雜度決定替換順序,采用優(yōu)先替代復(fù)雜函數(shù),這樣可以縮短編譯和連接的時間,從而確定復(fù)雜的函數(shù)先替換,簡單的函數(shù)后替換,從時間上縮短后面函數(shù)調(diào)試時間。
按照這2個原則逐一替換各個子函數(shù),從而完成父函數(shù)的全匯編編寫。
為了驗證各個模塊匯編代碼的正確性,本文使用ITU-T 提供的G.729.1相應(yīng)測試矢量test1_16k.in作為輸入信號,由于G.729.1包括12種編碼速率,即8~32 kbit/s,為了加快調(diào)試的速度,在程序中不能直接設(shè)置編碼速率為最高速率(32 kbit/s)。如果先編寫8 kbit/s所對應(yīng)的程序模塊,可設(shè)置編碼速率為8 kbit/s,這樣12~32 kbit/s所對應(yīng)的程序?qū)⒉粫?zhí)行,增加了編譯的速度,且便于調(diào)試。當(dāng)調(diào)試某一模塊,可在該模塊的結(jié)尾處設(shè)置斷點,一幀一幀調(diào)試,大概執(zhí)行10幀,如果該模塊的匯編結(jié)果與C語言結(jié)果相同 ,可認(rèn)為該模塊的匯編程序正確。
2.3 匯編優(yōu)化
匯編代碼執(zhí)行效率雖然很高,為了進(jìn)一步提高編寫效率,充分利用各種DSP的硬件資源,本文在匯編代碼的基礎(chǔ)上進(jìn)一步優(yōu)化以提高編碼效率。
2.3.1 實現(xiàn)高效循環(huán)
1)單循環(huán)指令RPT(CSR/k8/k16)。如果循環(huán)體中只有一條指令或一個并行指令對,則可以使用RPT指令實現(xiàn)。當(dāng)RPT CSR嵌套循環(huán)中使用時,CSR只需要在循環(huán)體之外初始化一次,單循環(huán)指令的效率很高,是實現(xiàn)循環(huán)的首選方式。
2)局部塊循環(huán)指令RPTBLOCAL{}。當(dāng)循環(huán)體的代碼長度不大于56 Byte的時候,可以使用RPTBLOCAL指令對指令緩存隊列中的循環(huán)體代碼塊執(zhí)行循環(huán)。局部塊循環(huán)避免了從內(nèi)存中重復(fù)讀取循環(huán)體代碼,從而減少了程序空間訪問的流水線沖突,如果循環(huán)代碼在外部RAM中,局部塊循環(huán)不會重復(fù)產(chǎn)生額外的等待,從整體上降低了功耗。在實現(xiàn)塊循環(huán)時,RPTBLOCAL指令是第1選擇。
3)塊循環(huán)指令RPTB{}。由于塊循環(huán)指令要重復(fù)地訪問內(nèi)存代碼,執(zhí)行效率不高,因此,在局部塊循環(huán)指令不能使用的情況下才會用塊循環(huán)指令實現(xiàn)循環(huán)。
4)跳轉(zhuǎn)指令。以上3種方法在實現(xiàn)循環(huán)時無需額外開銷,跳轉(zhuǎn)指令則至少需要5個指令的循環(huán)開銷。這種方法一般在多級(>2)嵌套循環(huán)里面使用。
為實現(xiàn)高效的循環(huán),應(yīng)盡量使用單循環(huán)指令和局部塊循環(huán)指令,避免使用跳轉(zhuǎn)指令來實現(xiàn)循環(huán)。如果塊循環(huán)的代碼長度大于56 Byte,可以采用下面2種措施來實現(xiàn)局部塊循環(huán):①將循環(huán)體拆分為2個長度較小的代碼塊;②將原循環(huán)中長度較大的指令用其他長度較小指令替代,最常見的就是去除立即數(shù)指令。碰到2級嵌套循環(huán),應(yīng)將內(nèi)層循環(huán)的塊循環(huán)計數(shù)器BRC1在外層循環(huán)體之前進(jìn)行初始化,這樣可以避免重復(fù)初始化帶來的額外指令。
2.3.2 宏優(yōu)化
對于長的或復(fù)雜的代碼,將重復(fù)調(diào)用的程序塊定義為宏,此外,函數(shù)調(diào)用會有額外開銷,特別是多次調(diào)用的函數(shù),將其定義為宏后可以節(jié)省調(diào)用花費的開銷。全匯編代碼中定義為宏的函數(shù)有G729EV_G729_Copy,Inv_sqrt和Lag_max。下面給出宏Lag_max的部分定義程序,其他函數(shù)的宏可以用類似方法定義。
Lag_max .macro scal_sig,L_FRAME,PIT_MAX,
PIT_MIN,max,p_max
.global _tabsqr
……
.endm
2.3.3 DSP匯編指令的巧用
C55x匯編指令有150多種,編寫的匯編代碼中使用的某些指令并不一定最合適,比如條件跳轉(zhuǎn)指令BCC和指令XCC都可以控制是否執(zhí)行下條語句,但是BCC需要5到6個執(zhí)行周期,XCC只需要1個執(zhí)行周期,因此,在選擇指令的時候應(yīng)盡量選用執(zhí)行周期較少的。如對某一個數(shù)據(jù)進(jìn)行歸一化時,并求出歸一化的指數(shù),可用并行指令MANT::NEXP,一個執(zhí)行周期就可完成。如除法運算中的SUBC指令,因為除法運算沒有相應(yīng)的指令,所以可以轉(zhuǎn)換為減法運算,該指令可以求商和余數(shù)。
2.3.4 并行指令優(yōu)化
DSP芯片可以在1個時鐘周期下完成多個操作,也就是說可以將多條指令合并為1條,提高程序的運行效率。C55x中的并行分為單指令內(nèi)建并行和用戶自定義并行兩類。內(nèi)建并行就是一些特殊指令,用得最多的就是并行乘累加指令MAC::MAC,它是基于C55x的雙乘加(multiply and accumulate,MAC)硬件結(jié)構(gòu)。雙MAC并行指令為處理包含大量乘累加操作的G.729.1算法提供了便利。用戶自定義并行是指用戶通過對指令進(jìn)行分析,調(diào)整編碼的順序,將符合條件的2條相鄰指令并行操作[11]。TMS320C5505包含多組總線和功能單元,豐富的硬件資源使其支持高度的并行性,因而并行指令優(yōu)化是全匯編代碼的主要指令優(yōu)化方法之一。
下面是一些可以采用用戶自定義并行指令來優(yōu)化匯編代碼的情況。
1)將所有裝載和存儲指令并行放置。例如
MOV *AR2,AC1 /*裝載AC1*/
‖MOV BRC0,*AR3 /*存儲BRC0*/
2)條件執(zhí)行指令與加載指令并行放置。例如
XCC first,T0==#0
‖MOV #0,AR0
3)可將A單元的ALU與D單元的ALU,MAC和移位操作并行處理。例如
ADD T0,AR1 /*在A單元修改AR1*/
‖MOV uns(rnd(HI(saturate(AC1<<#1)))),*AR2 /*在D單元執(zhí)行累加器移位飽和和存儲操作*/
不同的匯編程序并行優(yōu)化的效果不同,從全匯編代碼的優(yōu)化結(jié)果來看,通常經(jīng)過自定義并行優(yōu)化,代碼執(zhí)行時間可以減少20%左右。
2.3.5 流水線延遲的優(yōu)化
C55x有2條受保護(hù)的指令流水線:①取指流水線,用于將指令包放入指令緩存隊;②執(zhí)行流水線,用于完成指令譯碼、數(shù)據(jù)訪問和運算,共有7個階段。在流水線中是多條指令同時執(zhí)行,不同的指令會在流水線的不同階段修改內(nèi)存、I/O空間和寄存器的值,為了防止數(shù)據(jù)訪問時會對同一空間進(jìn)行讀/寫,C55x的流水線保護(hù)單元會插入額外的周期來預(yù)防這種錯誤。如果一條指令要訪問前面未執(zhí)行完的指令所訪問的空間,這條指令就會在流水線中中斷,直至前面的指令執(zhí)行完,這條指令再執(zhí)行。為了使延遲最小,利用分析工具Pipeline Stall Analyzer,通過單步執(zhí)行程序找出產(chǎn)生流水線延遲的指令并分析在哪個階段產(chǎn)生流水線延遲并通過調(diào)整順序來解決。例如匯編程序中
MOV #5,AR1
MOV *AR1+,AC0
由于這2條語句有4個周期的延遲,可以把第1條匯編語句改為AMOV #5,AR1,還可以與其他語句進(jìn)行調(diào)整來減小延遲。
2.3.6 多使用雙字訪問指令
在很多信號處理中,待處理的數(shù)據(jù)都是連續(xù)存放在內(nèi)存中的,使用雙字訪問可以一次讀取多個數(shù)據(jù),減少內(nèi)存訪問指令數(shù)。
2.3.7 盡量減少進(jìn)行函數(shù)調(diào)用
因為進(jìn)行函數(shù)調(diào)用的時候,要將程序計數(shù)器(programe counter,PC)指針和一些寄存器壓棧,函數(shù)調(diào)用完后,程序結(jié)束還要出棧,這都是一些不必要的操作。所以對于一些小的函數(shù), 就不調(diào)用而是直接寫入主函數(shù)里, 這樣就可以減少那些壓棧出棧的操作,提高速度。
2.3.8 去除一些冗余的賦值
編譯器產(chǎn)生的代碼有很多賦值,經(jīng)常將一個值賦給寄存器,再賦給變量,這樣就產(chǎn)生了冗余。
通過對G.729.1進(jìn)行匯編編寫及優(yōu)化,并利用CCS3.3提供的性能分析工具(profiler)對優(yōu)化前后的代碼進(jìn)行分析, 表1是G.729.1編碼器源C代碼與匯編優(yōu)化后的指標(biāo)對比,其中,表1中運算量的單位為CPU的時鐘周期,而優(yōu)化效率則是源C代碼的運算量減去匯編優(yōu)化后的運算量與源C代碼的運算量的比值。
表1 G.729.1編碼器匯編優(yōu)化前后的指標(biāo)對比
由表1可以看出,函數(shù)的優(yōu)化效率至少為90%以上,匯編優(yōu)化后的函數(shù)執(zhí)行效率得到大大提高。通過測試可知,G.729.1全匯編代碼的運算量只有1 683 881 clock,而主頻為100 MHz的TMS320VC5505芯片在20 ms內(nèi)允許執(zhí)行的代碼量為2 000 000 clock,小于G.729.1編解碼的代碼量,保證了系統(tǒng)的實時性。
為了進(jìn)一步評價語音編解碼系統(tǒng)還原出的語音質(zhì)量,本文采用ITU-T推出的WB_PESQ軟件對系統(tǒng)合成語音的質(zhì)量進(jìn)行評估[9]。實驗所用語音選自ITU-T提供的4組測試語音矢量,由于測試語音的語種、時長、是否帶噪等因素會影響語音質(zhì)量的測試結(jié)果,因此,測試語音應(yīng)該足夠豐富,如表2所示。這些語音的采樣頻率都為16 kHz,分別對C語言中的32 kbit/s的合成語音和匯編語言中的32 kbit/s的合成語音做對比,如表3所示。
從表3的評測結(jié)果可以看出,匯編語音中的合成語音的質(zhì)量和C語言中的合成語音質(zhì)量基本相同,且當(dāng)速率為32 kbit/s時,合成的語音質(zhì)量較高,因此,全匯編優(yōu)化后的G.729.1編解碼器完全可以滿足實際話音通信系統(tǒng)的要求。
表2 測試語音矢量
表3 測試語音WB_PESQ得分
為了進(jìn)一步驗證G.729.1編解碼的正確性,本文以測試矢量tst_16k.in作為輸入語音,經(jīng)G.729.1全匯編編碼和解碼后分別得到8,12和32 kbit/s的合成語音tst_16k_asm.o8,tst_16k_asm.o14和tst_16k_asm.o32。以32 kbit/s的合成語音為例,將原始語音文件與合成語音文件分別導(dǎo)入音頻制作軟件Cool Edit Pro,并對比它們的波形圖,如圖4所示。
圖4 原始語音和32 kbit/s合成語音的波形圖Fig.4 Original speech waveform and synthetic speech waveform of 32 kbit/s
將原始語音和32 kbit/s的合成語音的波形進(jìn)行對比,由圖4可見,32 kbit/s的合成語音波形圖與原始輸入語音的基本一致,進(jìn)一步驗證了全匯編結(jié)果的正確性。
針對G.729.1中的TDAC編碼器的譜包絡(luò)編碼方法,本文在原有方法的基礎(chǔ)上增加一種對相鄰幀對應(yīng)子帶采用差分霍夫曼的編碼方法,提高了語音的質(zhì)量。同時,針對G.729.1編解碼算法的高復(fù)雜度,通過充分利用C55x DSP結(jié)構(gòu)特點和匯編語言的特點,對其進(jìn)行全匯編設(shè)計及優(yōu)化,使得G.729.1編解碼器在TMS320VC5505得到實時實現(xiàn),提高系統(tǒng)運行的效率。并且該方法在工程應(yīng)用中可直接封裝使用,為后續(xù)G.729.1算法的優(yōu)化研究奠定了基礎(chǔ)。
[1] ITU-T Recommendation. G.729-based Embedded Variable bit-rate coder,An 8-32kbit/s scalable wideband coder bitstream interoperable with G.729 (Amendment 7: New Anne F with voice activity detector using ITU-T G.720.1 Annex A)[S].Geneva,Switzerland:Telecommunication Standardization Sector of ITU, 2012.
[2] RABOT S, KOVESI B, TRILLING R, et al. ITU-T G.729.1: An8-32kbit/s scalable coder interoperable with G.729 for wideband telephony and voice over IP[C]//IEEE International Conference on Acoustics, Speech and Signal Processing. Honolulu, Hawaii, USA: IEEE,2007:529-532.
[3] GEISER B,JAX P, VARY P, et al. Bandwidth Extension for Hierarchical Speech and Audio Coding in ITU-T Rec. G.729.1[J]. IEEE International Conference on Audio, Speech and Signal Processing, 2007,15(8):2496-2509.
[4] 李海婷,范睿,朱恒,等.最新的ITU-T嵌入式變速率語音編碼關(guān)鍵技術(shù)[J].電聲技術(shù),2006, 30(11):50-55. LI Haiting, FAN Rui, ZHU Heng,et al. Key techniques of the latest ITU-T embedded variable bit-rate speech coding[J]. Audio Engineering, 2006,30(11):50-55.
[5] SETO Koji, OGUNFUNMI Tokunbo. Scabable Wideband Speech coding for IP Networks[C]//IEEE Conference on Circuits, Systems & Computers.Penang,Malaysia: IEEE, 2012:77-81.
[6] 劉麗群, 黃冰. 基于DM642的G.729.1的DSP實現(xiàn)[J].桂林電子科技大學(xué)學(xué)報,2011,31(2):103-105. LIU Liqun , HUANG Bing. Implementation of the G.729.1 based on DM642[J].Journal of Guilin University of Electronic Technology,2011,31(2):103-105.
[7] 董傳霄.基于ARM體系結(jié)構(gòu)的上層應(yīng)用—音頻編解碼協(xié)議G.729.1的優(yōu)化及應(yīng)用[D].北京:北京郵電大學(xué),2009. DONG Chuanxiao. An application based on ARM—The optimization and Application of G.729.1 speech coding codec[D].Beijing:Beijing University of Posts and Telecommunications, 2009.
[8] CHO Keunseok,JEONG Sangbae,HAHN Minsoo.Frame Error-Robust MDCT bit Reduce for G.729.1 by Inter-Fame Correlation[C]//IEEE International Conference on Consumer Electronics. Xianning,China:IEEE,2011,819-820.
[9] ITU-T Recommendation. Wideband extension to Recommendation P.862 for the assessment of wideband telephone networks and speech codecs [R].Geneva,Switzerland:Telecommunication Standardization Sector, 2007.
[10] Texas Instruments Inc.TMS320VC5505 DSP System User’s Guide,SPRUFP0C[R].Texas: Texas Instruments Incorporated, 2012.
[11] Texas Instruments Incorporated.TMS320C55X系列DSP指令系統(tǒng)開發(fā)工具與編程指南[M].李海森,周天,黎子盛,譯. 北京:清華大學(xué)出版社,2007. Texas Instruments Incorporated.DSP instructions system development tools and programming guide of TMS320VC55x [M].LI Haisen,ZHOU Tian,LI Zisheng,translation.Beijing: Tsinghua University Press,2007.
王春柳(1989-),女,安徽馬鞍山人,碩士研究生,研究方向為數(shù)字語音編碼、DSP。E-mail:chunliuwang@yeah.net。
陳德宏(1965-),男,安徽馬鞍山人,副教授,碩士生導(dǎo)師,研究方向為通信系統(tǒng)總體設(shè)計、數(shù)字語音編碼、DSP、密碼分析。E-mail:cdh@ahut.edu.cn。
申星海(1990-),男,山西運城人,碩士研究生,研究方向為數(shù)字語音編碼、DSP。
(編輯:王敏琦)
G.729.1 algorithm improvement and DSP all assembly optimization design
WANG Chunliu1, CHEN Dehong2, SHEN Xinghai2
(1.Department of Electrical Information Engineering, Wentian College, Hohai University, Ma’anshan 243031, P.R.China;2. Institute of Electrical and Information Engineering, Anhui University of Technology, Ma’anshan 243002, P.R.China)
In the wideband speech coding algorithm of G.729.1 standard, based on sub-band correlation of inter-frames, spectral envelope coding of time-domain aliasing cancellation encoder reduces allocation bits with the difference Huffman coding. Considering the sub-band correlation between adjacent frames, a difference Huffman coding mode in sub-band of adjacent frames is added on the foundation of the original spectral envelope coding mode, which further reduces spectral envelope of coded bits and improves the quality of synthesized speech. G.729.1 can adjust the coding rate according to the characteristics of channel at any time and can get a better wideband speech quality,which makes the encoding algorithm have a high complexity. Therefore, all assemble language based on TMS320VC5505 digital signal processor is adopted to the real-time implement of G.729.1 algorithm. And the further optimization is made for the assembly code of G.729.1. The optimized G.729.1 algorithm can ensure the high-quality synthesis speech, improve the coding efficiency and achieve the real-time processing of the speech signal.
wideband speech coding; G.729.1; spectral envelope coding; difference Huffman coding; assembly optimization
10.3979/j.issn.1673-825X.2016.06.007
2015-05-19
2015-12-21
王春柳 chunliuwang@yeah.net
國家自然科學(xué)基金(61304066)
Foundation Item:The National Natural Science Foundation of China (61304066)
TN912.3
A
1673-825X(2016)06-0789-08