今のPjに入って、数年ぶりにディジタル信号処理を勉強し直しています。
フィルタを設計するたびに、「いろんな理由があっていつもFIRを使っているけど、なんでIIRじゃだめなんだっけ?」と毎回調査しているので、今回はそれをまとめたいと思います🐜
間違っていたらごめんなさい。指摘くれると嬉しいです。
FIR
FIRは有限インパルス応答(Finite Impulse Response)の略語で、インパルス応答が有限であることを意味する1。
差分方程式で書くと、以下の通り。
時刻のとき、はシステムの出力、はシステムの入力、はシステムの入力に対する係数である。
つまり、FIRフィルタでは、出力は入力の畳み込み和でのみ計算されることを示す。
IIR
IIRは無限インパルス応答(Infinite Impulse Response)の略語で、インパルス応答が無限であることを意味する2。
差分方程式で書くと、以下の通り。
時刻のとき、はシステムの出力、はシステムの入力、はシステムの出力に対する係数、はシステムの入力に対する係数である。
つまり、IIRフィルタでは、出力は入力の畳み込み和だけでなく、過去の出力の畳み込み和も使って計算されることを示す。
例として、のときの差分方程式によるディジタルフィルタを、以下に表現する。(Zについては以降を参照)
FIRとIIRの一般化
IIRの差分方程式において、の符号を置き換えると以下のようにかける。
つまりFIRとIIRの違いは、を除くが、ゼロかゼロでないかであることがわかる。
差分方程式にZ変換を導入
ところで、Z変換3では1時刻分遅延することを以下のように書く。
また、をZ変換すると、以下のように書ける。
したがって、差分方程式は以下のように書き下せる。
さらに、について解く。
ここで、
とすると、はを倍したものであり、このときのをシステムの伝達関数と呼ぶ。
なお、Z領域は複素領域であることに十分注意すること。
FIRとIIRの比較
FIRとIIRの特徴を比較すると以下の通り。
項目 | FIR | IIR |
---|---|---|
次数(タップ数) | 多め | 少なめ |
計算量 | 次数に比例して高コスト | 比較的小さい |
周波数応答性 | 形状が鈍りがち | 急峻な形状 |
安定性 | 常に安定 | 発散する可能性あるため 極配置などで評価の必要あり |
線形位相特性 | あり 理想的には一定に群遅延する |
なし |
移動平均はFIR?IIR?
いわゆる単純移動平均はFIRフィルタに相当します。
軽くフィルタリングするときは非常に便利ですよね。
結局どっち使うの?
私の場合、安定性と線形位相特性の有無を重視するのがほとんどなので、FIRを選択します。
用途によりますが、波形の形状などを重視しない加速度(センサ)を扱うときはIIRで設計すると思います。
おわりに
信号処理はとにかくノウハウの塊のようなところがあり、完全理解は難しいので、数学的な議論は極力省き、要点だけをざっとまとめました。4
今度はFFTや周波数応答の要点と、さらにプログラム(.py)も公開して整理したいと思っています。
→色々書いています。よろしければ、ディジタル信号処理の記事は以下のリンクを参照してください。もちろん、サンプルプログラムもあります!
参考になれば幸いです(^^)
参考文献
参考文献は以下の通りです。
リンク
技術書