24

Androidで加速度計データのノイズをフィルタリングするにはどうすればよいですか? サンプル データにハイパス フィルターを作成して、低周波成分を除去し、高周波成分に注目できるようにしたいと考えています。カルマン フィルターがこれに最適な候補である可能性があることを読みましたが、このメソッドをどのように統合または使用して、主に Android Java で記述されるアプリケーションに使用しますか? それとも最初からできるの?またはAndroid NDKを介して?これをリアルタイムで実行できる可能性はありますか?

どんなアイデアでも大歓迎です。ありがとうございました!

4

5 に答える 5

26

Apple の SDK のサンプルは、実際には、ランプを使用するというさらに単純な方法でフィルタリングを実装しています。

//ramp-speed - 満足するまでこの値で遊ぶ
const float kFilteringFactor = 0.1f;

//最終結果の保存 - この関数の外で定義を保持します。ラッピング対象で
float accel[3];

//acceleration.x,.y,.z はセンサーからの入力です

//result.x,.y,.z はフィルタリングされた結果です

//重力を排除するためのハイパスフィルター
accel[0] = 加速度.x * kFilteringFactor + accel[0] * (1.0f - kFilteringFactor);
accel[1] = 加速度.y * kFilteringFactor + accel[1] * (1.0f - kFilteringFactor);
accel[2] = 加速度.z * kFilteringFactor + accel[2] * (1.0f - kFilteringFactor);
result.x = 加速度.x - 加速度[0];
結果.y = 加速度.y - 加速度[1];
result.z = 加速度.z - 加速度[2];
于 2009-11-15T05:00:56.783 に答える
3

rbgrnからの回答でnorm()およびclamp()メソッドが何をするのか疑問に思っている人は、ここでそれらを見ることができます:http: //developer.apple.com/library/IOS/samplecode/AccelerometerGraph/Listings/AccelerometerGraph_AccelerometerFilter_m.html

double norm(double x, double y, double z)
{
    return Math.sqrt(x * x + y * y + z * z);
}

double clamp(double v, double min, double max)
{
    if(v > max)
        return max;
    else if(v < min)
        return min;
    else
        return v;
}
于 2012-05-25T02:57:22.633 に答える
1

これがAppleのiPhone用サンプルコードで行われたことを覚えているようです。どれどれ...

GoogleでAccelerometerFilter.h/.mを探します(またはAppleのAccelerometerGraphサンプルを入手します)。次のリンク: http: //en.wikipedia.org/wiki/High-pass_filter (これがAppleのコードの基になっています)。

Wikiにもいくつかの擬似コードがあります。しかし、数学はコードに変換するのはかなり簡単です。

于 2009-10-28T17:52:44.673 に答える
0

IMO、最初の試みとしてカルマンフィルターを設計すると、おそらくかなり単純な問題が複雑になりすぎます。私は単純な FIR フィルターから始めて、それをテストして、必要なものを提供できないことが合理的な確実性でわかった場合にのみ、より複雑なものを試します。しかし、私の推測では、必要なことはすべて実行でき、はるかに簡単かつ効率的に実行できると思います。

于 2009-10-28T17:56:00.893 に答える