語音信號的A律編解碼的DSP實(shí)現(xiàn)
摘要:本文介紹了G.711標(biāo)準(zhǔn)的A律壓縮算法的基本原理,設(shè)計出了A律編解碼的軟件流程框圖,在以TMS320VC5416為處理器的硬件開發(fā)平臺上實(shí)現(xiàn)了語音信號的A律壓縮解壓算法,并給出了C54x的匯編語言程序。
關(guān)鍵詞:數(shù)字信號處理;語音編碼;G.71l;A律
0 引言
語言壓縮技術(shù)既節(jié)省了存儲時所占用的存儲空間,又減少了傳輸時所占用的帶寬,而快速發(fā)展的數(shù)字信號處理(DSP)技術(shù)使得實(shí)時實(shí)現(xiàn)各種復(fù)雜的語音壓縮算法成為可能。
國際電信聯(lián)盟(ITU)1972年制定出來的一套語音壓縮標(biāo)準(zhǔn)稱為G.7ll,主要用于公用電話網(wǎng)。它用脈沖編碼調(diào)制(PCM)對語音信號采樣,采樣率為8kHz,比特率為64kb/s。該標(biāo)準(zhǔn)下主要有兩種壓縮算法,一種是μ律,另一種是A律。其中歐洲和中國等國家采用A律壓縮算法,美國和日本等國家采用μ律壓縮算法。
1 A律壓縮算法簡介
A律編碼的數(shù)據(jù)對象是12位精度的二進(jìn)制數(shù),它保證了壓縮后的數(shù)據(jù)有5位的精度并存儲到一個字節(jié)(8位)中。A律符合下式的對數(shù)壓縮方程:
式中,x為歸一化的輸入語音信號,y為壓擴(kuò)后的歸一化輸出信號,A為壓縮參數(shù)取值。由于該方程是一條連續(xù)的光滑曲線,物理上實(shí)現(xiàn)比較復(fù)雜。在實(shí)用中一般用13段折線近似該曲線,此時選擇AA=87.6。對PCM信號,一般地,輸入的模擬語音信號經(jīng)過低通濾波、放大和限幅后,然后進(jìn)入A/D轉(zhuǎn)換器編碼,常用的編碼方法有2的補(bǔ)碼和折疊二進(jìn)制碼兩種。表l是A律壓縮編碼規(guī)律表,其中只給出了在抽樣值為正值時,A/D轉(zhuǎn)換器輸出的12位二進(jìn)制數(shù)(補(bǔ)碼)是如何壓縮成8位二進(jìn)制數(shù)的。
2 A律算法的硬件構(gòu)成
采用合眾達(dá)電子的SEED-DEC5416嵌入式DSP開發(fā)板作為實(shí)現(xiàn)A律算法的硬件開發(fā)平臺,其系統(tǒng)結(jié)構(gòu)原理如圖1所示。主處理器選擇的是1 6 bit定點(diǎn)DSP芯片TMS320vC5416,語音信號經(jīng)過差分運(yùn)算放大后送入ADC進(jìn)行模數(shù)轉(zhuǎn)換,采樣率為8kHz,量化位數(shù)為12bit,轉(zhuǎn)換后的數(shù)據(jù)送入McBSP,然后對McBSP中的數(shù)據(jù)進(jìn)行壓縮編碼,壓縮后的數(shù)據(jù)送入‘C5416內(nèi)部的DARAM保存,還可以直接解壓后經(jīng)McBSP送DAC,數(shù)模轉(zhuǎn)換后再送入功放模塊驅(qū)動揚(yáng)聲器發(fā)聲。其中,McBSP與ADC/DAC之間的數(shù)據(jù)交換是靠ADC/DAC提供的移位信號和幀同步信號實(shí)現(xiàn)的。
[!--empirenews.page--]
3 A律算法的軟件設(shè)計
在TI提供的開發(fā)工具CCS中進(jìn)行源程序的編輯和調(diào)試,源程序采用‘C54x系列的匯編語言編寫。首先完成對DSP芯片必要的初始化、McBSP的初始化及開放McBSP中斷,然后執(zhí)行A律壓縮解壓算法。
一般地,用程序進(jìn)行A律編碼解碼有兩種方法:一種是查表法,這種方法程序代碼小,執(zhí)行速度快,但需要占用較多的內(nèi)存以存儲查找表(表的大小為212=4096個字),另一種方法是直接計算法,這種程序代碼較多,執(zhí)行速度慢一些,但可以節(jié)省內(nèi)存空間。對照表l,可以畫出A律壓縮編碼直接計算方法的流程如圖2所示。待壓縮的數(shù)據(jù)來自voidin變量空間(見附錄1),該變量空間保存著McBSP中的數(shù)據(jù),保存符號位就是將待壓縮數(shù)據(jù)的位11放入壓縮數(shù)據(jù)的位7,并通過測試位11決定是否對該數(shù)求補(bǔ)即對負(fù)數(shù)求絕對值(A/D轉(zhuǎn)換后的數(shù)據(jù)用二進(jìn)制補(bǔ)碼表示),求絕對值的目的是為了減小直接對負(fù)值壓縮時帶來的量化誤差。另外,還將兩個8位的壓縮數(shù)據(jù)組成一個16位的字保存至compress變量空間。
解壓一般是壓縮的逆過程,但有時為了使得量化誤差不超過△i/2,可在解壓后的數(shù)據(jù)位增加一個最低有效位,該最低有效位為1時經(jīng)過D/A轉(zhuǎn)換后對應(yīng)△min/2電壓,即將8位的壓縮數(shù)據(jù)解壓成13位的數(shù)據(jù)。本文中解壓仍然按照解壓成12位的數(shù)據(jù),其解壓流程如圖3所示。圖3中壓縮數(shù)據(jù)暫存單元com的位6~4的段碼值若大于l時,需將這4位段內(nèi)碼的前后相鄰位都置1,然后將這6位送至解壓數(shù)據(jù)暫存單元dcom的位(段碼值+3)~位(段碼值-2)即可,代碼(見附錄2)中采用的方法是對這6位邏輯左移(段碼值-2)位。
4 實(shí)驗(yàn)分析及結(jié)論
由于語音信號可以分解成許多正弦頻率的和,實(shí)驗(yàn)中采用200Hz的正弦信號代替實(shí)際的語音信號。將匯編語言編寫的源程序和命令連接文件都添加到新建立的工程文件夾中,并編譯、鏈接及裝載程序運(yùn)行,然后執(zhí)行集成開發(fā)環(huán)境ccs的菜單命令View|Graph|Time Frenquency,打開Graph Property Dialog對話框,在此分兩次輸入標(biāo)題名sine和decompress sine、起始地址0x0082和0x065E(命令連接文件.cmd中將.bss段定位到DARAM的org=0080h上),并選擇數(shù)據(jù)的長度為200及數(shù)據(jù)類型為16-bit signed integer,然后點(diǎn)擊ok按鈕即可生成圖4和圖5的曲線。[!--empirenews.page--]
與圖4相比,圖5只有在幅值比較大時兩者的誤差才略為明顯,這是A律解壓算法特性造成的,對語音信號的影響并不大,因?yàn)檎Z音信號出現(xiàn)大幅度值的概率小。
本文完成的語音信號的A律編解碼的DSP實(shí)現(xiàn),經(jīng)過實(shí)驗(yàn)表明,可以達(dá)到實(shí)時的語音壓縮及解壓效果
附錄1壓縮代碼