butter bandpass filter

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
mathematik
User
Beiträge: 28
Registriert: Dienstag 16. April 2013, 12:40

Hallo zusammen,

wär schön, wenn mir jemand helfen könnt. Ich würde gerne den butter bandpass filter anwenden um ein EEG Signal (250Hz) zu filtern (6-11Hz). Dazu habe ich mir folgendes überlegt:

Code: Alles auswählen

def butter_bandpass(lowcut, highcut, fs, order=5):
    nyq = 0.5 * fs
    low = lowcut / nyq
    high = highcut / nyq
    b, a = butter(order, [low, high], btype='band')
    return b, a

def butter_bandpass_filter(data, lowcut, highcut, fs, order=5):
    b, a = butter_bandpass(lowcut, highcut, fs, order=order)
    y = lfilter(b, a, data)
    return y

if __name__ == "__main__":
    fs = 250.0
    lowcut = 6.0
    highcut = 11.0
    
    T=len(eeg)
    nsamples=T*fs
    t=range(0,T,1)
    x=eeg[t]
    y=butter_bandpass_filter(x, lowcut, highcut, fs, order=6)
Stimmt das, was ich mir überlegt habe?

Vielen Dank!
Zuletzt geändert von Anonymous am Montag 29. Juli 2013, 17:27, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
BlackJack

Das ist irgendwie keine Python-Frage. Und das Beispiel ist nicht lauffähig, weil nicht alles definiert ist, was dort verwendet wird. Zudem sieht das Ergebnis von `range()` als Index für `eeg` zumindest komisch aus. Da `eeg` nicht definiert ist, kann es natürlich sein, dass es so einen Datentyp gibt, bei dem man das so machen kann, aber besonders sinnvoll oder intuitiv erscheint mir das nicht.
mathematik
User
Beiträge: 28
Registriert: Dienstag 16. April 2013, 12:40

Sorry, ich hatte vergessen zu erwähnen, dass eeg in meinem Fall schon definiert ist. Dies ist eine Liste von Daten, die mit 250Hz aufgenommen wurden. Diese möchte ich nun filtern (6-11Hz).
Aber wie kann ich es dann machen, wenn nicht mit einem butter bandpass filter?
BlackJack

@mathematik: Ich sehe da immer noch nicht den Sinn von dem `range()`. `butter()` und `lfilter()` fallen weiterhin vom Himmel. Es sei denn man sucht danach im Netz. Dann findet man den Kommentar bei SO von wo Du den Quelltext kopiert hast: How to implement band-pass Butterworth filter with Scipy.signal.butter. Etwas runterscrollen zur Antwort von Warren Weckesser.

Ich verstehe jetzt immer noch nicht was eigentlich Deine Frage ist, oder das konkrete Problem? Tun die Funktionen nicht das was Du willst? Inwiefern tun sie das nicht? Was sind die Eingangsdaten und wie unterscheiden sich die Ausgangsdaten von dem was Du erwartet hast?
mathematik
User
Beiträge: 28
Registriert: Dienstag 16. April 2013, 12:40

Was ich eigentlich machen will ist folgendes: Ich habe ein sehr verrauschtes Signal (meine Daten eeg). Dieses ist mit 250Hz aufgezeichnet. Da ich mit diesen Daten weiter arbeiten möchte, will ich sie filtern (6-11 Hz). Was dadurch geschehen soll, ist, dass mein Signal nicht mehr derart verrauscht ist, sondern eine schöne periodische Funktion ergibt. Welchen bandpassfilter ich dazu nehme ist egal, so lange es funktioniert. Bisher funktioniert das nicht so wirklich, wenn ich es mit dem Code mache, den ich gepostet habe. Auch verstehe ich nicht so ganz, was in dem Beitrag anders gemacht wird, als ich es getan habe.
Antworten