国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

一種基于CK嵌入式CPU的G.729A語音編解碼器

2010-12-21 06:31:00裘燕鋒
電子器件 2010年4期
關(guān)鍵詞:基音編解碼代碼

裘燕鋒,馬 琪

(杭州電子科技大學(xué)微電子CAD所, 杭州 310037)

傳統(tǒng)語音編碼分為波形編碼和參數(shù)編碼兩種類型。隨著語音壓縮技術(shù)的發(fā)展,產(chǎn)生了一種新的混合編碼,綜合了波形和參數(shù)編碼的特點,如碼本激勵線形預(yù)測編碼(CELP)。 ITU推出的語音編碼標(biāo)準(zhǔn)G.729就是建立在CELP算法基礎(chǔ)上,采用了CSACELP(共軛代數(shù)碼本激勵線性預(yù)測)算法,其中的G.729A是G.729的簡化版本[1]。

一般的語音編碼器都用DSP處理器實現(xiàn)。但DSP處理器不僅成本較高,而且還需要CPU輔助控制網(wǎng)絡(luò)/通信協(xié)議棧和整個應(yīng)用系統(tǒng),這就意味著要用“CPU+DSP”的雙核單芯片或雙芯片來實施整個應(yīng)用方案。因此我們希望能尋求一款性能較高并能同時完成語音編解碼、網(wǎng)絡(luò)/通信協(xié)議棧和系統(tǒng)主控的嵌入式CPU芯片,以有效降低整個應(yīng)用方案的成本。而其關(guān)鍵技術(shù)是如何在此類嵌入式CPU上實現(xiàn)對語音信號的實時編解碼。

本文選擇一種低成本的國產(chǎn)32 bit嵌入式CPU CK-Core平臺,通過對G.729A算法流程的分析和優(yōu)化,在該硬件平臺上實現(xiàn)了一個G.729A語音編解碼器,在為低成本語音編解碼應(yīng)用解決方案提供技術(shù)關(guān)鍵的同時,也有助于國產(chǎn)32 bit嵌入式CPU的推廣應(yīng)用。

1 32位嵌入式CPU CK510E平臺

CK-Core是由浙江大學(xué)和杭州中天微系統(tǒng)公司聯(lián)合開發(fā)的高性能、低成本、低功耗32 bit嵌入式CPU核系列,是目前量產(chǎn)規(guī)模最大的國產(chǎn)32 bit嵌入式CPU核。其中的CK510E主要特點有[2]:32 bit數(shù)據(jù)長度, 16 bit指令長度;250 MHz工作頻率(最惡 劣 情 況), 400 MHz(典型 情 況);177dhrystone MIPS(250 MHz);7級流水線結(jié)構(gòu);片上高速緩存;支持big endian和little endian模式;內(nèi)部硬件調(diào)試模塊支持片上硬件調(diào)試;支持快速中斷,支持向量中斷和自動向量中斷;指令Cache和數(shù)據(jù)Cache大小可配置,相關(guān)組的個數(shù)可調(diào)整。

CK510E算術(shù)運算單元包括32 bit的算術(shù)運算單元(ALU)、一個桶型移位器和乘法器。 ALU執(zhí)行標(biāo)準(zhǔn)的32 bit整數(shù)操作,支持FF1操作,絕大部分可以在一個周期內(nèi)完成。乘法器支持32×32整數(shù)乘法,以及64 bit的無符號乘加運算。

2 G.729A的CS-ACELP編解碼原理

2.1 編碼原理

