加速度センサ と ローパスフィルタ (波形)


android の加速度センサを調べていたら、プログラム例として、下記のような式が頻出していた。
現在の値 = 0.9 * ひとつ前の値 + 0.1 * センサの値

しかし、これが何をするものかの説明がほとんどなかった。
そこで少しだけ詳しく説明する。

目的
センサから情報には、センサ自体の精度や感度による誤差や、手に持った場合の手ぶれの影響などが含まれます。
本来検出したいセンサ情報を得るのは、素早い振動成分(高周波成分)を取り除くて、変動幅が小さい有効成分(低周波成分)だけを取りだす必要があります。
このための仕組みが、ローパスフィルタ(Low Pass Filter 低周波通過濾波器) です。

原理
詳しい原理は、デジタル信号処理 の教科書に任せて。
ひとまずは、加算平均すると、ローパスフィルタになると、覚えておけばよい。

ソースコード
ソースコードは code.google に掲載した

Android との親和性を考慮して、Java Applet で記述した。
センサから情報の代わりとして、サインカーブにノイズを付加したものを使用した。

・ローパスフィルタ1
よく使用されるのは、過去3回のセンサ情報を平均したものです。
数式で表すとこんな感じ。

y[i] = ( x[i] + x[i-1] + x[i-2] ) / 3

・ローパスフィルタ2
冒頭の Android プログラムの式です。
数式で表すとこんな感じ。

y[i] = 0.9*y[i-1] + 0.1*x[i]

実行結果
ローパスフィルタ1は、ノイズ成分が除去されて、滑らかになっています。
ローパスフィルタ2は、さらに滑らかになっています。

wave

なぜ、このような違いが出るかは、次の記事(周波数特性) で説明します。

参考
傾き、加速度の手振れノイズをフィルターする
加速度センサから重力の影響を取り除く
Android_加速度センサー 概要 (PDF)
wikipedia デジタル信号処理

関連
加速度センサ と ローパスフィルタ (周波数特性)
加速度センサ と ローパスフィルタ (アプリ)


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です