Signal Processing

Butterworth-Filter mit SciPy’s signal.butter entwerfen

Spread the love

Die SciPy-Bibliothek ist eine leistungsstarke Ressource für wissenschaftliches Rechnen, und ihr Modul scipy.signal bietet umfassende Werkzeuge für die Signalverarbeitung. Filterung ist ein fundamentaler Aspekt der Signalverarbeitung, und Butterworth-Filter werden aufgrund ihres maximal flachen Amplitudenverlaufs im Durchlassbereich häufig eingesetzt. Dieser Artikel befasst sich mit der Funktion scipy.signal.butter, einem Schlüsselwerkzeug zur Entwicklung dieser Filter innerhalb von SciPy.

Inhaltsverzeichnis

Butterworth-Filter verstehen

Butterworth-Filter zeichnen sich durch ihren maximal flachen Amplitudenverlauf im Durchlassbereich aus. Diese Eigenschaft sorgt für minimale Signalverzerrungen im gewünschten Frequenzbereich. Diese Flachheit geht jedoch auf Kosten eines relativ allmählichen Abfalles im Sperrbereich (dem Frequenzbereich, in dem der Filter das Signal abschwächt). Um einen steileren Abfall zu erreichen, ist eine höhere Filterordnung erforderlich.

Verwendung von scipy.signal.butter

Die Funktion scipy.signal.butter ist das Hauptwerkzeug für die Entwicklung von Butterworth-Filtern in SciPy. Ihre wichtigsten Parameter sind:

  • N: Die Filterordnung. Höhere Ordnungen führen zu einem steileren Abfall, erhöhen aber die Komplexität und das Potenzial für Instabilität.
  • Wn: Die Grenzfrequenz (oder Frequenzen für Bandpass- und Bandsperrfilter), normiert auf die Nyquist-Frequenz (die halbe Abtastrate). Ein Wert von 0,5 entspricht der halben Abtastrate.
  • btype: Der Filtertyp: ‚lowpass‘, ‚highpass‘, ‚bandpass‘ oder ‚bandstop‘.
  • analog: True entwirft einen analogen Filter; False (Standard) entwirft einen digitalen Filter.
  • output: Gibt das Ausgabeformat an. ‚ba‘ (Zähler- und Nennerkoeffizienten) und ’sos‘ (Second-Order Sections) sind gängige Optionen. ’sos‘ wird im Allgemeinen für numerische Stabilität bevorzugt, insbesondere bei Filtern höherer Ordnung.

Beispiel: Entwurf eines Tiefpass-Butterworth-Filters

Entwerfen wir einen Tiefpass-Butterworth-Filter 4. Ordnung mit einer Grenzfrequenz von 10 Hz, angenommen eine Abtastrate von 100 Hz:


import numpy as np
from scipy import signal
import matplotlib.pyplot as plt

# Abtastrate
fs = 100  # Hz

# Grenzfrequenz (normiert)
cutoff = 10 / (fs / 2)  # Normierung auf Nyquist-Frequenz

# Filterordnung
order = 4

# Filterentwurf mit SOS für Stabilität
sos = signal.butter(order, cutoff, btype='lowpass', analog=False, output='sos')

# Ausgabe SOS
print("Second-order sections (sos):", sos)

Beispiel: Anwendung des Filters und Visualisierung

Um den Filter anzuwenden und die Ergebnisse zu visualisieren:


# Beispielsignal
t = np.linspace(0, 1, fs, endpoint=False)
sig = np.sin(2 * np.pi * 20 * t) + np.sin(2 * np.pi * 5 * t)

# Anwendung des Filters
filtered_sig = signal.sosfilt(sos, sig)

# Darstellung des Original- und des gefilterten Signals
plt.figure(figsize=(10, 6))
plt.plot(t, sig, label='Originalsignal')
plt.plot(t, filtered_sig, label='Gefiltertes Signal')
plt.xlabel('Zeit (s)')
plt.ylabel('Amplitude')
plt.title('Originalsignal vs. gefiltertes Signal')
plt.legend()
plt.grid(True)
plt.show()

Fazit

scipy.signal.butter ist ein leistungsstarkes Werkzeug zum Entwerfen von Butterworth-Filtern. Das Verständnis seiner Parameter und die Verwendung der Ausgabe ’sos‘ für numerische Stabilität sind entscheidend für ein effektives Filterdesign in Ihren Signalverarbeitungs-Workflows. Denken Sie daran, Grenzfrequenzen auf die Nyquist-Frequenz zu normieren. Die Visualisierung von Filterantworten mit Matplotlib verbessert das Verständnis und ermöglicht die Leistungsanalyse.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert