human
Appliquer un filtre dans scipy.signal: Utiliser lfilter ou filtfilt
gpt
* ```filtfilt``` est un filtrage à phase nulle, qui ne décale pas le signal lorsqu'il est filtré. Étant donné que la phase est nulle à toutes les fréquences, elle est également à phase linéaire. Filtrer en sens inverse dans le temps nécessite de prédire l'avenir, il ne peut donc pas être utilisé dans des applications en temps réel, mais uniquement pour le traitement hors ligne d'enregistrements de signaux.
* ```lfilter``` est un filtrage causal uniquement vers l'avant dans le temps, similaire à un filtre électronique réel. Il ne peut pas être à phase nulle. Il peut être à phase linéaire (FIR symétrique), mais ce n'est généralement pas le cas. Il ajoute généralement des retards différents à différentes fréquences.

Un exemple et une image devraient le rendre évident. Bien que l'amplitude de la réponse en fréquence des filtres soit identique (en haut à gauche et en haut à droite), le passe-bas à phase nulle s'aligne avec le signal d'origine, simplement sans contenu haute fréquence, tandis que le filtrage à phase minimale retarde le signal de manière causale :

```from __future__ import division, print_function
import numpy as np
from numpy.random import randn
from numpy.fft import rfft
from scipy import signal
import matplotlib.pyplot as plt
b, a = signal.butter(4, 0.03, analog=False)
# Montre que la réponse en fréquence est la même
impulsion = np.zeros(1000)
impulsion[500] = 1
# Applique le filtre en avant et en arrière dans le temps
imp_ff = signal.filtfilt(b, a, impulsion)
# Applique le filtre en avant dans le temps deux fois (pour la même réponse en fréquence)
imp_lf = signal.lfilter(b, a, signal.lfilter(b, a, impulsion))
plt.subplot(2, 2, 1)
plt.semilogx(20*np.log10(np.abs(rfft(imp_lf))))
plt.ylim(-100, 20)
plt.grid(True, which='both')
plt.title('lfilter')
plt.subplot(2, 2, 2)
plt.semilogx(20*np.log10(np.abs(rfft(imp_ff))))
plt.ylim(-100, 20)
plt.grid(True, which='both')
plt.title('filtfilt')
sig = np.cumsum(randn(800))  # Bruit brownien
sig_ff = signal.filtfilt(b, a, sig)
sig_lf = signal.lfilter(b, a, signal.lfilter(b, a, sig))
plt.subplot(2, 1, 2)
plt.plot(sig, color='silver', label='Original')
plt.plot(sig_ff, color='#3465a4', label='filtfilt')
plt.plot(sig_lf, color='#cc0000', label='lfilter')
plt.grid(True, which='both')
plt.legend(loc="best")
```