圖1所示是基于碼激勵線性預(yù)測編碼模型的編碼器,其采樣率為8 kHz, ,每10 ms為1幀,對應(yīng)80個采樣點。輸入信號首先進行高通濾波,接著LP分析每10 ms做一次LP濾波器系數(shù)的計算,然后這些系數(shù)被轉(zhuǎn)換為LSF并進行矢量量化(VQ)。激勵信號應(yīng)用分析合成(ABS)搜索算法進行選擇,該算法依據(jù)感覺加權(quán)失真測度使原始與重建語音信號間的誤差最小。激勵參數(shù)每5ms子幀確定一次。開環(huán)基音延遲基于感覺加權(quán)語音信號每10 ms一幀估算一次,目標(biāo)信號x(n)由LP殘差通過加權(quán)合成濾波器W(z)/A(z)的濾波得到。算得加權(quán)合成濾波器的沖擊響應(yīng)h(n)后,進行閉環(huán)基音分析[3]。利用目標(biāo)信號x(n)和沖擊響應(yīng)h(n),在開環(huán)基音延遲值附近搜索1/3 精度的分?jǐn)?shù)基音延遲。目標(biāo)信號減去自適應(yīng)碼書貢獻(xiàn)后,作為新的目標(biāo)信號用于搜索固定碼書。

圖1 編碼器原理圖

2.2 解碼原理

如圖2所示。首先,從接收到的比特流中提取參數(shù)標(biāo)號,這些標(biāo)號被譯碼以獲得對應(yīng)的10 ms語音幀的編碼參數(shù)(包括LSF,兩個分?jǐn)?shù)基音延遲,兩個固定碼書矢量, 兩組自適應(yīng)碼書和固定碼書增益),由固定碼本和自適應(yīng)碼本的增益定標(biāo)的矢量相加得到激勵;再將激勵通過綜合濾波器濾波重建語音;最后通過后處理重建語音信號得到合成語音[3]。

圖2 解碼器原理圖

3 G.729A算法的優(yōu)化實現(xiàn)

標(biāo)準(zhǔn)的G.729A C語言程序運算量很大,若將其直接加載到CK510E上, G.729A語音編解碼算法無法實現(xiàn)實時, 所以必須根據(jù)CK510E的特點對G.729A算法進行算法級和代碼級優(yōu)化, 才能在CK510E上實時實現(xiàn)G.729A編解碼。

3.1 取消預(yù)讀的5 ms前瞻

在原G.729A語音編解碼算法中,需要來自下一語音幀的40個樣點(5 ms)前瞻。根據(jù)文獻(xiàn)[4]及我們的實際仿真結(jié)果,是否預(yù)讀5 ms前瞻對語音質(zhì)量并沒有明顯差別。因此在算法中我們將數(shù)據(jù)緩沖區(qū)中下一幀5 ms的前贍數(shù)據(jù)用“0”代替,取消由此帶來的編碼器5 ms的編解碼延時。

3.2 加速多級運算的第一級搜索

在對G.729A算法結(jié)構(gòu)的分析中,發(fā)現(xiàn)在G.729A算法中有大量的多級查詢或多級量化,如基音延遲搜索、LSP系數(shù)的量化等。這種方法在處理過程中,先按照約定的算法或原則將查詢或量化的范圍縮小,然后提高精度,繼續(xù)縮小范圍;最后在這個很小的范圍內(nèi)進行運算。這種多級的運算可以減小計算量。一般情況下,經(jīng)過第一級的運算后,所縮小到的區(qū)域已經(jīng)很小,此后的運算量也較小,進行優(yōu)化的意義不大。因此,在保證語音質(zhì)量的前提下,我們重點對第一級的搜索過程進行粗化來減少計算量[5]。

在LP轉(zhuǎn)換為LSP和LSP系數(shù)的量化中,均要用到Chebyshev多項式來搜尋線譜頻(LSF)。原算法在搜尋時,將0到π的區(qū)間平均分成了50個小區(qū)間,然后在每個小區(qū)間進行2次搜尋。我們對其進行粗化搜索的優(yōu)化,將0到π的區(qū)間平均分成40個小區(qū)間[6],每個小區(qū)間再進行2次搜尋。在滿足精度要求的前提下,粗化第一級量化的搜索過程,減少了總的搜索時間,從而降低了計算量。

