Arduinoで信号処理をする上で便利なフィルタのライブラリ

No Image

Arduinoでセンサの値を受け取るなどのプロトタイピング的なことをすることは多いですが、そのときに嫌でもついてくるのが「信号処理」です。
別に生データを見るくらいなら特に気にすることもないのですが、それを使って解析するのであれば「それらしい値」が必要です。
自前でプログラムを書いてもいいのですが、面倒じゃないですか。
だったら素晴らしい有志の方が公開しているライブラリを使わない手はありません。

スポンサーリンク

ローパスフィルタ

ローパスフィルタは高い周波数ほど減衰させるフィルタです。
ノイズなどを除去するのに向いています。

移動平均フィルタ

移動平均フィルタ

何個で移動平均を取るかを指定でき、簡単に求めることができます。
毎回コードを書くのが面倒な方はこういうライブラリで済ませるのが良いでしょう。

FIRフィルタ

FIRフィルタは移動平均の拡張版のようなフィルタです。
要素に重み付けをすることで周波数特性を自由に変えることができます。
係数を工夫することでハイパスフィルタやバンドパスフィルタもつくれる、万能なフィルタです。

係数の計算

係数の設計が面倒なんですが、下記のようなツールを利用すれば各タップの係数が出てくるので便利です。

IIRフィルタ

上のライブラリではFIRフィルタだけでなくIIRフィルタも実装されています。
IIRフィルタは設計が面倒で、設計ミスをしてしまうと発振することもあります。
FIRフィルタよりタップ数が少なくても急峻なフィルタを作れますが、上級者向けです。

センサフュージョン

複数のセンサを組み合わせて、精度よく観測するためのフィルタです。
Arduinoでよく使われるのはロボットやドローンの姿勢制御ですね。
加速度センサ・ジャイロセンサ・地磁気センサを組み合わせて姿勢角(ロール・ピッチ・ヨー)を算出したりします。

カルマンフィルタ

スポンサーリンク

カルマンフィルタ
カルマンフィルタはとても強力なのですが、システムのモデルがわかっているという前提があります。
ノイズは白色ガウス雑音じゃないとダメだったり結構ややこしいです。

Madgwickフィルタ

カルマンフィルタと違ってモデルが不要で、高速なのにカルマンフィルタと同等以上の精度が出るというすごいフィルタです。
Madgwickはカタカナだと「マッジウィック」と読むらしいです。

軽いのでArduinoでもサクサク演算してくれます。

外れ値検出

数値が想定している範囲より外れているなら簡単に外れ値を検出できるのですが、範囲内に入っていてもデータの傾向からずれている値ってありますよね。
急にぴょこっと飛び出たデータを拾っちゃうみたいな、ただあんまり飛び出てないから検出できないとか...

Hampelフィルタ

hampel_filter グラフ
Hampelフィルタはデータをあまり平滑化しません。
スパイクだけを取り除く感じです。

似たようなフィルタにメディアンフィルタがありますが、こちらは少しデータを平滑化します。
どちらも使って比較してもいいかもしれません。


以上、Arduinoで使えるフィルタライブラリの紹介でした。
ライブラリがあるのであれば、積極的に使って楽にプロトタイピングしていきましょう。

Arduinoで信号処理をする上で便利なフィルタのライブラリ

スポンサーリンク

Leave a Comment