目次

ディジタルフィルタ

LPFとかを計算処理によって組みたい時に使う,マイコンのソフトウェアで実装するときもこのディジタルフィルタを使う.
関連ワード

伝達関数の知識とかフーリエ級数の知識とかめっちゃ必要.
サンプリング定理 取得した信号の半分以下の周波数成分までの信号しか再現することはできない.

離散化

連続系を離散化するときの種類
これを離散化する。サンプリング時間$T_{s}$、遅延要素$z^{-1}$とすると

前進差分、前進短形 $$ s = \frac{1-z^{-1}}{T_{s}z^{-1}} = \frac{z-1}{T_{s}} $$

後退差分、後退矩形 $$ s = \frac{1-z^{-1}}{T_{s}} = \frac{z-1}{T_{s}z} $$

台形近似、双一次、Tustin変換

$$ s = \frac{2}{T_{s}}\frac{1-z^{-1}}{1+z^{-1}} $$

FIR(有限長インパルス)

遅延ブロックの数-1がタップ数ということらしい.
$n$サンプル目の入力$x[n]$に対してタップ数$M$のFIRフィルタを通過した出力$y[n]$は $$ y[n] = \sum_{i=0}^{i=M} a_{i}x[n-i] $$ 遅延時間はタップ数/2×1サンプル時間

安定であることが保証されるが、急峻なフィルタを作ろうと思うとフィルタ次数が大きくなりがち

移動平均

フィルタ係数をすべて同じにしたものを移動平均と呼ぶことが多い。サンプリング周波数$f_{s}$、平均化の数を$N(M+1)$サンプルとすると$\frac{f_{s}}{N}$でノッチ(ゲイン0)が生じる。このノッチにハマるように設計すると高調波を消せる。

$$ y[n] = \frac{1}{M+1}\sum_{i=0}^{i=M} {x[n-i]} $$ 上の式では$a_{i} = \frac{1}{M+1}$となるためくくりだしている

sincフィルタ

移動平均に間引き(デシメーション)を追加したものをsincフィルタ、cicフィルタと呼ぶらしい。

