ITU-TG.729算法及其實時實現
?G.729編解碼算法,實時實現的G.729系統的軟件設計和硬件設計。在ADSP-2181上實現的G.729編解碼器,已經通過了ITU-T G.729的全部測試矢量,并且已經在數字語音記錄儀和H.323網上多媒體通信系統中得到推廣應用。
??? 關鍵詞: G.729協議 ADSP-2181 接口模塊 IDMA口
??? G.729協議[1]是由ITU-T的第15研究小組提出的,并在1996年3月通過的8Kbps的語音編碼協議。
??? G.729協議使用的算法是共軛結構的算術碼本激勵線性預測(CS-ACELP),它基于CELP編碼模型[2]。由于G.729編解碼器具有很高的語音質量和很低的延時,被廣泛地應用在數據通信的各個領域,如IP phone和H.323網上多媒體通信系統等。
??? 針對實時實現G.729的一些難點,我們提出了解決的方法。目前,我們已經在Analog Device的定點數字處理芯片adsp-2181上實時實現了符合ITU-T G.729編解碼器的全部功能,該編解碼器占用了22MIPS的運算量。我們在ADSP-2181上實現的G.729編解碼器,已經通過了ITU-T G729的全部測試矢量,并且已經在數字語音記錄儀和H.323網上多媒體通信系統中進行了推廣應用。
??? 1 G.729協議編解碼算法介紹
??? 1.1 G.729編碼算法介紹
??? 電話線路上的模擬語音信號,經話路帶寬濾波(符合ITU-T G.712建議)后,被8kHz采樣,量化成16bit線性PCM數字信號輸入到編碼器。該編碼器是基于線性預測分析合成技術,盡量減少實際語音與合成語音之間經聽覺加權后差分信號的能量為準則來進行編碼的。編碼器的結構框圖如圖1所示,其主要部分有:
??????? ·線性預測分析和LPC系數的量化;
??????? ·開環基音周期估計;
??????? ·自適應碼本搜索;
??????? ·固定碼本搜索;
??????? ·碼本增益量化。
??? 下面分別描述這五部分的主要技術。
??????? ·線性預測分析與LPC系數的量化
??? 首先對信號進行加線性預測分析窗,分析窗由兩部分組成。第一部分是半個漢明窗,第二部分是四分之一個余弦信號。將加窗后的語音信號通過LevinsonDurbin算法獲得線性預測濾波器系數ai ?i=1......10。由于線譜對參數比線性預測系數具有更好的內插特性和量化特性[3], G.729將LPC參數轉換成相應的線
??? 譜對參數,最后對線譜對參數進行量化。
??????? ·開環基音分析
??? 為了減少自適應碼本搜索的復雜度,需要計算開環基音Top,使自適應碼本搜索在開環基音值附近進行。基音值的范圍在18~145個樣本點之間。
??????? ·自適應碼本搜索
??? G.729對每個子幀進行閉環基音搜索,它通過最小化原始語音信號和重構語音信號的加權均方誤差來進行閉環基音搜索。對子幀1的閉環基音T1的搜索是局限在開環基音Top的一個小范圍內,對子幀2的閉環基音T2的搜索是局限在閉環基音T1的一個小范圍內。這樣可以減少基音搜索的復雜度。
??????? ·固定碼本搜索
??? G.729固定碼本矢量含有四個非0脈沖,每個脈沖的幅度要可以是+1或-1。通過最小化加權語音信號和加權重構語音信號的均方誤差來進行固定碼本的搜索。
??????? ·增益量化
??? G.729對自適應碼本增益和固定碼本增益采用二級共軛結構碼本進行矢量量化。在碼本搜索時,采用預搜索策略,使得運算量只為全搜索算法的1/4。
??? 1.2 G.729解碼算法介紹
??? G.729的解碼也是按幀進行的,主要是對符合G.729協議的碼流進行解碼,得到相應的參數,根據語音產生的機理,合成語音。解碼的方框圖如圖2所示,其主要部分為:參數解碼;后濾波處理。
??? G.729解碼過程如下。
???????? ·參數解碼
??? 首先解碼得到線譜對參數,并將線譜對參數轉換為線性預測系數。然后解碼出基音周期,獲得自適應碼本矢量V(n)。解碼出固定碼本矢量的四個脈沖的位置和符號,計算出固定碼本矢量c(n)。解碼出固定本預測增益gc和固定碼本增益,接著得到激勵信號
??? ?,n=0……39。最后將激勵信號
??? u(n)?輸入到線性預測合成濾波器中,計算出重構語音。
??????? ·后濾波處理
??? 后濾波處理主要是自適應后濾波。自適應后置濾波器是由三個濾波器級連而成:長時后置濾波器Hp(z),短時后置濾波器Hf(z),頻譜傾斜補償濾波器Ht(z),后面接著進行一個自適應增益控制過程。后置 濾波器的系數每一個子幀更新一次。后置濾波能夠有效地改善合成出的語音質量。
??? 2 G.729編解碼器的實現
??? 我們在Analog Device的定點數字處理芯片ADSP-2181[4][5]上實時實現了符合ITU-T G.729的全部功能,進行編解碼總共用了22MIPS(ADSP-2181處理速度為33MIPS)。實時實現了G.729的編解碼功能,主要有以下的難點。
??????? ·數據在DSP中的安排。在DSP中只要是聲明的變量,DSP的連接程序就會分配數據空間。如果我們象C語言編程那樣定義局部變量,就會浪費大量的存儲空間。
??????? ·數據精度的處理。在16位的定點信號處理芯片上實現一些浮點算法時,為了使運算速度加快,往往要針對定點芯片的特點,用定點數來表示浮點數。雖然速度提高了,但是很可能導致運算精度不夠。
??????? ·有限計算資源的利用。ADSP2181只有33MIPS,而且不能使所有的MIPS都用來實現G.729的編解碼功能。
??????? ·DSP高速運行時,DSP與主機的數據交互。
??????? ·語音信號和編解碼緩沖區的維護。這些緩沖區至少都有兩者要去存儲,如語音信號緩沖區, 一方面語音編碼模塊要調用,另一方面采集中斷程序也要調用它。而在語音編碼模塊調用的過程中,該緩沖區不應該被其它模塊所改變,所以中斷程序不應該此時去存儲這個緩沖區,這就存在著矛盾。
??? 2.1 軟件設計
??? 軟件設計主要包括三個部分。
??????? · 命令解釋器
??? 命令解釋器主要是用于解釋主CPU發來的各種命令,如發送或接收編解碼數據、查詢編解碼狀態以及啟動、停止編解碼操作等。該模塊不直接與主CPU打交道,而是通過接口功能模塊,間接實現與主CPU的數據信息交換。
??????? · G.729數據引擎
??? 我們在ADSP-2181上完成了G.729的實時編/解碼工作。
??? ADSP-2181不僅包含了ADSP-2100系列的基本結構(三個運算單元、數據地址發生器和一個程序序列器),還含有兩個串行口、一個16位的內部IDMA口,一個8位的BMDA口、一個可編程定時器、標志輸入輸出(Flag I/O、外部中斷能力以及片內程序和數據存儲器等周邊設備。ADSP-2181片內集成了共80K字節的存儲器,它們分別是16K字(24bit)程序存儲器和16k字(16bit)的數據存儲器,大量的片內存儲器使得復雜的G.729編解碼算法能夠全部放入ADSP-2181片內,無須增加任何的片外RAM,簡化了硬件設計和接口。
??????? · 接口功能模塊
??? 該模塊實現ADSP-2181與主CPU的數據實際交換工作。該模塊包括DSP的主控程序和數據傳輸兩部分。DSP的主控程序主要負責不斷將采集到的語音數據分幀,送入編碼器,并將接收到的碼流分類后送入解碼器模塊。數據傳輸部分負責采集數據和與主CPU的數據交換。
??? 2.2 硬件設計
??? 本系統考慮了各CPU之間的數據交換與協調等問題。ADSP2181具有一個16位的IDMA
口,在處理器全速運行的情況下,ADSP-2181可以自動完成IDMA口的接收和發送數據,這為系統的設計帶來了很大的便利。利用ADSP-2181的這個性質,我們通過IDMA口來實現ADSP-2181與主CPU的數據交互。
??? 我們設計了ADSP-2181與PC機ISA總線接口的主從系統。在這個主從系統中,PC機為主CPU,ADSP-2181為從CPU。在啟動時,由PC機通過IDMA口將程序裝載入ADSP-2181內部存儲器中。在ADSP-2181全速運行時,主機可以查詢從機的運行狀態、讀取壓縮后的G.729碼流,也可以送入待解碼的G.729碼流等。
??? 在該主從系統中,PC機通過ADSP-2181的IDMA口來讀寫它的內部存儲器。PC總線通過GAL譯碼,形成,,,,IACK信號,與ADSP-2181的IDMA口連接,這樣就實現了在ADSP-2181全速運行的情況下,PC機仍能訪問到ADSP-2181內部存儲器。
??? 圖3是主從系統中的ADSP-2181功能與接口的框圖。語音信號由ADSP1847采集,通過ADSP-2181的串口0送入到ADSP-2181進行編碼。編碼數據通過IDMA口送到主機進行存儲。需要解碼的數據從主機由IDMA口送到ADSP-2181進行解碼,解碼后獲得的語音信號通過串口0送至ADSP1847。
??? 2.3 難點的解決
??? 數據在DSP中的安排。維護好一張變量表,每次進入一個模塊時,首先使用已經分配但暫時不用的變量。只在不夠的情形下,再去分配額外的變量,同時將這些新分配的變量計入到變量表中,供其它模塊使用。另外維護好一個局部變量堆棧,使得各個模塊的內部局部變量分配在堆棧中,當從該模塊退出時,就從堆棧中彈出這些局部變量,釋放空間。
??? 數據精度的處理。對精度要求比較高的地方,將計算的中間變量采用32位來表示,運算結束后,再轉換成16位表示,這樣指令條數增加不多,但精度卻大大提高了。在某些精度要求比較高的模塊,采用尾數和指數來表示浮點數,自己編寫一套指數和尾數的運算庫,由于尾數和指數表示法有足夠大的精度范圍,完全滿足要求。但只能在少許地方采用這種方法,否則運算量就會上去,給實時實現帶來困難。
??? 有限計算資源的利用。利用ADSP強大的多功能指令可以非常好地利用有限計算資源。
??? DSJP高速運行時,DSP與主機的數據交互。由于ADSP-2181具有一個16位的IDMA口,在處理器全速運行的情況下,ADSP-2181可以自動完成IDMA口的接收和發送數據,這為系統的設計帶來了很大的便利。利用ADSP-2181的這個性質,我們通過IDMA口來實現ADSP-2181與主CPU的數據交互。
??? 語音信號和編解碼緩沖區的維護。本系統的數據交互都是采用雙緩沖的工作方式。雙緩沖的好處在于數據的交互不會影響到其他工作的正常進行。
??? 本系統的數據采集與播放采用雙緩沖的工作方式。采集時采用cod-ad和cod-work兩個緩沖區,播放時采用decod-work和decod-work兩個緩沖區。cod-ad用于ADSP-2181的串口數據采集,cod-work用于ADSP-2181的編碼。當cod-ad采完一幀數據后與cod-work互換。decod-work用于ADSP-2181的串口數據播放,decod-work用于ADSP-2181的解碼。當播放完一幀數據后,decod-ad與decod-work互換。采集與播放程序放在ADSP-2181的中斷服務程序中。本系統只開放ADSP-2181的接收中斷,ADSP-2181每接收一個數據,同時就播放一個數據。
??? 另外G.729的編碼器的編碼數據和解碼器的解碼數據都有兩個緩沖區,緩沖區的工作原理與數據采集和播放的雙緩沖區的工作原理相同。
??? 綜上所述,ITU-T的G.729協議是一個ITU-T的8Kbps語音編解碼協議,它具有高音質和低延時的特點。軟件設計主要包括三個部分:命令解釋器、G.729數據引擎、接口功能模塊。我們用ADSP-2181實時實現了G.729協議,在ADSP-2181的數據采集/播放和ADSP-2181與主CPU接口的數據交互方面都采用了雙緩沖方式。硬件設計主要是通過ADSP-2181的IDMA口,來實現主CPU與ADSP-2181的數據交互。
??? 針對實時實現G.729的一些難點,我們提出了一系列解決的方法,通過這些解決方法,我們已經在Analog Device的定點數字處理芯片ADSP-2181上實時實現了符合ITU-T G.729的全部功能,并且已經通過了ITU-T G.729的全部測試矢量。該編解碼器已經在數字語音記錄儀和H.323網上多媒體通信系統中推廣應用。
評論
查看更多