乘法累加單元(MAC)和單周期內(nèi)核的組合使MAXQ2000成為多功能微控制器(μC)。MAXQ2000具有性能和I/O外設(shè),非常適合許多應(yīng)用:鬧鐘、手持醫(yī)療設(shè)備、數(shù)字讀數(shù)——任何需要低功耗、高性能和大量I/O的應(yīng)用。通過集成MAC,MAXQ2000進(jìn)入DSP (μC)領(lǐng)域。
MAXQ2000能從MAC中得到多少性能?本應(yīng)用筆記通過音頻濾波示例探討了這個問題,并給出了MAXQ2000支持的性能的定量指導(dǎo)。
軟件和硬件要求
本應(yīng)用筆記簡單演示了音頻濾波器。音頻數(shù)據(jù)是作者預(yù)先錄制的消息,說“管道在新的時(shí)開始生銹”。此文本不是隨機(jī)選擇的 - 它提供了不錯的頻率分量組合,突出了簡單濾波器的可聽效果。錄音可以用任何適當(dāng)長度的8kHz錄音代替,但不是必需的。
本應(yīng)用筆記所需的硬件包括MAXQ2000評估板和用于連接計(jì)算機(jī)揚(yáng)聲器的小電路。
MAXQ2000評估板是探索MAXQ2000功能的好工具。它包括一個LCD面板、LED組,并可訪問MAXQ2000 μC的所有I/O引腳。它還包括一個MAX1407 ADC/DAC,可用于音頻輸出。
所需的第二件硬件可以很容易地進(jìn)行面包板測試。用于本演示的電路如圖1所示。它要求一個1 x 8的母頭接頭連接到J2000的MAXQ7評估板,另一個連接到任何接地(MAXQ1評估板上的TP2000是一個不錯的選擇)。揚(yáng)聲器連接器可以是任何類型 — 顯示的是 3.5 毫米立體聲插孔,這使得連接到典型的計(jì)算機(jī)揚(yáng)聲器變得簡單。請注意,兩個輸入通道是連接在一起的,因?yàn)槲覀兊难菔緫?yīng)用程序只顯示一個音頻通道(單聲道)。
圖1.音頻播放所需的其他硬件。
運(yùn)行此演示所需的軟件是使用 IAR 嵌入式工作臺構(gòu)建和調(diào)試的。它利用MAXQ2000的硬件調(diào)試支持,提供了良好的調(diào)試環(huán)境。您可以在實(shí)際硬件上運(yùn)行時(shí)設(shè)置斷點(diǎn)、設(shè)置和讀取寄存器和內(nèi)存,并查看調(diào)用堆棧。
運(yùn)行演示應(yīng)用程序
MAXQ2000評估板上的按鈕用于選擇濾波器,并播放通過該濾波器的音頻樣本。使用按鈕 SW4 選擇濾波器 - 濾波器的名稱將顯示在 LCD 屏幕上(HI 表示高通,LO 表示低通,BP 表示帶通,ALL 表示所有通)。使用 SW5 按鈕開始通過所選過濾器播放音頻。可以在播放過程中更改過濾器。
設(shè)計(jì)簡單的FIR濾波器
我開發(fā)了一個Java?小程序,可以讓我輕松創(chuàng)建新的過濾器。我沒有使用給定濾波器參數(shù)的標(biāo)準(zhǔn)窗口技術(shù),而是選擇通過在極點(diǎn)零圖中放置零來粗略地“設(shè)計(jì)”我的濾波器,如圖 2 所示。該小程序允許在坐標(biāo)平面的任何位置放置零點(diǎn),并不斷更新演示應(yīng)用所需的FIR濾波器系數(shù)。但請注意,該演示僅支持全零篩選器。支持 IIR 濾波器不會太困難 — 更多說明在支持 IIR 濾波器部分。
圖2.使用零極點(diǎn)圖生成簡單的FIR濾波器。
通用濾波器采用線性方程的形式:
y(n) + ΣbKy(k) = ΣaJx(j)
其中 k 表示濾波器反饋部分的順序,j 表示濾波器前饋部分的順序。
示例 IIR 濾波器可以像以下這樣簡單:
y(n) = 0.5y(n-1) + x(n) - 0.8x(n-1)
某些濾波器被歸類為FIR濾波器。它們不包含反饋部分。換句話說,特征濾波方程中沒有 y 部分:
y(n) = ΣaJx(j) y(n) = x(n) - 0.2x(n - 1) + 0.035x(n - 3)
在任何一種情況下,濾波器都?xì)w結(jié)為一個特征方程,該方程本質(zhì)上是過去輸入和輸出值的加權(quán)平均值。濾波器設(shè)計(jì)的工作是產(chǎn)生那些 Aj和乙k值。為了有效地計(jì)算濾波器的輸出,我們需要能夠快速相乘和求和有符號數(shù)的硬件支持。輸入MAXQ2000的乘法累加單元。
使用乘法累加 (MAC) 單元實(shí)現(xiàn)篩選器
上一節(jié)中的小程序通過計(jì)算給定圖中零坐標(biāo)的濾波器系數(shù)來工作。但是,計(jì)算的系數(shù)是浮點(diǎn)數(shù),而我們的 MAC 使用純 16 位整數(shù)數(shù)學(xué)。為了糾正此問題,演示應(yīng)用程序使用定點(diǎn)數(shù)字系統(tǒng),其中系數(shù)的 0 到 15 位位于小數(shù)點(diǎn)右側(cè)(第 16 位表示符號幅度)。一旦操作結(jié)束,MAC累加器中的48位結(jié)果將移動到足夠的位置以去除任何分?jǐn)?shù)。
此解決方案是精度與速度的權(quán)衡。在許多情況下,這種方法的錯誤可以忽略不計(jì)。出于診斷目的,小程序顯示了計(jì)算濾波器的三個圖。第一個圖顯示了使用 64 位浮點(diǎn)數(shù)的理想濾波器行為。該圖標(biāo)記為“理想變換”,如圖2所示。
圖 3 顯示了小程序生成的其余繪圖。圖3中的第一個圖顯示了使用16位定點(diǎn)數(shù)的有效濾波器。在許多情況下,誤差并不明顯,因此最后一個圖是一個誤差指示器,顯示理想行為除以實(shí)際頻率響應(yīng)。理想情況下,這是 Y = 1 時(shí)的直線。
圖3.濾波器 16 位實(shí)現(xiàn)的實(shí)際變換和舍入誤差(幾乎沒有誤差)。
為簡單起見,小程序生成MAXQ?應(yīng)用所需的浮點(diǎn)系數(shù),因此可以將新的濾波器簡單地剪切并粘貼到濾波器應(yīng)用的源中(粘貼到文件data.asm中)。小程序還會生成另外兩個值 — 篩選器的順序(系數(shù)數(shù))和偏移計(jì)數(shù),因此應(yīng)用程序可以適當(dāng)?shù)匾苿幼罱K結(jié)果。此數(shù)據(jù)顯示在小程序底部的文本框中,可能如下所示:
Zeroes: dc16 dc16 12, 11, 0x1000, 0x26d3, 0x1e42, 0xf9a3, 0xecde, 0xff31, 0xa94, 0x2ae, 0xfd0c, 0xff42, 0xde Shift amount: 12
在MAXQ匯編語言中實(shí)現(xiàn)濾波器
為了獲得最佳性能并執(zhí)行準(zhǔn)確的性能分析,實(shí)際的過濾器將以匯編語言實(shí)現(xiàn)。這將使我們能夠準(zhǔn)確計(jì)算生成一個輸出值所需的周期數(shù),從而估計(jì)其他數(shù)據(jù)集的性能。
MAX1407具有12位ADC。但是,輸入數(shù)據(jù)是 16 位寬的,我們的過濾器產(chǎn)生 16 位的結(jié)果。因此,雖然這 4 個最低有效位 (LSB) 被浪費(fèi)在此應(yīng)用中,但我們可以安全地分析我們的性能,就像處理和生成 16 位值(CD 質(zhì)量的音頻為 16 位)一樣。
在此示例中,濾波器系數(shù)存儲在表中的代碼空間中。選擇篩選器后,應(yīng)用程序?qū)⒉檎蚁鄳?yīng)的篩選器,讀取移位量和抽頭次數(shù),然后準(zhǔn)備好開始篩選數(shù)據(jù)。以下代碼應(yīng)用篩選器系數(shù):
move MCNT, #22h ; signed, mult-accum, clear regs first zeroes_filterloop: move A[0], DP[0] ; let's see if we are out of data cmp #W:rawaudiodata ; compare to the start of the audio data lcall UROM_MOVEDP1INC ; get next filter coefficient move MA, GR ; multiply filter coefficient... lcall UROM_MOVEDP0DEC ; get next filter data move MB, GR ; multiply audio sample... jump e, zeroes_outofdata ; stop if at the start of the audio data djnz LC[0], zeroes_filterloop zeroes_outofdata: move A[2], MC2 ; get MAC result HIGH move A[1], MC1 ; get MAC result MID move A[0], MC0 ; get MAC result LOW
在執(zhí)行此代碼之前,LC[0] 設(shè)置為濾波器的抽頭數(shù),DP[0] 設(shè)置濾波器的當(dāng)前輸入字節(jié)地址,DP[1] 指向?yàn)V波器系數(shù)的開頭。因此,DP[1] 以遞增的方式處理濾波器系數(shù),DP[0] 以遞減的方式處理輸入數(shù)據(jù)(首先處理最近的輸入)。
由于MAC在一個周期內(nèi)工作,因此這里沒有很多代碼來處理它。MCNT 設(shè)置為 22h 表示使用有符號整數(shù)。在主循環(huán)中,連續(xù)寫入 MA,然后 MB 觸發(fā)乘法累加運(yùn)算 — 結(jié)果在下一個時(shí)鐘周期中準(zhǔn)備就緒。由于我們的累加器是 48 位(我們的乘法結(jié)果是 32 位),我們不必?fù)?dān)心任何溢出(除非我們的過濾器中有 64,000 個抽頭!
性能
該示例應(yīng)用采用以 16kHz 輸出的單聲道 8 位音頻數(shù)據(jù),不足以使 μC 疲憊不堪。因?yàn)槲覀冇脜R編語言編寫了濾波器,所以我們可以很容易地計(jì)算用于提出長度為 N 的 FIR 濾波器計(jì)算所需的時(shí)間的表達(dá)式的周期。然后,我們可以使用此表達(dá)式使用前面列出的算法找到最大過濾率。
我們可以將用于生成音頻樣本的函數(shù)分為三個部分:初始化、濾波器計(jì)算循環(huán)和結(jié)果修復(fù)。在我們發(fā)布的示例中,初始化需要 38 個周期,濾波器計(jì)算循環(huán)每個濾波器系數(shù)需要 17 個周期,結(jié)果修復(fù)需要 9 + (6 x S) 個周期,其中 S 是偏移量。通常,偏移量約為 12,因此我們可以估計(jì)結(jié)果固定在 81 個周期。因此,產(chǎn)生一個濾波輸出值需要 119 + (17 x N) 個周期。在20MHz時(shí),MAXQ2000可以運(yùn)行接近100kHz的11抽頭濾波器,這對于語音數(shù)據(jù)來說已經(jīng)足夠好了。
讓我們回過頭來重新分析我們的應(yīng)用程序,看看我們可以在哪里收緊它。我們將專注于過濾器循環(huán),因?yàn)檫@是我們大多數(shù)循環(huán)發(fā)生在除最微不足道的過濾器之外的任何過濾器上的地方。
我們可以對循環(huán)代碼進(jìn)行一些關(guān)鍵的改進(jìn)以提高效率。請記住,我們使用存儲在代碼空間中的預(yù)先錄制的音頻樣本。由于MAXQ的哈佛架構(gòu),代碼空間的查找比數(shù)據(jù)空間中的查找需要更多的時(shí)間。調(diào)用UROM_MOVEDP1INC和UROM_MOVEDP0DEC的函數(shù)各需要 5 個周期(LCALL 為 2 個周期,然后在函數(shù)內(nèi)需要 3 個周期)。如果我們將過濾器存儲在 RAM 中(一個周期用于選擇指針,一個周期用于從中讀取),并且如果我們提供存儲在 RAM 中的實(shí)時(shí)輸入數(shù)據(jù),則每個周期都可以替換為兩個周期。如果我們愿意向過濾器捐贈 256 個單詞的 RAM,我們可以使用 BP[Offs] 實(shí)現(xiàn)一個循環(huán)緩沖區(qū)來存儲輸入數(shù)據(jù)。這些更改將循環(huán)時(shí)間從 11 個周期減少到 17 個周期。我們的過濾器循環(huán)現(xiàn)在如下所示(周期計(jì)數(shù)列在注釋中的第一個):
zeroes_filterloop: move A[0], DP[0] ; 1, let's see if we are out of data cmp #W:rawaudiodata ; 2, compare to the start of the audio data move DP[1], DP[1] ; 1, select DP[1] as our active pointer move GR, @DP[1]++ ; 1, get next filter coefficient move MA, GR ; 1, multiply filter coefficient... move BP, BP ; 1, select BP[Offs] as our active pointer move GR, @BP[Offs--] ; 1, get next filter data move MB, GR ; 1, multiply audio sample... jump e, zeroes_outofdata ; 1, stop if at the start of the audio data djnz LC[0], zeroes_filterloop ; 1
一旦我們在RAM中有了濾波器和輸入數(shù)據(jù),我們就可以使用MAXQ架構(gòu)的另一個技巧。MAXQ指令集是高度正交的——對于在任何操作中可以用作源的內(nèi)容幾乎沒有限制。因此,我們可以將其直接寫入MAC寄存器,而不是將濾波器數(shù)據(jù)和輸入數(shù)據(jù)讀取到GR中。這使循環(huán)減少到 9 個周期。 最后一項(xiàng)改進(jìn)可以使這段代碼真正飛起來。每次通過循環(huán)時(shí),我們將當(dāng)前數(shù)據(jù)指針與音頻輸入數(shù)據(jù)的開頭進(jìn)行比較,以查看我們是否越界(MOVE A[0]、DP[0] 語句、CMP 比較語句和 JUMP E 語句)。如果我們將初始音頻數(shù)據(jù)(我們現(xiàn)在使用 BP[Offs] 指向的循環(huán)緩沖區(qū)讀取)設(shè)置為全部零,我們可以簡單地刪除這些檢查。將 RAM 初始化為 0 的成本可以忽略不計(jì),而接下來幾千個樣本節(jié)省的 4 個周期可以忽略不計(jì)。我們的新循環(huán)代碼是纖細(xì)的 5 個周期。 在回到性能方程之前,讓我們看一下結(jié)果計(jì)算。我們目前將 48 位結(jié)果向下移動的方式似乎很浪費(fèi)。 一種可能的解決方案是再次使用我們的MAC。與其向右移動 12(或 0 到 16 之間的任何值),我們可以向左移動 16 減去該量(即左移 4)。這會將我們的結(jié)果放在 MAC 寄存器的中間 16 位字中。請注意,我們的左移實(shí)際上是通過乘以 2 到某個冪
zeroes_filterloop: move A[0], DP[0] ; 1, let's see if we are out of data cmp #W:rawaudiodata ; 2, compare to the start of the audio data move DP[1], DP[1] ; 1, select DP[1] as our active pointer move MA, @DP[1]++ ; 1, multiply next filter coefficient move BP, BP ; 1, select BP[Offs] as our active pointer move MB, @BP[Offs--] ; 1, multiply next filter data jump e, zeroes_outofdata ; 1, stop if at the start of the audio data djnz LC[0], zeroes_filterloop ; 1
zeroes_filterloop: move DP[1], DP[1] ; 1, select DP[1] as our active pointer move MA, @DP[1]++ ; 1, multiply next filter coefficient move BP, BP ; 1, select BP[Offs] as our active pointer move MB, @BP[Offs--] ; 1, multiply next filter data djnz LC[0], zeroes_filterloop ; 1
move A[2], MC2 ; get MAC result HIGH move A[1], MC1 ; get MAC result MID move A[0], MC0 ; get MAC result LOW move APC, #0C2h ; clear AP, roll modulo 4, auto-dec AP shift_loop: ; ; Because we use fixed point precision, we need to shift to get a real ; sample value. This is not as efficient as it could be. If we had a ; dedicated filter, we might make use of the shift-by-2 and shift-by-4 ; instructions available on MAXQ. ; move AP, #2 ; select HIGH MAC result move c, #0 ; clear carry rrc ; shift HIGH MAC result rrc ; shift MID MAC result rrc ; shift LOW MAC result djnz LC[1], shift_loop ; shift to get result in A[0] move APC, #0 ; restore accumulator normalcy move AP, #0 ; use accumulator 0
在我們原來的右移應(yīng)該是 12 的情況下)。 這將讓我們將結(jié)果計(jì)算提高到 12 個周期,而不是 9 + (6 x S) 個周期。
; ; don't care about high word, since we shift left and take the ; middle word. ; move A[1], MC1 ; 1, get MAC result MID move A[0], MC0 ; 1, get MAC result LOW move MCNT, #20h ; 1, clear the MAC, multiply mode only move AP, #0 ; 1, use accumulator 0 and #0F000h ; 2, only want the top 4 bits move MA, A[0] ; 1, lower word first move MB, #10h ; 1, multiply by 2^4 move A[0], MC1R ; 1, get the high word, only lowest 4 bits significant move MA, A[1] ; 1, now the upper word, we want lowest 12 bits move MB, #10h ; 1, multiply by 2^4 or MC1R ; 1, combine the previous result and this one ; ; result is in A[0] ;
現(xiàn)在讓我們回到前面的等式。我們的新方程使用40個開銷周期和每個循環(huán)迭代5個周期的保守估計(jì)。使用與之前相同的100抽頭濾波器示例,MAXQ2000可以處理16kHz的37位單聲道音頻數(shù)據(jù),如表1所示。
表 1.最大FIR濾波器采樣速率(20MHz MAXQ2000,環(huán)路)
過濾器長度(抽頭) | 最大速率(赫茲) |
50 | 68965.51724 |
100 | 37037.03704 |
150 | 25316.4557 |
200 | 19230.76923 |
250 | 15503.87597 |
300 | 12987.01299 |
350 | 11173.18436 |
對于需要更高采樣率且可能犧牲代碼空間的應(yīng)用程序,我們可以實(shí)現(xiàn)另一項(xiàng)性能改進(jìn)。我們可以“內(nèi)聯(lián)”濾波器系數(shù),這消除了選擇活動指針的需要和循環(huán)的需要(這種技術(shù)也稱為循環(huán)展開)。此更改的代價(jià)是增加了代碼空間 - 以前,我們的 100 點(diǎn)過濾器需要 100 個單詞才能存儲;現(xiàn)在需要存儲 300 個單詞(每個系數(shù)移動 2 個單詞,每個數(shù)據(jù)值移動 1 個單詞)。在 16 千字的設(shè)備中,對于性能優(yōu)勢來說,這可能是微不足道的代價(jià)。新代碼可能如下所示: 為了計(jì)算此更改的性能優(yōu)勢,我們再次假設(shè)開銷為 40 個周期,但現(xiàn)在每個循環(huán)迭代有 3 個周期,盡管我們已經(jīng)真正消除了循環(huán)。100抽頭的性能限制現(xiàn)在為58kHz(見表2)。
move BP, BP ; select BP[Offs] as our active pointer zeroes_filtertop: move MA, #FILTERCOEFF_0 ; 2, multiply next filter coefficient move MB, @BP[Offs--] ; 1, multiply next filter data move MA, #FILTERCOEFF_1 ; 2, multiply next filter coefficient move MB, @BP[Offs--] ; 1, multiply next filter data move MA, #FILTERCOEFF_2 ; 2, multiply next filter coefficient move MB, @BP[Offs--] ; 1, multiply next filter data . . . move MA, #FILTERCOEFF_N ; 2, multiply next filter coefficient move MB, @BP[Offs--] ; 1, multiply next filter data ; ; filter calculation complete ;
表 2.最大FIR濾波器采樣速率(20MHz MAXQ2000,展開環(huán)路)
過濾器長度(抽頭) | 最大速率(赫茲) |
50 | 105263.1579 |
100 | 58823.52941 |
150 | 40816.32653 |
200 | 31250 |
250 | 25316.4557 |
300 | 31250 |
350 | 27027.02703 |
支持 IIR 濾波器
本應(yīng)用筆記不演示IIR濾波器的使用,但MAXQ2000沒有理由不支持IIR濾波器。涉及的更改將是:
將一段 RAM 專用于存儲最新的輸出樣本(這將最有效地實(shí)現(xiàn)為循環(huán)緩沖區(qū),使用 BP[Offs] 寄存器的方式類似于前面描述的方式)
包括濾波器反饋(“y”部分)的特征濾波器系數(shù)
添加另一個循環(huán),繼續(xù)累積作為過濾器反饋部分結(jié)果的產(chǎn)品
雖然添加另一個循環(huán)聽起來像是性能下降,但不一定是。雖然計(jì)算濾波器的一個輸出需要更多時(shí)間,但I(xiàn)IR濾波器通常需要較少的抽頭(N的值較小)來計(jì)算輸出值。
結(jié)論
MAXQ2000的性能和外設(shè)使其成為出色的通用μC。它可用于任何需要快速、多功能μC的地方,特別是在需要用戶交互的應(yīng)用中。MAC的有效利用使MAXQ2000具有一定的數(shù)字濾波功能,使MAXQ2000成為目前最通用的μC之一。
-
微控制器
+關(guān)注
關(guān)注
48文章
7649瀏覽量
152103 -
濾波器
+關(guān)注
關(guān)注
161文章
7860瀏覽量
178926 -
連接器
+關(guān)注
關(guān)注
98文章
14656瀏覽量
137229
發(fā)布評論請先 登錄
相關(guān)推薦
評論