web-dev-qa-db-fra.com

Comment appliquer un filtre à un signal dans python

y a-t-il une fonction préparée dans python pour appliquer un filtre (par exemple, filtre Butterworth) à un signal donné? Je cherche une telle fonction dans 'scipy.signal' 'mais je n'en trouve pas des fonctions utiles plus que celles de conception de filtre.En fait, je veux que cette fonction convolve un filtre avec le signal.

17
Navid Khairdast

Oui! Il y en a deux:

scipy.signal.filtfilt
scipy.signal.lfilter

Il existe également des méthodes de convolution (convolve et fftconvolve), mais elles ne sont probablement pas appropriées pour votre application car elles impliquent des filtres IIR.

Exemple de code complet:

b, a = scipy.signal.butter(N, Wn, 'low')
output_signal = scipy.signal.filtfilt(b, a, input_signal)

Vous pouvez en savoir plus sur les arguments et l'utilisation dans la documentation. Un truc est que Wn est une fraction de la fréquence de Nyquist (la moitié de la fréquence d'échantillonnage). Donc, si la fréquence d'échantillonnage est de 1000 Hz et que vous voulez une coupure de 250 Hz, vous devez utiliser Wn=0.5.

En passant, je recommande fortement l'utilisation de filtfilt sur lfilter (qui s'appelle simplement filter dans Matlab) pour la plupart des applications. Comme l'indique documentation :

Cette fonction applique un filtre linéaire deux fois, une fois en avant et une fois en arrière. Le filtre combiné a une phase linéaire.

Cela signifie que chaque valeur de la sortie est fonction à la fois des points "passés" et "futurs" de l'entrée. Par conséquent, il ne retardera pas l'entrée.

En revanche, lfilter n'utilise que les valeurs "passées" de l'entrée. Cela introduit inévitablement un décalage temporel, qui dépendra de la fréquence. Il existe bien sûr quelques applications pour lesquelles cela est souhaitable (notamment le filtrage en temps réel), mais la plupart des utilisateurs sont bien mieux avec filtfilt.

35
cxrodgers