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?
quelle
Antworten:
Das Filter in Ihrem Beispiel ist ein Infinite Impulse Response (IIR) -Filter erster Ordnung . Seine Übertragungsfunktion ist:
das entspricht einer Differenzgleichung von:
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).
quelle
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.
quelle
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
Ich hoffe es hilft.
quelle