フィルタリングの意義
センサにはノイズがつきものです。突然データがピンッと跳ねることがあります。
また人間は非常にアナログです。指を止めているつもりでもデータがブルブルと揺らいだりします。
これをそのままデジタルに用いると非常に不安定なシステムになってしまいます。
そこで生のデータを整えるフィルターが重要となります。
フィルター
指数移動平均(EMA)フィルターを用います。(参照)
S_t = α \times Y_{t-1} + (1-α) \times S_{t-1}
αの値が大きいほど古い値の重みが小さくなります。逆も然り。
ローパスフィルター
瞬間的な変動値を減衰します。ブルブルを抑えたデータが得られます。
var lastVal: CGFloat = 0.0
var alpha: CGFloat = 0.4
func lowpass(val: CGFloat) -> CGFloat {
lastVal = alpha * val + lastVal * (1 - alpha)
return lastVal
}
ハイパスフィルター
瞬間的な変動成分のみにします。グイッと変化した際のデータが得られます。
var lastVal: CGFloat = 0.0
var alpha: CGFloat = 0.4
func highpass(val: CGFloat) -> CGFloat {
lastVal = alpha * val + lastVal * (1 - alpha)
return val - lastVal
}