在MAXQ3120上實(shí)現(xiàn)CODEC應(yīng)用
引言
今天的電話已數(shù)字化。而在過去,它往往意味著咔嗒作響的、包含數(shù)百個(gè)電氣觸點(diǎn)的史端橋式開關(guān),數(shù)英里的雙絞線電纜就象多彩的意大利面條,星羅棋布于鄉(xiāng)村野外的微波塔。今天,話音業(yè)務(wù)在最開始的時(shí)候就被轉(zhuǎn)換成了數(shù)字形式,并和成百上千的其他話音、電子郵件和網(wǎng)頁等信息一同,由一條光纖傳輸。
數(shù)字電話催生了信息時(shí)代,并繼續(xù)以新的技術(shù),如因特網(wǎng)話音(voip),改變著通信工業(yè)的前景。然而,有一個(gè)事實(shí)沒有變 - 必須在線路上的某個(gè)點(diǎn),將話音轉(zhuǎn)換為數(shù)字,并將數(shù)字轉(zhuǎn)換回話音。
這正是codec (編解碼器)的工作。這個(gè)名稱是coder/decoder (編碼器/解碼器)的縮寫,是一種概念上非常簡(jiǎn)單的器件。它包含一個(gè)模擬到數(shù)字轉(zhuǎn)換器(adc),用于將音頻轉(zhuǎn)換為位流;一個(gè)數(shù)字到模擬轉(zhuǎn)換器(dac),用于將收到的位流轉(zhuǎn)換回音頻;和一個(gè)接口,用于和其他codec共享總線,并通過總線插入和取回?cái)?shù)字化的音頻信息。
通常,一個(gè)codec就是一片獨(dú)立的混合信號(hào)半導(dǎo)體器件。對(duì)于簡(jiǎn)單應(yīng)用,這種方案能夠很好地工作,例如端局交換機(jī)中的線卡。然而,很多時(shí)候我們還希望對(duì)要發(fā)送的音頻信號(hào)作一些預(yù)處理(例如限幅、動(dòng)態(tài)范圍壓縮或頻譜整形等),或?qū)κ盏降囊纛l信號(hào)作一些后處理(例如噪聲抑制)。對(duì)于獨(dú)立式codec而言,這些處理任務(wù)比較難以實(shí)現(xiàn)。這是因?yàn)槟M音頻信號(hào)一經(jīng)codec轉(zhuǎn)換,就再也沒有機(jī)會(huì)作進(jìn)一步地處理了 - 獨(dú)立式codec直接連接到了pcm干線。這種情況下,系統(tǒng)設(shè)計(jì)者就只有兩種很笨拙的選擇了:或者在模擬域執(zhí)行這種處理(通常很昂貴且可能引入噪聲),或者放棄使用這種獨(dú)立式的單片codec,而改用獨(dú)立的精密adc和dac芯片,并在數(shù)字域進(jìn)行處理。這兩種方式都不理想。本文給出一種新的方案,它采用maxq3120微控制器和外部dac作音頻codec,同時(shí)能夠?qū)θ胝竞统稣疚涣鬟M(jìn)行額外的處理。
codec基礎(chǔ)
在數(shù)字電話還很遙遠(yuǎn)的時(shí)候,人們就認(rèn)識(shí)到保持一個(gè)話音信號(hào)清晰可辨的必要頻段大約為300hz至3.5khz。此范圍之外的頻率對(duì)于語音信號(hào)的保真度有貢獻(xiàn),但對(duì)于清晰度無益(事實(shí)表明,限制帶寬的信號(hào)比寬帶信號(hào)反而更易于辨析)。根據(jù)nyquist定律,對(duì)于信號(hào)的采樣率必須至少為其最高頻率的兩倍,因此所有話音codec都工作于每秒8,000個(gè)采樣
- 多于所要求的3.5khz的兩倍 - 每個(gè)采樣都被轉(zhuǎn)換為一個(gè)數(shù)字化的碼字。
然而,碼字的長(zhǎng)度又帶來另一個(gè)問題。在任何數(shù)字系統(tǒng)中,都必須在信號(hào)的完整性和字長(zhǎng)間做出妥協(xié)。為獲得高保真,系統(tǒng)設(shè)計(jì)者應(yīng)選擇較大的字長(zhǎng),但位數(shù)越多帶寬越高,而帶寬是要付出成本的。另一方面,如果設(shè)計(jì)者選擇較小的字長(zhǎng)以節(jié)省帶寬成本,話音質(zhì)量就會(huì)有所損失。實(shí)驗(yàn)表明較小的字長(zhǎng)
- 大約八位 - 也可以提供較好的話音質(zhì)量,但前提是講話者必須是在安靜的環(huán)境中用恒定的話音講話。這種情況下正常的音量變化就會(huì)造成發(fā)送器飽和,導(dǎo)致箝位和失真。降低增益當(dāng)然可以消除高音量時(shí)的箝位問題,但正常音量可用的位數(shù)卻減少至四到五位,使比較輕的話音聽起來有刮擦聲且不自然。為了適應(yīng)人類話音的整個(gè)范圍,從最輕的低語到大聲的喊叫,看起來有必要采用十二到十四位分辨率。
最佳方案是非線性codec (見圖1)。這種類型的codec利用了這樣一件事實(shí):我們的耳朵對(duì)于響亮聲音的小誤差更“寬容”,而對(duì)于微弱聲音的小誤差很敏感。圖1中,靜默狀態(tài)位于零線附近;輕微的話音相對(duì)于中心線有小量偏移,而響亮的話音偏移較多。在這樣的器件中,零線附近的編碼密度高于遠(yuǎn)離零線處的編碼密度,使codec既能為低電平信號(hào)提供滿意的性能,同時(shí)為高電平信號(hào)提供足夠的動(dòng)態(tài)范圍。
圖1. 典型pcm codec的響應(yīng)曲線。在零相對(duì)幅度附近的區(qū)間編碼密度高于曲線端點(diǎn)處,使codec既保持了話音的高度清晰,又具有很寬的動(dòng)態(tài)范圍。
在數(shù)字側(cè),器件必須與pcm干線接口。各codec并不是通過單獨(dú)的一組線連接到其相應(yīng)的中繼設(shè)備上,而是一定數(shù)量的codec一同被連接到一條共享的總線 - pcm干線上。為了協(xié)調(diào)傳輸過程,這些codec共用一個(gè)位時(shí)鐘,而用單獨(dú)的幀脈沖指揮每個(gè)器件開始發(fā)送和接收。按照北美標(biāo)準(zhǔn),24個(gè)codec共享一條pcm干線,某種類型的時(shí)序器邏輯以1,544,000位/秒的速率控制著其運(yùn)行節(jié)奏。每過125μs,第一個(gè)codec收到一個(gè)幀脈沖并發(fā)送八位數(shù)據(jù)到干線上。8個(gè)位時(shí)鐘后,第二個(gè)codec收到其幀脈沖,依此類推。所有24個(gè)codec發(fā)完數(shù)據(jù)后,時(shí)序器提供一位的時(shí)間用于傳送信令,然后重復(fù)上述過程。這樣,總的數(shù)據(jù)量為:
[(8 bits per sample x 24 channels) + 1 signaling bit] x 8,000 samples
per second = 1,544,000 bits per second
pcm codec的類型
用于電話的pcm codec已有了全世界統(tǒng)一的幀速率(采樣率)。不幸的是,在其它方面幾乎沒有統(tǒng)一的全球標(biāo)準(zhǔn)。常用的編碼方案有兩種:用于歐洲的a率和主要用于美國(guó)和日本的μ率。有兩種基本線速率正在使用:美國(guó)的ds1
(1.544mbps)和歐洲的e1 (2.048mbps)。本文所討論的設(shè)計(jì)為ds1 (或稱為t1) codec,工作于a率或μ率模式。
μ率codec按照以下規(guī)則對(duì)采樣信號(hào)進(jìn)行編碼:
其中μ是本規(guī)則的特征參數(shù),典型為255。
a率codec的編碼方式略有不同:
其中a是本規(guī)則的特征參數(shù),通常為87.6,有些情況下為87.7。需要注意的是,當(dāng)接近于零時(shí),a率函數(shù)是線性的;只有當(dāng)輸入大于1/a后它才變?yōu)閷?duì)數(shù)。
在具體實(shí)踐中,這兩種壓擴(kuò)率所形成的曲線非常近似。并且,實(shí)際應(yīng)用中從未使用這些線性公式。為了減輕運(yùn)算開銷,常常采用分段線性逼近的方式。然而,在本設(shè)計(jì)中,我們通過查表的方式嚴(yán)格按照這些規(guī)則來做。
將一個(gè)微控制器變?yōu)閏odec
maxq3120包含有兩個(gè)精密的16位adc通道、一個(gè)16 x 16乘法器以及一個(gè)40位累加器。雖然maxq3120不含dac通道,有很多低成本的精密串行dac可用于此功能。剩下的工作就是構(gòu)建一個(gè)軟件來連接這些外圍器件。
編碼
可通過三步完成編碼:轉(zhuǎn)換模擬信號(hào)為數(shù)字量,對(duì)數(shù)字采樣進(jìn)行再抽樣并濾波,最后,用a率或μ率編碼轉(zhuǎn)換方式壓縮采樣至八位。
第一步是a/d轉(zhuǎn)換,最容易實(shí)現(xiàn),因?yàn)閍dc通道已內(nèi)置于maxq3120。maxq3120每48μs產(chǎn)生一個(gè)新的16位轉(zhuǎn)換結(jié)果。這意味著對(duì)于8mhz的處理器時(shí)鐘,系統(tǒng)可以有384個(gè)指令周期來處理采樣。
幸好,采樣的處理只是簡(jiǎn)單地讀取adc并將數(shù)據(jù)存儲(chǔ)于一個(gè)環(huán)形緩沖器。緩沖器總是保存著32個(gè)最近的16位采樣結(jié)果。maxq3120有256字的16位ram。這樣,每個(gè)通道的環(huán)形緩沖器僅消耗全部可用ram的12.5%。
adc每48μs采一個(gè)樣,但通信網(wǎng)絡(luò)每125μs需要一個(gè)新的采樣。因此,無論我們?nèi)绾翁幚硇盘?hào),都必須對(duì)其進(jìn)行再抽樣。最簡(jiǎn)陋的方法之一就是,當(dāng)收到一個(gè)幀脈沖時(shí),只接受最近的一個(gè)采樣來做進(jìn)一步的轉(zhuǎn)換,而扔掉所有其他采樣。不過maxq3120還能夠做的更好。
每收到一個(gè)幀脈沖,maxq3120的codec軟件對(duì)環(huán)形緩沖器中匯集的采樣實(shí)施31抽頭fir濾波器算法。該濾波器的3db截止點(diǎn)位于3.5khz,可提供抗混疊和進(jìn)一步的采樣重構(gòu)功能,降低- adc通道的噪聲。經(jīng)濾波處理后的結(jié)果是一個(gè)16位采樣,可用于a率或μ率壓縮。
有多種方法可以對(duì)16位線性編碼進(jìn)行壓縮。直接計(jì)算和分段逼近是兩種常用方法。在本設(shè)計(jì)中我們并沒有采用這兩種方法,而是利用maxq3120程序空間較大的特點(diǎn),建立了兩個(gè)128字的表格,一個(gè)用于μ率編碼和解碼,另一個(gè)用于a率。首先,查詢一個(gè)外部引腳的電平狀態(tài),根據(jù)該引腳的電平,將兩個(gè)128字表格中的一個(gè)載入ram。編碼過程的操作如下:
獲取16位線性pcm采樣的絕對(duì)值。并保持對(duì)符號(hào)位的跟蹤。
在所采用的表格中執(zhí)行對(duì)分檢索:比較pcm采樣和表格的中間值。如果pcm采樣小于中間值,只考慮表格的下半部分;如果采樣大于中間值,則只需考慮上半部分。重復(fù)上述操作,直至僅剩下兩個(gè)表格項(xiàng),選擇最接近的一個(gè)。
壓縮后的編碼實(shí)際上是表格項(xiàng)的索引號(hào)。例如,如果采樣值為0x006d,采用a率壓縮,上述表格中最接近的值為0x006f。其索引號(hào)為7;這正是壓縮后的編碼。
最后,沿用原始采樣的符號(hào)位。得到的8位碼是對(duì)數(shù)pcm值。然而,這還沒有結(jié)束。發(fā)送到網(wǎng)絡(luò)的并不是簡(jiǎn)單的二進(jìn)制補(bǔ)碼。每種編碼規(guī)則都有一套特殊的處理方法。
對(duì)于μ率:
負(fù)值符號(hào)位為“0”;正值符號(hào)位為“1”。
幅值采用反碼。因此,零表示為0b11111111,而+1表示為0b11111110。這是為了保證發(fā)送數(shù)據(jù)流中有大量的“1”位。(很多類型的物理層傳輸設(shè)備僅在“1”位有電平跳變;因此,大量的“1”位使時(shí)鐘恢復(fù)更容易。)
有“正零”和“負(fù)零”之別,分別表示為0b11111111和0b01111111。
最大的負(fù)數(shù)為-127,表示為0b00000000。然而,為保持定時(shí)的完整性,許多系統(tǒng)不允許全零值。這些系統(tǒng)通過自動(dòng)對(duì)第1位取反來阻止全零碼的出現(xiàn)。雖然這會(huì)給碼流造成不可恢復(fù)的變化(0b00000000變?yōu)?b00000010),但對(duì)于音頻傳輸而言,它在聽覺上造成的變化微乎其微
- 兩種碼所表達(dá)的聲音都非常響!(本設(shè)計(jì)中未執(zhí)行該功能,盡管實(shí)現(xiàn)很簡(jiǎn)單。)
對(duì)于a率:
和μ率一樣,負(fù)數(shù)符號(hào)位為零。
和μ率一樣,有“負(fù)零”和“正零”之別,分別表示為0b00000000和0b10000000。
傳輸之前,每個(gè)a率字被0x55“異或”,相當(dāng)于對(duì)編碼字節(jié)隔位取反。和μ率中的取反類似,也可以確保高密度的“1”,使時(shí)鐘恢復(fù)更容易。
解碼
解碼8位pcm采樣要比編碼容易得多,因?yàn)闊o需對(duì)信號(hào)進(jìn)行再抽樣。經(jīng)過適當(dāng)?shù)膒cm編碼規(guī)則處理后,得到一個(gè)8位、帶符號(hào)的幅度值。以這個(gè)數(shù)值為索引,檢索相應(yīng)的pcm表格(同時(shí)考慮符號(hào)),得到一個(gè)16位、帶符號(hào)的數(shù)值,可直接送給dac。
為本項(xiàng)目選擇的轉(zhuǎn)換器是max5722雙通道dac。這是一款12位dac,采用低成本8引腳μmax封裝。和大多數(shù)dac一樣,max5722需要一個(gè)外部基準(zhǔn)電壓源。正好,maxq3120上的1.25v帶隙基準(zhǔn)源適用于此目的。
max5722是一款串行dac,這就意味著微控制器必須以串行方式和dac通信。dac接口是同步的,因此無需連續(xù)為其提供時(shí)鐘 - 只有當(dāng)片選為低時(shí)才需要提供時(shí)鐘給它。因此可以利用微控制器的通用i/o組成一個(gè)3線接口與其通信。
在本設(shè)計(jì)中,注意到adc通道的輸入范圍為-1.0v至+1.0v,而dac輸出通道的范圍為0.0v至+1.25v。在一個(gè)真正的電信應(yīng)用中,例如線卡,這樣的信號(hào)電平很可能還需要轉(zhuǎn)換為其他模擬電平(例如,電信網(wǎng)絡(luò)中通常能遇到的最大電平為0dbm,即對(duì)600阻抗輸出1mw)。如果在你的應(yīng)用中必須保持輸入、輸出電平相等,請(qǐng)參考max5722數(shù)據(jù)資料中關(guān)于產(chǎn)生雙極性輸出的詳細(xì)說明。
pcm總線
現(xiàn)在,我們已經(jīng)知道了如何將模擬信號(hào)轉(zhuǎn)換為壓縮的pcm碼,或者反之,余下的就一個(gè)問題了:與pcm總線的連接。
大多數(shù)情況下,與pcm干線的連接涉及一條四線總線的連接:一條發(fā)送數(shù)據(jù)線(終端發(fā)送其數(shù)據(jù)到這條線);一條接收數(shù)據(jù)線(中繼設(shè)備發(fā)送其數(shù)據(jù)到這條線,終端從中取回?cái)?shù)據(jù));一條幀同步線(每個(gè)終端獨(dú)占一條,其上脈沖指示何時(shí)總線上載有用于該終端的數(shù)據(jù));以及一條位時(shí)鐘線。我們的codec旨在用于終端設(shè)備,它接收位時(shí)鐘和幀脈沖,從接收數(shù)據(jù)線接收數(shù)據(jù),向發(fā)送數(shù)據(jù)線發(fā)送數(shù)據(jù)。
在t1系統(tǒng)中,時(shí)鐘工作于1.544mhz。這就意味著當(dāng)一個(gè)幀脈沖到來時(shí)我們必須非??斓仨憫?yīng)(幾個(gè)時(shí)鐘脈沖內(nèi)),一位所占時(shí)間略大于625ns,或五個(gè)指令周期。由于這個(gè)時(shí)間遠(yuǎn)小于通常的中斷響應(yīng)時(shí)間(考慮現(xiàn)場(chǎng)保護(hù)和其他中斷響應(yīng)時(shí)的開銷),簡(jiǎn)單地以中斷方式響應(yīng)幀脈沖信號(hào)速度不夠
- 必須考慮其他方案。
我們的方案是,采用maxq3120三個(gè)定時(shí)器中的一個(gè),超前預(yù)期的幀脈沖到達(dá)時(shí)間幾個(gè)微秒中斷處理器。當(dāng)幀脈沖到來時(shí),處理器已被中斷,并完成現(xiàn)場(chǎng)保護(hù),已準(zhǔn)備好投入每個(gè)時(shí)鐘周期來執(zhí)行pcm總線任務(wù)。其工作如下:設(shè)置定時(shí)器溢出間隔為110μs。在每一幀所有數(shù)據(jù)位被移出,幀事件處理完畢后啟動(dòng)定時(shí)器。以t1系統(tǒng)為例,在10.4μs要移出兩個(gè)采樣的數(shù)據(jù)。當(dāng)定時(shí)器中斷處理器后,軟件立即開始監(jiān)視幀脈沖的前沿。這是系統(tǒng)唯一的中斷。所有其它事務(wù)都工作于查詢方式,且要等待最重要的任務(wù)(通過總線收發(fā)pcm數(shù)據(jù))完成后方能著手處理。
幀脈沖到來時(shí)處理器會(huì)非常忙碌。它需要移位發(fā)送緩沖器并將要輸出的位寫到合適的端口;接著在五個(gè)周期內(nèi)讀取一個(gè)輸入位并移位接收緩沖器。maxq3120能夠非常精確地在5個(gè)周期內(nèi)完成這些任務(wù)。
你或許已注意到,這里的討論只聚焦于t1總線,那e1的情況又如何呢?工作于2.048mhz的e1系統(tǒng)每一位的時(shí)間只略大于488ns - 少于四個(gè)指令周期。因此,e1 pcm總線的管理有賴于外部硬件。例如一片廉價(jià)的、由位時(shí)鐘驅(qū)動(dòng)的移位寄存器,就可將處理器從苛刻的位級(jí)定時(shí)解放出來。
額外功能
我們的codec完成了。然而,專用codec已非常廉價(jià)且供應(yīng)充足,因此,除非有特別動(dòng)機(jī),否則,用微控制器搭建codec將無任何意義。以下是一些可能促使設(shè)計(jì)者考慮該系統(tǒng)的想法:
前置濾波 當(dāng)信號(hào)還是線性pcm格式時(shí),我們有非常好的機(jī)會(huì)來對(duì)其進(jìn)行均衡、動(dòng)態(tài)范圍壓縮、噪聲抑制或大量其他類型的信號(hào)操作。雖然maxq3120并非傳統(tǒng)意義上的dsp,憑借該處理器的能力,還是能夠輕松應(yīng)付這些功能的。
帶內(nèi)信令提取 在線性pcm碼流中探測(cè)帶內(nèi)音的高效、簡(jiǎn)單算法很容易找到。可以將這些算法拓展為探測(cè)dtmf數(shù)字信號(hào),并用它們實(shí)現(xiàn)一些特定的性能和功能。利用該算法精密監(jiān)聽撥號(hào)音(北美為350hz
+ 440hz)、振鈴(440hz + 480hz)和忙音(480hz + 620hz),我們還可以知道一次通話的進(jìn)程情況。
會(huì)議電話橋分器 可以非常簡(jiǎn)單地對(duì)通道1接收的音頻信號(hào)進(jìn)行混合,并將其與通道2發(fā)送的音頻相組合,反之亦然。通過這種操作,你實(shí)際上等效于實(shí)現(xiàn)了一個(gè)兩通道的數(shù)字會(huì)議電話橋分器。由于是數(shù)字橋,話音質(zhì)量沒有損失。如果希望橋接兩個(gè)以上通道,只需簡(jiǎn)單地增加更多maxq3120器件。
結(jié)語
雖然maxq3120并不是專為電信類應(yīng)用設(shè)計(jì),其片上精密adc和dsp功能卻為設(shè)計(jì)者帶來了廣闊的機(jī)會(huì),很容易用它們實(shí)現(xiàn)用戶化的硬件和軟件方案。各種各樣唾手可得的開發(fā)工具簡(jiǎn)化了設(shè)計(jì)任務(wù)。
評(píng)論