淺談頻域數字濾波器
1.系統帶寬與雜訊
大家都知道反饋是閉環控制系統的命根子, 然而在實際應用中,反饋信號總是伴隨著雜訊。搞控制的人都對卡爾曼濾波這種時域濾波器耳熟能詳,反倒是對頻域濾波器了解可能不是太好。其實在現實中,對於有效信號和雜訊的頻率特性區別明顯的時候,頻域濾波器可以是一個好的選擇。
例如下圖:



在控制系統的反饋中,一般會結合被控對象的帶寬來設置反饋信號的濾波器截止頻率,高於系統帶寬的信號往往是無意義的雜訊,比如我以前寫的寫過的:
控制研究中的 『帶寬』 怎樣理解?
以及現實中如何標定系統的帶寬
如何用實驗方法確定系統的頻域響應 - 知乎專欄
一般來說,宏觀機械系統的帶寬在50Hz以下,微機電系統可以達到100KHz,電路系統的帶寬可達100MHz甚至10GHz以上。
2.從滑均濾波到FIR濾波器
問題是上面的濾波器該如何數字實現呢?凡是有過工程經驗的人都有過一個樸素的概念:多采幾個樣,求平均值,也就是常說的「滑動平均濾波」

比如上圖,就是根據三個歷史值和當前值,加起來求一個平均來當做當前濾波的結果。
也就是
用c語言偽代碼可以寫一個簡單的程序
double AveragingFilter(double dataN)
{
static double dataHistory[3]=0;
double result=0;
result=(dataN+dataHistory[0]+dataHistory[1]+dataHistory[2])/4;
dataHistory[2]=dataHistory[1];
dataHistory[1]=dataHistory[0];
dataHistory[0]=dataN;
return result;
}
相信這是很多人都會做的,但是我們換一種角度來看它,對上述差分方程做Z變換
我們可以看到它的頻域響應(假定採樣頻率/執行頻率為1KHz):

我們再來看更一般N階的滑動平均濾波器的情況:
它的截止頻率為Fs/n。其中Fs為採樣頻率。再來看一個n=10的例子:

用信號處理的語言來說,這叫做有限衝擊響應(Finite impulse response,FIR)濾波器,即系統輸出和過去的有限個的輸入有關係。從控制人的角度,也可以理解為這是一個純零點系統,沒有極點,再換句話說,這個濾波器的系統沒有反饋。
但是滑動平均濾波器並不能算一個好的低通濾波器,我們能否通過改變它的零點,來設計更好的低通濾波器呢?
可以。在matlab命令行輸入fadtool,我們就可以方便的設計低通濾波器了。



如何將連續域的控制器進行離散化實現 - 知乎專欄
其中的道理是一樣的,在fadtool里也可以將它的係數通過c語言頭文件的形式導出來,方便編程。
FIR由於只有前饋通道,沒有反饋,可以不擔心穩定性問題,這使得它在處理高速信號的時候具有優勢。
但是,FIR是非常消耗硬體資源的。


502階!我那麼貴的開發板,一共才840個乘法器和加法器。這時候,是該談談IIR濾波器了。
3.反饋系統-IIR濾波器
其實最簡單的IIR濾波器我們搞控制的一點也不陌生,一階慣性環節就是
我們看它的bode圖(T=0.1),

就是截止頻率w約等於1/T的低通濾波器么把它離散化實現了不就完了。但是再仔細看看它的相位響應,在控制系統裡面,你確定這麼大的相位延遲它不會失穩?
這時候就需要更高階的設計方法了,濾波器的差分方程/時域表達式形式就變成了:
在此形式下,看起來系統當前時刻的輸出不僅和之前時刻的輸入有關,而且還和歷史輸出有關,看起來當前的結果是迭代了無數過去的歷史狀態,所以叫做無窮脈衝響應(infinite impulse response,IIR) 濾波器。
即引入了反饋的形式,寫成Z函數
同樣可用fdatool來幫助設計,記得把設計方法換成IIR

階數只剩下15階了,消耗的資源大為減少。但是IIR是反饋系統,在高速的信號處理中,即使是使用並行實現,由於計算延遲和有限字長來造成的穩定性仍然是非常有挑戰性的。
推薦閱讀:
※做到千人千面營銷,營銷自動化你究竟了解多少
※這5類PLC程序,大家都喊【丟】,千萬別入套!
※【Excel VBA】- 使用自定義函數自動生成序列號
※近來商用化的機器人、無人機等快速發展,對控制演算法提出了哪些新的要求?

