2014-06-09 14 views
18

Ich habe eine sehr grundlegende Frage. Was ist ein Tiefpassfilter und ein Hochpassfilter im Falle eines Android Accelerometers?Android Tiefpassfilter und Hochpassfilter

Wenn ich die Ausgabe vom Beschleunigungssensor sehe, sehe ich Wenn ich keinen Filter verwende (Fall: Ich habe mein Handy im Leerlauf auf dem Tisch gehalten) Ich bekomme z Axis + ve Wert. Jetzt, wenn ich denke, die grundlegende Physik verwendend, gibt es mir genauen Wert (9.8approx) für kleines g, nämlich Beschleunigung wegen der Schwerkraft.

Um die lineare Beschleunigung zu erhalten, Wenn ich irgendeine Kraft zum Telefon addiere, ändert es den Beschleunigungsmesserwert, aber es ist g + a, die ich anwendete. Also, um a zu bekommen, warum kann ich nicht einfach direkt von dem Wert subtrahieren, den ich von Accelerometer bekomme?

Was ist die Verwendung?
Grundlegende Definition Ich verstehe für Tiefpass: Um niedrigen Wert zu ermöglichen, High Pass: Um einen hohen Wert zu ermöglichen. Bitte helfen Sie mir, es zu verstehen. Ich bin damit verwirrt.

Antwort

16

Low Pass Filter: gibt niederfrequente Signale und verringert die Amplitude von Signalen mit Frequenzen, die höher ist als die Schwellenfrequenz

High Pass Filter: gibt Hochfrequenzsignale und verringert die Amplitude von Signalen, mit Frequenzen, die niedriger ist als die Grenzfrequenz

Wenn man sich die documentation aussehen, heißt es: „, um die reale Beschleunigung der Vorrichtung zu messen, muss der Beitrag der Schwerkraft sein eliminiert. Dies kann durch Anwenden eines Hochpassfilters erreicht werden. Umgekehrt kann ein Tiefpassfilter kann die Schwerkraft zu isolieren, verwendet werden „

Sie dieses Tutorial auf Tiefpassfilterung überprüfen konnte. http://www.raweng.com/blog/2013/05/28/applying-low-pass-filter-to-android-sensors-readings/

die Dokumentation bei http://developer.android.com/reference/android/hardware/SensorEvent.html#values Lesen, können Sie sehen, dass können Sie die ein Werte für alle x, y, z-Achse zugreifen, indem Sie:

values[0] - a on x axis 
values[1] - a on y axis 
values[2] - a on z axis 
+1

Das ist, was ich fragen. Warum können wir nicht direkt 9,8 vom Acccelerometer-Wert subtrahieren, den wir bekommen ... Es ist nichts als die tatsächliche Beschleunigung des Telefonsensors ... Ist das nicht? Wenn Sie in Android-Dokumentation sehen, verwendet sie .8 als Alpha, um es zu berechnen. Warum Alpha verwenden? – Jeet

23

Wenn man sich die Dokumentation anschauen, werden Sie sehen, dass SensorEvent ein Array zurückgibt, die den Vektor aller Kräfte repräsentiert. Dies ist, wie die Komponenten der Beschleunigung lassen sich in jeder Achse:

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

Sie finden müssen, welche Richtung der Schwerkraft wird in dann zersetzen, dass in seine Bestandteile arbeitet. Die Größe der Schwerkraft wird immer 9,8 betragen, aber die Richtung und somit die Art und Weise, wie sie in die Komponenten zerfällt, wird sich ändern. Unter der Annahme, dass wir den Wert der Schwerkraft erhalten könnten und speichern, daß der Vektor in einem Array wie gravity[3]:

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

Die Gesamtbeschleunigung, T, am Telefon T = g + a ist.Um a nur würden wir a = T - g brauchen:

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

Beachten Sie, wie das alles Element für Element berechnet, weil es eine Vektoroperation ist.

Der schwierige Teil ist, gravity zu finden, weil es nur einen Beschleunigungsmesser im Telefon gibt, der die Schwerkraft UND die anderen Kräfte gleichzeitig misst. Wir haben 2 verschiedene Kräfte, die wir von dem einen Sensor finden wollen. Wenn wir die Kräfte nur zu einem isolierten Zeitpunkt betrachten könnten, wären wir nicht in der Lage, die Informationen zu extrahieren. Allerdings erhalten wir über einen bestimmten Zeitraum hinweg Proben und wenn wir uns ansehen, wie sich die Kräfte im Laufe der Zeit verändern, können wir die Informationen extrahieren.

Dies bedeutet, dass wir die Ergebnisse aus dieser Quelle filtern müssen, basierend darauf, wie schnell sich diese Kräfte ändern. Die Größe der Beschleunigung aufgrund der Schwerkraft ändert sich nicht schnell, weil sie sich überhaupt nicht ändert. Die Schwerkraft ist eine konstante Kraft. Andere Kräfte werden sich jedoch im Laufe der Zeit ändern. Wenn wir die sich langsam ändernden Kräfte wie die Schwerkraft mit Hilfe eines Hochpassfilters ausfiltern, sind die verbleibenden Kräfte die sich schnell ändernden wie die Kräfte, die auf das Telefon einwirken. Aus diesem Grund wird der Hochpassfilter verwendet.

0

Die Ausgabe des Beschleunigungssensors enthält Rauschen, wenn Sie direkt von diesen Werten, die Rauschen enthalten, subtrahieren. Um Rauschen zu eliminieren, müssen Hochpass- und Tiefpassfilter implementiert werden.

0

Normalerweise verwende ich diese Formel, um die Daten von den Beschleunigungssensordaten zu filtern, die zu den linearen Sensor- (wie Gyroskop-) Daten herauskommen. Verwenden Sie es, wenn Sie nicht sicher sind, ob ein eingebauter gyroskopischer Sensor vorhanden ist.

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; 
}