許悅,李強
(重慶郵電大學(xué) 重慶 400065)
隨著工信部表示三網(wǎng)融合在“十二五”期間將有實質(zhì)性的進展,使用于廣電網(wǎng)絡(luò)的數(shù)字高清電視機頂盒所具有的功能也將越來越豐富。除了能支持接收電視節(jié)目外,還可以支持VoD、Web瀏覽器、DVD、可視電話、遠程教育、遠程醫(yī)療、會議電視等多媒體,其功能正在向高檔化多媒體終端發(fā)展。通過高清機頂盒的硬件擴展接口(USB接口或RCA接口),結(jié)合軟件項目的開發(fā),從而實現(xiàn)VoIP技術(shù)在機頂盒方面的應(yīng)用。
SIC8008是重慶四聯(lián)微電子有限公司設(shè)計的一款高性能MPEG2/AVS/H264高清解碼芯片。SIC8008結(jié)構(gòu)框圖如圖1所示。主CPU主要用于系統(tǒng)(Linux OS)應(yīng)用,輔CPU實現(xiàn)音頻實時解碼功能及其它計算功能。
圖1 SIC8008結(jié)構(gòu)框圖
文獻[2]中指出,關(guān)于機頂盒實現(xiàn)VoIP功能,業(yè)界一般有3種方式:
STB通過USB接口外接USB話機,USB話機完成電話按鍵的輸入、聲音的采集和播放,機頂盒內(nèi)實現(xiàn)USB話機驅(qū)動和其它協(xié)議,控制軟件,從而實現(xiàn)機頂盒VoIP功能。
VoIP的輸入輸出主要通過機頂盒的RJ11接口,機頂盒設(shè)計時已經(jīng)增加了RJ11電話機接口。電話機信號經(jīng)過語音接口單元,送入語音處理單元完成語音編碼壓縮與解壓縮,以及一些語音協(xié)議處理,如SIP、H.323等協(xié)議,再通過主控制器處理后傳送給輸入端。
VoIP的輸入輸出接口通過機頂盒的音頻輸出和MIC輸入接口完成。
SIC8008整機設(shè)計本身沒有實現(xiàn)RJ11和MIC輸入接口,因此,第一種方式可以直接應(yīng)用在VoIP原型系統(tǒng)。但是,由于市面上生產(chǎn)的USB話機不但價格很高,而且其驅(qū)動程序并不具有兼容性,同時如果自行開發(fā)SIC8008的USB話機驅(qū)動程序,即提高了開發(fā)成本,又延長了工作周期。為了節(jié)約研究成本并提高工作效率,最后采用在SIC8008整機外接USB聲卡并連接耳機與話筒的方式來實現(xiàn)此原型系統(tǒng)。其中,USB聲卡必須符合標(biāo)準(zhǔn)的USB audio協(xié)議。
在軟件實現(xiàn)的方法上,將用于PC的語音實時流處理的開源代碼經(jīng)過修改后移植應(yīng)用在SIC8008中,實現(xiàn)語音會話。采用的信令協(xié)議為SIP。VoIP原型系統(tǒng)結(jié)構(gòu)如圖2所示。
圖2 數(shù)字高清電視機頂盒芯片SIC8008 VoIP原型系統(tǒng)結(jié)構(gòu)
SIC8008所用的操作系統(tǒng)是經(jīng)過內(nèi)核剪裁的linux-2.6.30。主要做了以下修改:在arch目錄下只保留了arm子目錄,并根據(jù)SIC8008的各項參數(shù)對此子目錄下的各文件進行重新定義,在內(nèi)核中加入符合SIC8008高清數(shù)字電視機頂盒相關(guān)的時鐘、器件以及配置文件等。在fs路徑下,根據(jù)NAND FLASH模塊添加了ysffs2文件系統(tǒng)。Yaffs(Yet Another Flash File System)文件系統(tǒng)是專門針對NAND FLASH設(shè)計的嵌入式文件系統(tǒng),yaffs2是此文件系統(tǒng)的第二個版本,能夠更好的支持大容量的NAND FLASH芯片。
經(jīng)過對Linux內(nèi)核的剪裁,主要增添了針對SIC8008數(shù)字高清電視機頂盒SoC的ARM系統(tǒng)類型SICMicro HDSoC。由于VoIP原型系統(tǒng)的需要,在對內(nèi)核進行配置時,設(shè)備驅(qū)動的聲卡支持選項中要勾選USB聲音器件選項。
Mediastreamer2是由Simon Morlat開發(fā)的一個輕量級的流技術(shù)引擎,可以對音頻和視頻進行實時流的制作與處理。該引擎基于ortp庫,全部由C語言編寫,完全符合SIC8008上VoIP原型系統(tǒng)處理聲音的需求。
正如在參考文獻[3]介紹,在基于Linux平臺的語音會話系統(tǒng)中,Mediastreamer2可以通過alsa或oss進行語音的讀寫,收發(fā)RTP包,完成語音編解碼,播放及錄制wav文件,利用FIR濾波器量化語音以及進行自動增益控制等[4]。其簡單的設(shè)計思想,給利用Mediastreamer2開發(fā)語音處理程序的工作提供了一個良好的平臺。
[3]中對主要的語音壓縮算法G.728、G.723.1、G.729.A和iLBC做了比較,最終選擇iLBC作為最終的語音編碼方案。在Mediastreamer2中,默認的語音編碼方案為speex。iLBC和speex都是對CELP的發(fā)展,并且在算法復(fù)雜度及聲音質(zhì)量上都不相上下。但是,由于speex需要ogg作為其容器格式,在將其移植在SIC8008的過程中,還需要首先移植libogg庫,這反而大大增加了整個系統(tǒng)開發(fā)的周期;而iLBC作為Mediastreamer2的默認語音編碼算法,則只需要修改較少部分的代碼并添加一個ilbc.c的文件即可。因此,iLBC最終作為此VoIP原型系統(tǒng)的語音壓縮算法。同樣,文獻[3]為使iLBC作為默認算法對Mediastreamer2的修改方法進行了詳細介紹。
iLBC是一種基于獨立幀的利用線性預(yù)測方法對殘差信號進行編碼的算法,主要支持兩種幀長格式:20 ms和30 ms。對于20 ms幀,每幀的位數(shù)為304 bit,共有160個采樣點,分為4個子幀;對于30 ms,每幀的位數(shù)為400 bit,共有240個采樣點,分為6個子幀。通過使語音信號通過LPC濾波器后得到殘差信號,之后對幀中殘差信號能量最大的部分進行標(biāo)量量化,搜索到開始狀態(tài),建立動態(tài)碼書,用動態(tài)碼書對剩余的殘差信號進行編碼。這種編碼方法即為獨立幀編碼,這種方法增加了幀與幀之間的獨立性,從而消除了傳輸時由于丟包而引起的感知下降。
iLBC編碼器的輸入必須是采樣率為8 000 Hz,16 bit的PCM信號。
iLBC的編碼過程如圖3所示。
在文中的VoIP原型系統(tǒng)中,經(jīng)過USB聲卡采集后得到的PCM信號首先通過高通濾波器,濾除直流分量和低頻噪音。用Levinson-Durbin算法求解LPC系數(shù)得到LPC-10的系數(shù)。每一次LPC分析,得到線性預(yù)測濾波器的系數(shù)之后都需要將其轉(zhuǎn)換為一個線譜頻率(LSF)的集合,量化內(nèi)插后得到線譜對(LSP)集合。因為線譜對系數(shù)更利于量化、內(nèi)插,其對量化誤差不敏感,具有良好的強健性[5]。得到PLC分析器后,計算出信號的殘差,從殘差中找到兩個能量最大的連續(xù)子幀,然后把能量值較小的首23/22個樣點(30 ms/20 ms)或尾23/22樣點從連續(xù)子幀中去除,剩余的57/58個被選定為本次處理的開始狀態(tài)。之后對開始狀態(tài)以基于DPCM的標(biāo)量量化進行編碼[6]。已經(jīng)編碼的殘差信號再經(jīng)解碼得到的LPC激勵樣點集合作為自適應(yīng)碼書。對于剩余的殘差信號,矢量量化將按下面順序進行:包含有初始狀態(tài)的兩個連續(xù)子幀中剩余的23/22個樣點;時間軸上在開始狀態(tài)后的各子幀;時間軸上在初始狀態(tài)前的各子幀。對于此矢量量化,每次碼書搜索的范圍是動態(tài)的,隨著最新的解碼結(jié)果,該動態(tài)碼書被更新。最后將編碼的語音信號打包放入有效載荷中。
iLBC的解碼模塊的運算量相對與編碼模塊要小。根據(jù)文獻[7]的介紹,解碼的主要過程如下:解包后提取參數(shù)。從得到的LSF參數(shù)進行內(nèi)插,并轉(zhuǎn)化各子幀的LPC系數(shù),以便進行合成操作。對開始狀態(tài)進行解碼,解碼結(jié)果一方面作為激勵信號暫時儲存,另一方面存入碼本存儲區(qū),以構(gòu)成動態(tài)碼本的初始值。對剩余的子幀部分,按照與編碼相同的次序進行殘差解碼,并用解碼結(jié)果更新動態(tài)碼本,重復(fù)此步驟直到所有子幀完成解碼。對于解碼得到的殘差信號,進行語音增強的操作。之后進行語音合成,形成解碼后的語音。最后通過高通濾波器,消除合成后的低頻語音。解碼模塊的流圖如圖4所示。
圖4 SIC8008 VoIP原型系統(tǒng)iLBC解碼模塊流圖
SIC8008是一套采用專用視頻硬件模塊處理高清視頻解碼的方案,并不是由嵌入式CPU或DSP加軟件的方式處理視頻編解碼,能夠有效降低芯片功耗。該高清機頂盒方案的視頻解碼核,在進行高清H.264解碼時的工作主頻約為250 MHz,遠低于CPU或DSP的600 M~1 000 MHz,可顯著降低功耗。釋放CPU的計算能力,用于實現(xiàn)其他功能。VoIP系統(tǒng)作為SIC8008數(shù)字電視高清機頂盒產(chǎn)品中的一項增值業(yè)務(wù),要在不影響高清電視信號視頻解碼的情況下,來實現(xiàn)IP電話的應(yīng)用。該原型系統(tǒng)主要利用SIC8008的輔CPU計算功能來實現(xiàn)其功能。
文件xend.c是基于Mediastreamer2和oRTP開發(fā)的功能測試文件,用來模擬語音信號從接收到iLBC編碼,之后通過RTP包發(fā)送的過程。其運行結(jié)果如圖5所示。
有圖5中可以看出,在測試程序運行過程中,延遲告警隨著運行時間持續(xù)增大,并不能達到預(yù)期的效果。究其原因,參考圖6的輔CPU占用情況可以看出,是因為測試程序中PID為354的線程對CPU的占用率過高。此PID正是圖5中名為ms_ticker_run的線程ID,即語音處理時的線程。
PID為354的線程所實現(xiàn)功能主要是對語音進行iLBC編碼壓縮及RTP打包發(fā)送(發(fā)送地址為127.0.0.1)。初步認為是由于iLBC壓縮算法復(fù)雜度而引起的CPU占用過高。通過對iLBC庫中的編碼測試文件ilbc_encoder.c來進一步試驗,證實了上述判斷,測試結(jié)果見圖7。
圖5 由xend.c編譯生成的xend_original.elf運行情況
圖6 xend_original.elf運行時輔CPU占用情況
圖7 iLBC編碼測試
圖7中,第二個參數(shù)為iLBC編碼時使用幀長的選擇;第三個參數(shù)為輸入文件,即采樣率為8000Hz,16bit的PCM信號;第三個參數(shù)為編碼后的輸出文件。從圖中可以看出,PCM輸入文件時長30.24秒,經(jīng)iLBC編碼的時間為36.79秒,是實際語音時間的121.7%,超出了6.55秒,遠遠不能達到語音處理的實時性。
為了使VoIP原型系統(tǒng)的編碼模塊在SIC8008上盡可能的降低其對輔CPU的占用率,在實際開發(fā)應(yīng)用的過程中,對iLBC編碼算法代碼進行優(yōu)化改進。
文獻[8]針對編碼算法提出了三個改進方案,并在Windows XP上驗證了優(yōu)化的可行性。其中,文獻[8]中提出的減少自適應(yīng)碼書比較次數(shù)和搜索范圍是有效降低算法復(fù)雜度的方法,即考慮到擴展碼書與基本碼書的相關(guān)性,在基本碼書中搜索時取定一個步長跳躍式地搜索,并且在第一級搜索時,編碼的目標(biāo)向量具有較大能量,而第二、第三級搜索時的目標(biāo)向量能量逐級減小,可以將步長繼續(xù)增大,節(jié)約編碼時間。
由于第二和第三級搜索時目標(biāo)向量的能量越來越小,和第一級搜索時相比處于次要地位,SIC8008上iLBC編碼模塊的實際應(yīng)用過程中,在基本碼書和擴展碼書搜索中只保留第一級的搜索,同時使用步長為2的跳躍式搜索。
根據(jù)上一節(jié)的優(yōu)化方法和文獻[8]中提到的其他方案,修改iLBC的代碼,在SIC8008上測試相關(guān)功能。
iLBC編碼模塊優(yōu)化后,其編碼測試結(jié)果如圖8所示。在參數(shù)不變的情況下,編碼時間為實際語音時間的57.5%,比優(yōu)化前縮短了19.39 s。
圖8 iLBC代碼優(yōu)化后的編碼測試
應(yīng)用于實時聲音處理并以RTP包發(fā)送的程序中,xend.elf測試結(jié)果如圖9所示。圖9中結(jié)果沒有延遲告警,正常顯示發(fā)送帶寬。
此時,輔CPU占用率降低了40%左右,如圖10所示。
最后,基于優(yōu)化后的iLBC編碼模塊將文獻[3]中提到的IP電話語音留言功能移植在SIC8008中,進行語音留言測試,所得new message.wav聲音質(zhì)量略有下降,但是依然具有很強的可懂度和清晰度。
通過優(yōu)化,證明了iLBC編碼模塊在SIC8008芯片上開發(fā)VoIP原型系統(tǒng)的可實現(xiàn)性,符合實時語音處理的要求;同時,證明了iLBC編碼優(yōu)化方案在嵌入式軟件開發(fā)過程中的可行性。
圖9 iLBC代碼優(yōu)化后xend.elf的運行情況
圖10 iLBC代碼優(yōu)化后xend.elf運行時輔CPU的占用情況
基于SIC8008芯片開發(fā)的VoIP原型系統(tǒng),在保證不能影響輔CPU進行高清視頻解碼的情況下,盡可能的降低對其資源的占用。其中,對語音進行實時編碼處理的模塊設(shè)計及優(yōu)化是解決問題的關(guān)鍵所在。經(jīng)過對iLBC編碼模塊代碼的改進與優(yōu)化,測試結(jié)果與為優(yōu)化前的模塊相比,CPU占用率降低了40%左右,并且語音質(zhì)量仍然清晰,具有很強的可懂度。雖然,在自適應(yīng)碼書搜索中采用步長不等于1和只進行一級搜索的方法從理論上不能保證最優(yōu)解,但是在應(yīng)用過程中其實驗結(jié)果對信噪比的影響不大,因此,iLBC模塊的優(yōu)化方案在VoIP原型系統(tǒng)開發(fā)中還是值得的。
參考文獻
[1]重慶四聯(lián)微電子. SIC8008產(chǎn)品說明[R]. 重慶四聯(lián)微電子,2011.
[2]于文華.基于網(wǎng)絡(luò)機頂盒實現(xiàn)VOIP終端[J].電腦知識與技術(shù),2010,6(3).
[3]許悅.基于Mediastreamer2的IP電話語音信箱功能的設(shè)計與實現(xiàn)[J].電子測試,2011(12).
[4]Simon Morlat, Mediastreamer2 Documentation 2.4.0[EB/OL]. May 19, 2010. http://download-mirror.savannah.gnu.org/releases/linphone/mediastreamer/doc/index.html.
[5]楊拯. iLBC語音算法研究及DSP實現(xiàn)[D].北京:北京郵電大學(xué),2008.
[6]S. V. Anderson. Internet Low Bit Rate Codec (iLBC)[EB/OL]. December 2004. http://tools.ietf.org/html/rfc3951.
[7]郭廷廷,李 敬.iLBC編碼算法及其在VoIP中的應(yīng)用[JOL].電子技術(shù)應(yīng)用,2006(7).
[8]肖博,劉炯鑫,黃永峰.iLBC語音編解碼器的實現(xiàn)與優(yōu)化[J].計算機研究與發(fā)展,2007,44(z1).