デジタルフィルタの実装

デジタルフィルタ設計では、限られた計算資源や厳しいリアルタイム性を考慮する必要があります。この記事では、実装の注意点とともになぜこのような特性が求められるのか、その背景と設計のポイントをわかりやすく解説します。

デジタルフィルタとは

FIRフィルタとIIRフィルタの比較図。FIR(有限インパルス応答)はインパルス応答が有限長で常に安定し、線形位相特性を設計しやすい一方、次数が高くなると計算量が増える。IIR(無限インパルス応答)はインパルス応答が無限長で、少ない次数で急峻な特性を実現できるが、安定条件を満たす必要があり位相特性は一般に非線形。下部に低域通過フィルタの周波数特性の例を並べ、IIRでは阻止域にリップルが現れることを示している。

デジタルフィルタとは入力された信号にフィルタ処理を施し、必要な周波数成分だけを取り出す仕組みです。センサやアナログ回路、外乱などで重畳したノイズ成分を、平均化などのデジタルフィルタで除去・低減することで、ノイズの影響を小さくできます。

デジタルフィルタはFIRフィルタ(Finite Impulse Response)、IIRフィルタ(Infinite Impulse Response)の2つに分けられ、特性によって使い分けます。

FIRフィルタ

デジタルフィルタのインパルス応答が有限時間後に完全に0になるフィルタがFIRフィルタです。現在と過去の入力値のみを使って計算するため、安定しています。データを平滑化する際によく出てくる移動平均はFIRフィルタの典型例です。後述するIIRフィルタと比べて計算式が単純なため、実装も容易なフィルタです。係数が対称、または反対称なFIRフィルタは線形位相となり、波形を維持したまま通すことができます。

IIRフィルタ

有限のサンプル数で厳密に0にならず、無限長の応答を持つためIIRと呼ばれます。極と零点を組み合わせて計算します。必要な係数が少ないため、限られたメモリと演算量で計算できるのが特徴です。ただし伝達関数H(z)の分母多項式が0となる根(極)と、分子多項式が0となる根(零点)の配置、位相ゆがみなどをあわせて考える必要があり、所望のフィルタを作り出すのが難しい側面があります。極の位置によっては、時間がたつにつれて出力が増大し、発散する可能性も出てきます。パラメータしだいで不安定になりやすいのも特徴の1つです。

実装上の注意点

デジタルフィルタを実装・コーディングする際に、留意すべきポイントを列挙します。

データ型の選択

固定小数点と浮動小数点のどちらを選ぶかで実装の難易度が変わります。FIRフィルタの場合は数値の変動幅をあらかじめ知ることが容易なため、固定小数点の実装でもそれほど苦労しません。

IIRフィルタで固定小数点を用いて実装するとスケーリング設計が必要となり、計算コストが増大します。オーバーフローの回避も難易度が高いため、実装を簡略化したい場合は浮動小数点を使うのが適しています。

数値安定性

原理的には次数をいくつでも実装できますが、高次数を単一の直接形として実装すると演算誤差の問題が発生しやすくなります。伝達関数を低次のセクション(1次または2次のセクション)に分解し、縦続形(SOS:Second-Order Sections 形)で実装するのが数値安定性の観点で推奨されます。

演算誤差はある程度発生する前提でコーディングします。FIRフィルタは内部の計算で誤差が生じても、安定しているため発散することなく動作します。IIRフィルタでは丸め誤差が蓄積していくため、係数設計と精度の管理が不可欠です。ズレにシビアな位相制御が求められる場合はFIRフィルタでの実装を検討するほうがよいでしょう。

メモリ使用量

FIRは遅延器と乗算器の組み合わせをタップと呼び、タップの数が多いほど過去データを保持するため、データ保持量が増大します。結果としてメモリへのアクセス頻度が上昇し、システム全体の負荷につながってしまいます。

IIRはFIRより少ない係数でFIRと同等の振幅特性が実現できますが、過去の出力値をメモリに持ちます。出力値をフィードバックして次の計算に利用するIIRでは、戻ってきた値が異常な場合に対応するための正確な管理や初期化が必要です。

設計方法

パラメータ調整が容易なPythonで設計を始め、Cに移植する手順で開発すると実装がスムーズです。無償で使用できるPythonと、ライブラリのSciPyやNumPyを使えば、所望の特性を持つフィルタを作りやすくなります。データを表に変換するpandas、フィルタ特性をグラフ表示するためのmatplotlibなど、他にも必要な機能がライブラリに充実しています。

Pythonで開発している間は処理速度を気にして動作確認する場面はあまりありませんが、実際はリアルタイム処理が要求されます。Cで最適化する際は乗算やメモリアクセスの回数を調整します。

FIR/IIRフィルタの使い分け

波形そのものの形を重視するシーンでは位相直線性が重要です。その場合はFIRが向いています。位相がゆがむと音響分野では音のにじみ、画像加工処理では輪郭のぼやけなどを引き起こしかねません。位相直線性を満たすフィルタを使うことで、同じ遅延時間で処理されるため、波形を維持したままフィルタ処理がおこなえます。

一方、限られたリソースで速く処理をするためには低次で急峻なフィルタが求められます。その場合はIIRが最適です。フィルタの次数が高いほど計算量が増えるため、演算量を抑える必要のあるマイコンなどでよく使われます。通信システムでは隣接する周波数帯の信号を分離し、狭い帯域で通信するために欠かせない技術です。

組み込みソフトの世界 トップへ戻る