Wie wende ich einen Chebishev-Filter an?


7

Ich las eine Zeitung über eine Gehirn-Computer-Schnittstelle. In diesem Artikel berichteten die Autoren, dass "jedes Signal mit einem Bandpass-Chebishev-Typ-I-Filter 8 Ordnung gefiltert wurde, dessen Grenzfrequenzen 0,1 und 10 Hz betragen und entsprechend der hohen Grenzfrequenz dezimiert wurden". Ich habe versucht, diesen Filter mit scipy zu entwerfen:

import scipy.signal as signal
signal.cheby1(8,0.05,[0.1,10.0],btype='band',analog=0,output='ba')

Das Ergebnis war:

Warning: invalid value encountered in sqrt
(array([ nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan,
    nan,  nan,  nan,  nan,  nan,  nan]), array([ nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan,
    nan,  nan,  nan,  nan,  nan,  nan]))

Ich habe keinen Hintergrund in der Signalverarbeitung, daher weiß ich eigentlich nicht, was ich tue. Ich weiß nicht, ob sie einen IIR- oder FIR-Filter verwendet haben oder ob ich die Grenzfrequenzen skalieren muss oder ob ich die falsche Welligkeit verwende. Ich hoffe ihr könnt mir helfen.

Antworten:


5

Das Hauptproblem bei dem von Ihnen angegebenen Beispiel ist, dass die Filterdesignfunktion cheby1alle NaNs zurückgibt, was kein sehr guter Filter sein wird. Das Problem ist, wie Sie die Durchlassband- / Sperrband-Kantenfrequenzen angeben. Diese spezielle Funktion soll die cheby1Funktion von MATLAB emulieren . Die von Ihnen angegebenen Frequenzen sollten so normalisiert werden, dass ein Wert von 1der Hälfte der Abtastrate entspricht.

import scipy.signal as signal
fs = whatever_the_sample_rate_of_the_filter_input_is_going_to_be
signal.cheby1(8,0.05,[0.1/(fs/2),10.0/(fs/2)],btype='band',analog=0,output='ba')

Ich habe SciPy nicht zur Hand, aber das sollte zumindest den gewünschten Filter richtig gestalten.


Danke, das werde ich abends versuchen. Meine Abtastrate beträgt 240 Hz. Wissen Sie, wie Sie den Filter auf die Daten anwenden können? Ich habe eine Formel auf Wikipedia gefunden ( en.wikipedia.org/wiki/… ), aber diese liefert mir seltsame oszillierende Ergebnisse (sehr große Zahlen ...). Also habe ich wohl etwas falsch implementiert. Ich implementiere dies in C ++, daher kann ich die Funktion scipy.signal.lfilter nicht aufrufen. Übrigens. Was ändert sich, wenn ich die Welligkeit ändere?
Alfa

2
Dies ist ein numerisch herausfordernder Filter, da Sie Pole haben, die sehr nahe am Einheitskreis liegen. Sie müssen den Filter in Abschnitte zweiter Ordnung aufteilen und diese nacheinander anwenden.
Hilmar

Und wie würde ich den Filter in Abschnitte zweiter Ordnung aufteilen? Ich denke, Matlab hat eine Funktion dafür, aber es ist nicht in scipy verfügbar.
Alfa

@alfa: kein scipy hat es nicht, aber ich fing an, Oktavcode
Endolith

2

Zwei Grenzfrequenzen bedeuten normalerweise, dass es sich um ein Bandpassfilter mit einem Hochpass von 0,1 Hz und einem Tiefpass von 10 Hz handelt. Der Tiefpass-Cutoff (der die höhere der beiden Frequenzen ist) bestimmt, um wie viel Sie abtasten können. Wenn Ihr Tiefpassfilter unendlich steil wäre, könnten Sie mit einer neuen Abtastrate von 20 Hz (dem doppelten Grenzwert) davonkommen. Da die Steilheit begrenzt ist, müssen Sie ein Schutzband zwischen der Grenzfrequenz und der neuen Nyquist-Frequenz lassen. Wie viel Sie benötigen, hängt von der Reihenfolge des Filters ab und davon, wie viel Aliasing-Rauschen Sie tolerieren können.

In diesem speziellen Beispiel scheinen sie um den Faktor 12 oder so heruntergesampelt zu haben, was mir zu aggressiv erscheint und wahrscheinlich zu viel Aliasing-Rauschen führen wird.


Danke für die Erklärungen. Ich denke, das Downsampling um den Faktor 12 ist sinnvoll, da es viel Rauschen mit hoher Amplitude und Frequenz gibt und das Signal, an dem sie interessiert waren, eine sehr niedrige Frequenz hatte. Ich wollte eigentlich ihre Ergebnisse reproduzieren. Gibt es praktische Tutorials (mit Code) zu dieser Art von Filtern?
Alfa
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.