はじめに
先日、このようなツイートが流れてきました。
上司に「フィルタなんて過去N回分の入力値の平均でいいんじゃないの?」と言われたことを思い出したので、一次のローパスフィルタ(LPF)を作る方法を適当にまとめました。
— 水色の男@名古屋のプログラマ (@mizuiro_0718) 2019年9月28日
4枚目はノイズを含んだサイン波をフィルタに通した結果です。 pic.twitter.com/9VZs3JKT1z
無類の制御工学愛好家である私は、即座にRTとファボを押しました。
その後もRT、ファボは伸びていったのを見て、「以外と皆知らないんだなぁ…」と思ったりしました。と同時に、内容に少しだけ(ほんの少しだけ)難しいところがあるなと思いました。
なのでここでは、最も簡単な作成方法について紹介させて頂きます。
「難しいところ」はどこか、どう簡単にするか
「離散化の手法として、双一次変換を利用している」という点です。
双一次変換の利用は、全く間違ったことではないのですが個人的にはLPF(ローパスフィルタ)であれば双一次変換でなくてもよいと考えます。なおHPF(ハイパスフィルタ)の場合も同様です。
じゃあ何を使うべきかというと、後退差分です。具体的な内容は次節。
双一次変換はどこに使うべきかというと、BPF(バンドパスフィルタ)やBSF(バンドストップフィルタ)等、「周波数の管理をシビアにすべきフィルタ」に使うべきです。というか、このへんのフィルタは双一次変換を使わないとダメです。後退差分では設計通りの性能を得ることは難しいです。
後退差分による離散化
連続時間系の伝達関数におけるsは、後退差分による離散化では下記のように変換されます。ここでTは離散時間系のサンプリング周期です。
s=\frac{1-z^{-1}}{T}
LPFの伝達関数はこうでした。τはLPFの時定数です。
Y(s)=\frac{1}{1+\tau s}R(s)
余談ですが、LPFのカットオフ周波数Fと時定数τの関係は下記です。
\tau = \frac{1}{2\pi F}
本論に戻って、伝達関数を離散化することで下記式が得られます。
(T+\tau (1-z^{-1}))y[n] = Tr[n]\\
y[n] = \frac{\tau}{T+\tau}y[n-1] + \frac{T}{T+\tau}r[n]
すなわち、LPF出力の前回値と入力信号の今回値を合成することで、LPF出力の今回値が得られます。しかも合成の比は、τ(またはT)をτとTの和で除することで得られます。めっちゃ簡単じゃないですか?
また上式の別の解釈として、こうも書けます。
y[n] = ay[n-1]+(1-a)r[n]\\
where \quad a=\frac{\tau}{T+\tau}
aを使う場合とそうでない場合、好きなほうで式を覚えて頂ければと思います。