センサーなどのノイズを程よく除去するにはローパスフィルター(LPF)が有効である。
デジタル通信するセンサーの場合はアナログのLPFは使えないので、デジタルのLPFを使うことになる。
センサから出てくる値をxとして、現在保有している平均値をSとすると
S=S*0.9 + 0.1x
といった具合でLPFが実装できる。
浮動小数点演算は小さなマイコンには重い作業なので
32倍の値をS2とでもしておき、
S2=( S2 - (S2>>5) + x )
S=S>>5
といった値を吐き出すのが演算負荷的によろしいのではと思っている。>>はビットシフト。
今使っているマイコンは浮動小数点使っても大丈夫なくらいのメモリーがあるので浮動小数点演算させちゃってます。
上の式のように毎回Xと同レベルに戻してしまうと値がギクシャクしますからね。
スタートの時は0から平均化すると立ち上がりに時間がかかるから、最初に1サンプルした値を整数倍して基準としておかないといけませんね。
S = ( (S << 5) - S + X) >> 5
なんてのはどうでしょう?
↓
S = (S*31+x)>>5
なんだけど、xが32より小さいときは
フィルターとしての特性がスムーズにいかないけど
整数計算では、まぁそんなもんでしょうね。(^^)