2017-01-18 5 views
0

私は正弦波を追跡するリニアカルマンフィルタの実装をいくつか実装しました。私は両方とも動作するPythonとC実装を持っています。カルマンフィルタの固定小数点の実装が奇妙に

しかし、固定小数点実装を使用するバージョンも開発していますが、当初はフィットしていて、他のカルマンフィルタコードの出力から逸脱する奇妙な効果が見られます。

は、以下のプロットを参照してください。

Plot of output of Various Implementations of Kalman Filter

誰もが固定小数点の実装で間違っているかもしれないもののためにいくつかの直感を持っている場合、私は不思議でしたか?

+0

カルマンフィルタは数値問題に対して非常に敏感です。特に、「テキストブック」の式をipmplementする場合は、特に注意が必要です。フィルタの平方根の形について読むことができますが、これは数値問題をあまり控えめにすることができます。 – dmuir

答えて

1

あなたは今この問題を長らく過ぎていますが、そうでない場合は、通常は固定小数点KFで行う必要があります。利用可能な値の範囲が限られているために問題が発生します。初期共分散行列が表現可能であるように固定小数点を設定すると、小数点の右に多くのビットを持たず、収束し始めたソリューションのゲインと状態の更新を表すことがよくあります。

これは、フィルタのための浮動小数点が好きであり、特に共分散行列が標準偏差の二乗であるため、明らかに長いことです。状態の更新が二乗されないため、二乗共分散要素と非平方状態更新を合理的に表すことを可能にする単一の固定小数点位置を選択しようとしている。

私はしばしば1つまたは2つのギアシフトで終わる - 私は過去に「5スピード」の固定小数点KFを使い果たしました。私が時間更新ステップの終わりに達すると、私はそのサイクルのために得ようとする共分散の最大値を持っています。測定処理は、共分散を減少させるだけである。私のカルマンフィルタの固定小数点表現が、共分散に必要なものよりも2ビット以上大きい場合、私は左にシフトし、その場で固定小数点を変更します。これは、利得および状態更新値のための妥当な数のビットを保持する。

これは実際には貧しい人の浮動小数点ですが、すべてのフィルタエレメントに小数点位置が1つしかありません。私はいつもシフトしないようにヒステリシスを使います。私が正しく動作するようになると、固定小数点の結果と浮動小数点の結果を区別することはできません。

+0

私はこの問題(私は私の値を格納するのに十分なビットを使用していなかった)を取得し、私は私の固定小数点表現のための十分なビットを使用している限り、正しい動作を取得しました(90は、小数点の左に24ビットシフトし、Q行列は小数点の左に10ビットシフトしました)しかし、私はこれを減らし、ビット数が大きすぎるために正しい動作を維持しようとしています私はカルマンフィルタ(FPGA)を使用したいと思っています。あなたのことは私が考えなかった興味深い方法です、あなたの助けをありがとう。 – SomeRandomPhysicist

+0

私のコードをFPGAに収めるために、psudo-floating pointメソッドを実装する方法を見ていきます。ありがとう! – SomeRandomPhysicist

関連する問題