基于AVR的數(shù)字濾波器濾除工頻干擾的快速算法實(shí)現(xiàn)
3 分配系數(shù)法原理
從(3)式可知,濾波算法可以用迭代計(jì)算實(shí)現(xiàn),為保證每個(gè)新的輸出值都可以作為下次計(jì)算的輸入值,必須使輸出值和輸入值的位寬度一致。AVR單片機(jī)內(nèi)部硬件乘法器的輸出結(jié)果為16位,兩次乘法運(yùn)算的結(jié)果還要進(jìn)行加法運(yùn)算,其結(jié)果很有可能超過16位寬度。如果要進(jìn)行迭代計(jì)算,就要將乘加運(yùn)算的結(jié)果轉(zhuǎn)化成8位表示方式。一種解決方法是用查表法實(shí)現(xiàn)乘法計(jì)算,這樣運(yùn)算結(jié)果就直接表達(dá)成8位定點(diǎn)數(shù)形式,不用進(jìn)行表示方式的轉(zhuǎn)化,但是這種方案要占用額外的硬件存儲空間構(gòu)造一張查找表。
可以從逆向進(jìn)行思考:由(3)式可知,每個(gè)新的輸出值y(k)都與上一次的輸出值y(k-1)和新的輸入值x(k)有關(guān)。y(k-1)和x(k)都是8位的,因此最大值為0xFF。為了使a×y(k-1)+(1-a)×x(k)不超過0xFFFF,兩個(gè)系數(shù)a和(1-a)的和不能超過0xFFFF/0xFF=0x101。實(shí)際上,a+(1-a)等于“1”,因此這里的0x101就可以看作“1”。如果取a=0.9,那么對應(yīng)地將0x101平均分成10份,取其中的9份,即0x101×0.9近似等于0xE7, 相應(yīng)地0.1就等于0x101-0xE7=0x1A。這里的0xE7可以近似被認(rèn)為是0.9的一種定點(diǎn)Q8數(shù)表示形式,而0.1的定點(diǎn)Q8數(shù)表示形式就是0x1A。由于濾波器系數(shù)a和(1-a)采用了Q8數(shù)的表示形式,這種將16位乘加運(yùn)算結(jié)果轉(zhuǎn)化為8位定點(diǎn)數(shù)表示形式的工作就變得簡單了,只需通過移位運(yùn)算,取y(k)的高8位即可,對應(yīng)的C語言代碼為:
y(k)=(char)(y(k)>>8)
在C語言編程處理中,并不需要建立一個(gè)數(shù)組來儲存y(k)的值,而只需定義兩個(gè)unsigned char型的變量分別儲存y(k-1)和x(k)。當(dāng)乘加計(jì)算a×y(k-1)+(1-a)×x(k)完成后,將結(jié)果轉(zhuǎn)化成8位定點(diǎn)數(shù)形式,再將其賦值給y(k-1)所對應(yīng)的變量即可。因此采用迭代方式進(jìn)行乘加運(yùn)算后,整個(gè)運(yùn)算過程只需要兩個(gè)變量和兩個(gè)常數(shù)參加即可。
通過這種處理,y(k)就可以作為計(jì)算下一次輸出值y(k+1)的一個(gè)已知量,并繼續(xù)與Q8數(shù)形式的濾波器系數(shù)相乘,得到新的輸出值。這種處理方式簡化了乘加運(yùn)算的完成過程,節(jié)省了系統(tǒng)硬件資源,并降低了處理器開銷。
4 采樣時(shí)間的控制
采用單片機(jī)進(jìn)行數(shù)字信號處理,一種有效而準(zhǔn)確的數(shù)據(jù)采集方式就是通過計(jì)數(shù)器中斷服務(wù)程序(ISR)控制AD對輸入信號進(jìn)行精確采樣。但是(圖2)中斷服務(wù)程序(ISR)的開銷影響了AD采樣時(shí)間間隔的精確度,同時(shí)如果中斷服務(wù)程序(ISR)的開銷過大,必然導(dǎo)致AD的最高采樣頻率的降低。因此,要想獲得精確的采樣頻率,就必須在盡量減少中斷服務(wù)程序開銷的前提下,適當(dāng)調(diào)整計(jì)數(shù)器中斷的時(shí)間間隔。這可以通過調(diào)整OCR0的預(yù)置數(shù)來完成。
5 算法流程圖
濾波算法是通過中斷服務(wù)程序(ISR)來完成的,整個(gè)應(yīng)用程序的主函數(shù)main()主要負(fù)責(zé)初始化計(jì)數(shù)器中斷,并處理其它應(yīng)用。整個(gè)程序的流程圖如圖3所示。
本算法的C語言代碼(附錄A)經(jīng)過AVR-GCC編譯器的編譯后,“.text”段只有310個(gè)字節(jié),大大節(jié)省了單片機(jī)的flash空間。
6 基于VMLAB的濾波系統(tǒng)仿真實(shí)現(xiàn)
VMLAB的全稱為:Visual Micro Lab。它針對AVR系列單片機(jī)和ST62系列單片機(jī)設(shè)計(jì),是一個(gè)單片機(jī)的虛擬原型框架,可以提供給用戶一個(gè)真正意義上的虛擬微控制器(MCU)設(shè)計(jì)實(shí)驗(yàn)室。它具有強(qiáng)大的多窗口、多文件的編輯器,微控制器的集成開發(fā)環(huán)境,擁有一系列的集成開發(fā)工具,圖形界面的調(diào)試器,混合模式的模擬-數(shù)字電路仿真器,代碼質(zhì)量檢查器等。基于MCU,它可以仿真出包括模擬元器件在內(nèi)的更多外圍設(shè)備,并具有交互式器件模擬仿真功能。
假設(shè)有用信號是2V大小的直流信號,工頻干擾是峰峰值為1V,頻率為50Hz的正弦波,建立單片機(jī)AD的輸入信號表示形式如下:
2+0.5 sin(2π×50×t)
VMLAB通過工程文件來管理和控制各種仿真信息、硬件連接以及顯示I/O電壓波形等。根據(jù)本算法的特點(diǎn),采用Atmega16作為目標(biāo)單片機(jī),時(shí)鐘選為8MHz,建立工程文件。恰當(dāng)設(shè)置OCR0寄存器,使計(jì)數(shù)器比較匹配中斷的時(shí)間間隔約為2ms,這樣AD的采樣頻率Fs近似認(rèn)為等于500Hz。經(jīng)過仿真,對比結(jié)果如表3。
從表3可以看出:隨著a的增大,算法收斂的時(shí)間變長,同時(shí)50Hz對應(yīng)的衰減幅度增加,衰減的幅度值和理論推導(dǎo)基本一致。另外,當(dāng)a=0.95時(shí),DA輸出的均值變小。這主要是進(jìn)行循環(huán)迭代運(yùn)算時(shí),需要將16位的變量轉(zhuǎn)化為8位表示形式所導(dǎo)致的。在有用信號失真較小的情況下,為使濾波器達(dá)到降低工頻干擾的最佳效果,必須恰當(dāng)選擇a值。經(jīng)過以上的仿真試驗(yàn)可以發(fā)現(xiàn),當(dāng)a=0.9時(shí),衰減幅度、DA輸出均值和算法收斂時(shí)間表現(xiàn)比較均衡,可以作為一般情況下的選擇值。
評論