,,,,
(1.上海師范大學(xué) 信息與機(jī)電工程學(xué)院,上海 200234; 2.上海計(jì)算機(jī)軟件技術(shù)開(kāi)發(fā)中心,上海 201114)
STM32F10x系列是ST公司針對(duì)工業(yè)、醫(yī)療和消費(fèi)類市場(chǎng)推出的基于ARM cortex-M3內(nèi)核的微控制器,該系列包含五大產(chǎn)品線:STM32F100具有電機(jī)控制和CEC功能;STM32F101具有高達(dá)1MB的Flash;STM32F102具有USB全速設(shè)備功能;STM32F103具有高達(dá)1MB的Flash、電機(jī)控制、USB和CAN接口;STM32F105/107具有以太網(wǎng)MAC、CAN和USB2.0 OTG.
無(wú)論針對(duì)工業(yè)控制、醫(yī)療服務(wù)或者消費(fèi)類領(lǐng)域,傳感器已經(jīng)成為電子設(shè)備中不可缺少的部分,如:工業(yè)稱重設(shè)備使用的壓阻式壓力傳感器、醫(yī)療儀器中常見(jiàn)的心率脈搏傳感器、智能手機(jī)中的重力傳感器等.傳感器將各種模擬信號(hào)轉(zhuǎn)換成電壓信號(hào)后,需要通過(guò)模數(shù)轉(zhuǎn)換器(A/D)將電壓信號(hào)轉(zhuǎn)換成數(shù)字信號(hào),然后再輸出到處理器進(jìn)行相應(yīng)信號(hào)處理,傳感器的信號(hào)處理框圖如圖1所示.
圖1 通過(guò)傳感器的模擬信號(hào)處理框圖
然而,模擬信號(hào)極易受到外界干擾,如傳感器未能水平放置,風(fēng)向、風(fēng)力大小的影響,日光燈的工頻干擾,甚至是微小的震動(dòng),都會(huì)對(duì)傳感器獲得的信號(hào)造成擾動(dòng),去除這些干擾最有效、最經(jīng)濟(jì)的方法就是處理器對(duì)輸入的數(shù)字信號(hào)進(jìn)行信號(hào)濾波的去噪預(yù)處理.根據(jù)濾波器單位脈沖響應(yīng)的時(shí)間特性,濾波器可分為FIR濾波器和IIR濾波器兩類,由于FIR濾波器只包含有限個(gè)系數(shù)、無(wú)輸入反饋,以及結(jié)構(gòu)簡(jiǎn)單等特點(diǎn),使FIR濾波器成為實(shí)際應(yīng)用系統(tǒng)中最常用的濾波器類型.
DSP(數(shù)字信號(hào)處理器)和FPGA(可編程邏輯門(mén)陣列)是實(shí)現(xiàn)數(shù)字濾波器最常用的處理器,其中DSP適合實(shí)現(xiàn)串行的濾波器結(jié)構(gòu),FPGA適合實(shí)現(xiàn)并行的濾波器結(jié)構(gòu).雖然這兩種處理器具有超強(qiáng)的處理能力,但是價(jià)格昂貴,作為傳感器信號(hào)的濾波器實(shí)現(xiàn)可謂大材小用.濾波運(yùn)算需要大量的乘法,常用的單片機(jī)由于沒(méi)有硬件乘法器,實(shí)現(xiàn)濾波器需要占用大量的CPU時(shí)鐘,這勢(shì)必影響系統(tǒng)中其他處理的正常工作.STM32F10x系列微控制器采用RISC結(jié)構(gòu),并內(nèi)嵌硬件乘法器以及大量片內(nèi)外設(shè),同時(shí)兼顧了低成本優(yōu)勢(shì),特別適合于傳感器信號(hào)的FIR濾波器實(shí)現(xiàn)和數(shù)字信號(hào)處理.
對(duì)長(zhǎng)為N的數(shù)字濾波器的單位脈沖響應(yīng),其傳輸函數(shù)為:
(1)
其中ω為數(shù)字頻率,Hg(ω)為幅度特性函數(shù),θ(ω)為相位特性函數(shù).
為保證信號(hào)的群延時(shí)為常數(shù),要求所設(shè)計(jì)的FIR濾波器是線性相位,即相位特性函數(shù)θ(ω)滿足:
θ(ω)=-τω,
(2)
θ(ω)=θ0-τω.
(3)
其中τ為常數(shù),θ0為起始相位,-π≤ω≤π.公式(2)表示第一線性相位,公式(3)為第二線性相位.
為設(shè)計(jì)線性相位FIR濾波器,經(jīng)過(guò)推導(dǎo)[1]可得,線性相位FIR濾波器的單位脈沖響應(yīng),應(yīng)滿足:
h(n)=h(N-1-n), 0≤n≤N-1 ;
(4)
h(n)=-h(N-1-n), 0≤n≤N-1 .
(5)
其中,h(n)滿足公式(4),則所設(shè)計(jì)的FIR濾波器是第一線性相位;h(n)滿足公式(5),則所設(shè)計(jì)的FIR濾波器是第二線性相位.
FIR濾波器設(shè)計(jì)常用的3種方法是窗函數(shù)設(shè)計(jì)法[1]、頻率取樣法和優(yōu)化設(shè)計(jì)法,其中使用最廣泛是窗函數(shù)設(shè)計(jì)法,常用的窗函數(shù)[1]有矩形窗、海明窗、漢寧窗、萊克曼窗和凱塞-貝塞爾窗,其中從頻域特性看,萊克曼窗與前幾個(gè)窗函數(shù)相比,主瓣寬度窄、旁瓣衰減快;與凱塞-貝塞爾窗相比,雖然凱塞-貝塞爾窗是一種可調(diào)節(jié)的窗函數(shù),但是在提高頻域特性的同時(shí),其時(shí)域的幅值較難整型化,同時(shí)也會(huì)使得過(guò)渡帶變寬,綜合工業(yè)控制領(lǐng)域?qū)V波的需求,采用布萊克曼窗(blackman),通過(guò)matlab軟件設(shè)計(jì)得到濾波器的單位脈沖響應(yīng)h(n).
FIR濾波器的基本結(jié)構(gòu)主要有:直接型FIR、級(jí)聯(lián)型FIR、線性相位型FIR、頻率取樣型FIR等結(jié)構(gòu),其中直接型FIR濾波器結(jié)構(gòu)為串行運(yùn)算結(jié)構(gòu)[2],較符合微控制器按照程序順序執(zhí)行的特點(diǎn).直接型FIR濾波器結(jié)構(gòu)[3]如圖2所示,其結(jié)構(gòu)就是描述了信號(hào)xn經(jīng)過(guò)系統(tǒng)的卷積運(yùn)算.
圖2 直接型FIR濾波器結(jié)構(gòu)
圖2中,xn…xn-N表示輸入信號(hào),yn表示第n時(shí)刻的輸出信號(hào),z-1表示延時(shí)1個(gè)單位時(shí)間,c0,…,cN-1表示相應(yīng)輸入信號(hào)乘以相應(yīng)的系數(shù).
ST公司在推出STM32F10x系列MCU的同時(shí),推出了STM32F10x數(shù)字信號(hào)處理庫(kù),其中FIR濾波器的實(shí)現(xiàn)函數(shù)如表1所示.
表1 STM32F10x DSP library中FIR濾波器函數(shù)原型
其中COFFS結(jié)構(gòu)體的定義如下:
其中,h為濾波器系數(shù),nh為濾波器階次.
這里需要注意,fir_16by16_stm32函數(shù)并不能實(shí)現(xiàn)濾波器設(shè)計(jì),函數(shù)只是將信號(hào)x與系數(shù)p以圖2方式(直接型FIR濾波器結(jié)構(gòu))運(yùn)算后得到一個(gè)運(yùn)算結(jié)果,實(shí)際是完成了信號(hào)x與系數(shù)p的線性卷積運(yùn)算[1],如公式(6)所示:
(6)
其中,x、h為2個(gè)信號(hào),x={x0,x1,...,xL-1},h={h0,h1,...,hM-1},卷積結(jié)果y的長(zhǎng)度為M+L-1.
通過(guò)分析fir_16by16_stm32函數(shù),調(diào)用函數(shù)得到的運(yùn)算結(jié)果如公式(7)所示:
(7)
其中,N即為函數(shù)原形中的第4個(gè)參數(shù)(表1).
因此,為盡可能節(jié)約STM32F10x芯片內(nèi)的內(nèi)存資源,同時(shí)減少運(yùn)算耗時(shí),在編程過(guò)程的數(shù)據(jù)定義時(shí),應(yīng)滿足公式(8):
N=L-M.
(8)
即濾波結(jié)果的數(shù)組長(zhǎng)度等于信號(hào)數(shù)組長(zhǎng)度與濾波系數(shù)數(shù)組個(gè)數(shù)的差.
另外值得注意的是,STM32F10x系列微控制器只支持整數(shù)運(yùn)算,浮點(diǎn)數(shù)的運(yùn)算通過(guò)編譯將轉(zhuǎn)化為整數(shù)運(yùn)算,但運(yùn)算效率大大降低.同時(shí)為了使用fir_16by16_stm32函數(shù),通過(guò)表1,可以看到信號(hào)數(shù)組x及濾波器數(shù)組h的數(shù)據(jù)類型為short型,即數(shù)值范圍在-215~+215-1,因此,信號(hào)xi應(yīng)滿足:
-215≤xi≤215-1 .
(9)
通過(guò)matlab軟件設(shè)計(jì)后的濾波器系數(shù)以歸一化的數(shù)值方式得到,即:
(10)
因此,在使用fir_16by16_stm32函數(shù)時(shí)并不能直接使用matlab軟件設(shè)計(jì)的濾波器系數(shù),而必須經(jīng)過(guò)數(shù)值變換,如圖3所示.數(shù)值放大過(guò)程中,考慮到最后需要恢復(fù)原數(shù)值范圍,建議放大倍數(shù)為2n,n為整數(shù),這可以使后期數(shù)據(jù)恢復(fù)時(shí),只需要進(jìn)行移位操作,相比于除法運(yùn)算,運(yùn)算量大大降低.無(wú)論使用數(shù)值擴(kuò)大以后采用四舍五入、向上取整或者向下取整,最后去除小數(shù)的同時(shí)依然會(huì)導(dǎo)致一些誤差,因此最后需要對(duì)整型化的系數(shù)作微調(diào).
圖3 濾波器系數(shù)的數(shù)值變化框圖
從表1可以看到,濾波結(jié)果數(shù)組的數(shù)據(jù)類型為int型,即32位有符號(hào)整型,所以應(yīng)保證濾波結(jié)果的每個(gè)數(shù)值的絕對(duì)值應(yīng)小于231,因此按照公式11,可推導(dǎo)出數(shù)值放大倍數(shù)(A)的限制:
(11)
其中,N為濾波器階次,max(xi)表示信號(hào)各系數(shù)的最大值.當(dāng)然,在對(duì)系數(shù)進(jìn)行放大的同時(shí),應(yīng)該考慮應(yīng)用的精度需求.
采用matlab軟件為設(shè)計(jì)工具,濾波器設(shè)計(jì)采用窗函數(shù)法,采用布萊克曼窗,濾波器點(diǎn)數(shù)取64點(diǎn).設(shè)信號(hào)采樣率為256樣值/s,濾波器截至頻率為10Hz,濾波器時(shí)頻域特性如圖4所示:
圖4 截至頻率為10Hz的FIR濾波器時(shí)頻特性
表2 濾波器放大倍數(shù)實(shí)驗(yàn)結(jié)果
為使用STM32F10x數(shù)字信號(hào)處理庫(kù),利用matlab設(shè)計(jì)的濾波器的系數(shù)需要進(jìn)行變換,為保證每個(gè)系數(shù)的可見(jiàn)性,即通過(guò)數(shù)值變換后最小系數(shù)至少為0或1,按照濾波器階次,通過(guò)實(shí)驗(yàn)得到各階次濾波器的放大倍數(shù),如表2所示.
表2的實(shí)驗(yàn)結(jié)果只是考慮了系數(shù)整數(shù)化以后的可見(jiàn)性,同時(shí)考慮公式(11)時(shí),可以看到當(dāng)濾波器點(diǎn)數(shù)為64點(diǎn)或128點(diǎn)時(shí),如果信號(hào)的數(shù)值過(guò)大就會(huì)造成運(yùn)算結(jié)果溢出,即超出表1中濾波器輸出數(shù)組的數(shù)據(jù)類型.
實(shí)驗(yàn)所用平臺(tái)采用STM32F107為主處理器的評(píng)估板,板上配有LCD顯示屏、網(wǎng)口、wifi模塊、zigbee模塊、傳感器等模塊,完全能夠滿足測(cè)試需求.
假設(shè)采樣率為256樣點(diǎn)/s,以5 Hz和50 Hz組成原始信號(hào),如圖6所示.
圖6 被測(cè)信號(hào)時(shí)域及頻域特性
設(shè)計(jì)10 Hz的濾波器,并整型化后的結(jié)果如圖7所示.
圖7 整型化后的10Hz FIR濾波器
對(duì)圖6所示原始信號(hào)進(jìn)行濾波后的結(jié)果如圖8所示.
圖8 原始信號(hào)經(jīng)過(guò)濾波器后的結(jié)果
圖6的原始信號(hào)經(jīng)過(guò)如圖7的濾波器后,50 Hz的噪音信號(hào)已經(jīng)被完全濾除,圖8中的時(shí)域信號(hào)已經(jīng)可以被認(rèn)為是5Hz的單頻信號(hào),達(dá)到預(yù)期的FIR濾波器的效果.
表3 濾波器性能測(cè)試結(jié)果
本節(jié)主要分析基于STM32F10x的時(shí)間特性,測(cè)試平臺(tái)依然采用STM32F107VC為主處理器,并且工作頻率設(shè)置在72 MHz.假設(shè)信號(hào)采樣率為256樣點(diǎn)/s,以表2所示階次濾波器為測(cè)試對(duì)象,以測(cè)試各階濾波器濾波1 s采樣信號(hào)(即256點(diǎn)信號(hào))所耗時(shí)間,如表3所示.
從表3實(shí)驗(yàn)結(jié)果看,256階濾波器對(duì)128點(diǎn)信號(hào)的濾波時(shí)間僅為1.5 ms,濾波效率完全能夠滿足通常濾波器的需求.這里需要注意的是,64階和128階測(cè)試過(guò)程中,為了使濾波結(jié)果真實(shí)有效(即數(shù)據(jù)在運(yùn)算過(guò)程中不發(fā)生越界),信號(hào)值控制在210以內(nèi),因此完全夠滿足常用的8位或10位,即STM32F10x平臺(tái)的片內(nèi)A/D能夠使用128階濾波器.
基于STM32F10x平臺(tái),作者提出了FIR濾波器的設(shè)計(jì)與實(shí)現(xiàn)方法,包括濾波器在matlab平臺(tái)下的設(shè)計(jì),及在STM32F10x平臺(tái)利用STM32F10x DSP Lib進(jìn)行濾波器實(shí)現(xiàn)的整套方案,通過(guò)測(cè)試表明,濾波器的濾波結(jié)果與仿真要求一致,在72 MHz主頻下,以256/s采樣率,采用128階FIR濾波器對(duì)1 s數(shù)據(jù)的濾波器的時(shí)間僅為1.5 ms,完全滿足通常的濾波時(shí)間需求.
參考文獻(xiàn):
[1] 李莉.數(shù)字信號(hào)處理原理和算法實(shí)現(xiàn)[M].北京:清華大學(xué)出版社,2010.
[2] 章曉眉,趙冬娥,馮彥君,等.基于FPGA的FIR濾波器設(shè)計(jì)[J].電子質(zhì)量,2011(9):29-41.
[3] 戴曜澤,王春雷,朱智強(qiáng).基于FPGA高階FIR濾波器的實(shí)現(xiàn)[J].現(xiàn)代電子技術(shù),2012,35(8):111-113.
上海師范大學(xué)學(xué)報(bào)·自然科學(xué)版2013年4期