權進國,夏 晶,林孝康
(清華大學深圳研究生院信息學部,深圳 518055)
TETRA 標準中的語音壓縮編解碼采用ACELP算法,這是一種改進型的CELP,其碼率被壓縮至4.567kb/s。ACELP 算法以30ms為一幀,每幀又分成4個子幀,每子幀7.5ms。采用8k 采樣速率,每幀有240個抽樣,每子幀有60個抽樣。ACELP 算法的輸入為16bit 線性PCM 編碼后的數字語音信號。輸入語音在編碼器中經過預處理和加窗后,首先進行LP 分析,用Levinson-Durbin 算法求出LP參數。由于LP參數較敏感,微小的變動可能影響整個頻譜,直接量化傳輸LP參數會嚴重影響合成語音質量。因此,通常將LP參數轉化成LSP參數進行量化編碼并傳輸。LSP參數與LP參數是等效的,但變動單個LSP參數僅影響局部頻譜。由于編解碼器中的濾波器實際使用的是LP參數,因此,還需要再將LSP參數變換成LP參數。
之后,進行長時預測分析。長時預測分析的目的是發現最佳基音參數:基音濾波器的延遲和增益。為簡化長時預測分析,該過程通常分成開環基音搜索和閉環基音搜索兩步進行。開環基音搜索是進行基音粗估計。閉環基音搜索是基音周期的細搜索過程。
完成長時預測分析后,下一步將進行固定碼本搜索。在固定碼本搜索中,采用代數碼本結構和聚焦搜索技術。固定碼本搜索的目的是找到最佳代數碼字和增益參數。
解碼功能包括對傳輸參數的解碼(LP 濾波器參數解碼、自適應碼本矢量解碼、固定碼矢量解碼、自適應碼本和固定碼本增益解碼)以及合成重建語音。
TMS320C54x是TI 公司生產的16 位定點DSP,適合遠程通信等實時嵌入式應用的需要。經統計,若用C 語言在C54x DSP 上實現ACELP 算法,那么未經優化的C 程序需要約700MIPS的處理能力才能保證在30ms 內完成ACELP 算法,C45x DSP的處理能力與之相差甚遠。由此可見,若用C 語言實現,那么ACELP 算法難以應用到需要實時處理的場合。因此,為了能在C54x 上實時實現ACELP 算法,需要將C 程序轉成C54x的匯編程序,并盡量優化以降低運算量和存儲量。在進行DSP的軟件調試和開發過程中,采用了TI 公司的集成開發環境TMS320C5000 CCS2.0。
2.1.1 編程
由于程序規模較大,又是在DSP 匯編級別上實現,因此保持原C 程序所具有的模塊化和結構化有利于程序的編寫、檢查和閱讀,尤其有利于匯編程序的調試。所以在編寫匯編程序時盡量保持與原C程序在結構和流程上一致,只在極少需要優化的地方對匯編程序結構進行調整。
匯編程序要解決的一個重要問題是函數調用時的參數傳遞問題。為此,定義了coeff_1,coeff_2......coeff_10 等10個16bit的全局變量。如果參數是32bit,則用累加器A 和B 傳遞。對于靜態變量,需要在數據區開辟專門的區域進行存儲,以保證不會被錯誤的更改。函數內需要使用臨時變量時,則從堆棧中開辟一段存儲區,函數調用結束即可釋放這段存儲區。
2.1.2 優化
編寫DSP 程序,要想提高效率就要充分利用DSP 芯片的各種硬件資源,并適當對結構進行一些調整,下面是用到的一些方法:
(1)去掉一些不必要的子程序調用
C 程序中有大量的子程序調用,其中有不少子程序在匯編中用簡單的幾條指令就可以實現,這樣的子程序在匯編中可以去掉,因為調用這些子程序所造成的流水線中斷相對于子程序本身來說代價過高。去掉一些不必要的子程序并對主程序進行少許結構上的調整可以達到優化程序的目的。
(2)循環指令rptb 和rpt的使用
C54x 專門提供了塊循環指令rptb,充分使用該指令可以有效的減少指令周期。對于多重循環,塊循環應盡量放在最內層,尤其是在代數碼本搜索函數中。
把循環盡可能的壓縮至一條指令,這樣可以用rpt 指令實現,以便減少循環開銷。
(3)展開循環次數較少的循環
循環會造成流水線中斷、增加循環開銷,為盡可能避免這一點,可以將循環次數較少的循環展開。比如:Chebps 函數被調用次數很多,該函數中存在一個循環,其循環次數僅為4,該循環應該展開。
(4)充分利用存儲器映射寄存器
存儲器映射寄存器間傳遞參數及間接尋址等都是行之有效的優化方法。
(5)移位
對于某些移位位數未定的移位,可以考慮使用rpt 和sfta 結合來完成。另外使用指令中的移位功能,利用帶ASM的移位指令格式,一般可以節約一個指令周期,在一般情況下也許不必在意,但是對于調用次數多達100 來次的Chebps 函數,節省每一條指令都意義重大。
(6)充分利用各種延遲指令
轉移指令會造成指令中斷,浪費指令周期,可以利用指令的流水線等待周期預先執行一兩條其他指令,但應注意這一兩條指令不應影響延時指令的執行條件。
(7)針對具體函數進行結構上的調整
比如:代數碼本搜索D4i60_16 函數,由于最內層和次內層會有門限判斷,只有超過門限時下一層循環才會開始執行。因此,可以考慮將那些只在下一層循環才會用到的一些變量放到門限判斷之后去計算,這樣就避免了一些無謂的運算。但是對于前兩層循環,則應盡量把計算放在第一層循環。
(8)使用并行指令
并行指令使用的場合一般比較苛刻,但如果能夠比較好的使用并行指令,仍然不失為一種優化的方法。
(9)巧妙使用DSP 匯編指令
巧妙的使用DSP 匯編指令可以有效的降低運算量,提高運算速度。
如使用ADDM 指令,C54x 可以使用ADDM 指令把存儲器變量直接加上一個立即數,這在某些循環中十分有用。
盡量使用xc 指令代替條件轉移指令,使用xc指令比使用條件轉移指令節省指令周期,但是只有某些場合適合用xc 代替條件轉移指令,有時需要注意潛在的流水線沖突。
又如跳轉指令banz,使用banz 比使用一般的跳轉指令節省指令周期。移動緩沖區指令delay,可以快速地在兩個相鄰變量間進行賦值,調整變量存儲器的結構以方便的使用delay 指令很重要。尤其是在D4i60_16的最內層循環中使用delay 指令可以大大降低運算量。
2.1.3 調試
ETSI 提供ACELP 算法C 程序的同時也提供了相應的測試序列,只要通過了這些測試序列即可認為程序基本正確。測試文件包括三個:TE1 _46.CHD、TE2_128.PCM、TE3_46.SPE。解碼器輸入TE1_46.CHD,輸出TE2_128.PCM;編碼器輸入TE2_128.PCM,輸出TE3_46.SPE。程序編寫完畢后需要分別以TE1_46.CHD 和TE2_128.PCM 作為解碼器和編碼器的輸入,并將經解碼和編碼后得到的數據分別與TE2_128.PCM 和TE3_46.SPE 比較。
在CCS 里讀文件與在VC 中不一樣,CCS 里每次只能讀出8 位并存放在低8 位,高8 位將置零。因此每一個抽樣的16 位數據將讀兩次,并需要編程將兩次讀出的8 位合并成一個完整的16 位數據。寫文件則相反,首先需要將一個完整的16 位數據分成兩個8 位數據,存在兩個字的低8 位,再將這兩個字寫入文件。具體來講,編碼器每次需讀出480 字的數據,再將這480 字的數據合并成240 字,即得到240 抽樣的16bit 量化數據,以此作為編碼器輸入。最后得到的輸出為138bit,ACELP 算法實際用138字來表示該輸出,寫文件前需要先將138 字拆成276 字,然后再寫入文件。
采用以上步驟,用全匯編實現并優化ACELP 算法,經過統計,運算量和存儲量為:編碼部分13.3MIPS,解碼部分1.2MIPS,程序空間13.8K 字,數據空間13K 字。TMS320VC5410的處理能力達100MIPS,內 部RAM 有64K × 16bit,這 樣 采 用TMS320C5410 芯片即可實時實現ACELP 算法。
圖1(a)是長為1 分鐘的原始語音波形,圖1(b)是編解碼器對(a)處理后得到的合成語音。其中橫軸表示采樣點數,縱軸表示幅度。可以看出,盡管ACELP 編解碼是參數編碼,而不是波形編碼,但ACELP 仍然相當好的從波形上恢復出了原始語音。試聽結果也表明,ACELP 算法可以獲得很高的合成語音質量。

圖1 原始語音與合成語音的波形比較
為實現全數字集群系統TETRA的語音編碼方案,需設計DSP 系統優化以實現其核心代數碼激勵線性預測(ACELP)算法。這是一種CELP 改進算法,在碼率降到4kb/s~8kb/s時,仍然能保證很高的語音質量。課題重點研究了這種ACELP 算法在TI DSP TMS320C5410 芯片上實現的軟、硬件設計,以及用全匯編實現此算法的一些關鍵技術,并給出了實際實驗結果。實驗結果表明,經該方法實現后的ACELP 算法可以獲得很高的合成語音質量。
[1]ETSI.Terrestrial Trunked Radio(TETRA);Speech codec for full- rate traffic channel;Part2:TETRA codec[S].ETS 300 395-2.ETSI.February 1998.Second Edition.
[2]王炳錫.語音編碼[M].西安:西安電子科技大學出版社,2002.
[3]汪安民.TMS320C54xx DSP 實用技術[M].北京:清華大學出版社,2002.
[4]劉益成.TMS320C54x DSP 應用程序設計與開發[M].北京:北京航空航天大學出版社,2002.