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