Wie kann ich ein Niederfrequenzsignal hochpassfiltern (DSP), ohne Verzögerungen einzuführen?

Ich muss ein Signal hochpassfiltern, und mein Design schneidet es einfach nicht. Der Teil, der es schwierig macht, ist, dass ich Verzögerungen nicht tolerieren kann. Ich sample mit 20 Hz, das Signal, das mir wichtig ist, ist 1/12 bis 1/4 Hz, und mein System muss so echtzeitfähig wie möglich sein (eine Verzögerung von 2 Sekunden für die Signalverarbeitung ist ungefähr alles, was ich bewältigen kann). Die Eckfrequenz ist flexibel, muss aber im ungünstigsten Fall unter 1/10 Hz liegen.

Ich habe einen IIR-ähnlichen Tiefpassfilter wie diesen verwendet:

signal_low_freq(n) = (signal_low_freq(n-1)*(filter_constant - 1) + (sensor_data(n))) /filter_constant;

signal_ac(n) = sensor_data(n) - signal_low_freq(n);

wobei filter_constant = 165.

Es hat eine geringe Latenz, führt aber auch zu einer großen Menge an phasenbezogenen Fehlern (ich habe es bei etwa 100 Verzögerungswerten gemessen).

Ich habe Matlabs fdatool verwendet und kann mit einem FIR-Filter hoher Ordnung großartige Ergebnisse erzielen, aber das ist offensichtlich viel zu viel Verzögerung.

Hat jemand eine gute Lösung für dieses DSP-Problem?

Hinweis: Im Audiobereich ist es analog zum Sampling bei 48 kHz und Hochpassfilterung mit einer Eckfrequenz irgendwo zwischen 150 Hz und 240 Hz.

Ist das der genaue Code? -- weil dir in der ersten Zeile ein Index für Sensordaten fehlt. Können Sie eine Zahl für die Sprungantwort Ihres Filters und signal_low_freq anzeigen?
Guter Fang für den fehlenden Index, ich habe ihn repariert. Es ist praktisch Zeile für Zeile der Code, wobei alle Namen geändert werden, damit sich niemand aufregt. Der Filter, den ich skizziert habe, ist Müll und funktioniert überhaupt nicht gut, aber DSP ist nicht meine stärkste Fähigkeit, und ich weiß nicht, was ich sonst tun soll, um keine große Verzögerung einzuführen.

Antworten (1)

Ich fürchte, Sie stoßen auf eine grundlegende Einschränkung realer, kausaler physikalischer Systeme. Sie fragen nach einem Filter, der zwischen Signalen mit Perioden von 12 bis 16 Sekunden unterscheiden kann, aber nur ein 2-Sekunden-Segment (1/6 bis 1/8 der Periode) der Wellenform "betrachten" kann fraglich. Unter diesen Umständen ist es einfach nicht möglich, keine Phasenverschiebung und eine geringe Verzögerung zu erzielen.

Können Sie etwas mehr Kontext für dieses Problem liefern? Welcher Art sind die Signale und warum ist eine so geringe Verarbeitungslatenz erforderlich?

Ich dachte, ich könnte gegen eine Wand stoßen; Ich hatte gehofft, jemand mit mehr Erfahrung könnte die Regeln beugen und mich zu einer Lösung führen. Das Problem ist Trägheit, bezieht sich auf Beschleunigungsmesserdaten und versucht, die Position bei sinusförmiger Bewegung in Echtzeit zu ermitteln. Wenn die Position nicht fast in Echtzeit ist, wird sie nutzlos. Ich weiß, dass Sie Niederfrequenzfehler (DC- und Bias-Drift) gleich im Voraus herausfiltern müssen, und ich habe nichts anderes als Kalman-Filter als Lösung gesehen. Der IIR-ähnliche Filter, den ich beschreibe, kümmert sich um einen Teil der niedrigen Frequenzen, hat aber schreckliche Phaseneigenschaften und führt einen Haufen niedriger Frequenzen ein. Fehler.
Ah. In diesem Fall gehen Sie zu einfach vor. Die Gleichstrom- und Niederfrequenzkomponenten, die Sie unterdrücken möchten, haben eine viel niedrigere Frequenz als Ihr Trägheitssignal, daher verwenden Sie einen Filter mit sehr niedriger Grenzfrequenz (ein paar Größenordnungen unter Ihrer Signalfrequenz), um sie zu trennen. Dieser Filter kann ein einfacher rekursiver Filter oder ein ausgeklügelter Kalman-Filter sein, und ja, die Initialisierung kann lange dauern. Aber dann, wenn Sie seinen Ausgang vom Rohsignal subtrahieren, bleibt das Navigationssignal übrig, praktisch ohne Auswirkung auf seine Phasen-/Verzögerungseigenschaften.
Als ich mir die Phaseneigenschaften von zB IIR-Filtern in Matlabs fdatool ansah, hatte es schreckliche Phaseneigenschaften bei meinen Signalfrequenzen, selbst wenn ich die Eckfrequenz weit unter mein Signal drückte. Gibt es einen bestimmten Typ von IIR oder einem anderen rekursiven Filter, den ich vermisse und der die Phase meines Signals nicht so stark beeinflusst?