24小時聯(lián)系電話:18217114652、13661815404
中文
公司新聞
嵌入式微控制器的數(shù)字濾波
處理隨時間推移或在時域中收集的數(shù)據(jù)樣本時,最基本的操作之一是“過濾”數(shù)據(jù)。重要的是要理解可以數(shù)字方式過濾數(shù)據(jù)以達(dá)到最佳結(jié)果并釋放CPU來執(zhí)行其他任務(wù)的通用方法,尤其是在涉及嵌入式微控制器時。
在本文中,了解時域中用于過濾和處理數(shù)據(jù)樣本的廣泛使用的方法。另外,請仔細(xì)研究LPC55S69 MCU中PowerQuad單元的Dual Biquad IIR引擎-一種在許多濾波用例中有用的通用DSP構(gòu)建塊。
連續(xù)采樣數(shù)據(jù)的通用過濾器
在時域中采樣數(shù)據(jù)時,將以已知的固定速率連續(xù)收集數(shù)據(jù)。時域濾波器接受此數(shù)據(jù)作為輸入,并輸出以某種方式修改的新信號。濾波器的輸出只是另一個時域信號,可以對其進(jìn)行進(jìn)一步處理或傳輸?shù)綌?shù)模轉(zhuǎn)換器(DAC)。
我們通常根據(jù)濾波器對正弦波的響應(yīng)方式來對其進(jìn)行處理。如果我們將輸入信號視為簡單的正弦波,則濾波器可以調(diào)整輸入的幅度以及調(diào)整其相位。將復(fù)雜信號施加到濾波器時,它將調(diào)整信號正弦分量的幅度和相位。濾波器在頻率范圍內(nèi)的行為方式稱為頻率響應(yīng)。
時域中的標(biāo)準(zhǔn)操作由所謂的有限沖激響應(yīng)(FIR)過濾器執(zhí)行,該過濾器將最新的數(shù)據(jù)樣本與以前收集的元素混合在一起以獲得下一個輸出樣本。
圖1.使用輸入的歷史記錄進(jìn)行逐樣本過濾處理。
實現(xiàn)這種過濾器的一種方法是將先前的樣本存儲在數(shù)組中,并使用一個簡單的方程式將它們合并:
x[n] // The most recent input?<br /> x[n-1], x[n-2] // The two previous input samples?<br /> y[n] // The next output sample??<br /> <br /> y[n] = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2]
這個特定的偽代碼段將最新的樣本與之前的兩個數(shù)據(jù)樣本結(jié)合在一起。它將每個數(shù)據(jù)樣本與單獨的常量系數(shù)相乘,然后對結(jié)果求和以獲得下一個輸出樣本。總之,這表示簡單的乘法和累加運算,其中常數(shù)系數(shù)和歷史記錄的長度控制濾波器的頻率響應(yīng)。
通過為系數(shù)選擇適當(dāng)?shù)闹担梢詷?gòu)造各種類型的濾波器。如果濾波器衰減高頻,則它充當(dāng)?shù)屯V波器。通過衰減低頻,所得濾波器將充當(dāng)高通濾波器。也可以將兩種方法結(jié)合使用,這將導(dǎo)致帶通濾波器。
FIR濾波器在概念上很簡單,但是可能需要大量先前的數(shù)據(jù)樣本才能對其頻率響應(yīng)進(jìn)行精確控制。盡管此過濾器易于理解和實現(xiàn),但在常規(guī)CPU上執(zhí)行它可能很麻煩,尤其是在具有中等大小的歷史記錄的情況下。這是因為每個樣本都需要許多乘法和加法運算才能確定輸出。
減少所需歷史量的一種方法是在計算下一個輸出樣本時使用先前確定的濾波器輸出。這是另一類稱為無限脈沖響應(yīng)濾波器(IIR)的數(shù)字濾波器的基礎(chǔ):
// This examples uses the previously established naming conventions<br /> y[n] = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a1 * y[n-2]
上面的示例是IIR濾波器的一種特殊情況,稱為雙二階濾波器-一種常見的構(gòu)建模塊,可以級聯(lián)以構(gòu)造更大的濾波器。與FIR濾波器相比,此方法需要較少的系數(shù)才能實現(xiàn)所需的頻率響應(yīng)。使用這種方法時,需要特別權(quán)衡。如果未正確選擇系數(shù),則使用反饋會導(dǎo)致濾波器振蕩。
圖2.自動生成系數(shù)的眾多工具之一。
使用PowerQuad IIR Biquad引擎
LPC55S69 PowerQuad單元集成了用于計算IIR雙二階濾波器的專用硬件。使用PowerQuad過濾收集的數(shù)據(jù)樣本將使CPU有空余時間來執(zhí)行其他任務(wù)。
如上所述,過濾器算法的實現(xiàn)并不復(fù)雜,但是它們會占用大量CPU時間。LPC55S69 MCU的PowerQuad單元包含針對許多濾波和復(fù)雜數(shù)學(xué)運算進(jìn)行了優(yōu)化的專用硬件。它通過AHB總線和Arm?Cortex?-M33協(xié)處理器接口連接。
LPC55S69的標(biāo)準(zhǔn)開發(fā)環(huán)境是免費的基于Eclipse的IDE MCUXpresso。LPC55S69 SDK包含許多有用的示例,其中一些是PowerQuad示例應(yīng)用程序。
圖3.選擇PowerQuad數(shù)字濾波器示例。
“ powerquad_filter”示例項目包含一些不同過濾器配置的示例。“ powerquad_filter.c”文件具有幾個函數(shù),這些函數(shù)演示了基本的過濾器設(shè)置。
早先,本文討論了使用“直接格式I”的過濾器,這是最直接的實現(xiàn)。但是,PowerQuad重新安排了乘法和加法運算的流程,而不改變結(jié)果,從而導(dǎo)致“直接格式II”,這不需要存儲輸入和輸出的歷史記錄。而是存儲中間歷史記錄v [n],也稱為過濾器狀態(tài)。
AHB總線上的少數(shù)寄存器用于存儲狀態(tài)和系數(shù),以設(shè)置用于IIR濾波器操作的PowerQuad。在SDK示例中,過濾器的狀態(tài)在PQ_BiquadRestoreInternalState函數(shù)中初始化。
完成后,過濾器即可處理數(shù)據(jù)樣本。這是在fsl_powerquad_filter.c中的PQ_VectorBiquadDf2F32函數(shù)中完成的:
圖4.矢量化IIR濾波器實現(xiàn)
此功能旨在處理輸入樣本的塊(為八的倍數(shù))。可以借助MCR指令將數(shù)據(jù)從LPC55S69的主處理內(nèi)核的寄存器傳輸?shù)竭B接的協(xié)處理器(在這種情況下為PowerQuad)。
然后,PowerQuad會執(zhí)行過濾工作,這是執(zhí)行LLP55S69的Cortex-M33內(nèi)核所采用的多種乘法和加法運算的一種更為有效的方式。一旦完成PowerQuad,就可以使用MCR指令訪問結(jié)果,該指令將數(shù)據(jù)從協(xié)處理器移回內(nèi)部CPU寄存器。
用于數(shù)字濾波的雙Biquad IIR引擎
LPC55S69 MCU帶有PowerQuad單元(其中包含兩個獨立的biquad引擎),可以幫助加速過濾和復(fù)雜的數(shù)學(xué)運算。AHB總線寄存器用于配置PowerQuad IIR功能,并且通過協(xié)處理器接口在PowerQuad和Cortex-M33內(nèi)核之間交換數(shù)據(jù)。
MCUXpresso中的LPC55S69 SDK是一個很好的起點。但是,該代碼并未經(jīng)過優(yōu)化,因為它易于理解。請記住,盡管PowerQuad可以大大加快過濾應(yīng)用程序的速度,但是CPU仍必須在PowerQuad協(xié)處理器之間來回傳輸數(shù)據(jù)。