footstep detector / 中間電位からノイズを除去するための処理

pp.260-264
足踏みによる振動の大きさも、元々存在している振動も、センサーの感度もばらつきがある。加えて抵抗分圧器による中間電位も抵抗の精度によってばらつきが出る。こうした問題をすべてプログラミングで解決することにする。

感度を上げるためには、ノイズの乗っている中間電位を正確に計る必要がある。それには何度も計って平均をとってノイズを取り除けばよい。普通の移動平均でもよいが、ここではごく簡素化した指数加重移動平均を使ってみる。

ここでは最新値と直近の平均値の2つしか使わずに、最新値に1/16の重みづけをし、直近の平均値に15/16の重みづけをして平均値を更新することにする。式で表すと下のようになる。16分の~のように2の整数乗分の~にしているのはビット演算がしやすいから。
f:id:ti-nspire:20191023110116p:plain
yt: 更新された平均値、xt: 最新値、yt-1: 更新前の直近の平均値。

精度を保ちたいので割り算は極力避ける。かつ割り算をしなければならないときは丸めの処理に注意する。そこでとりえず割り算をなくす手段として両辺に16をかけておく(出力する最後の最後には16で割る)。式で表すと下のようになる。
f:id:ti-nspire:20191023110425p:plain
f:id:ti-nspire:20191023111942p:plain
f:id:ti-nspire:20191023112021p:plain
3番目の展開式にある(16/2)は、整数で割ったときに四捨五入されるようにするための処理。整数で普通に割ったら余りは切り捨てられる。(16/2)に負符号がついているのは、(-16yt/16)を負に向かって四捨五入したいから(つまり-1.4は-1に、-1.5は-2したいから)。round()を適用したほうが簡単であるがfloatも余計な函数も使いたくないのでこうしている。