G.729�(xié)議使用的算法是共軛結(jié)�(gòu)的算術碼本激勵線性預測(CS-ACELP�,它基于CELP編碼模型。由于G.729�解碼�具有很高的語音質(zhì)量和很低的延�,被廣泛地應用在數(shù)�(jù)通信的各個領�,如IP phone和H.323�(wǎng)上多媒體通信系統(tǒng)等�
電話線路上的模擬語音信號,�(jīng)話路帶寬濾波(符合ITU-T G.712建議)后,�8kHz采樣,量化�16bit線性PCM�(shù)字信號輸入到編碼�。該編碼器是基于線性預測分析合成技�,盡量減少實際語音與合成語音之間經(jīng)聽覺加權(quán)后差分信號的能量為準則來進行編碼�。編碼器的結(jié)�(gòu)框圖如圖1所�,其主要部分有�
·線性預測分析和LPC系數(shù)的量�;
·開環(huán)基音周期估計;
·自適應碼本搜�;
·固定碼本搜索;
·碼本增益量化�
下面分別描述這五部分的主要技��
·線性預測分析與LPC系數(shù)的量�
首先對信號進行加線性預測分析窗,分析窗由兩部分組�。部分是半個漢明窗,第二部分是四分之一個余弦信�。將加窗后的語音信號通過LevinsonDurbin算法獲得線性預測濾波器系數(shù)ai i=1......10。由于線譜對參數(shù)比線性預測系�(shù)具有更好的內(nèi)插特性和量化特性[3], G.729將LPC參數(shù)�(zhuǎn)換成相應的線譜對參數(shù),對線譜對參數(shù)進行量化�
·開環(huán)基音分析
為了減少自適應碼本搜索的復雜�,需要計算開�(huán)基音Top,使自適應碼本搜索在開�(huán)基音值附近進行。基音值的范圍�18~145個樣本點之間�
·自適應碼本搜�
G.729對每個子幀進行閉環(huán)基音搜索,它通過最小化原始語音信號和重�(gòu)語音信號的加�(quán)均方誤差來進行閉環(huán)基音搜索。對子幀1的閉環(huán)基音T1的搜索是局限在開環(huán)基音Top的一個小范圍�(nèi),對子幀2的閉環(huán)基音T2的搜索是局限在閉環(huán)基音T1的一個小范圍�(nèi)。這樣可以減少基音搜索的復雜度�
·固定碼本搜索
G.729固定碼本矢量含有四個非0脈�,每個脈沖的幅度要可以是+1�-1。通過最小化加權(quán)語音信號和加�(quán)重構(gòu)語音信號的均方誤差來進行固定碼本的搜��
·增益量化
G.729對自適應碼本增益和固定碼本增益采用二級共軛結(jié)�(gòu)碼本進行矢量量化。在碼本搜索�,采用預搜索策�,使得運算量只為全搜索算法�1/4�
G.729的解碼也是按幀進行�,主要是對符合G.729�(xié)議的碼流進行解碼,得到相應的參�(shù),根據(jù)語音�(chǎn)生的機理,合成語音。解碼的方框圖如圖2所�,其主要部分為:參�(shù)解碼;后濾波處理�
G.729解碼過程如下�
·參數(shù)解碼
首先解碼得到線譜對參�(shù),并將線譜對參�(shù)�(zhuǎn)換為線性預測系�(shù)。然后解碼出基音周期,獲得自適應碼本矢量V(n)。解碼出固定碼本矢量的四個脈沖的位置和符�,計算出固定碼本矢量c(n)�
·后濾波處�
后濾波處理主要是自適應后濾波。自適應后置濾波器是由三個濾波器級連而成:長時后置濾波器Hp(z),短時后置濾波器Hf(z),頻譜傾斜補償濾波器Ht(z),后面接著進行一個自適應增益控制過程。后� 濾波器的系數(shù)每一個子幀更新一�。后置濾波能夠有效地改善合成出的語音�(zhì)量�
我們在Analog Device的定點數(shù)字處理芯片ADSP-2181[4][5]上實時實�(xiàn)了符合ITU-T G.729的全部功�,進行編解碼總共用�22MIPS(ADSP-2181處理速度�33MIPS�。實時實�(xiàn)了G.729的編解碼功能,主要有以下的難點�
·�(shù)�(jù)在DSP中的安排。在DSP中只要是聲明的變�,DSP的連接程序就會分配�(shù)�(jù)空間。如果我們象C語言編程那樣定義局部變�,就會浪費大量的存儲空��
·�(shù)�(jù)精度的處�。在16位的定點信號處理芯片上實�(xiàn)一些浮點算法時,為了使運算速度加快,往往要針對定點芯片的特點,用定點數(shù)來表示浮點數(shù)。雖然速度提高�,但是很可能導致運算精度不��
·有限計算資源的利�。ADSP2181只有33MIPS,而且不能使所有的MIPS都用來實�(xiàn)G.729的編解碼功能�
·DSP高速運行時,DSP與主機的�(shù)�(jù)交互�
·語音信號和編解碼緩沖區(qū)的維�。這些緩沖區(qū)至少都有兩者要去存�,如語音信號緩沖區(qū), 一方面語音編碼模塊要調(diào)�,另一方面采集中斷程序也要�(diào)用它。而在語音編碼模塊�(diào)用的過程�,該緩沖區(qū)不應該被其它模塊所改變,所以中斷程序不應該此時去存儲這個緩沖區(qū),這就存在著矛��
1. 軟件設計
軟件設計主要包括三個部分�
· 命令解釋�
命令解釋器主要是用于解釋主CPU�(fā)來的各種命令,如發(fā)送或接收編解碼數(shù)�(jù)、查詢編解碼狀�(tài)以及啟動、停止編解碼操作等。該模塊不直接與主CPU打交�,而是通過接口功能模塊,間接實現(xiàn)與主CPU的�(shù)�(jù)信息交換�
· G.729�(shù)�(jù)引擎
我們在ADSP-2181上完成了G.729的實時編/解碼工作�
ADSP-2181不僅包含了ADSP-2100系列的基本結(jié)�(gòu)(三個運算單�、數(shù)�(jù)地址�(fā)生器和一個程序序列器�,還含有兩個串行口、一�16位的�(nèi)部IDMA�,一�8位的BMDA�、一個可編程定時�、標志輸入輸出(Flag I/O、外部中斷能力以及片�(nèi)程序和數(shù)�(jù)存儲器等周邊設備。ADSP-2181片內(nèi)集成了共80K字節(jié)的存儲器,它們分別是16K字(24bit)程序存儲器�16k字(16bit)的�(shù)�(jù)存儲�,大量的片�(nèi)存儲器使得復雜的G.729編解碼算法能夠全部放入ADSP-2181片內(nèi),無須增加任何的片外RAM,簡化了硬件設計和接口�
· 接口功能模塊
該模塊實�(xiàn)ADSP-2181與主CPU的數(shù)�(jù)實際交換工作。該模塊包括DSP的主控程序和�(shù)�(jù)傳輸兩部�。DSP的主控程序主要負責不斷將采集到的語音�(shù)�(jù)分幀,送入編碼�,并將接收到的碼流分類后送入解碼器模�。數(shù)�(jù)傳輸部分負責采集�(shù)�(jù)和與主CPU的數(shù)�(jù)交換�
2. 硬件設計
本系�(tǒng)考慮了各CPU之間的數(shù)�(jù)交換與協(xié)�(diào)等問�。ADSP2181具有一�16位的IDMA
�,在處理器全速運行的情況�,ADSP-2181可以自動完成IDMA口的接收和發(fā)送數(shù)�(jù),這為系統(tǒng)的設計帶來了很大的便�。利用ADSP-2181的這個性質(zhì),我們通過IDMA口來實現(xiàn)ADSP-2181與主CPU的數(shù)�(jù)交互�
我們設計了ADSP-2181與PC機ISA總線接口的主從系�(tǒng)。在這個主從系�(tǒng)�,PC機為主CPU,ADSP-2181為從CPU。在啟動�,由PC機通過IDMA口將程序裝載入ADSP-2181�(nèi)部存儲器�。在ADSP-2181全速運行時,主機可以查詢從機的運行狀�(tài)、讀取壓縮后的G.729碼流,也可以送入待解碼的G.729碼流��
在該主從系統(tǒng)�,PC機通過ADSP-2181的IDMA口來讀寫它的內(nèi)部存儲器。PC總線通過GAL譯碼,形成IACK信號,與ADSP-2181的IDMA口連接,這樣就實�(xiàn)了在ADSP-2181全速運行的情況�,PC機仍能訪問到ADSP-2181�(nèi)部存儲器�
圖3是主從系�(tǒng)中的ADSP-2181功能與接口的框圖。語音信號由ADSP1847采集,通過ADSP-2181的串口0送入到ADSP-2181進行編碼。編碼數(shù)�(jù)通過IDMA口送到主機進行存儲。需要解碼的�(shù)�(jù)從主機由IDMA口送到ADSP-2181進行解碼,解碼后獲得的語音信號通過串口0送至ADSP1847�
3 .難點的解�
�(shù)�(jù)在DSP中的安排。維護好一張變量表,每次進入一個模塊時,首先使用已經(jīng)分配但暫時不用的變量。只在不夠的情形�,再去分配額外的變�,同時將這些新分配的變量計入到變量表�,供其它模塊使�。另外維護好一個局部變量堆�,使得各個模塊的�(nèi)部局部變量分配在堆棧�,當從該模塊退出時,就從堆棧中彈出這些局部變�,釋放空間�
�(shù)�(jù)精度的處�。對精度要求比較高的地方,將計算的中間變量采用32位來表示,運算�(jié)束后,再轉(zhuǎn)換成16位表�,這樣指令條數(shù)增加不多,但精度卻大大提高了。在某些精度要求比較高的模塊,采用尾數(shù)和指�(shù)來表示浮點數(shù),自己編寫一套指�(shù)和尾�(shù)的運算庫,由于尾數(shù)和指�(shù)表示法有足夠大的精度范圍,完全滿足要求。但只能在少許地方采用這種方法,否則運算量就會上�,給實時實�(xiàn)帶來困難�
有限計算資源的利�。利用ADSP強大的多功能指令可以非常好地利用有限計算資源�
DSJP高速運行時,DSP與主機的�(shù)�(jù)交互。由于ADSP-2181具有一�16位的IDMA�,在處理器全速運行的情況�,ADSP-2181可以自動完成IDMA口的接收和發(fā)送數(shù)�(jù),這為系統(tǒng)的設計帶來了很大的便�。利用ADSP-2181的這個性質(zhì),我們通過IDMA口來實現(xiàn)ADSP-2181與主CPU的數(shù)�(jù)交互�
語音信號和編解碼緩沖區(qū)的維護。本系統(tǒng)的數(shù)�(jù)交互都是采用雙緩沖的工作方式。雙緩沖的好處在于數(shù)�(jù)的交互不會影響到其他工作的正常進行�
本系�(tǒng)的數(shù)�(jù)采集與播放采用雙緩沖的工作方式。采集時采用cod-ad和cod-work兩個緩沖區(qū),播放時采用decod-work和decod-work兩個緩沖區(qū)。cod-ad用于ADSP-2181的串口數(shù)�(jù)采集,cod-work用于ADSP-2181的編�。當cod-ad采完一幀�(shù)�(jù)后與cod-work互換。decod-work用于ADSP-2181的串口數(shù)�(jù)播放,decod-work用于ADSP-2181的解�。當播放完一幀�(shù)�(jù)�,decod-ad與decod-work互換。采集與播放程序放在ADSP-2181的中斷服務程序中。本系統(tǒng)只開放ADSP-2181的接收中�,ADSP-2181每接收一個數(shù)�(jù),同時就播放一個數(shù)�(jù)�
另外G.729的編碼器的編碼數(shù)�(jù)和解碼器的解碼數(shù)�(jù)都有兩個緩沖區(qū),緩沖區(qū)的工作原理與�(shù)�(jù)采集和播放的雙緩沖區(qū)的工作原理相��
綜上所�,ITU-T的G.729�(xié)議是一個ITU-T�8Kbps語音編解碼協(xié)�,它具有高音質(zhì)和低延時的特�。軟件設計主要包括三個部分:命令解釋�、G.729�(shù)�(jù)引擎、接口功能模�。我們用ADSP-2181實時實現(xiàn)了G.729�(xié)�,在ADSP-2181的數(shù)�(jù)采集/播放和ADSP-2181與主CPU接口的數(shù)�(jù)交互方面都采用了雙緩沖方�。硬件設計主要是通過ADSP-2181的IDMA�,來實�(xiàn)主CPU與ADSP-2181的數(shù)�(jù)交互�
針對實時實現(xiàn)G.729的一些難�,我們提出了一系列解決的方�,通過這些解決方法,我們已�(jīng)在Analog Device的定點數(shù)字處理芯片ADSP-2181上實時實�(xiàn)了符合ITU-T G.729的全部功�,并且已經(jīng)通過了ITU-T G.729的全部測試矢�。該編解碼器已經(jīng)在數(shù)字語音記錄儀和H.323�(wǎng)上多媒體通信系統(tǒng)中推廣應��
1. 引言
語音通信是現(xiàn)代多媒體通信中一個重要的組成部分,語音壓縮又是實�(xiàn)低速率語音通信的關鍵技�。國際電信聯(lián)盟(ITU)于1996年提出了一種共軛結(jié)�(gòu)代數(shù)碼激勵線性預測(CS-ACELP)的語音編碼算法—G.729。該算法�8kbits碼率下具有較好的語音編碼�(zhì)�,且延遲較短,因此在IP電話、移動通信、多媒體�(wǎng)絡通信以及各種手持設備中具有廣泛應用。G.729A是在G.729基礎上進行了一部分簡化,使得編碼的復雜度降�,對硬件的要求更�,而編碼質(zhì)量并沒有明顯降低[1][2][3]�
2.G.729A的DSP軟件開發(fā)流程
在編寫和�(diào)試C6000程序時,為了使C6000代碼獲得的性能,我們需要按照軟件編程的3個階段進行,每個階段完成的任務如下[4]�
階段:開始可以不考慮C6000的有關知識,完全根據(jù)任務編寫C語言程序。在CCS�(huán)境下用C6000的代碼產(chǎn)生工具,編譯�(chǎn)生在C6000�(nèi)運行的代�,證明其功能正確。然后再用CCS的調(diào)試工�,如debug和profiler�,分析確定代碼可能存在的、影響性能的低效率�。為進一步改進代碼性能,需要進入第二階段�
第二階段:利用內(nèi)�(lián)函數(shù)、CCS編譯選項和其他具體優(yōu)化方法改進C語言程序。重復階�,檢查所�(chǎn)生的C6000代碼性能。如果產(chǎn)生的代碼仍不能達到所期望的性能,則進入第三階段�
第三階段:從C語言程序中抽出對性能影響很大的程序段,用線性匯編重新編寫,再用匯編�(yōu)化器�(yōu)�,鏈�,直到達到所期望的性能要求�
具體到G.729A標準編解碼器的實時要�,第三階段是工作的重點,而且線性匯編的重新編寫要求對程序代碼和DSP的特性有充分的了��
3. G.729A代碼的剖�
CCS集成開發(fā)�(huán)境為軟件開發(fā)人員提供了高效的開發(fā)、調(diào)試工�。特別是它提供了評價器( profiler)的�(yōu)化工具,通過收集在指定代碼區(qū)間程序執(zhí)行的�(tǒng)計性能,分析確定程序中各個段、各個子函數(shù)所花費的處理器時間,從而把程序的優(yōu)化集中在對程序性能影響的代碼段上去[5]。其兩種不同的測試方法是�
�1� 在需要測定復雜度的程序段的開頭和�(jié)尾處設定兩個斷�,打開時鐘窗�,運行程�。在個斷點處�(zhí)行停�,這時雙擊時鐘窗口使之�0,接著繼�(xù)�(zhí)行程�,在第二個斷點處停止,這時,時鐘窗口顯示的值便是該段代碼的復雜�。這在測試程序中一個函�(shù)的復雜度是非常有用的�
�2� 先打開統(tǒng)計窗�,在需要測試的程序段頭尾設置統(tǒng)計點((Probe Point�。程序運行結(jié)束后,統(tǒng)計窗口內(nèi)該程序段后面的統(tǒng)計值便是該代碼段的復雜�。這種方法較簡�,統(tǒng)計點自動收集�(tǒng)計信息,無需手工干涉,這在測定程序多段代碼的復雜度是非常有��
4. 線性匯編的�(yōu)�
線性匯編是TI提供的一種匯編語言,其指令系統(tǒng)和匯編語言的指令系�(tǒng)完全相同,但在編寫時不需要指定寄存器和操作單�,也不需要考慮延時的問題,因此編寫線性匯編相對要容易一� [6]�
�(jīng)過階段和第二階段的優(yōu)化后,音頻編碼程序在DM642上的運行狀況有了很大改善,但是�(jīng)測試仍然沒有到達實時效果,而語言的效率幾乎發(fā)揮到�,測試的速度達到�36.5幀/s,是未優(yōu)化之前的10�。這時,我們采用線性匯編語言重新編寫C代碼的低效率段程序,進一步提高程序的�(zhí)行效率和充分利用DM642的硬件資�,最終按設計要求在DM642實時實現(xiàn)G.729A編碼。在前面的DSP開發(fā)流程已經(jīng)提過,DSP開發(fā)的一個手段是用匯編重寫C代碼,它是可以既提高程序�(zhí)行速度又可以減少程序體積的方法。由于針對并行處理器編寫匯編的難度很�,一般采取的是混合編程的方法,即程序的主要部分用C代碼,部分耗時較大的函�(shù)可以用線性匯編改��
在編寫線性匯編優(yōu)化代碼的過程�,為了提高代碼執(zhí)行效�,我們需要遵循以下原則[7]�
?�?)寫并行代碼:通過使用匯編指令并行�(zhí)行的方法減少循環(huán)�(nèi)的執(zhí)行周期數(shù),優(yōu)化線性匯編代�。這里的關鍵問題是弄清指令相關�,只有不相關的指令才能并行執(zhí)�。辨別指令是否相�,可以使用相關圖�
?�?)處理跳�(zhuǎn)指令和轉(zhuǎn)移指令:匯編程序的一大特點就是頻繁地跳轉(zhuǎn),當滿足不同的條件時,要求程序進行不同的操�,或跳到相應的位�。對于“大于”、“大于等于�、“小于�、“小于等于”等較為接近的邏輯判斷和處理,應慎重對待,否則將�(chǎn)生邏輯性錯�,并且很難調(diào)�。當�(fā)生溢出需進行相應處理�,這種�(xiàn)象尤為突出�
?�?)盡量減少循�(huán)體內(nèi)的指令數(shù):G.729A的算法實�(xiàn),有許多是在循環(huán)�(nèi)部完成的,有些地方如固定碼本搜索過程�,為了確定四個非0脈沖的位置和幅度,還用到了多重循�(huán)。在循環(huán)�(nèi)�,特別是在嵌套較深的循環(huán)�(nèi)�,減少一條指令可以大大降低程序的操作次數(shù)。例�,對于一個每重循�(huán)8次的四重嵌套循環(huán),在最�(nèi)層循�(huán)每減少一條指�,整個程序可以少�(zhí)�84=4096語句。因此在設計程序�,能夠放在循�(huán)體外�(zhí)行的語句,盡量放在循�(huán)體外�(zhí)��
?�?)展開程序體:在一定條件下,盡量展開程�,以減少子程序的�(diào)用和返回次數(shù),犧牲空間換取時��
G.729A算法中的LPC模塊、LSP量化及激勵碼本搜索耗時最�,為進一步提高代碼效�,對相關計算、FIR濾波等部分函�(shù)用線性匯編語言進行了改�,并用畫相關圖等方法有針對性的進行�(yōu)�。經(jīng)匯編�(yōu)化器�(yōu)化后,代碼效率比C語言直接編譯有明顯提��
5. �(yōu)化工作的�(chuàng)新點
在對G.729A的優(yōu)化中,本文在前人研究成果的基礎上,針對TMS320DM642 DSP系列芯片提出了一些有價值的新方�。這些�(chuàng)新點在不同程度上提高了代碼的�(yōu)化速度和執(zhí)行效�,在語音編解碼的DSP實時實現(xiàn)中起到了關鍵性作�。下�,以舉例的方式闡明一些經(jīng)典的方法�
5.1 繪制分析�,掌握函�(shù)�(jié)�(gòu)
對于一個語句較多、結(jié)�(gòu)復雜的函�(shù),為了充分了解其邏輯�(jié)�(gòu)和語句的相關�,我們通常采用畫分析圖的方法。分析圖的形式比較靈�,可以根�(jù)具體的情況選用不同的制圖工具。在編寫線性匯編的時�,需要考慮存取�(shù)組中的元�,數(shù)�(jù)打包操作和數(shù)�(jù)相關性等問題,分析圖有助于正確處理這些問題�
在對函數(shù)Cor_h_X� )優(yōu)化過程中,我們遇到了一定的困難,原因在于其中有一個雙層的循環(huán)體,�(nèi)層的次數(shù)與外層有�,外層的循環(huán)次數(shù)�40,并且循�(huán)�(nèi)部的語句有先后的相關�。這樣的結(jié)�(gòu)如果用循�(huán)展開的方法將會用到大量的寄存器,�(shù)目超出了64�,需要開辟額外的�(nèi)存空間去存放臨時變量,而讀寫內(nèi)存會消耗較多的時間,因此這樣�(zhí)行效率不會有充分的提高。對�,我們利用分析圖描述了函�(shù)中關鍵代碼的�(shù)組X[ ],h[ ]的使用情�,如�1所示:
�1 cor_h_X� )函�(shù)分析圖(部分�
�1直觀地反映了�(shù)�16位h[ ]�16位X[ ]之間的乘加關�,從函數(shù)cor_h_X� )中可知,兩個數(shù)組的乘積之和要對應的保存在臨時數(shù)�32位Y[ ]�。通過研究此分析圖,我們發(fā)�(xiàn)h[ ]與X[ ]中的一些元素進行乘積和處理之后就不再被使用,那么存儲這些元素的寄存器可以存放中間�(jié)果(Y[]的元素),這樣就可節(jié)省寄存器的使用個數(shù),免去了開辟�(nèi)存空間和中間變量的存取指令�
對于函數(shù)cor_h_X� �,利用上述思想編寫線性匯編,只需要定�57個寄存器就可以完成所用的操作,存取指令從1760條優(yōu)化到30�,僅為原來的1/60。同時執(zhí)行速度�390072個時鐘減少到35871個,降為原來�1/10�
繪制的分析圖可以包含相關圖,相關表等,使資源安排更加合理。該方法在其他函�(shù)的改寫中也多次使用到�
5.2 功能相似的函�(shù)或代碼段合并為一個函�(shù)
線性匯編在提高代碼效率的同時也成倍的增加了代碼尺�,以上述cor_h_X� )為�,它在該寫后代碼尺寸�660條增大到7776條(該數(shù)�(jù)由CCS剖析工具分析所得)。在工程應用�,對于有限的�(nèi)存程序區(qū),我們會適當減少程序占用的空�。合并功能相似的函數(shù)可以達到這一要求�
在LSP量化處理中,源代碼中給出�2個LSP選擇函數(shù):Lsp_select_1� )和Lsp_select_2� �,而我們發(fā)�(xiàn)它們具有相同的功能和相似的�(jié)�(gòu),因此,在對兩者的線性匯編改寫中,我們只需編寫一個函�(shù)(命名為Lsp_select)即可實�(xiàn)LSP量化處理中這兩個模塊的功能�
另外,在對于一些數(shù)組拷�,數(shù)組初始化的代碼,我們同樣可以用此方�,編寫一個函�(shù)實現(xiàn),這樣可以在提高執(zhí)行效率的同時,減少程序占用的�(nèi)存空��
5.3 多個循�(huán)合并為一個循�(huán)
C代碼改寫線性匯編的時�,我們常常會�(fā)�(xiàn),只要作一些調(diào)�,兩個或多個循�(huán)完成的操作完全可以由一個循�(huán)來完�。以LPC子模�240點加窗語音的自相關計算Autocorr()函數(shù)為例,經(jīng)過優(yōu)化改寫的C代碼(部分)如下�
for(i=0; i<L_WINDOW; i++� //個循�(huán)�
y[i] = (_smpy(x[i], hamwindow[i]�+0x00008000L�>>16;
sum = 1; //避免�0的情�
for(i=0; i<L_WINDOW; i++� //第二個循�(huán)�
sum = _sadd(sum,_smpy(y[i], y[i]));
這段代碼包含了兩個for循環(huán),在CCS中直接編譯運行并行度很差,利用線性匯編重寫代�。我們發(fā)�(xiàn)兩個循�(huán)體的循環(huán)次數(shù)均為60(L_WINDOW=60),所處理的數(shù)組不同,并且兩個循�(huán)沒有相關�,可以把和第二個循�(huán)合并成一個循�(huán)。前者的功能是對語音信號進行加窗;后者是實現(xiàn)乘累加(Mac�。兩者合并后采用線性匯編編�,其代碼如下�
mvk 60,i //設置循環(huán)次數(shù)
loop1: lddw *ham++,hamih:hamil //hamwindow[]指針
lddw *x++,xih:xil //x[]指針
smpy2 hamil,xil,yi1:yi0 //兩對16位操作數(shù)相承,并行執(zhí)�
smpy2 hamih,xih,yi3:yi2
sadd yi0,con0x8000,yi0
sadd yi1,con0x8000,yi1
sadd yi2,con0x8000,yi2
sadd yi3,con0x8000,yi3
packh2 yi1,yi0,yl //�(shù)�(jù)打包技�
packh2 yi3,yi2,yh
stdw yh:yl,*y++ //雙字存取,提高執(zhí)行效�
smpy2 yl,yl,yi1:yi0
sadd sum0,yi1,sum0
sadd sum0,yi0,sum0
smpy2 yh,yh,yi3:yi2
sadd sum0,yi3,sum0
sadd sum0,yi2,sum0
add i,-1,i
[i] b loop1 //把和第二個循�(huán)合成一個大循環(huán),減少轉(zhuǎn)移次�(shù)
�(chǎn)生的匯編代碼并行流水性能大大增加,耗費的時鐘周期數(shù)�1310000減少�15000,少于改編前�1/8�
6. �(jié)束語
關于編解碼器�(zhí)行的時鐘周期,在線性匯編改寫前�,文件版本通過CCS的profiler剖析工具得知:每10幀�100ms)從159700000降至68500000,僅為原來的42%。硬件版本進行測試得:編解碼的幀�(shù)提高到了88幀/s以上,鑒于編�、解碼的時間比例�5:1,所�,本系統(tǒng)編碼已經(jīng)達到100幀/s,完全符合實時通信的要求�
維庫電子�,電子知識,一查百��
已收錄詞�160436