類似的方法還可以用在開環(huán)音調(diào)分析中,開環(huán)音調(diào)分析對三個范圍進行搜索,這三個范圍分別是[ 20, 39] , [40, 79]和[ 80, 143],對應(yīng)有三個循環(huán)分別對三個范圍進行搜索。我們對搜索的第一級進行粗化,把這三個循環(huán)的步長改為原來的兩倍[7],結(jié)果證明粗化搜索過程對合成語音的質(zhì)量基本沒有影響,而開環(huán)基音搜索的運算量約降低到原來的一半。

3.3 基本運算函數(shù)的代碼優(yōu)化

3.3.1 溢出保護的分析

在原G.729A算法代碼中,所有運算之后都要檢驗結(jié)果是否溢出,尤其是一些基本運算調(diào)用十分頻繁,因此,所需執(zhí)行的溢出檢驗的次數(shù)非常巨大,耗費了大量的運算量[8]。而在實際的運算過程中,通過對數(shù)據(jù)值所處范圍進行分析,發(fā)現(xiàn)并不是所有的運算都存在溢出,因此,我們只需在程序運行當(dāng)中確實有可能出現(xiàn)溢出的地方加入溢出保護。測試結(jié)果證明,通過在不必要的地方去除溢出的處理,程序的計算量明顯降低。而且通過ITU-T提供的全部測試序列的檢驗,去除不必要的溢出保護沒有降低語音的質(zhì)量。在去除了不必要的溢出判斷之后,再對基本函數(shù)使用CK-Core內(nèi)核的匯編指令進行手工匯編代碼編寫,例如對在basic_op.c文件中兩個16位數(shù)乘法運算Word16 mult(var1,var2)在不需要溢出判斷時改寫如下:

用匯編語句改寫后,去除冗余的溢出檢查,運算速度明顯提高。

3.3.2 采用函數(shù)直接插入和宏定義

對函數(shù)采用直接插入一方面可以節(jié)省函數(shù)調(diào)用的開銷,另一方面CK510E的C編譯器可對直接插入的函數(shù)以及函數(shù)的上下文代碼進行優(yōu)化,但函數(shù)的直接插入會增加代碼長度。綜合性能上的考慮,我們可以對一些小的并且調(diào)用不太頻繁的基本運算函數(shù),采取直接插入的方法。另外,在原G.729A算法代碼中,對一些簡單的運算函數(shù),我們可以定義為宏來提高系統(tǒng)的運行速度。

3.4 核心運算模塊的代碼優(yōu)化

CK510E擁有26條與DSP相關(guān)的匯編指令,支持SIMD,可加速MAC等相關(guān)運算,非常適用于運算量較大、實時性要求較高的核心運算部分的實現(xiàn)。但目前幾乎所有的C編譯器(包括CK 510E的C編譯器)對DSP相關(guān)指令編譯的優(yōu)化效率都不高。為了最好的發(fā)揮DSP指令資源特別是CPU中的DSP指令資源優(yōu)勢,往往需要用C和匯編混合編程:C語言主要完成運算量不大、控制程序流程的代碼部分,而匯編語言著重完成核心運算模塊的實現(xiàn)。

由于語音編解碼本身的特點, G.729A算法中相乘后累加的運算形式出現(xiàn)的頻率很高,而且常常出現(xiàn)在循環(huán)內(nèi)部。但G.729A算法C代碼經(jīng)C編譯器編譯后,生成的匯編代碼大多是兩個數(shù)先相乘、再利用加指令將結(jié)果累加到某一寄存器中,這樣既需要眾多的寄存器暫存數(shù)據(jù),又會因指令的繁多(乘、加、裝載、存儲等)而增加運算時間。我們在匯編代碼優(yōu)化中,充分利用CK 510E的相關(guān)DSP指令,做乘加一次性操作(如mulsha指令),使系統(tǒng)可以在一個指令周期內(nèi)完成乘加操作。如C編譯器生成的實現(xiàn)“數(shù)據(jù)寄存器r2, r3相乘,再與數(shù)據(jù)寄存器r4作和,并將最終的結(jié)果保存在r4中”的匯編代碼為:

