📚

ロードセルからの値に外れ値が混ざっていたのでメディアンフィルタを使ってみた

に公開

概要

ロードセルとHX711を使ってArduinoで押されたピークの強さをとろうとしていて、1フレームだけとんでもなく大きな値が来て困った話。

もともとの実装(移動平均フィルタ)

ロードセルから来た値を何も考えずに移動平均を使ったローパスフィルタで処理していました。

変更後の実装(メディアンフィルタ)

以下のサイトを参考にしました。
https://ehbtj.com/electronics/filter-library-useful-for-arduino-signal-processing/

移動平均は細かい値の変動(高い周波数)を取り除くのには良さそうですが、外れ値を弾くには向いてなさそうです。

以下の記述を見てメディアンフィルタを使用してみることにしました。

Hampelフィルタはデータをあまり平滑化しません。
スパイクだけを取り除く感じです。
似たようなフィルタにメディアンフィルタがありますが、こちらは少しデータを平滑化します。

ライブラリもあったのでこちらを利用しました。
https://github.com/luisllamasbinaburo/Arduino-MedianFilter/tree/master

フランス語で書いてありますが、

#include "MedianFilterLib.h"でライブラリを読み込んで、
MedianFilter<int> medianFilter(5);でサンプル数を決めて
int median = medianFilter.AddValue(rawMeasure);すれば戻り値に結果が帰ってきます。

少数の場合も同様の使い方で大丈夫そうです。

実際に使ってみたところ、Rawで外れ値が来た場合もMedの値には影響がなさそうでした。

Discussion