So implementieren Sie Bandpass-Butterworth-Filter mit Scipy.signal.butter

AKTUALISIEREN:

Ich habe ein Scipy-Rezept gefunden, das auf dieser Frage basiert! Wenn Sie interessiert sind, wenden Sie sich direkt an:Inhaltsverzeichnis »Signalverarbeitung» Butterworth Bandpass

Es fällt mir schwer, das zu erreichen, was anfangs eine einfache Aufgabe zu sein schien, ein Butterworth-Bandpassfilter für 1-D-Numpy-Arrays (Zeitreihen) zu implementieren.

Die Parameter, die ich einschließen muss, sind die Abtastrate, die Grenzfrequenzen in Hertz und möglicherweise die Reihenfolge (andere Parameter wie Dämpfung, Eigenfrequenz usw. sind für mich undurchsichtiger, sodass jeder "Standard" -Wert ausreicht).

Was ich jetzt habe, ist das, was wie ein Hochpassfilter zu funktionieren scheint, aber ich bin mir nicht sicher, ob ich es richtig mache:

def butter_highpass(interval, sampling_rate, cutoff, order=5):
    nyq = sampling_rate * 0.5

    stopfreq = float(cutoff)
    cornerfreq = 0.4 * stopfreq  # (?)

    ws = cornerfreq/nyq
    wp = stopfreq/nyq

    # for bandpass:
    # wp = [0.2, 0.5], ws = [0.1, 0.6]

    N, wn = scipy.signal.buttord(wp, ws, 3, 16)   # (?)

    # for hardcoded order:
    # N = order

    b, a = scipy.signal.butter(N, wn, btype='high')   # should 'high' be here for bandpass?
    sf = scipy.signal.lfilter(b, a, interval)
    return sf

Die Dokumente und Beispiele sind verwirrend und undurchsichtig, aber ich möchte das Formular implementieren, das in dem als "für Bandpass" gekennzeichneten Kommentar angegeben ist. Die Fragezeichen in den Kommentaren zeigen, wo ich gerade ein Beispiel kopiert habe, ohne zu verstehen, was passiert.

Ich bin kein Elektrotechniker oder Wissenschaftler, sondern nur ein Medizingerätedesigner, der eine einfache Bandpassfilterung für EMG-Signale durchführen muss.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage