Signal Processing

Conception de filtres Butterworth avec `scipy.signal.butter`

Spread the love

La bibliothèque SciPy est une ressource puissante pour le calcul scientifique, et son module scipy.signal fournit des outils complets pour le traitement du signal. Le filtrage est un aspect fondamental du traitement du signal, et les filtres de Butterworth sont fréquemment utilisés en raison de leur réponse en amplitude maximalement plate dans la bande passante. Cet article se penche sur la fonction scipy.signal.butter, un outil clé pour la conception de ces filtres au sein de SciPy.

Table des matières

Comprendre les filtres de Butterworth

Les filtres de Butterworth sont appréciés pour leur réponse en amplitude maximalement plate dans la bande passante. Cette caractéristique assure une distorsion minimale du signal dans la plage de fréquences souhaitée. Cependant, cette planéité se fait au prix d’une décroissance relativement progressive dans la bande d’arrêt (la plage de fréquences où le filtre atténue le signal). L’obtention d’une décroissance plus abrupte nécessite un ordre de filtre plus élevé.

Utilisation de scipy.signal.butter

La fonction scipy.signal.butter est l’outil principal pour la conception de filtres de Butterworth dans SciPy. Ses paramètres clés sont :

  • N : L’ordre du filtre. Des ordres plus élevés produisent une décroissance plus abrupte, mais augmentent la complexité et la potentialité d’instabilité.
  • Wn : La fréquence de coupure (ou les fréquences pour les filtres passe-bande et coupe-bande), normalisée à la fréquence de Nyquist (la moitié du taux d’échantillonnage). Une valeur de 0,5 représente la moitié du taux d’échantillonnage.
  • btype : Le type de filtre : ‘lowpass’, ‘highpass’, ‘bandpass’ ou ‘bandstop’.
  • analog : True conçoit un filtre analogique ; False (par défaut) conçoit un filtre numérique.
  • output : Spécifie le format de sortie. ‘ba’ (coefficients du numérateur et du dénominateur) et ‘sos’ (sections du second ordre) sont des options courantes. ‘sos’ est généralement préféré pour la stabilité numérique, en particulier avec les filtres d’ordre supérieur.

Exemple : Conception d’un filtre passe-bas de Butterworth

Concevons un filtre passe-bas de Butterworth du 4e ordre avec une fréquence de coupure de 10 Hz, en supposant un taux d’échantillonnage de 100 Hz :


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

# Fréquence d'échantillonnage
fs = 100  # Hz

# Fréquence de coupure (normalisée)
cutoff = 10 / (fs / 2)  # Normalisation à la fréquence de Nyquist

# Ordre du filtre
order = 4

# Conception du filtre en utilisant SOS pour la stabilité
sos = signal.butter(order, cutoff, btype='lowpass', analog=False, output='sos')

# Affichage de SOS
print("Sections du second ordre (sos):", sos)

Exemple : Application du filtre et visualisation

Pour appliquer le filtre et visualiser les résultats :


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

# Application du filtre
filtered_sig = signal.sosfilt(sos, sig)

# Tracé des signaux original et filtré
plt.figure(figsize=(10, 6))
plt.plot(t, sig, label='Signal original')
plt.plot(t, filtered_sig, label='Signal filtré')
plt.xlabel('Temps (s)')
plt.ylabel('Amplitude')
plt.title('Signal original vs. Signal filtré')
plt.legend()
plt.grid(True)
plt.show()

Conclusion

scipy.signal.butter est un outil puissant pour la conception de filtres de Butterworth. La compréhension de ses paramètres et l’utilisation de la sortie ‘sos’ pour la stabilité numérique sont cruciales pour une conception efficace de filtre dans vos workflows de traitement du signal. N’oubliez pas de normaliser les fréquences de coupure à la fréquence de Nyquist. La visualisation des réponses du filtre à l’aide de Matplotlib améliore la compréhension et permet l’analyse des performances.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *