„Tiefpassfilter“ in Nicht-EE-Software-API-Kontexten


12

Ich bin ein erfahrener Softwareentwickler und arbeite an Smartphonesensoren. Ich habe grundlegende EE-Kurse in DSP belegt und versuche, mein Wissen anzuwenden. Ich glaube, dass ich Faltung, Übertragungsfunktionen, Z-Transformation usw. verstehe. Ich weiß ein wenig über FIR- und IIR-Filter.

Beim Durchlesen von Software-APIs und Dokumentationen wird festgestellt, dass Benutzer eine LPF auf Sensordaten im Zeitbereich anwenden. Ich weiß, dass Sie dies durch die Verwendung von Differenzgleichungen tun (z. B. y [i] = y [i-1] + 2 * x [i]), aber ich habe in meiner EE-Klasse gelernt, dass LPF typischerweise durch die Faltungsoperation angewendet werden wo Sie das Zeitsignal mit den Koeffizienten einer Sinuswelle (zum Beispiel) und mit einer bestimmten Grenzfrequenz falten. Die umgangssprachliche Verwendung des "Tiefpassfilters" ist mir also nicht genau genug.

Die Google Android-API enthält beispielsweise die folgende Dokumentation: http://developer.android.com/reference/android/hardware/SensorEvent.html#values

 public void onSensorChanged(SensorEvent event)
 {
      // alpha is calculated as t / (t + dT)
      // with t, the low-pass filter's time-constant
      // and dT, the event delivery rate

      final float alpha = 0.8;

      gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0];
      gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1];
      gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2];

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

Wie interpretiere ich diesen Tiefpassfilter? Was ist die Grenzfrequenz? Was ist die Übergangsbandbreite? Verwenden sie diese LPF ausschließlich zur Mittelwertbildung?


gut, es stört mich auch
Sibbs Gambling

Antworten:


11

Das Filter in Ihrem Beispiel ist ein Infinite Impulse Response (IIR) -Filter erster Ordnung . Seine Übertragungsfunktion ist:

H(z)=1α1αz1

das entspricht einer Differenzgleichung von:

y[n]=αy[n1]+(1α)x[n]

x[n]y[n]

αα[0,1)α=0αα=1

α1α

α=0.8Bildbeschreibung hier eingeben

Aus dem Beispiel würde ich vermuten, dass dieses Filter verwendet wird, um hochfrequentes Rauschen aus einer Zeitreihe von Messungen eines Sensors herauszufiltern und zu versuchen, ein vergleichsweise niederfrequentes Signal von Interesse herauszufiltern. Dies wäre eine sehr typische Anwendung für diese Art von Filter.

In Ihrer anderen Teilfrage haben Sie Recht, dass die Filterung häufig durch Faltung des Eingangssignals mit der Impulsantwort des Filters erfolgt. In den meisten Fällen wird dies nur mit FIR- Filtern (Finite Impulse Response) durchgeführt . IIR-Filter wie dieses werden typischerweise unter Verwendung der Differenzgleichung des Filters implementiert; Da die Impulsantwort eines IIR-Systems unendlich lang ist, müssen Sie sie auf eine endliche Länge abschneiden, damit die Faltung möglich ist. An diesem Punkt ist der Filter nicht mehr IIR. Das Differenzengleichungsformat lässt sich fast immer billiger rechnerisch implementieren, obwohl die in dieser Struktur enthaltene Rückkopplung zu numerischen Problemen führen kann, die behoben werden müssen (z. B. interner Überlauf und Rundungsfehlerakkumulation).


Vielen Dank! Einige Anschlussfragen: (1) Sie sagten, Ihre Gleichung H (z) = ... ist eine Differenzgleichung; Es ist wirklich eine Übertragungsfunktion, oder? Ich dachte, dass eine Differenzgleichung ausschließlich für den Zeitbereich gilt. (2) Entspricht 1.0 in Ihrem Leaky-Integrator sample_frequency / 2 (wie in Matlab)? (3) Bezüglich FIR vs IIR ist meines Erachtens richtig, dass die IIR-Differenzgleichung in O (N) angewendet werden kann, die Faltung jedoch O (N ^ 2) oder O (N lgN) mit FFT-basierter Faltung ist? (4) Können Sie Software-Programmierern ein Buch zur Umsetzung dieser DSP-Ideen empfehlen? Wie das, was das Android-Codebeispiel tut.
stackoverflowuser2010

π+πO(N)NN . (4) Ich würde empfehlen, DSP von Lyons zu verstehen . Es ist ein großartiges Einführungsbuch.
Jason R

Ich weiß, dass (i) das Anwenden der Differenzgleichung O (N) ist. Aber ich dachte, dass (ii) die Faltungsoperation mit Summation über Multiplikation und Addition (songho.ca/dsp/convolution/convolution.html) O (N ^ 2) oder O (N lgN) mit einer FFT-basierten Implementierung ist . In allen Fällen ist N die Filterreihenfolge - wobei ich davon ausgehe, dass die Filterreihenfolge und die Zeitsignallänge dieselbe Größenordnung haben (z. B. beide 256). Sind also (i) und (ii) nicht verschieden? Außerdem habe ich dieses Lyoner Buch auf Amazon.com gesehen, aber ich hatte gehofft, dass etwas mehr für C / Java-Software-Programmierer geschrieben wird.
stackoverflowuser2010

1
O(N) NO(N2)MNO(MN)MN
Jason R

O(M×(N+M))iNO(N2)O(NM)
stackoverflowuser2010

2

Zusammenfassend lässt sich sagen, dass IIR-Filter, die auf einfachen idealisierten physikalischen Modellen basieren, wie z. B. ein RC-Filter, eine geringe Anzahl von Polen und Nullen aufweisen und daher normalerweise als Differenzgleichung implementiert werden, da eine geringe Anzahl von Polen oder Nullen nur sehr wenige arithmetische Operationen impliziert pro Probe unter Verwendung einer Differenzgleichung.

Da ein IIR eine Impulsantwort mit unendlicher Länge impliziert, würde die Faltung entweder ewig dauern oder die Verwendung einer Näherung erfordern.

FIR-Filter werden normalerweise durch Faltung mit der Impulsantwort endlicher Länge (oder durch schnelle FFT-Faltung, wenn das Filter lang genug ist, um rechnerisch effizient zu sein) implementiert. Diese Arten von Filtern werden häufiger verwendet, wenn man eine gewünschte Frequenzantwortspezifikation mit einer Impulsantwort endlicher Länge approximieren kann, anstatt zu wissen, wo sich die Pole und Nullen der Z-Ebene befinden könnten.

Da jedoch ein Filter mit einer scharfen Spezifikation eine lange FIR-Faltung impliziert, kann die Implementierung von FIR-Filtern sehr viel langsamer sein und die Einrichtung kann viel mehr Codezeilen erfordern, weshalb FIR-Filter in einfacher Software möglicherweise nicht so häufig verwendet werden Beispiele.


0

Ich komme immer wieder auf diesen Beitrag zurück. Vielen Dank, dass Sie die Frage gestellt haben. Hier ist eine großartige, rechenfreundliche Implementierung des Leaky-Integrators in C (für einen Mikrocontroller vorgesehen).

Zunächst einige Umordnungen: y = α * x + (1 - α) * y_last = α * (x - y_last) + y_last

wenn wir α auf ungefähr 12%, 25%, 50% (1/8, 1/4, 1/2, ...) beschränken. Wir können einige effiziente Bitverschiebungen nutzen. Nehmen wir den Fall von 1/8, 8 => 2 ^ 3 => (dreimal herunterschalten)

= (x - y_last) / 8 + y_last

#define SMOOTHING_FACTOR       (3)

int16_t FilterSample(int16_t new_sample)
{
  static int16_t last_result = 0;

  // Each bit shift down is equivalent to dividing-by-two
  last_result = (new_sample - last_result) >> SMOOTHING_FACTOR) + last_result;

  return last_result;
}

Ich hoffe es hilft.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.