mult r2, r3 //需要4個時鐘周期

addu r4, r2 //需要1個時鐘周期

該段代碼共需要 5 個時鐘周期, 我們使用mulsha指令進行優(yōu)化改寫后的代碼如下:

mov lo, r4 //需要1個時鐘周期

mulsha r2, r3 //需要1個時鐘周期

mulsha指令操作直接實現(xiàn)寄存器r2和r3的值相乘,再加上寄存器lo中的值,并將結(jié)果保存在寄存器lo中,優(yōu)化后的代碼只需要2個時鐘周期就可以完成。如果多次進行這樣的運算,優(yōu)化效果會十分明顯。所以我們對整個 G.729A算法中的乘累加,都使用該指令代碼來完成。

在整個G.729A算法核心運算模塊的代碼優(yōu)化中,我們利用profile工具,統(tǒng)計出占用循環(huán)數(shù)比較多的函數(shù)為:合成濾波器(Syn_filt()),計算相關(guān)(Cor_h_x()),計算自相關(guān)(Autocorr())等,這些函數(shù)耗費了整個編解碼器的主要運算時間。因此我們主要對這些函數(shù)進行部分的匯編改寫。首先,由編譯器進行匯編文件生成,具體如下:

其中file.c是對應(yīng)要進行手工優(yōu)化的文件,然后在匯編文件中對計算復(fù)雜的函數(shù)再進行手工匯編的優(yōu)化。我們主要的優(yōu)化原則和方法有:

3.4.1 合理分配局部變量

在G.729A算法中運用了大量的局部變量來存儲運算過程中的值。由于CK510E內(nèi)部寄存器的數(shù)目有限,數(shù)據(jù)緩沖區(qū)分配太多局部變量會導(dǎo)致內(nèi)存空間的浪費。因此需要根據(jù)運算的特點對局部變量的分配進行調(diào)整,盡可能利用CK510E的內(nèi)部寄存器暫存中間運算結(jié)果。

3.4.2 流水線結(jié)構(gòu)的利用

代碼優(yōu)化應(yīng)充分考慮到CK510E執(zhí)行指令采用七級的流水線結(jié)構(gòu)。為了調(diào)高系統(tǒng)的并行處理能力,避免流水線延遲,應(yīng)對可能要用到上一條指令結(jié)果的當(dāng)前指令,中間插入其他指令;一些大于一個指令周期才能完成的指令,若在下一條指令中要用到它的結(jié)果時,這兩條指令之間也必須錯開相應(yīng)的指令周期。

3.4.3 循環(huán)的優(yōu)化

由于CK510E并不是真正意義上的DSP處理器,并不具備零開銷循環(huán)的功能,因此任何一條循環(huán)判斷跳轉(zhuǎn)指令都要耗費相當(dāng)大的時鐘周期數(shù),所以對循環(huán)進行優(yōu)化是十分必要的。 G729A算法中包含了大量的循環(huán),多重嵌套循環(huán)也在很多地方使用。在這些循環(huán)尤其是嵌套較深的循環(huán)內(nèi)部,減少一條指令就可以大大降低程序操作的次數(shù)。因此在優(yōu)化代碼時盡量把能夠在循環(huán)體外執(zhí)行的語句放到循環(huán)體外執(zhí)行,同時,如果內(nèi)層循環(huán)代碼不多時,要盡量把循環(huán)體展開,從而降低內(nèi)層循環(huán)的開銷,提高執(zhí)行效率。

4 G.729A編解碼器測試結(jié)果

我們對算法代碼優(yōu)化后實現(xiàn)的G.729A編解碼器進行了測試分析。測試平臺為嵌入式 CPU CK510E,工作頻率為120 M。測試數(shù)據(jù)為一段語音文件,該語音文件是利用WindowS自帶的錄音機錄制的,內(nèi)容為“你好,這里是國家集成電路產(chǎn)業(yè)化基地”,總共有608個幀。

