用MAXQ結合MAC進行控制和數(shù)字信號處理
maxq簡介
maxq系列微控制器是高性能的16位risc器件,專門為低噪聲操作而設計,是用電池供電的混合信號應用的理想器件。maxq將高精度的模擬功能與數(shù)字元件集成在一起,減少了設計中的芯片數(shù)目。maxq采用harvard存儲器結構,將數(shù)據(jù)、代碼與寄存器空間安排在不同的總線上。這種存儲器結構的主要優(yōu)點是具有靈活的字長,系統(tǒng)與外設寄存器可以是8位或16位。由于maxq的指令字是16位的,微控制器通常具有16位指令總線。harvard結構的另一個優(yōu)點是始終利用寄存器來訪問存儲器,這樣便可以用直接存取的方式訪問外設,例如模數(shù)轉換器(adc)與硬件協(xié)處理器等。maxq2000是maxq系列微控制器中的第一款產品,它集成了16位cpu、64kb閃存、2kb sram和4 36字段的lcd控制器。
對控制應用和數(shù)字信號處理都有要求時出現(xiàn)的難題
傳統(tǒng)微控制器(mcu)與數(shù)字信號處理器(dsp)通常被認為是微型計算機領域中兩個互不兼容的機種。mcu適用于需要對非同步過程實現(xiàn)低延遲響應的控制應用,dsp則在高強度數(shù)學計算方面表現(xiàn)卓越。當然,也可以用mcu進行紛繁復雜的算術運算,但是由于絕大多數(shù)mcu的算術邏輯單元(alu)每次執(zhí)行一項運算,其運算速度與dsp相比大大減慢。同理,因為內部架構的原因,dsp也不適用于控制應用。
隨著在控制應用中增加少量信號處理功能的實際應用越來越多,在dsp與傳統(tǒng)mcu之間進行選擇變得越來越困難。在此類應用中,將dsp代碼嵌入到mcu中的解決方法具有一定的吸引力。但是采用這種方法后,應用程序的大部分時間都花在執(zhí)行dsp函數(shù)上了,而控制應用不得不有所犧牲。maxq架構的出現(xiàn),解決了這個問題。在模塊化的maxq架構中,可以很容易地集成乘法-累加單元(mac)。使用了硬件mac后,16 16位的乘法-累加運算可在一個周期內實現(xiàn),而不影響控制處理器上的任務執(zhí)行。下面舉例說明如何使用maxq微控制器中的mac模塊解決實際問題。
mac模塊與maxq結合使用
對dsp來說,最基本的應用是對模擬信號進行濾波。在濾波應用中,將經過適當調制的模擬信號提供給adc,在數(shù)字域中對采樣得到的數(shù)據(jù)流進行濾波。常規(guī)濾波器的執(zhí)行過程可以用如下公式實現(xiàn):
式中bi和ai分別是系統(tǒng)前饋與反饋響應的特征值。根據(jù)ai和bi的值,可以將數(shù)字濾波器分成有限沖擊響應(fir)濾波器和無限沖擊響應(iir)濾波器兩大類。當系統(tǒng)不包含任何反饋元素時(即所有ai=0),濾波器為fir型,其方程為:
而當ai和bi的元素都不為0時,濾波器為iir型。
由公式(2)知,fir型濾波器的主要數(shù)學運算是將每個采樣輸入與常數(shù)相乘,然后將每個乘積累加,共進行n次,可以用如下c語言程序段來說明:
y[n]=0;
for(i=0;i小于n;i++)
y[n]+=x[i]*b[i]
對帶乘法器單元的微處理器,可以根據(jù)以下偽碼來實現(xiàn):
move ptr0, #x ;primary data pointer -> samples
move ptr1, #b ;secondary dp -> coefficients
move ctr, #n ;loop counter gets number of samples
move result, #0 ;clear result register
acc_loop:
move acc, @ptr0 ;get a sample
mul @ptr1 ;multiply by coefficient
add result ;add to previous result
move result, acc ;...and save the result back
inc ptr0 ;point to next sample
inc ptr1 ;point to next coefficient
dec ctr ;decrement loop counter
jump nz, acc_loop ;jump if there are more samples
end
這樣,盡管有一個乘法器,乘法與累加的循環(huán)也需要12條指令以及(假定是單周期運行的單元與乘法器)4+ 8n個周期。而在maxq的乘法-累加單元中完成相同的操作,代碼空間從12個字縮減到9個字,運行時間從4+ 8n個周期減少到4 +5n個周期,其代碼實現(xiàn)如下:
move dp[0], #x ; dp[0] -> x[0]
move dp[1], #b ; dp[1] -> b[0]
move lc[0], #loop_cnt ; lc[0] -> number of samples
move mcnt, #init_mac ; initialize mac unit
mac_loop:
move dp[0], dp[0] ; activate dp[0]
move ma, @dp[0]++ ; get sample into mac
move dp[1], dp[1] ; activate dp[1]
move mb, @dp[1]++ ; get coeff into mac and multiply
djnz lc[0], mac_loop
需要注意的是,在maxq乘法-累加單元中,當?shù)诙€操作數(shù)裝入該單元時,請求的運算自動執(zhí)行,其結果存儲在mc寄存器中。還應當注意的是,在傳統(tǒng)方法中每個基本運算后都必須進行溢出檢測,而mc寄存器的長度是40位,在溢出前可以累加大量32位的乘法計算結果,這是對傳統(tǒng)方法的改善。為了說明如何在信號處理流程中高效使用mac,現(xiàn)列舉一個用于雙音多頻(dtmf)收發(fā)器的簡單應用。
dtmf概述
dtmf(dual tone multitre-quency)雙音多頻是用于電話網絡中的信令技術,用來從網絡終端(電話或其他設備)向交換機傳送地址信息。其機理是使用兩組各四路獨立音調,互相之間沒有諧波相關關系,例如“低頻組”(低于1 khz)與“高頻組”(高于1 khz)。電話鍵盤上的每個數(shù)字都剛好可以用一路低頻組音調和一路高頻組音調來表示。圖1給出了這些音調的分配。
dtmf收發(fā)器的音調編碼器
dtmf收發(fā)器的編碼器部分簡單明了,即需要兩個數(shù)字正弦振蕩器,每個振蕩器都可以調諧到四個低頻組頻率或高頻組頻率之一。
解決數(shù)字合成正弦波問題的方法很多。
產生正弦波的方法之一是完全避免數(shù)字合成問題,只對端口引腳產生的方波進行較強的濾波。盡管這種方法在很多應用中都比較有效,但是該技術達不到bellcore(貝爾通信研究所)對正弦波頻譜純度的要求。第二種方法是利用速查表來產生正弦波。在這種方法中,將一路正弦波的1/4存儲在一張rom表中,這張表根據(jù)預先計算的間隔采樣來生成所需要的波形。不過,要生成一個分辨率足夠高、能夠滿足頻譜要求的1/4正弦表,需要很大的存儲量,所以這種方法通常不被采用。另外一個相對較好的方法就是使用遞歸數(shù)字諧振器來產生正弦波。
遞歸數(shù)字諧振器產生的正弦波如圖2所示。該諧振器用雙極點濾波器來實現(xiàn),可用以下差分方程描述:
其中k為常數(shù),其定義為:
由于dtmf撥號盤只需要少量音調,k的8個數(shù)值可以預先計算,并存儲在rom中。例如,在8 khz的采樣速率下產生行頻為770 hz音調所需的常數(shù)為:
還有一個數(shù)值必須計算,即振蕩器開始運行所需的初始脈沖。很明顯,若xn-1與xn-2都為0,隨后的每個xn都將為0。為了啟動振蕩器,將xn-1設置為0,并將xn-2設置為:
在本例中,假定需要單位正弦波,則(6)式可簡化為:
很容易將上述過程用代碼表示:初始化兩個中間變量x1、 x2。x1初始化為0,而x2裝入初始激勵數(shù)值(以上(7)式已計算)啟動振蕩。執(zhí)行以下操作產生正弦波的一次采樣:
x0=k*x1-x2;
x2=x1;
x1=x0;
每個新的正弦值都用一次乘法與一次減法來計算。使用maxq微控制器上的單周期硬件mac,正弦波可以用如下代碼產生:
move dp[0], #x1 ; dp[0] -> x1
move mcnt, #init_mac ; initialize mac unit
move ma, #k ; ma=k
move mb, @dp[0]++ ; mb=x1, mc=k*x1, point to x2
move ma, #-1 ; ma=-1
move mb, @dp[0]-- ; mb=x2, mc=k*x1-x2, point to x1
nop ; wait for result
move @--dp[0], mc ; store result at x0
dtmf音調的檢測
由于只需要檢測少量頻率,因此可以使用改進的goertzel算法。該goertzel算法比一般的dft(離散式傅立葉變換)機制更有效,并提供對頻段內信號的可靠檢測。圖3是用簡單二階濾波器實現(xiàn)goertzel算法的示意圖。
為了用goertzel算法檢測特定頻率的音調,必須先計算常數(shù)k。對dtmf檢測器,該常數(shù)可以在編譯時計算,所有的音調頻率都已明確指定。k值可按公式(4)計算。
首先,將三個中間變量(d0、d1與d2)初始化為0。現(xiàn)在,對接收到的每個采樣值x,按以下公式計算:
在獲得了足夠數(shù)量的采樣值后(若采樣速率為8 khz,通常為205),使用最新計算出的d1與d2計算下式:
這樣p中就包含了輸入信號x中測試頻率的平方冪(d12與d22)。為了解碼全部四列dtmf,每個采樣將通過8個濾波器完成。每個濾波器將有自己的k值和一組中間變量。由于每個變量都是16位的,整個算法將需要48個字節(jié)的中間存儲。
一旦計算了不同音調頻率的p值,高頻組與低頻組中的一路音調將比其他音調的數(shù)值高出兩倍以上,而通常其幅度高出一個數(shù)量級。圖4是提供給解碼器的采樣輸入信號,x的值分別為852 hz和1 336 hz。圖5給出了goertzel算法的檢測結果。若信號頻譜達不到這個標準,有兩種可能情況,要么是信號中沒有dtmf能量,要么是噪聲太大阻斷了信號。
說明該算法的電子表格以及配備了mac的maxq處理器的實例代碼在網站www.maxim-ic.com/maxq_dtmf上有說明。
結論
maxq微控制器與其mac單元相結合,在傳統(tǒng)mcu與dsp之間架起了橋梁,很好地解決了控制應用與需要少量信號處理并存系統(tǒng)的技術問題。添加了硬件mac之后,maxq微控制器將過去16位微控制器的信號處理能力提高到了新水平。單周期的mac還提供了常用函數(shù),使實時信號處理成為可能。
評論
查看更多