ArduinoでSTEM教育​ 基礎編:デジタル入力フィルタ

ArduinoでSTEM教育​ 基礎編:デジタル入力フィルタ

センサの入力信号は、ノイズ成分が含まれる場合がほとんどです。このノイズをソフトで除去する方法がデジタルフィルタです。今回は、代表的なローパスフィルタ、Mean(平均)フィルタ、Median(中央)フィルタのプログラム方法を紹介します。

ローパスフィルタ(RCフィルタ)

ローパスフィルタは、周波数が低い信号を通して、周波数が高い信号を遮断します。また、このフィルタはRCフィルタとも呼ばれます。電気回路でローパスフィルタを作るときは、下記のような回路構成で、抵抗(R)とコンデンサ(C)を使用します。

ローパスフィルタ

これを式で表します。ある時刻tにおけるフィルタ出力値Voutは、係数をaとして、センサ入力値をVinとすると、下記のようになります。

Vout[t] = a * Vout[t-1] + (1-a) * Vin[t]

もう少し簡単に言葉で表すと、下記のとおりです。

フィルタ出力値 = a * 前回のフィルタ出力値 + (1-a) * センサ入力値

Arduinoのローパスフィルタ(RCフィルタ)のソースコードは以下です。

以上のプログラムを実行した結果が下記です。CSV形式でシリアル出力しているので、シリアルプロッタでグラフ表示ができます。青がセンサ入力値、赤がフィルタ後の値です。フィルタ係数aを0~1の範囲内で色々変えて試してみてください。1に近づくほどフィルタ効果が大きくなります。

ローパスフィルタ(RCフィルタ)のグラフ

Meanフィルタ(平均フィルタ)

Meanフィルタは、過去n回分の平均値を出力するフィルタです。例として、過去10回分の平均値を計算しています。

ArduinoのMeanフィルタ(平均フィルタ)のソースコードと動作確認したグラフは以下です。

Meanフィルタ(平均フィルタ)のグラフ

Medianフィルタ(中央フィルタ)

Medianフィルタは、過去n回分の中央値を出力するフィルタです。例として、過去10回分の中央値を計算しています。 中央値を計算するためには、データをバッファに貯めて、昇順もしくは降順で並べて、真ん中のデータを取得する必要があり、データ処理が少し複雑です。

ArduinoのMedianフィルタ(中央フィルタ)のソースコードと動作確認したグラフは以下です。

まとめ

最後に、これまでのフィルタを全て比較したグラフが以下です。一応、ソースコードも載せておきます。

各種フィルタ比較

Meanフィルタは、急激な変化がある場合(例えば、スパイク状のノイズ)、その値も含めて平均化するため、フィルタ後の値に少し影響があります。一方、Medianフィルタは、中央値を選択するため、その影響を受けにくいという特徴があります。どのフィルタが優れているとは一概に言えません。それぞれのフィルタの特徴を理解して、状況に応じて試してみてください。

Arduino基礎編カテゴリの最新記事