張芹 江新道
摘要:該文根據(jù)G.729編解碼理論和具體解碼流程,結(jié)合TI公司DSP產(chǎn)品TMS320C6000系列的TMS320DM642、CCS6000集成開發(fā)環(huán)境以及G.729的硬件實現(xiàn)平臺,提出了DSP傳送數(shù)據(jù)給ARM的算法,以及實現(xiàn)G.729解碼算法的主要程序,在最后給出了G.729解碼的結(jié)果。實驗表明:該方案能夠成功地實現(xiàn)語音解碼。該方法具有低延遲、低速率、高語音質(zhì)量的優(yōu)點。
關(guān)鍵詞:語音解碼;G.729標(biāo)準(zhǔn);數(shù)字信號處理器
中圖分類號:TP391 文獻(xiàn)標(biāo)識碼:A 文章編號:1009-3044(2014)19-4558-04
The Realization for Speech Decoder Based on TMS320DM642
ZHANG Qin, JIANG Xin-dao
(Anhui Vocational College of Electronic and Information Technology,Bengbu 233060,China)
Abstract: Based on the basic theory of the speech coding(LP,VQ,CELP)and the A-B-S technique, combining the TMS320DM642 and the CCS6000, this paper propose the algorithm of the data delivered from DSP to ARM, And the main program of the G.729 decoder, finally, the result of the G.729 decoder has been given. Experiments show that this scheme can successfully implement speech decoding。This method has the advantages of low latency, low rate and high speech quality.
Key words:speech decoding;G.729; DSP
語音通信作為人們傳遞信息、交流思想的最直接有效的方式,在現(xiàn)代各類綜合業(yè)務(wù)數(shù)字中顯得尤其重要。由于語音信號數(shù)據(jù)量大,有限的頻率資源變得越來越寶貴,所以總是力求在有限的信道內(nèi)進(jìn)行更多的信息傳輸。從而對語音編解碼技術(shù)提出更高要求。相應(yīng)的,語音編解碼技術(shù)也成為國際標(biāo)準(zhǔn)化工作中最為活躍的研究領(lǐng)域,G.729應(yīng)運(yùn)而生。
1 G.729編解碼原理
G.729采用的是共軛結(jié)構(gòu)代數(shù)碼激勵線性預(yù)測法,簡稱CS-ACELP[1]。
G.729對輸入的語音模擬信號以每秒8千次的頻率采樣,再以16比特進(jìn)行線性PCM 量化,每80個樣點為一個語音幀,對語音信號分析并提取各種參數(shù),并編碼發(fā)送。參數(shù)編碼的比特分配如表1所示[2]。
表1 8kbps CS-ACELP算法比特分配(每10ms幀)
G.729的編碼流程圖如圖1所示。其中虛線部分表明每子幀(5ms)作一次計算,實線則說明每幀(10ms)計算一次[4]。
相應(yīng)地,解碼時,從比特流中提取參數(shù)編碼,從而獲取各個參數(shù)。方法:通過自適應(yīng)碼矢序號從自適應(yīng)碼本中獲取自適應(yīng)碼矢;通過固定碼矢序號從固定碼本中獲取固定碼矢。所有的碼矢再乘以相應(yīng)的增益,然后按點相加組成激勵序列。用線性預(yù)測濾波器系數(shù)構(gòu)成合成濾波器。用自適應(yīng)碼本方法實現(xiàn)長時域基音合成濾波,把每一子幀的激勵信號通過LP合成濾波器后計算出合成語音,再用后置濾波器進(jìn)一步增強(qiáng)音質(zhì)。
解碼端應(yīng)當(dāng)接收到的發(fā)送參數(shù)及發(fā)送順序,表中所列參數(shù)順序即為發(fā)送順序。
表2 發(fā)送參數(shù)及其順序
圖2 CS-ACELP(G.729)解碼端流程圖[2]
2 G.729解碼實現(xiàn)
2.1 TMS320DM642 DSP簡介
TMS320DM642 DSP 是屬于TMS320C6000 系列DSP 的高性能定點DSP,在TI的C64xDSP內(nèi)核基礎(chǔ)上進(jìn)一步集成了完備的視頻和音頻輸入輸出接口、以太網(wǎng)接口、PCI-66總線等片上外設(shè),是一款非常適合多種數(shù)字媒體應(yīng)用的DSP[5]。
2.2 CCS6000集成開發(fā)環(huán)境
Code Composer Studio(CCS)是Tl公司提供的DSP系統(tǒng)集成開發(fā)環(huán)境,它將工程管理、代碼編輯和系統(tǒng)調(diào)試等功能集成到一個統(tǒng)一的系統(tǒng)中。在CCS6000環(huán)境下,我們能夠進(jìn)行軟件編輯、語言編譯、系統(tǒng)調(diào)試、源代碼性能測試及工程項目管理等所有工作[6]。
2.3 解碼器的初始化
除了下表中的四個變量以外,其它所有解碼器的變量應(yīng)該初始化為0(編碼器變量初始值相同)。
表3 解碼器變量初始化值表
2.4 ARM與DSP接口
本文所用的系統(tǒng)開發(fā)平臺結(jié)構(gòu)主要由DSP、ARM以及FPGA組成,該文的主要工作是在TMS320DM642 DSP上實現(xiàn)G.729解碼算法,解碼后的數(shù)據(jù)需要傳送給ARM做后續(xù)處理。DSP與ARM的接口示意圖如圖3所示。
圖3 DSP與ARM接口示意圖
ARM和DSP之間是通過主機(jī)高速并行接口(HPI)實現(xiàn)數(shù)據(jù)通信的,通過兩端協(xié)商,約定以某些標(biāo)志位來協(xié)調(diào)通信并實現(xiàn)數(shù)據(jù)傳輸。在本文所用實驗平臺上設(shè)置了arm_flag[0], arm_flag[1], arm_flag[2], arm_flag[3]標(biāo)志信號,其初始值為0。
DSP為發(fā)送數(shù)據(jù)端,ARM為接收數(shù)據(jù)端,約定如下:
1)arm_flag[0]=1表示DSP準(zhǔn)備好后,ARM可以接收。
2) arm_flag[2]!=2表示ARM端準(zhǔn)備好后,數(shù)據(jù)傳輸開始。
3) arm_flag[2]=2 表示數(shù)據(jù)已傳輸完。
DSP向ARM發(fā)送數(shù)據(jù)的具體算法流程如圖4所示。首先用一個循環(huán)查詢判斷arm_flag[0]是否為1,如果為1則表示DSP已準(zhǔn)備就緒,可以發(fā)送數(shù)據(jù),程序繼續(xù)判斷ARM端是否已經(jīng)準(zhǔn)備好;如果arm_flag[0]不為1,則代表DSP還沒準(zhǔn)備好發(fā)送數(shù)據(jù),程序繼續(xù)判斷arm_flag[0]是否為1。在arm_flag[0]=1的情況下,接著判斷arm_flag[2]是否為2,如果不為2,則代表數(shù)據(jù)沒有傳輸完,發(fā)送數(shù)據(jù)正式開始,用一個while循環(huán),只要arm_flag[2]不為2就一直傳輸數(shù)據(jù);如果為2,則代表本次數(shù)據(jù)傳輸完了,并設(shè)置arm_flag[2]為初始值0,開始下一幀數(shù)據(jù)的傳輸判斷。
圖4 DSP給ARM傳送數(shù)據(jù)算法流程
2.5 解碼程序說明
G.729解碼程序主要包括以下部分:
·decoder.c 里面包含main()函數(shù)。
·bits.c 里面包含收到編碼參數(shù)的處理函數(shù)和解碼后發(fā)送數(shù)據(jù)的函數(shù)。
·basic_op.h 定義了一些基本算術(shù)函數(shù),解碼算法里的計算過程調(diào)用了這些算術(shù)函數(shù)。
·basic_op.c 基本算術(shù)函數(shù)的函數(shù)體。
·de_acelp.c 用于固定碼本序號的解碼。
·dec_gain.c 用于自適應(yīng)碼本和固定碼本增益的解碼。
·dec_lag3.c 用于自適應(yīng)碼本序號的解碼。
·lsp_dec.c 用于LSP序號的解碼。
·dec_ld8k.c 用于重構(gòu)激勵信號和語音信號。
decoder.c里面的main函數(shù)調(diào)用解碼程序用到的各個算法函數(shù),這些算法函數(shù)主要集中在de_acelp.c、dec_gain.c、dec_lag3.c、lsp_dec.c、dec_ld8k.c里面,這些算法函數(shù)又是調(diào)用basic_op.c里面定義的基本算術(shù)函數(shù)。
2.6 解碼結(jié)果
設(shè)輸入信號數(shù)組為serial[SERIAL_SIZE],這里我們自己造一個輸入信號數(shù)組,設(shè)它為for(i=0;i 解碼結(jié)果輸出如圖5所示。 圖5 輸出結(jié)果圖 需要指出的是,這里解碼器為了將輸出變?yōu)楸忍亓饕员愀玫陌l(fā)送數(shù)據(jù),進(jìn)行了1bit→short int(即2字節(jié),16bit)轉(zhuǎn)換操作。 同時,因為編碼器中的比特分配并不是均勻的,例如某一個參數(shù)需要用5bit來表示,但是它并不是在內(nèi)存中用5bit表示,而是用了一個short int 型數(shù)據(jù)來表示的,所以解碼的輸入輸出結(jié)果的數(shù)組值個數(shù)與G.729理論上的16:1壓縮比有出入。 3 結(jié)論 本文從解碼的角度介紹了G.729編碼理論,給出了解碼的流程圖,并利用DSP產(chǎn)品TMS320DM642、CCS 6000以及實際系統(tǒng)開發(fā)平臺,提出了DSP與ARM接口的設(shè)計方法,成功地實現(xiàn)了語音信號的解碼工作。該方法具有低延遲、低速率、高語音質(zhì)量的優(yōu)點。 下一步工作可以做:1) 結(jié)合TMS320DM642 DSP 指令的特點對代碼進(jìn)行優(yōu)化;2) 對G.729 C程序中某些小算法和數(shù)據(jù)存取方式進(jìn)行優(yōu)化。 參考文獻(xiàn): [1] 張玉業(yè),鄧勇全,李玲遠(yuǎn).語音編解碼算法G.729的軟件實現(xiàn)[J].通信技術(shù), 2003(2). [2] ITU-T , Coding of speech at 8 kbit/s using conjugate-structure algebraic-code-excited linear prediction (CS-ACELP), International Telecommunication Union,1996 [3] ITU-T , Coding of speech at 8 kbit/s using conjugate-structure algebraic-code-excited linear prediction (CS-ACELP)Annex G, International Telecommunication Union,2007 [4] 王炳錫, 語音編碼[M].西安:電子科技大學(xué)出版社,2002. [5] 吳海濤,G.729語音編解碼算法研究及DSP實現(xiàn)[D].哈爾濱:哈爾濱理工大學(xué),2005. [6] 李方慧,王飛,何佩琨,TMS320C6000系列DSP原理與應(yīng)用[M].2版.北京:電子工業(yè)出版社,2003.
2.4 ARM與DSP接口
本文所用的系統(tǒng)開發(fā)平臺結(jié)構(gòu)主要由DSP、ARM以及FPGA組成,該文的主要工作是在TMS320DM642 DSP上實現(xiàn)G.729解碼算法,解碼后的數(shù)據(jù)需要傳送給ARM做后續(xù)處理。DSP與ARM的接口示意圖如圖3所示。
圖3 DSP與ARM接口示意圖
ARM和DSP之間是通過主機(jī)高速并行接口(HPI)實現(xiàn)數(shù)據(jù)通信的,通過兩端協(xié)商,約定以某些標(biāo)志位來協(xié)調(diào)通信并實現(xiàn)數(shù)據(jù)傳輸。在本文所用實驗平臺上設(shè)置了arm_flag[0], arm_flag[1], arm_flag[2], arm_flag[3]標(biāo)志信號,其初始值為0。
DSP為發(fā)送數(shù)據(jù)端,ARM為接收數(shù)據(jù)端,約定如下:
1)arm_flag[0]=1表示DSP準(zhǔn)備好后,ARM可以接收。
2) arm_flag[2]!=2表示ARM端準(zhǔn)備好后,數(shù)據(jù)傳輸開始。
3) arm_flag[2]=2 表示數(shù)據(jù)已傳輸完。
DSP向ARM發(fā)送數(shù)據(jù)的具體算法流程如圖4所示。首先用一個循環(huán)查詢判斷arm_flag[0]是否為1,如果為1則表示DSP已準(zhǔn)備就緒,可以發(fā)送數(shù)據(jù),程序繼續(xù)判斷ARM端是否已經(jīng)準(zhǔn)備好;如果arm_flag[0]不為1,則代表DSP還沒準(zhǔn)備好發(fā)送數(shù)據(jù),程序繼續(xù)判斷arm_flag[0]是否為1。在arm_flag[0]=1的情況下,接著判斷arm_flag[2]是否為2,如果不為2,則代表數(shù)據(jù)沒有傳輸完,發(fā)送數(shù)據(jù)正式開始,用一個while循環(huán),只要arm_flag[2]不為2就一直傳輸數(shù)據(jù);如果為2,則代表本次數(shù)據(jù)傳輸完了,并設(shè)置arm_flag[2]為初始值0,開始下一幀數(shù)據(jù)的傳輸判斷。
圖4 DSP給ARM傳送數(shù)據(jù)算法流程
2.5 解碼程序說明
G.729解碼程序主要包括以下部分:
·decoder.c 里面包含main()函數(shù)。
·bits.c 里面包含收到編碼參數(shù)的處理函數(shù)和解碼后發(fā)送數(shù)據(jù)的函數(shù)。
·basic_op.h 定義了一些基本算術(shù)函數(shù),解碼算法里的計算過程調(diào)用了這些算術(shù)函數(shù)。
·basic_op.c 基本算術(shù)函數(shù)的函數(shù)體。
·de_acelp.c 用于固定碼本序號的解碼。
·dec_gain.c 用于自適應(yīng)碼本和固定碼本增益的解碼。
·dec_lag3.c 用于自適應(yīng)碼本序號的解碼。
·lsp_dec.c 用于LSP序號的解碼。
·dec_ld8k.c 用于重構(gòu)激勵信號和語音信號。
decoder.c里面的main函數(shù)調(diào)用解碼程序用到的各個算法函數(shù),這些算法函數(shù)主要集中在de_acelp.c、dec_gain.c、dec_lag3.c、lsp_dec.c、dec_ld8k.c里面,這些算法函數(shù)又是調(diào)用basic_op.c里面定義的基本算術(shù)函數(shù)。
2.6 解碼結(jié)果
設(shè)輸入信號數(shù)組為serial[SERIAL_SIZE],這里我們自己造一個輸入信號數(shù)組,設(shè)它為for(i=0;i 解碼結(jié)果輸出如圖5所示。 圖5 輸出結(jié)果圖 需要指出的是,這里解碼器為了將輸出變?yōu)楸忍亓饕员愀玫陌l(fā)送數(shù)據(jù),進(jìn)行了1bit→short int(即2字節(jié),16bit)轉(zhuǎn)換操作。 同時,因為編碼器中的比特分配并不是均勻的,例如某一個參數(shù)需要用5bit來表示,但是它并不是在內(nèi)存中用5bit表示,而是用了一個short int 型數(shù)據(jù)來表示的,所以解碼的輸入輸出結(jié)果的數(shù)組值個數(shù)與G.729理論上的16:1壓縮比有出入。 3 結(jié)論 本文從解碼的角度介紹了G.729編碼理論,給出了解碼的流程圖,并利用DSP產(chǎn)品TMS320DM642、CCS 6000以及實際系統(tǒng)開發(fā)平臺,提出了DSP與ARM接口的設(shè)計方法,成功地實現(xiàn)了語音信號的解碼工作。該方法具有低延遲、低速率、高語音質(zhì)量的優(yōu)點。 下一步工作可以做:1) 結(jié)合TMS320DM642 DSP 指令的特點對代碼進(jìn)行優(yōu)化;2) 對G.729 C程序中某些小算法和數(shù)據(jù)存取方式進(jìn)行優(yōu)化。 參考文獻(xiàn): [1] 張玉業(yè),鄧勇全,李玲遠(yuǎn).語音編解碼算法G.729的軟件實現(xiàn)[J].通信技術(shù), 2003(2). [2] ITU-T , Coding of speech at 8 kbit/s using conjugate-structure algebraic-code-excited linear prediction (CS-ACELP), International Telecommunication Union,1996 [3] ITU-T , Coding of speech at 8 kbit/s using conjugate-structure algebraic-code-excited linear prediction (CS-ACELP)Annex G, International Telecommunication Union,2007 [4] 王炳錫, 語音編碼[M].西安:電子科技大學(xué)出版社,2002. [5] 吳海濤,G.729語音編解碼算法研究及DSP實現(xiàn)[D].哈爾濱:哈爾濱理工大學(xué),2005. [6] 李方慧,王飛,何佩琨,TMS320C6000系列DSP原理與應(yīng)用[M].2版.北京:電子工業(yè)出版社,2003.
2.4 ARM與DSP接口
本文所用的系統(tǒng)開發(fā)平臺結(jié)構(gòu)主要由DSP、ARM以及FPGA組成,該文的主要工作是在TMS320DM642 DSP上實現(xiàn)G.729解碼算法,解碼后的數(shù)據(jù)需要傳送給ARM做后續(xù)處理。DSP與ARM的接口示意圖如圖3所示。
圖3 DSP與ARM接口示意圖
ARM和DSP之間是通過主機(jī)高速并行接口(HPI)實現(xiàn)數(shù)據(jù)通信的,通過兩端協(xié)商,約定以某些標(biāo)志位來協(xié)調(diào)通信并實現(xiàn)數(shù)據(jù)傳輸。在本文所用實驗平臺上設(shè)置了arm_flag[0], arm_flag[1], arm_flag[2], arm_flag[3]標(biāo)志信號,其初始值為0。
DSP為發(fā)送數(shù)據(jù)端,ARM為接收數(shù)據(jù)端,約定如下:
1)arm_flag[0]=1表示DSP準(zhǔn)備好后,ARM可以接收。
2) arm_flag[2]!=2表示ARM端準(zhǔn)備好后,數(shù)據(jù)傳輸開始。
3) arm_flag[2]=2 表示數(shù)據(jù)已傳輸完。
DSP向ARM發(fā)送數(shù)據(jù)的具體算法流程如圖4所示。首先用一個循環(huán)查詢判斷arm_flag[0]是否為1,如果為1則表示DSP已準(zhǔn)備就緒,可以發(fā)送數(shù)據(jù),程序繼續(xù)判斷ARM端是否已經(jīng)準(zhǔn)備好;如果arm_flag[0]不為1,則代表DSP還沒準(zhǔn)備好發(fā)送數(shù)據(jù),程序繼續(xù)判斷arm_flag[0]是否為1。在arm_flag[0]=1的情況下,接著判斷arm_flag[2]是否為2,如果不為2,則代表數(shù)據(jù)沒有傳輸完,發(fā)送數(shù)據(jù)正式開始,用一個while循環(huán),只要arm_flag[2]不為2就一直傳輸數(shù)據(jù);如果為2,則代表本次數(shù)據(jù)傳輸完了,并設(shè)置arm_flag[2]為初始值0,開始下一幀數(shù)據(jù)的傳輸判斷。
圖4 DSP給ARM傳送數(shù)據(jù)算法流程
2.5 解碼程序說明
G.729解碼程序主要包括以下部分:
·decoder.c 里面包含main()函數(shù)。
·bits.c 里面包含收到編碼參數(shù)的處理函數(shù)和解碼后發(fā)送數(shù)據(jù)的函數(shù)。
·basic_op.h 定義了一些基本算術(shù)函數(shù),解碼算法里的計算過程調(diào)用了這些算術(shù)函數(shù)。
·basic_op.c 基本算術(shù)函數(shù)的函數(shù)體。
·de_acelp.c 用于固定碼本序號的解碼。
·dec_gain.c 用于自適應(yīng)碼本和固定碼本增益的解碼。
·dec_lag3.c 用于自適應(yīng)碼本序號的解碼。
·lsp_dec.c 用于LSP序號的解碼。
·dec_ld8k.c 用于重構(gòu)激勵信號和語音信號。
decoder.c里面的main函數(shù)調(diào)用解碼程序用到的各個算法函數(shù),這些算法函數(shù)主要集中在de_acelp.c、dec_gain.c、dec_lag3.c、lsp_dec.c、dec_ld8k.c里面,這些算法函數(shù)又是調(diào)用basic_op.c里面定義的基本算術(shù)函數(shù)。
2.6 解碼結(jié)果
設(shè)輸入信號數(shù)組為serial[SERIAL_SIZE],這里我們自己造一個輸入信號數(shù)組,設(shè)它為for(i=0;i 解碼結(jié)果輸出如圖5所示。 圖5 輸出結(jié)果圖 需要指出的是,這里解碼器為了將輸出變?yōu)楸忍亓饕员愀玫陌l(fā)送數(shù)據(jù),進(jìn)行了1bit→short int(即2字節(jié),16bit)轉(zhuǎn)換操作。 同時,因為編碼器中的比特分配并不是均勻的,例如某一個參數(shù)需要用5bit來表示,但是它并不是在內(nèi)存中用5bit表示,而是用了一個short int 型數(shù)據(jù)來表示的,所以解碼的輸入輸出結(jié)果的數(shù)組值個數(shù)與G.729理論上的16:1壓縮比有出入。 3 結(jié)論 本文從解碼的角度介紹了G.729編碼理論,給出了解碼的流程圖,并利用DSP產(chǎn)品TMS320DM642、CCS 6000以及實際系統(tǒng)開發(fā)平臺,提出了DSP與ARM接口的設(shè)計方法,成功地實現(xiàn)了語音信號的解碼工作。該方法具有低延遲、低速率、高語音質(zhì)量的優(yōu)點。 下一步工作可以做:1) 結(jié)合TMS320DM642 DSP 指令的特點對代碼進(jìn)行優(yōu)化;2) 對G.729 C程序中某些小算法和數(shù)據(jù)存取方式進(jìn)行優(yōu)化。 參考文獻(xiàn): [1] 張玉業(yè),鄧勇全,李玲遠(yuǎn).語音編解碼算法G.729的軟件實現(xiàn)[J].通信技術(shù), 2003(2). [2] ITU-T , Coding of speech at 8 kbit/s using conjugate-structure algebraic-code-excited linear prediction (CS-ACELP), International Telecommunication Union,1996 [3] ITU-T , Coding of speech at 8 kbit/s using conjugate-structure algebraic-code-excited linear prediction (CS-ACELP)Annex G, International Telecommunication Union,2007 [4] 王炳錫, 語音編碼[M].西安:電子科技大學(xué)出版社,2002. [5] 吳海濤,G.729語音編解碼算法研究及DSP實現(xiàn)[D].哈爾濱:哈爾濱理工大學(xué),2005. [6] 李方慧,王飛,何佩琨,TMS320C6000系列DSP原理與應(yīng)用[M].2版.北京:電子工業(yè)出版社,2003.