Wie man einen Bandpass-Butterworth-Filter mit Scipy.signal.butter implementiert
UPDATE:
Zu meiner überraschung, während der Suche nach diesem gleichen Thema, fast zwei Jahre später, fand ich einen Scipy Rezept in dieser Frage! So, für alle, die interessiert sind, gehen Sie direkt zu:
http://wiki.scipy.org/Cookbook/ButterworthBandpass
Ich habe eine harte Zeit zu erreichen, was schien zunächst eine einfache Aufgabe, die Implementierung eines Butterworth-Bandpass-filter für die 1-D-numpy array (Zeitreihe).
Habe ich Parameter enthalten sind, die sample_rate, die cutoff-Frequenzen IN HERTZ und ggf. um (andere Parameter, wie Dämpfung, Eigenfrequenz, usw.. sind etwas rätselhaft für mich, also keine "default" - Wert tun würde).
Was ich jetzt habe ist dieses, das zu funktionieren scheint wie ein high-pass-filter, aber ich bin in keiner Weise sicher, ob ich alles richtig machen:
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
Den docs und Beispiele sind verwirrend und unverständlich, aber ich möchte zum implementieren der vorliegenden form in die commend markiert als "bandpass". Die Fragezeichen in die Kommentare zeigen, wo ich gerade Kopie-aufgeklebt einige Beispiel-ohne zu verstehen, was passiert ist.
Ich bin kein Elektrotechnik oder Wissenschaftler, nur eine medizinische Ausrüstung, die designer benötigen, um einige eher einfachen bandpass-Filterung auf EMG-Signale.
Vielen Dank für jede Hilfe!!!
InformationsquelleAutor der Frage heltonbiker | 2012-08-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnten Sie überspringen die Verwendung von buttord, und stattdessen wählen Sie einfach eine Bestellung für das filtern und sehen, ob es erfüllt Ihre Filterkriterium. Zum generieren der filter-Koeffizienten für ein bandpass-filter, geben Sie die butter() filter um die cutoff-Frequenzen
Wn=[low, high]
(ausgedrückt als Bruchteil der Nyquist-Frequenz, die die Hälfte der Abtastfrequenz) und die band gebenbtype="band"
.Hier ist ein Skript, das bestimmt ein paar Komfort-Funktionen für das arbeiten mit einem Butterworth-bandpass-filter. Bei der Ausführung als Skript, macht es zwei Parzellen. Eine zeigt den Frequenzgang bei verschiedenen filter-Aufträge für die gleiche sampling-rate und die cutoff-Frequenzen. Der andere plot zeigt die Wirkung des filters (mit um=6) auf ein sample time series.
Hier sind die plots, die generiert werden, durch dieses Skript:
InformationsquelleAutor der Antwort Warren Weckesser
Die filter-design-Methode in akzeptierte Antwort ist korrekt, aber es hat einen Fehler. SciPy bandpass-Filter entwickelt, mit b, a instabil und kann dazu führen, fehlerhafte Filter bei höhere filter-Bestellungen.
Verwenden Sie stattdessen sos (second-order-sections) output filter design.
Können, können Sie auch plot-Frequenzgang durch änderung
zu
InformationsquelleAutor der Antwort user13107
Für ein bandpass-filter, ws ist ein Tupel mit den unteren und oberen Ecke Frequenzen. Diese repräsentieren die digitale Frequenz, wo der filter response 3 dB weniger als der Durchlassbereich.
wp ist ein Tupel mit der stop-band digital-Frequenzen. Sie vertreten die Position, wo die maximale Dämpfung beginnt.
gpass ist die maximale attenutation im Durchlassbereich in dB, während gstop ist der attentuation in der stopbands.
Sagen, zum Beispiel, Sie wollte ein filter bei einer Abtastrate von 8000 samples/sec mit Ecke-Frequenzen von 300 und 3100 Hz. Die Nyquist-Frequenz ist die sample-rate geteilt durch zwei, oder in diesem Beispiel 4000 Hz. Die entsprechende digitale Frequenz ist 1.0. Die beiden Eck-Frequenzen sind dann 300/4000 und 3100/4000.
Können nun sagen, Sie wollten die stopbands ab 30 dB +/- 100 Hz aus der Ecke-Frequenzen. So, Ihr stopbands würde beginnen bei 200 und 3200 Hz was in der digitalen Frequenzen von 200/4000 und 3200/4000.
Erstellen Sie Ihren filter, würden Sie rufen buttord als
Die Länge der resultierende filter wird abhängig sein von der Tiefe des Stopp-bands und der Steilheit der ansprechkurve bestimmt durch die Differenz zwischen den Eck-Frequenz-und stopband-Frequenz.
InformationsquelleAutor der Antwort sizzzzlerz