うまい寿司が食いたい。

うまい寿司が遠慮なく食べれるようになるまで,進捗とか垂れ流すブログ

入力信号を正弦波にしたときのカルマンフィルタによる予測

カルマンフィルタって何?

一言でまとめると,正規分布した観測ノイズを乗った情報から,ノイズを除去し状態の真値を推定する方法です。
応用例はいろいろあるのですが,

  • カーナビ
  • ロケットの軌道推定

なんかに使われているようです。

この記事は何でないのか?

カルマンフィルタの内容や式の解説などはありません。
それらは,下段の参考文献を見てください。

今回のこの記事では何をするのか?

ランダムウォークを入力信号として,観測ノイズを除去するカルマンフィルタは実装されているはありました。
しかしながら,例えば入力信号が正弦波のような波形であるときにノイズを除去する例は見られなかったので,今回試してみました。

状態空間と実際の系

状態空間と観測空間が同一であるようなモデルを考えます。つまり,
{ \displaystyle
x_M(t) =x_M(t-1)+u(t)
}
{ \displaystyle
y(t) =x_M(t)
}

のモデルを考えます。ここで,x(t)は真値でy(t)は観測値で,u(t)が入力信号になります。
実際には入力信号のノイズや,観測のノイズがかかるため上の式は

{ \displaystyle
x_t(t) =x_t(t-1)+u(t)+\varepsilon(t)
}
{ \displaystyle
y_o(t) =x_t(t)+\delta(t)
}

となります。\varepsilon(t)\delta(t)ガウス分布に従うノイズです。
カルマンフィルタで求めたい値はこのx_{t}(t)です。

状態空間モデルが立っているんだから,それが真値ではないかと一度思ったのですが,x_M \neq x_{t}であるため,入力信号のノイズが少しずつ重なっていき次第にずれていくのでx_M(t)理想ではありますが,求めたい真値ではありません。

カルマンフィルタの式

このページを参考にしました(下の参考文献3です)。

最終的に求めたい式としては,

{\displaystyle
x_{kf}(t) = (1-K)x_M' (t)+K y_o(t)
}

です。ここでx_{kf}(t)はカルマンフィルタによる予測値,x_M'(t)状態空間による予測値,y_o(t)は実測値です。つまり,予測値と実測値のどちらにより重きを置くのかをカルマンゲインKを用いて計算しています。詳細は上記の参考文献にまかせて,実際にこの式を利用して計算してみます。

正弦波を入力にしてみる。

{\displaystyle
u(t)=\sin(t)
} と仮定しました。このときに,カルマンフィルタを利用して計算をしてみると,

f:id:Leo0523:20180729144151p:plain

このような結果が得られました。ここで,横軸はステップ数で,縦軸はそれぞれでの値になります。
青が観測ノイズが乗っているもの,緑が観測ノイズがない場合の値です。そして,黄色がカルマンフィルタによってノイズを除去したときの予測値になります。
計算条件としては,モデルのノイズによる偏差\sigma_x=1,観測ノイズによる偏差が\sigma_z=10としています。
正弦波を入力としても,観測ノイズを除去して真値をかなりの精度で予測できることがわかりました。

実験的にモデルのノイズを大きくして\sigma_x=10,観測ノイズを小さくすると\sigma_z=1

f:id:Leo0523:20180729144856p:plain

このような結果が得られました。 これは,観測ノイズがモデルノイズに比べてほとんどありませんので,ほぼ観測値が真値に一致していることが原因だと考えられます。

最後にモデルノイズと観測ノイズが同じとき\sigma_x=\sigma_z=5を試してみました。 f:id:Leo0523:20180729145343p:plain あまり良い予測とは言えません。

この結果を見る限り,なんとなくどこか間違ってそうな気がするので,間違いに気づけば訂正いたします。

今回利用したコードはこちらです。

github.com

まとめ

正弦波を入力信号として,カルマンフィルタを用いて真値予測を実行してみました。
今回の実験によって,観測ノイズの分散>入力ノイズの分散のときには利用できそうであることがわかりました。
入力ノイズのほうが大きい場合には,観測信号がほぼ真値であるため,そもそもカルマンフィルタを利用する必要がありません。
また,分散が同程度である場合には,予測精度がよいとは言えませんでした。

参考資料

今回,記事を書くにあたって以下の資料を参考にしました。

まず,簡単な理解のために,一次元モデルについて調べていました。

参考文献 1 qiita.com

参考文献 2 qiita.com

このあたりでざっくりとした理解を得て,

参考文献 3 hamachannel.hatenablog.com

で,数式の理解を行いました。

また,実際に実装して試している例として,

参考文献 4 qiita.com

があります。ここでは,ランダムウォークに対してカルマンフィルタを適応しています。

また,多次元まで拡張したカルマンフィルタや,他の信号処理のモデルの比較など細かい部分まで触れられているのは,

参考文献 5 九州工業大学西田健先生の講義資料

http://lab.cntl.kyutech.ac.jp/~nishida/lecture/psc/no5.pdf

が参考になりました。探していた中で一番わかりやすかった気がしています。

lab.cntl.kyutech.ac.jp

先生のホームページ上から,すべての講義資料にアクセスできるようなので,他の信号処理のモデルとの比較に良さそうです。