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