SciPy signal.butter
SciPy
, eine kompakte Bibliothek von Python, gibt einige bedeutende Ebenen von Algorithmen heraus, die Optimierung, Statistik und viele andere Parameter berücksichtigen. Das signal
-Paket in dieser Bibliothek konzentriert sich auf allgemeine Funktionen im Zusammenhang mit der Signalverarbeitung.
Der Butterworth-Filter ist eine spezielle Art von Digitalfilter und wird am häufigsten in der Bewegungsanalyse und in Audioschaltungen verwendet. Außerdem enthält die Dokumentation der Funktionen unter dem signal
-Paket die butter
, die ein IIR
-Filterdesign im Matlab
-Stil sicherstellt.
Das manuelle Entwerfen von Filtern ist eine umfassende Aufgabe, und die Überwachung der Antworten nach ihrer Anwendung ist schwierig.
Daher wird die Python-Bibliothek mit intuitiveren Funktionen (sowohl für digitale als auch für analoge Signale) aktualisiert, um die manuellen Fälle nachzuahmen. Die scipy.signal.butter
ist eine solche Ergänzung.
Der folgende Abschnitt behandelt ein Beispiel eines Butterworth-Bandpassfilters mit scipy.signal.butter
. Dies bezieht sich auf eine cutoff
-Frequenz (lowcut
, highcut
); daher akzeptiert der Filter nur eine Bereichsantwort.
So werden die Spitzenwerte verworfen und eine vergleichsweise abgeflachte Signalfrequenz mit dem besten Kompromiss aus Dämpfung und Phasendifferenz erreicht.
Verwenden Sie scipy.signal.butter
in Python
Insbesondere die Funktion butter
benötigt insgesamt 2
obligatorische Parameter. Erstens braucht es die Ordnung
, was bedeutet, dass man die Stärke des Filters hat.
Je höher die Ordnung, desto besser wird die Ausgangsleistung erwartet. Als nächstes hat das Array-ähnliche Objekt die Durchlass- und Stoppbandfrequenz.
Die Nyquist-Rate trägt wesentlich zur Bestimmung der Abtastrate bei. Ansonsten bestünde das Problem des Aliasing und damit die Gefahr, wichtige Frequenzdaten zu verlieren.
Dieses Konzept wird im Codierungsbeispiel anhand einiger Ausdrücke dargestellt.
Technisch besteht die Aufgabe darin, ein verrauschtes Signal aufzunehmen. Filtern Sie die erwartete Reichweitenfrequenz über die butter
-Funktion.
Und somit erhalten wir flache Antworten ohne Welligkeit, die für unseren speziellen Fall erforderlich sind. Springen wir zum besseren Verständnis zum Codeblock.
Code-Auszug:
from scipy.signal import butter, lfilter
import numpy as np
import matplotlib.pyplot as plt
Zunächst werden die Importe durchgeführt. Wir haben Google Colab für den Codierungseditor verwendet.
Der folgende Link leitet Sie zur Hauptcodebasis weiter.
Als nächstes haben wir zwei benutzerdefinierte Funktionen. Der erste berechnet die Grenzfrequenzen und gibt dann über die Funktion butter
den Filterkoeffizienten (b, a
) zurück.
Und die folgende Funktion hat das Eingangssignal (das zu filternde Signal) und gibt das gefilterte Signal (y
) zurück. Sehen wir uns die Klassen an.
def butter_bandpass(lowcut, highcut, fs, order):
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(x, lowcut, highcut, fs, order):
b, a = butter_bandpass(lowcut, highcut, fs, order)
y = lfilter(b, a, x)
return y
In der nächsten Phase werden wir ein zufälliges verrauschtes Signal mit einer Frequenz, Periode und den meisten anderen Parametern erzeugen, die zum Entwickeln von Signalen erforderlich sind. Wir rufen die Funktionen butter_bandpass()
und butter_bandpass_filter()
zum Filtern des verrauschten Signals auf.
def filtering():
fs = 5000.0
lowcut = 500.0
highcut = 1000.0
T = 0.05
nsamples = int(T * fs)
t = np.linspace(0, T, nsamples, endpoint=False)
sig = np.sin(2 * np.pi * 2 * t)
noise = 5 * np.random.randn(nsamples)
x = sig + noise
order = 5
plt.figure(figsize=(10, 12))
plt.subplot(3, 1, 1)
plt.plot(t, x, "m", label="Noisy signal")
plt.legend(loc="upper left")
plt.grid(True)
plt.axis("tight")
y = butter_bandpass_filter(x, lowcut, highcut, fs, order)
plt.subplot(3, 1, 2)
plt.plot(t, y, "orange", label="Filtered signal")
plt.xlabel("time (seconds)")
plt.grid(True)
plt.axis("tight")
plt.legend(loc="upper left")
plt.subplot(3, 1, 3)
plt.plot(t, x, label="Noisy signal")
plt.plot(t, y, label="Filtered signal")
plt.show()
filtering()
Und die Ausgangsprojekte:
-
Darstellung des verrauschten Signals (Eingangssignal).
-
Gefiltertes Signal (nach Anwendung des Butterworth-Filters)
-
Vorschau von verrauschtem Signal und gefiltertem Signal zusammen
Wie im letzten Code Fence sehen Sie, wie wir matplotlib
verwendet haben, um die Ergebnisse anzuzeigen. Im ersten Diagramm (Magenta) haben wir das erzeugte verrauschte Signal, und anhand der Werte der y-Achse
werden Sie feststellen, dass die Signalspitzen über 10 und -10
reichen.
Im zweiten Diagramm (orange) sehen Sie, dass das gefilterte Signal auf der vertikalen Achse eine Grenze von 6 bis -6
hat. Die Messungen basieren auf der Verstärkung
und dem gesamten Frequenzbereich.
Das letzte Diagramm (blau und orange) zeigt, wie sukzessive der Butterworth-Filter auf das Eingangssignal wirkte. Dieses Diagramm ist die zusammengeführte Version der beiden vorherigen Diagramme.