張 濤, 陳 志, 崔赫哲
(1.天津大學 電子信息工程學院,天津 300072;2.金策工業綜合大學 信息系,平壤 999093)
3GPP于2001年3月公布了用于第三代移動通信系統WCDMA的自適應多速率寬帶 (AMR-WB,Adaptive Multi-Rate Wideband)語音編碼算法標準,2002年1月,ITU采納了AMR-WB編解碼算法,公布了數字寬帶語音編碼的新標準G.722.2,由此AMR-WB編碼算法成為第一種可以同時用于有線與無線業務的語音編碼系統[1]。
MIPS (Microprocessor without interlocked piped stages)是很流行的一種RISC處理器,最早在80年代初期由斯坦福大學Hennessy教授領導的研究小組研制出來,它采用精簡指令系統計算結構(RISC)來設計芯片,和英特爾采用的復雜指令系統計算結構(CISC)相比,具有設計更簡單、設計周期更短等優點,并可應用更多先進技術,開發更快的下一代處理器。
隨著移動通信與網絡技術的飛速發展,數字化語音編解碼壓縮的要求也相應提高,由于AMR-WB擁有低碼率、多速率、高寬帶、高語音質量等特性,使其應用領域非常廣泛,另一方面由于算法強大,所以標準定點C代碼執行效率低,限制了其在某些硬件條件比較苛刻的領域中的應用。這就需要根據實際的應用需求,在標準代碼的基礎上對算法進行必要的優化,并結合硬件資源的特點降低算法復雜度,以達到應用的條件。目前有關AMR-WB的研究,一是就其算法及復雜度進行研究分析,如文獻[2]中詳細分析了AMR-WB的編解碼過程,文獻[3]針對AMR-WB算法及實現的復雜度進行深入研究;二是就其在DSP芯片上進行應用,文獻[4]完成了AMR-WB在DSP芯片TMS320VC5509的優化實現,并達到了實時要求。本文依據現有的AMR-WB算法分析,在MIPS 4Kec平臺上利用有限的硬件資源實現AMR-WB的實時解碼。
AMR-WB編碼技術是一種由多個固定模式集成的ACELP語音編碼方案,該算法基于50~7 000 Hz的帶寬語音,與傳統的200~3 400Hz電話帶寬相比,50~200 Hz的低頻部分增加了語音的自然度和聽覺舒適性;3 400~7 000 Hz的高頻部分,增強了語音的可理解性,大大提高了語音質量與語音自然度;而且該編碼技術采用了自適應技術使得其能在系統容量與合成語音質量中取得靈活的折衷,最大限度地發揮系統的性能。
AMR-WB語音編解碼器由多速率語音編碼器、包括了端點檢測與舒適噪聲生成系統的源控制速率方案和對付傳輸錯誤和丟包后的錯誤隱藏機制組成[5]。多速率共支持9種速率模式,分別為 23.85、23.05、19.85、18.25、14.85、14.25、12.65、8.85和6.60 kb/s,對應模式8~0,其正常工作的采樣頻率為16 kHz,20 ms為一幀,,對兩個低、高頻帶 50~6 400 Hz和 6 400~7000 Hz分別進行獨立編碼,以降低復雜性提高編碼效率[6];源控制速率的作用就是讓語音編解碼器用一個低速率來編碼只包含背景噪音的語音幀,而不是編碼所有的語音;針對丟幀或失幀的情況,在語音合成時利用了一組預測參數對錯誤之處利用了隱藏機制。
AMR-WB大致編解碼過程如下:以代數碼激勵線性預測為基礎,通過線性預測分析、基音預測分析以及在 12.8 kHz采樣率的固定碼本參數的分析,以期望得到最小化感覺加權誤差信號,處理時以幀為單位(每幀長 20 ms,包括 320個采樣點),分析每幀語音抽取 CELP參數(LP系數,自適應和固定碼本的索引值和增益),除此還要計算得到23.85 kb/s模式下的高帶增益索引值。 以上所有的參數編碼后經信道傳送至解碼端,在解碼器中這些參數被解碼,重構的激勵信號通過LP合成濾波器重新合成語音信號[6]。
32位MIPS處理器和其它處理器的結構不同,它一共由兩個處理部件組成,一個是 32位RISC核心CPU,另一個是用軟件來實現的系統協處理器 CP0,它的組成有浮點運算單元、整數運算單元、支持虛擬地址轉換的TLB和CP0寄存器、指令 cache和數據 cache等[7]。
MIPS32寄存器堆包含CPU通用寄存器、CPU特殊寄存器、FPU寄存器,架構中有32個通用寄存器,其中$0永遠保存數據0和$31保存函數調用ja1返回地址,其它的寄存器可作為通用寄存器用于任何一條指令中;特殊寄存器有PC、HI和LO,分別用來保存當前指令地址、乘除指令高位結果、乘除指令地位結果;FPU則用來處理相關的浮點數據。
MIPS32架構是基于一種固定長度的定期編碼指令集(32位字),MIPS指令集是一種典型的RISC體系結構的指令集,包含的特點如下:指令種類少且格式規范,尋址方式簡化,大量利用寄存器操作,簡化了CPU結構。
Cache是CPU和主存之間的小容量高速度緩沖存儲器,用來存放經常使用的數據和程序指令,有效解決了處理速度和存儲速度之間的匹配問題,在MIPS架構中D_cache和I_cache分別存放數據和指令,容量較小,分別為32k。
文中采用的芯片類型為MIPS公司推出的低功耗高性能數字信號處理器MIPS32 4Kec,屬于MIPS32 4K系列,連接平臺用到的是Green_hill編譯環境。
由上述MIPS架構分析可知,為了使程序能在目標板上正確執行,使AMR-WB能夠實時地在MIPS32上解碼,首先要清楚并修改程序中有關的數據空間,第一,由于cache的限制,程序中不允許有堆的操作,即 calloc(),malloc()等函數要刪去;第二,程序中有關數組的數據都整合在一起放入外部空間,需要時再讀取;第三,輸入輸出不再是文件操作,而是以流形式進行操作。針對以上AMR-WB解碼對空間分配的需求,這里給 DDR(MEMORY)做一個配給,分別 bss_region段、const_region 段、pcm_region 段,大小各為 16k、64k、64k,其中bss_region存放結構體等數據,const_region存放表格等常量數據,pcm_region存放輸出音頻pcm數據,檢驗這些數據存放正確的標準是查看在Green_hill環境中運行得到的map文件里 .rodata,.heap,.data等類型的數據都為0byte。
數據空間劃分之后,再到片內和片外數據的交換,這里采樣的是DMA讀存機制,分別用readDDRfromDMA()和writeDDRfromDMA()函數實現,鑒于大小的限制,每次最多只能讀存4k的數據。另外pc平臺和Green_hill平臺的編譯器會有些差別,所以對程序中的數據類型得做一個統一的規范,如將原程序中出現的WORD16、WORD32等統一typedef為 I16、I32。
最后在MIPS平臺運行,需要3個Grennhill編譯生成的binary 文件:text.bin ext﹑data.bin﹑data.bin, 運行時先將 text.bin前32K指令寫入I_cache中,剩下所有指令寫入MEMORY中 (8字節對齊),ext_data.bin寫入MEMORY中,data.bin則寫入D_cache中,運行通過后用ITU提供的標準輸出文件.out和測試時輸出得到的dump.out文件進行對比,完全一致;并通過Adobe audition試聽,直到聽不出任何不同,則說明移植成功。
如果直接把未經優化的C代碼程序進行運行,會發現程序執行的效率極低,硬件平臺耗時較大,而且編譯連接后也會產生較大的代碼量,所以為了減少解碼的耗時與節約空間的使用,就必須對代碼及算法進行一定的優化,以保證能在MIPS平臺上實時解碼。
從ITU-T官網得到的代碼是比較完整的,具有較健全的功能,但是針對文中的目標而言,很多程序代碼都不是必須的,可以精簡程序代碼,提高程序運行效率。例如程序中有成千上萬條諸如 move16(),test(),logic32()等語句,由于數量龐大,調用這些小函數加起來的時間占用的比例就較大,在解碼一幀中占用比例為4%左右,基于其在本次實驗中無用的前提,可以全部刪除;另外一些小函數略簡單,諸如extract_h(),extract_l()是對數進行高16位和低16位的操作,而其占用時間比例也有3%左右,在程序中可以直接進行移位取數操作而不需反復多次調用此函數;本文要實現的是解碼功能,所以程序中除了解碼部分之外還有大量的編碼函數和表格變量數據等,在這里可以注釋掉,而不進行編譯與運行。
因為MIPS32中不同于其它的RISC架構的地方是其具有整數乘法部件,使用了兩個特殊的寄存器HI、LO,并且提供相應的指令 mfhi/mthi,mthi/mtlo來實現整數乘法結果(hi/lo)寄存器與通用寄存器之間的數據交換。
在profile生成的文件中,得知算法中乘累加與乘累減占用的時間比例較大,依照原算法的機制,先讀取兩個數a1、b1到寄存器,相乘后取出得到的結果到寄存器中,然后再讀取a2、b2,相乘后得到a2*b2,再讀取上一次所得結果 a1*b1與a2*b2相加或相減,接著再取結果寫回到寄存器中,然后依次繼續同樣的操作,直到乘累加乘累減運行結束。根據MIPS32具有整數乘法部件的特殊性,這里可以在乘累加乘累減運算上充分地利用上,改后的算法機制是:讀取a1、b1到寄存器,相乘后不取出所得結果而是放在特殊寄存器HI和LO中保留起來,再讀取a2、b2相乘后與上次結果a1*b1直接相加,再進行更新保留結果,而不需頻繁地取數寫數,依次進行直到乘累加乘累減運算結束。
比如一個10次乘累加的算法運算,原算法耗時60個周期,修改之后的算法耗時則降為30個周期,而且是匯編語言,所以很明顯這大大降低了整個程序的耗時時間。
在basicop2.c文件中,都是加、減、乘、除、移位、飽和溢出等等的基本算子函數,從profile生成文件中得知這些算子函數調用次數無疑是最多的,占用了大量的時間。對此,一方面,剖析函數實現的功能及對語句進行分析,用最精簡的語句來實現算子函數所完成的功能,例如在 L_shr()、L_shl()、L_mac()、L_add()中把多條語句實現的功能合并成一條語句來完成等等;一方面,也可以將在算子函數中出現的溢出保護操作刪去,因為設置保護是為了最初定點化時測試所用;另一方面,鑒于某些算子函數較小,而又被頻繁調用,所以可以引進內聯函數,在函數前加inline修飾,消除了函數調用時的開銷。修改之后的這些小函數,再放入工程中替代原有的算法,保證測試結果的正確性,速度得到了提高。
查看每一幀中的profile參數,對各函數占用時間做個排名,發現靠前的都是相同的幾個函數,且順序基本不變,所以對這些函數需要進行進一步的優化,首先對這幾個函數如Filt_6k_7k ()、Syn_filt()、Pred_lt4 ()、Interpol()、Scale_sig()、HP400_12k8()和 HP50_12k8()進行分析,得知其具有一個共同點:函數體都包含了多重for()循環,顯然可見嵌套循環的耗時非常大,處理循環內指令運行有一種很好的方式就是軟件流水線技術。
在MIPS運行的流水線中,每條指令的執行過程被分成五 個 階 段 : 取 指 (IF)、 譯 指 (ID)、 指 令 運 行 (EXE)、 訪 存(MEM)、寫回數據(WB),只有當一條指令執行階段都完成之后,該指令才算執行完畢,在流水線中的每一個執行階段過程,當一條指令在該階段中完成執行之后,下一條指令將立刻進入到該執行階段來執行操作,則當流水線處于飽和狀態時,將有5條指令在同時運行。具體應用其中就是對循環次數確定的循環進行改進,比如在Pred_lt4()中:


