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