さて、FIRフィルタの次は、IIRフィルタを設計してみる。
FIR(Finite Impulse Response)フィルタ。有限インパルス応答フィルタ。
IIR(Infinite Impulse Response)フィルタ。無限インパルス応答フィルタ。
例えば、IIRフィルタの入力に1サンプリングだけ1、その次からずっと0を入力した場合、IIRフィルタ出力は小さな値になっていくが無限に続く。その波形を示す。一次遅れの例である。
これがIIR(無限のインパルス応答)なる名前のゆえん。
さて、IIRフィルタ設計法にもいろいろあるが、わかりやすい「インパルス不変法」で一次遅れフィルタを設計してみる。
「インパルス不変法」というのは、アナログフィルタ入力に細いパルスを入れた場合のアナログフィルタ出力と上記のように、最初のみ1で、次からずっと0のデータを入力したIIRフィルタ出力波形とを一致させようという方法である。
例えば、アナログフィルタが一次遅れでその入力に細いパルスを入れた時の出力が上記波形のように、指数関数的で減少し、その時定数がτ[s]であるとすれば、出力波形は以下の式になる。
g(t) = e^(-t/τ) ( t>=0 ) (式1)
この波形をT[s]ごと、サンプリングした場合、g(t)の値は、上式にt=0, t=T, t=2T, t=3T,,,を代入して、その値は
1, e^(-T/τ), e^(-2T/τ), e^(-3T/τ) , , ,
と変化していく。 一般には
g(nT) = e^(-nT/τ) ; n=0,1,2,,, (式2)
と表現できる。(式2)のz変換する。右辺は、1サンプリング遅れるごとにその値にz-1をかけて、その総和を求める。数列のz変換は級数になる。左辺は単純にG(z)とおく。
G(z) = 1 + e^(-T/τ)*z(-1) + e^(-2T/τ)*z^(-2) + e^(-3T/τ)*z^(-3) + ,,,
(式3)
これは、公比e^(-T/τ)*z(-1)の等比級数である。(式3)の両辺にe^(-T/τ)*z(-1)をかける。
G(z)*e^(-T/τ)*z(-1) =
e^(-T/τ)*z(-1) + e^(-2T/τ)*z^(-2) + e^(-3T/τ)*z^(-3) + ,,,
(式4)
(式3)の両辺から(式4)の両辺を引くと
G(z) - G(z)*e^(-T/τ)*z(-1) = 1
G(z)について整理して
1
G(z) = ----------------- (式5)
1 - e^(-T/τ)*z(-1)
これが、時定数τの一次遅れになるIIRフィルタである。
G(z) = Y(z) / X(z) を代入して、フィルタ入力X(z)とフィルタ出力Y(z)の関係式に変形する。
Y(z) 1
--- = ----------------- (式6)
X(z) 1 - e^(-T/τ)*z(-1)
これをY(z)=の形に変形すると、
Y(z) = X(z) + e^(-T/τ)*Y(z)*z(-1) (式7)
これを逆z変換して、実時間の式へ戻す。Y(z) => y(nT) , X(z) => x(nT) , Y(z)*z^(-1) => Y{(n-1)T}と代入して、
y(nT) = x(nT) + e^(-T/τ)*y{(n-1)T} (式8)
この計算式で一次遅れのIIRフィルタができる。ブロック図は、
図としては簡単だが、Aの値が1と0.9の間の値になる。実際に、T=1msとして、時定数τ=10msとすると、e^(-0.1)=0.904837となる。これを浮動小数点演算ユニット(FPU)や乗算器(かけ算を行うハードウェア)がない安い16ビットマイコンや32ビットマイコン、あるいはディジタル回路用ハードウェア記述言語のVHDLやverilogでどのように実装したらよいのか、工夫が必要。工夫については、次の記事で。
Link:
プライムモーション社(みんなで手軽にWindowsリアルタイムIO制御)

最近のコメント