測試結(jié)果證明,經(jīng)過優(yōu)化后的算法相比沒有優(yōu)化的算法在執(zhí)行周期上明顯的減少,大幅提高了編解碼器運行的效率,而語音質(zhì)量并沒有明顯的降低。在處理時間上,未做優(yōu)化之前,平均一個語音幀編解碼時間約為46.8 ms,優(yōu)化處理后平均一個語音幀的編解碼時間約為8.3 ms(<10 ms),結(jié)果滿足實時要求,達(dá)到了本文優(yōu)化的預(yù)期目標(biāo)。在語音質(zhì)量上,圖3和圖4分別是測試語音信號的原始信號波形和重構(gòu)信號波形。重建波形與原始波形并無明顯失真,得到了較好的重建,經(jīng)主觀非正式測試,重建語音在主觀聽覺上與原始語音無明顯的差別,保留了較好的講話特征,對于語音信號具有良好的適應(yīng)性。

圖3 原始語音波形

圖4 重構(gòu)語音波形

[ 1] ITU-T Recommendation G.729:Coding of Speech at 8 kbit/s Using Conjugate-Structure Algebraic-Code-Excited Liner-Prediction(CS-ACELP)Annex A:Reduced complexity 8 kbit/s CS-ACELP speech codec, 1996.

[ 2] CK 510E用戶手冊[S] .杭州中天微系統(tǒng)有限公司, 2006.

[ 3] ITU-T Reccommendation G.729:Coding of Speech at 8kbit/s Using Conjugate-Structure Algebraic-Code-Excited Liner-Prediction(CS-ACELP), 1996.

[ 4] 許鋼,俞曉峰, 葛愿.基音周期估計中倍數(shù)檢驗算法的研究[ J] .自動化與儀器儀表, 2008, 126(2):79-81.

[ 5] 孫宏斌,楊藝山.基于G.729協(xié)議的算法優(yōu)化及仿真實現(xiàn)研究[ J] .計算機應(yīng)用, 2006(3):88-91.

[ 6] 崔心發(fā).ITU-TG.729A語音編碼算法的研究與實現(xiàn)[ D].成都:電子科技大學(xué)通信與信息系統(tǒng), 2006:64-65.

[ 7] 丁海建.G.729的優(yōu)化研究及其應(yīng)用[ D] .北京:北京郵電大學(xué)計算機科學(xué)與技術(shù)學(xué)院, 2008:43-44.

[ 8] 吳秀枝,陳智慧,萬曉榆.G.729算法的一種優(yōu)化改進[ J] .廣東通信技術(shù), 2009(5):16-19.

猜你喜歡
基音編解碼代碼
1553B總線控制器編解碼設(shè)計
大型民機試飛遙測視頻編解碼方法研究
基于基音跟蹤的語音增強研究
基于H.265編解碼的高清視頻傳輸系統(tǒng)研究
電子測試(2018年18期)2018-11-14 02:30:54
創(chuàng)世代碼
動漫星空(2018年11期)2018-10-26 02:24:02
創(chuàng)世代碼
動漫星空(2018年2期)2018-10-26 02:11:00
創(chuàng)世代碼
動漫星空(2018年9期)2018-10-26 01:16:48
創(chuàng)世代碼
動漫星空(2018年5期)2018-10-26 01:15:02
樂理小知識
小演奏家(2014年11期)2014-12-17 01:18:52
一種改進的基音周期提取算法
资兴市| 朝阳市| 科技| 惠来县| 江津市| 太谷县| 兴安盟| 湘乡市| 凤阳县| 商都县| 扶风县| 屏南县| 洛南县| 福海县| 旺苍县| 临猗县| 庆元县| 阳西县| 长顺县| 凯里市| 聂荣县| 竹北市| 洛川县| 泽库县| 铜梁县| 莱芜市| 化德县| 兴宁市| 肇东市| 屏东市| 蒙山县| 明溪县| 筠连县| 建昌县| 濮阳县| 定日县| 论坛| 宝山区| 阳曲县| 开原市| 达尔|