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