另外對于循環較短的內循環則可以直接進行完全展開,語句較少,對代碼量不會有太大影響。
為了最大化地提高運行效率,還做了一些常用的優化,如在if分支語句中,將出現概率較高的分支放在前面;對乘除法的地方,用移位來代替;在多重循環中,可以將次數最多的放在最內層,次數少的則放在外層,減少CPU跨層的次數;對switch-case語句可以采用if-else分支;對某些數組,用指針運算代替數組索引,還有用局部變量代替全局變量也能減少訪問內存的次數等等,這些小優化也能相應提高運行的速率。
ITU在2001年發布了最新的語音傳輸質量測量標準:P.862—PESQ(Perceptual Evaluation of Speech Quality),PESQ 是評價語音通信質量的最新標準,提供完全量化的語音質量衡量方法。這種標準的分值為MOS-LQO (Mean Opinion Score-Listening Quality Objective),其范圍為 0.5~4.5(0.5 最差,4.5最好),此文中用到的解碼語音質量評價方法即為此標準。
在分析和研究了AMR-WB編解碼原理的基礎上,先對其在VS2005編譯環境下進行了仿真實現,并且通過ITU-T官網代碼中附帶的標準語音對算法的性能進行了測試和評價。
附帶的標準語音內容是嬰兒呀呀學語的一段4 s話語,音頻屬性為:純二進制數據,采樣率16 000 Hz,量化位數為16位。在VS2005環境下運行編解碼器,得到不同編碼模式的重建語音,然后在Matlab下觀察波形圖進行比較,如圖1所示,可知該編解碼器可以在給定的速率模式下較好地還原時域波形,且編碼速率越高,失真越小,波形越接近原始語音。對解碼語音進行主觀聽覺測試,與原始語音對比,難以區別,主觀聽覺感受和自然度都很好。
為了測試語音質量情況,選取了10個包括男女聲和掃頻信號的語音文件,來自3GPP(3rd Generation Partnership Project)提供的標準測試文件[8],經過AMR-WB算法編解碼后計算其PESQ值,計算PESQ的方法是通過Matlab軟件工具來模擬實現的,表1則是給出了在各模式下其平均PESQ值。
從表1可以看出所選示例語音的PESQ值都在3以上,低模式的音質稍差一些,但都達到了通信質量的標準,且通過主觀測試試聽,和初始語音相比,聽不出差別,語音質量良好。
依照3.2中方法進行移植后,首先測試其程序的正確性以及解碼耗時情況,這里測試文件用的是ITU-T官網附帶的語音片段,對優化前的算法進行測試,輸出與標準輸出一致無誤,而耗時為一幀200 M(mips)左右,而實時要求是50 M以內,需要對算法進行優化。

