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
- Utilisation de
scipy.signal.butter
- Exemple : Conception d’un filtre passe-bas de Butterworth
- Exemple : Application du filtre et visualisation
- Conclusion
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.