乘法累加單元(MAC)和單周期內核的組合使MAXQ2000成為多功能微控制器(μC)。MAXQ2000具有性能和I/O外設,非常適合許多應用:鬧鐘、手持醫(yī)療設備、數字讀數——任何需要低功耗、高性能和大量I/O的應用。通過集成MAC,MAXQ2000進入DSP (μC)領域。
MAXQ2000能從MAC中得到多少性能?本應用筆記通過音頻濾波示例探討了這個問題,并給出了MAXQ2000支持的性能的定量指導。
軟件和硬件要求
本應用筆記簡單演示了音頻濾波器。音頻數據是作者預先錄制的消息,說“管道在新的時開始生銹”。此文本不是隨機選擇的 - 它提供了不錯的頻率分量組合,突出了簡單濾波器的可聽效果。錄音可以用任何適當長度的8kHz錄音代替,但不是必需的。
本應用筆記所需的硬件包括MAXQ2000評估板和用于連接計算機揚聲器的小電路。
MAXQ2000評估板是探索MAXQ2000功能的好工具。它包括一個LCD面板、LED組,并可訪問MAXQ2000 μC的所有I/O引腳。它還包括一個MAX1407 ADC/DAC,可用于音頻輸出。
所需的第二件硬件可以很容易地進行面包板測試。用于本演示的電路如圖1所示。它要求一個1 x 8的母頭接頭連接到J2000的MAXQ7評估板,另一個連接到任何接地(MAXQ1評估板上的TP2000是一個不錯的選擇)。揚聲器連接器可以是任何類型 — 顯示的是 3.5 毫米立體聲插孔,這使得連接到典型的計算機揚聲器變得簡單。請注意,兩個輸入通道是連接在一起的,因為我們的演示應用程序只顯示一個音頻通道(單聲道)。
圖1.音頻播放所需的其他硬件。
運行此演示所需的軟件是使用 IAR 嵌入式工作臺構建和調試的。它利用MAXQ2000的硬件調試支持,提供了良好的調試環(huán)境。您可以在實際硬件上運行時設置斷點、設置和讀取寄存器和內存,并查看調用堆棧。
運行演示應用程序
MAXQ2000評估板上的按鈕用于選擇濾波器,并播放通過該濾波器的音頻樣本。使用按鈕 SW4 選擇濾波器 - 濾波器的名稱將顯示在 LCD 屏幕上(HI 表示高通,LO 表示低通,BP 表示帶通,ALL 表示所有通)。使用 SW5 按鈕開始通過所選過濾器播放音頻??梢栽诓シ胚^程中更改過濾器。
設計簡單的FIR濾波器
我開發(fā)了一個Java?小程序,可以讓我輕松創(chuàng)建新的過濾器。我沒有使用給定濾波器參數的標準窗口技術,而是選擇通過在極點零圖中放置零來粗略地“設計”我的濾波器,如圖 2 所示。該小程序允許在坐標平面的任何位置放置零點,并不斷更新演示應用所需的FIR濾波器系數。但請注意,該演示僅支持全零篩選器。支持 IIR 濾波器不會太困難 — 更多說明在支持 IIR 濾波器部分。
圖2.使用零極點圖生成簡單的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)
在任何一種情況下,濾波器都歸結為一個特征方程,該方程本質上是過去輸入和輸出值的加權平均值。濾波器設計的工作是產生那些 Aj和乙k值。為了有效地計算濾波器的輸出,我們需要能夠快速相乘和求和有符號數的硬件支持。輸入MAXQ2000的乘法累加單元。
使用乘法累加 (MAC) 單元實現(xiàn)篩選器
上一節(jié)中的小程序通過計算給定圖中零坐標的濾波器系數來工作。但是,計算的系數是浮點數,而我們的 MAC 使用純 16 位整數數學。為了糾正此問題,演示應用程序使用定點數字系統(tǒng),其中系數的 0 到 15 位位于小數點右側(第 16 位表示符號幅度)。一旦操作結束,MAC累加器中的48位結果將移動到足夠的位置以去除任何分數。
此解決方案是精度與速度的權衡。在許多情況下,這種方法的錯誤可以忽略不計。出于診斷目的,小程序顯示了計算濾波器的三個圖。第一個圖顯示了使用 64 位浮點數的理想濾波器行為。該圖標記為“理想變換”,如圖2所示。
圖 3 顯示了小程序生成的其余繪圖。圖3中的第一個圖顯示了使用16位定點數的有效濾波器。在許多情況下,誤差并不明顯,因此最后一個圖是一個誤差指示器,顯示理想行為除以實際頻率響應。理想情況下,這是 Y = 1 時的直線。
圖3.濾波器 16 位實現(xiàn)的實際變換和舍入誤差(幾乎沒有誤差)。
為簡單起見,小程序生成MAXQ?應用所需的浮點系數,因此可以將新的濾波器簡單地剪切并粘貼到濾波器應用的源中(粘貼到文件data.asm中)。小程序還會生成另外兩個值 — 篩選器的順序(系數數)和偏移計數,因此應用程序可以適當地移動最終結果。此數據顯示在小程序底部的文本框中,可能如下所示:
Zeroes: dc16 dc16 12, 11, 0x1000, 0x26d3, 0x1e42, 0xf9a3, 0xecde, 0xff31, 0xa94, 0x2ae, 0xfd0c, 0xff42, 0xde Shift amount: 12
在MAXQ匯編語言中實現(xiàn)濾波器
為了獲得最佳性能并執(zhí)行準確的性能分析,實際的過濾器將以匯編語言實現(xiàn)。這將使我們能夠準確計算生成一個輸出值所需的周期數,從而估計其他數據集的性能。
MAX1407具有12位ADC。但是,輸入數據是 16 位寬的,我們的過濾器產生 16 位的結果。因此,雖然這 4 個最低有效位 (LSB) 被浪費在此應用中,但我們可以安全地分析我們的性能,就像處理和生成 16 位值(CD 質量的音頻為 16 位)一樣。
在此示例中,濾波器系數存儲在表中的代碼空間中。選擇篩選器后,應用程序將查找相應的篩選器,讀取移位量和抽頭次數,然后準備好開始篩選數據。以下代碼應用篩選器系數:
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] 設置為濾波器的抽頭數,DP[0] 設置濾波器的當前輸入字節(jié)地址,DP[1] 指向濾波器系數的開頭。因此,DP[1] 以遞增的方式處理濾波器系數,DP[0] 以遞減的方式處理輸入數據(首先處理最近的輸入)。
由于MAC在一個周期內工作,因此這里沒有很多代碼來處理它。MCNT 設置為 22h 表示使用有符號整數。在主循環(huán)中,連續(xù)寫入 MA,然后 MB 觸發(fā)乘法累加運算 — 結果在下一個時鐘周期中準備就緒。由于我們的累加器是 48 位(我們的乘法結果是 32 位),我們不必擔心任何溢出(除非我們的過濾器中有 64,000 個抽頭!
性能
該示例應用采用以 16kHz 輸出的單聲道 8 位音頻數據,不足以使 μC 疲憊不堪。因為我們用匯編語言編寫了濾波器,所以我們可以很容易地計算用于提出長度為 N 的 FIR 濾波器計算所需的時間的表達式的周期。然后,我們可以使用此表達式使用前面列出的算法找到最大過濾率。
我們可以將用于生成音頻樣本的函數分為三個部分:初始化、濾波器計算循環(huán)和結果修復。在我們發(fā)布的示例中,初始化需要 38 個周期,濾波器計算循環(huán)每個濾波器系數需要 17 個周期,結果修復需要 9 + (6 x S) 個周期,其中 S 是偏移量。通常,偏移量約為 12,因此我們可以估計結果固定在 81 個周期。因此,產生一個濾波輸出值需要 119 + (17 x N) 個周期。在20MHz時,MAXQ2000可以運行接近100kHz的11抽頭濾波器,這對于語音數據來說已經足夠好了。
讓我們回過頭來重新分析我們的應用程序,看看我們可以在哪里收緊它。我們將專注于過濾器循環(huán),因為這是我們大多數循環(huán)發(fā)生在除最微不足道的過濾器之外的任何過濾器上的地方。
我們可以對循環(huán)代碼進行一些關鍵的改進以提高效率。請記住,我們使用存儲在代碼空間中的預先錄制的音頻樣本。由于MAXQ的哈佛架構,代碼空間的查找比數據空間中的查找需要更多的時間。調用UROM_MOVEDP1INC和UROM_MOVEDP0DEC的函數各需要 5 個周期(LCALL 為 2 個周期,然后在函數內需要 3 個周期)。如果我們將過濾器存儲在 RAM 中(一個周期用于選擇指針,一個周期用于從中讀?。?,并且如果我們提供存儲在 RAM 中的實時輸入數據,則每個周期都可以替換為兩個周期。如果我們愿意向過濾器捐贈 256 個單詞的 RAM,我們可以使用 BP[Offs] 實現(xiàn)一個循環(huán)緩沖區(qū)來存儲輸入數據。這些更改將循環(huán)時間從 11 個周期減少到 17 個周期。我們的過濾器循環(huán)現(xiàn)在如下所示(周期計數列在注釋中的第一個):
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中有了濾波器和輸入數據,我們就可以使用MAXQ架構的另一個技巧。MAXQ指令集是高度正交的——對于在任何操作中可以用作源的內容幾乎沒有限制。因此,我們可以將其直接寫入MAC寄存器,而不是將濾波器數據和輸入數據讀取到GR中。這使循環(huán)減少到 9 個周期。 最后一項改進可以使這段代碼真正飛起來。每次通過循環(huán)時,我們將當前數據指針與音頻輸入數據的開頭進行比較,以查看我們是否越界(MOVE A[0]、DP[0] 語句、CMP 比較語句和 JUMP E 語句)。如果我們將初始音頻數據(我們現(xiàn)在使用 BP[Offs] 指向的循環(huán)緩沖區(qū)讀?。┰O置為全部零,我們可以簡單地刪除這些檢查。將 RAM 初始化為 0 的成本可以忽略不計,而接下來幾千個樣本節(jié)省的 4 個周期可以忽略不計。我們的新循環(huán)代碼是纖細的 5 個周期。 在回到性能方程之前,讓我們看一下結果計算。我們目前將 48 位結果向下移動的方式似乎很浪費。 一種可能的解決方案是再次使用我們的MAC。與其向右移動 12(或 0 到 16 之間的任何值),我們可以向左移動 16 減去該量(即左移 4)。這會將我們的結果放在 MAC 寄存器的中間 16 位字中。請注意,我們的左移實際上是通過乘以 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
在我們原來的右移應該是 12 的情況下)。 這將讓我們將結果計算提高到 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個周期的保守估計。使用與之前相同的100抽頭濾波器示例,MAXQ2000可以處理16kHz的37位單聲道音頻數據,如表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 |
對于需要更高采樣率且可能犧牲代碼空間的應用程序,我們可以實現(xiàn)另一項性能改進。我們可以“內聯(lián)”濾波器系數,這消除了選擇活動指針的需要和循環(huán)的需要(這種技術也稱為循環(huán)展開)。此更改的代價是增加了代碼空間 - 以前,我們的 100 點過濾器需要 100 個單詞才能存儲;現(xiàn)在需要存儲 300 個單詞(每個系數移動 2 個單詞,每個數據值移動 1 個單詞)。在 16 千字的設備中,對于性能優(yōu)勢來說,這可能是微不足道的代價。新代碼可能如下所示: 為了計算此更改的性能優(yōu)勢,我們再次假設開銷為 40 個周期,但現(xiàn)在每個循環(huán)迭代有 3 個周期,盡管我們已經真正消除了循環(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 濾波器
本應用筆記不演示IIR濾波器的使用,但MAXQ2000沒有理由不支持IIR濾波器。涉及的更改將是:
將一段 RAM 專用于存儲最新的輸出樣本(這將最有效地實現(xiàn)為循環(huán)緩沖區(qū),使用 BP[Offs] 寄存器的方式類似于前面描述的方式)
包括濾波器反饋(“y”部分)的特征濾波器系數
添加另一個循環(huán),繼續(xù)累積作為過濾器反饋部分結果的產品
雖然添加另一個循環(huán)聽起來像是性能下降,但不一定是。雖然計算濾波器的一個輸出需要更多時間,但IIR濾波器通常需要較少的抽頭(N的值較小)來計算輸出值。
結論
MAXQ2000的性能和外設使其成為出色的通用μC。它可用于任何需要快速、多功能μC的地方,特別是在需要用戶交互的應用中。MAC的有效利用使MAXQ2000具有一定的數字濾波功能,使MAXQ2000成為目前最通用的μC之一。
-
微控制器
+關注
關注
48文章
7840瀏覽量
153306 -
濾波器
+關注
關注
162文章
8004瀏覽量
180416 -
連接器
+關注
關注
99文章
15074瀏覽量
138752
發(fā)布評論請先 登錄
相關推薦
MAXQ2000 SPI模塊與MAX6951/MAX6950怎么配合使用?
MAXQ2000中文資料pdf
MAXQ2000 Low-Power LCD Microco
采用MAXQ2000進行音頻濾波
采用MAXQ2000 USB “拇指”評估套件進行設計

MAXQ2000 業(yè)內最高MIPS/mA的16位、RISC微
采用MAXQ2000 USB “拇指”評估套件進行設計

利用MAXQ2000設計電壓表

利用SD存儲介質擴展MAXQ2000的非易失性數據存儲空間

采用MAXQ2000進行音頻濾波

使用MAXQ2000和MAX7312進行LED打靶練習游戲

使用MAXQ2000進行安全系統(tǒng)控制

使用MAXQ2000微控制器進行基于溫度的風扇控制

如何將MAXQ2000用作電壓表

評論