web-dev-qa-db-ja.com

Androidローパスフィルターとハイパスフィルター

非常に基本的な質問があります。 Android Accelerometerの場合のローパスフィルターとハイパスフィルターとは何ですか?

加速度センサーからの出力を見ると、フィルターを使用していない場合が表示されます(ケース:テーブルで携帯電話をアイドル状態にした)z軸+ ve値を取得します。今、私が基本的な物理学を使用すると思うなら、それは私に小さなgの正確な値(9.8approx)、すなわち重力による加速度を与えます。

直線加速度を得るために、電話に力を加えると、加速度計の値が変わりますが、g + a私が適用した。 aを取得するために、なぜ加速度計から取得した値から直接減算できないのですか?

用途は何ですか?
基本的な定義は、ローパスについて理解します:低い値を許可するには、ハイパス:高い値を許可します。理解してください。私はこれと混同しています。

21
Jeet

ドキュメントを見ると、SensorEventがすべての力のベクトルを表す配列を返すことがわかります。 http://developer.Android.com/reference/Android/hardware/SensorEvent.html#values これは、加速のコンポーネントが各軸に分解する方法です。

 values[0] //acceleration on x axis
 values[1] //acceleration on y axis
 values[2] //acceleration on z axis

重力がどの方向に作用しているかを見つけて、それを構成要素に分解する必要があります。重力の大きさは常に9.8になりますが、方向、したがって重力がコンポーネントパーツに分解される方法は変わります。 重力の値を取得し、そのベクトルをgravity[3]のような配列に格納できると仮定すると

 gravity[0] //gravity x axis
 gravity[1] //gravity y axis
 gravity[2] //gravity z axis

電話の合計加速度TT = g + aです。 aだけを取得するには、a = T - gが必要です。

 linear_acceleration[0] = event.values[0] - gravity[0];
 linear_acceleration[1] = event.values[1] - gravity[1];
 linear_acceleration[2] = event.values[2] - gravity[2];

これはベクトル演算であるため、要素ごとにすべてを計算する方法に注意してください。

携帯電話には重力と他の力の両方を同時に測定する加速度計が1つしかないため、注意が必要なのはgravityを見つけることです。 1つのセンサーから検出したい2つの異なる力があります。孤立した時点でのみ力を見ることができた場合、情報を抽出することはできません。ただし、一定期間にわたってサンプルを取得し、時間の経過とともに力がどのように変化するかを調べることで、情報を抽出できます。

つまり、これらの力の変化の速さに基づいて、その1つのソースからの結果をフィルターで除外する必要があります。重力による加速度の大きさはまったく変化しないため、すぐには変化しません。重力は一定の力です。ただし、他の力は時間とともに変化します。ハイパスフィルターを使用して重力などのゆっくりと変化する力を除外すると、残りの力は、電話に加えられている力などの急速に変化する力になります。これが、ハイパスフィルターが使用される理由です。

27
shuttle87

ローパスフィルタ:低周波信号を通過させ、しきい値周波数よりも高い周波数の信号の振幅を低減します

High Pass Filter:高周波信号を通過させ、しきい値周波数より低い周波数の信号の振幅を低減します

ドキュメント を見ると、「デバイスの実際の加速度を測定するために、重力の寄与はeliminated。これは、ハイパスフィルターを適用することで実現できます。逆に、ローパスフィルターを使用して重力を分離できます。」

ローパスフィルタリングに関するこのチュートリアルをご覧ください: http://www.raweng.com/blog/2013/05/28/applying-low-pass-filter-to-Android-sensors-readings/

http://developer.Android.com/reference/Android/hardware/SensorEvent.html#values でドキュメントを読むと、にアクセスできることがわかります。すべてのx、y、z軸のa値:

values[0] - a on x axis
values[1] - a on y axis
values[2] - a on z axis
17
Claudiu S

ノイズを含むこれらの値から直接減算すると、加速度計の出力にはノイズが含まれます。ノイズを除去するには、ハイパスフィルターとローパスフィルターを実装する必要があります。

0
Vinay Kumar

私は通常、この式を使用して、加速度センサーのデータをリニアセンサー(ジャイロスコープなど)のデータに変換します。ジャイロセンサーが内蔵されているかどうかわからない場合に使用します。

private float[] values;
private float[] valuesN;
private float[] prev;
private float[] prevHF;
private boolean doHPF = false;

// ind - index of three dimensions (x, y, z)
private void makeHPFf() {
    for (int ind = 0; ind < 3; ind++) {
        valuesN[ind] = values[ind] * 0.002f * 9.8f;
        if (doHPF)
            values[ind] = valuesN[ind] - prev[ind] + (prevHF[ind] * 0.8f);
        prev[ind] = valuesN[ind];
        prevHF[ind] = values[ind];
    }

    if (!doHPF)
        doHPF = true;
}
0
Guy4444