圖1 原始語音和重建端語音波形圖Fig.1 Wave chart of original and reconstruction voice

表1 10句語音各模式下的平均PESQ值Tab.1 Average PESQ of ten speech in different mode
優化的方法如4節中所述,在每個函數或刪減步驟完成后,都要進行獨立測試,用輸出文件和標準文件進行對比,做到結果正確。在模式0的情況下,優化前后的重點函數及模塊的耗時情況如表2所示,表中所列舉的時間周期數是指每調用一次此函數所耗用的時間。從表中可以看出優化程度是較大的,完全優化后再測試每幀耗時為45 M左右,滿足實時要求,接著對模式1~8進行測試,發現都在40 M左右,都達到了實時的要求。
最后再進行主觀測試,解碼輸出的語音都有很好的自然度與流暢性,和輸入音頻相比,主觀上分辨不出差別來。

表2 重點函數優化前后指令周期數Tab.2 Instruction cycles of the focus function before and after optimization
AMR-WB是僅有的一個提供眾多特性的寬帶技術,使用AMR-WB編解碼后的語音自然度很高,可以用在3G移動通訊系統的多媒體服務、寬帶包交換網絡、音頻和視頻會議、聊天和虛擬現實等網絡應用、數字無線廣播等。文中在分析AMRWB技術及MIPS處理器的基礎上,成功地實現了AMR-WB解碼器在MIPS32 4Kec上的算法移植,并通過對算法進行各種優化,最終達到了解碼器在平臺上的實時運行的要求。
[1]王炳錫,王洪.變速率語音編碼[M].西安:西安電子科技大學,2004.
[2]錢國榮,李治柱.對新型寬帶語音編解碼器AMR_WB的研究[J].計算機工程與應用,2003(28):194-196.
QIAN Guo-rong,LI Zhi-zhu.The research of new wideband speech codec AMR_WB [J].Computer Engineering and Applications,2003(28):194-196.
[3]范錦繡,趙歡,張波濤.AMR_WB編碼算法研究和復雜度分析[J].電聲技術,2009(7):68-72.
FAN Jin-xiu,ZHAO Huan,ZHANG Bo-tao.AMR_WB coding algorithm and complexity analysis[J].Audio Engineering,2009(7):68-72.
[4]杜曉林,張雪英,李鳳蓮.AMR_WB算法仿真及其在TMS 320VC5509的優化實現[J].電聲技術,2011(1):67-71.
Du Xiao-lin,ZHANG Xue-ying,LI Feng-lian.Simulation of AMR_WBalgorithmandimplementationonTMS320VC5509[J].Audio Engineering,2011(1):67-71.
[5]3GPPTS 26.171.AMR speech codec wideband General description[S].2001
[6]G.722.2.Wideband coding of speech at around 16kb/s using Adaptive Multi-Rate Wideband (AMR-WB)[S].ITU-T, 2003.
[7]MIPS R4000 Users Manual:MIPS Computer System[S].1991
[8]3GPP.TS 26.174.Adaptive Multi-Rate Wideband(AMRWB)speech codec test sequences (Release 9)[S].3GPP,2009.