IIR(無限長インパルス

$$ y[n] = \sum_{i=1}^{K} a_{i}y[n-i] + \sum_{j=0}^{M} b_{j}x[n-j] $$

IIRフィルタにおいては$K=M$とすることが多い。 $$ y[n] = \sum_{i=1}^{M} a_{i}y[n-i] + \sum_{i=0}^{M} b_{i}x[n-i] $$

伝達関数としては $$ H(z) = \frac{\sum_{i=0}^{M} b_{i}z^{-i}}{1 - \sum_{i=1}^{M} a_{i}z^{-i}} $$ このとき$M$次のIIRフィルタの伝達関数と言ったりする。分子と分母でインデックスが異なるので注意
FIRフィルタと比較すると低次でより急峻なフィルタを作ることができるが、不安定になることもある。

ローパスフィルタ

一次のローパスフィルタ $$ G(s) = \frac{1}{T_{c}s+1} $$ これを離散化する。これを双一次変換で離散化したものを$H(z)$とすると

$$ H(z) = \frac{1}{T_{c}{\frac{2}{T_{s}}\frac{1-z^{-1}}{1+z^{-1}}}+1} = \frac{T_{s}(1+z^{-1})}{2T_{c}(1-z^{-1}) + T_{s}(1+z^{-1})} = \frac{T_{s}+T_{s}z^{-1}}{2T_{c}+T_{s}+(T_{s}-2T_{c})z^{-1}} = \frac{\frac{T_{s}+T_{s}z^{-1}}{2T_{c}+T_{s}}}{1-(-\frac{T_{s}-2T_{c}}{2T_{c}+T_{s}})z^{-1}} $$

双二次フィルタ

IIRフィルタのうち、次数が2のものを双二次(BiQuad)フィルタと呼ぶ。設計が容易であること、設計手法が確立されており、いろんなフィルタを設計できることからよく利用されている。
$$ H(z) = \frac{b_{0}+b_{1}z^{-1}+b_{2}z^{-2}}{a_{0}+a_{1}z^{-1}+a_{2}z^{-2}} $$ $a_{0} = 1$となるように正規化することが多い。
IIRフィルタと互換性をもたせつつも一般化すると

$$ H(z) = \frac{\sum_{i=0}^{2} b_{i}z^{-i}}{1 - \sum_{i=1}^{2} a_{i}z^{-i}} = \frac{b_{0}+b_{1}z^{-1}+b_{2}z^{-2}}{1 - (a_{1}z^{-1}+a_{2}z^{-2})} $$ 上の式と添字が同じだけど互換はないので注意

構成法

直接系、縦続系、並列系等がある。直接系はシンプルだけど演算誤差や係数誤差の影響が大きく現れるのであまり使われないらしい。 縦続系は直接系に比べてこれらの誤差の影響を受けにくいため、よく使われる。
双二次フィルタを次数分だけ直列に接続するような構成。次数が偶数か奇数かによってちょっと構成が変わる。まだ関数は作ってない。

実装など

一次ローパスフィルタ

$n$サンプル目の入力,出力をそれぞれ$x[n],y[n]$,重み係数$a$として $$ y[n] = ay[n-1] + (1-a)x[n] $$ アナログ回路のRCフィルタのような一次遅れの減衰特性を有する。
マイコンの中でよく実装されている。
今回の入力値と全体の出力値に重みをつけて足し合わせるというもの。
$a[n]$実装は比率を0~1とするパラメータであるが、このパラメータはこの信号のサンプリング周波数と減数のカットオフ周波数によって決まる。
0 : フィルタかからずそのまま通過
1 : すべて遮断,前回の計測値のまま
フィルタの時定数を$\tau$,サンプリング周期$T$として, $$ a = \frac{\tau}{\tau + T} $$ なのでこのフィルタを使うときはパラメータの横にサンプリング周波数とカットオフ周波数をコメントして置かないと後々わからなくなる。
これは指数平滑の処理とも言える。RCフィルタ(指数平滑フィルタ)

導出

$$ Y(s)=G(s)X(s) = \frac{1}{1+{\tau}s}X(s) $$ これを後退差分で離散化すると
$$ (T+{\tau}(1-z^{-1}))y[n] = Tx[n] $$ $$ y[n] = \frac{{\tau}}{T_{s}+{\tau}}y[n-1] + \frac{T_{s}}{T_{s}+{\tau}}x[n] = ay[n-1] + (1-a)x[n] $$

最も簡単な「一次のローパスフィルタ」を作る方法

EMA(指数移動平均)

DSP

Think DSP: Digital Signal Processing in Python http://greenteapress.com/wp/think-dsp/
著者Allen B. Downey氏の好意により、(CC BY-NC 3.0)ライセンスによってPDFが無料公開されている。
GitHubリポジトリにサンプルコードが配布されている。

参考文献

やる夫で学ぶディジタル信号処理
FIRフィルタを計算してみる
ディジタルフィルタの概要
連続系の代表的な伝達関数の双一次変換による離散化
dsp Guru
z変換
第10章 z-変換 : デジタルフィルター
FIR
FIRフィルタに関して
6 FIR ディジタルフィルタの設計法
移動平均
【FIRフィルタ】第10回:単純移動平均処理振幅特性(ゲイン特性)まとめ 比較
sinc
モーター制御アプリケーションの電流計測用のADS1202とFPGAデジタルフィルタの組み合わせ
IIR
双2次フィルタ ++C++; // 未確認飛行 C
双二次フィルタのフィルタ係数と周波数特性の関係

TNJ-052:LTspice でやってみるデジタル・フィルタ解析(前編)平均化フィルタの周波数応答と連続信号・離散信号
TNJ-053:LTspice でやってみるデジタル・フィルタ解析(後編)ΣΔADC でのsinc フィルタってホントにsinc?
TNJ-096: アナログ・フィルタの伝達関数をデジタル・フィルタに変換する「双一次変換」とは