J'ai vu dans un thread SO une suggestion à utiliser filtfilt
qui effectue un filtrage vers l'arrière / vers l'avant au lieu de lfilter
.
Quelle est la motivation pour utiliser l'une contre l'autre technique?
J'ai vu dans un thread SO une suggestion à utiliser filtfilt
qui effectue un filtrage vers l'arrière / vers l'avant au lieu de lfilter
.
Quelle est la motivation pour utiliser l'une contre l'autre technique?
filtfilt
fait le même filtre deux fois, dans des directions opposées, donc ce n'est pas plus lent que de fairelfilter
deux fois dans une direction, c'est ainsi que vous obtiendriez la même réponse en fréquence.Réponses:
filtfilt
est un filtrage de phase zéro, qui ne décale pas le signal pendant qu'il filtre. La phase étant nulle à toutes les fréquences, elle est également linéaire. Le filtrage en arrière dans le temps vous oblige à prévoir l'avenir, il ne peut donc pas être utilisé dans des applications réelles "en ligne", uniquement pour le traitement hors ligne d'enregistrements de signaux.lfilter
est un filtrage causal direct dans le temps uniquement, semblable à un filtre électronique réel. Cela ne peut pas être en phase zéro. Il peut s'agir d'une phase linéaire (FIR symétrique), mais ce n'est généralement pas le cas. Habituellement, il ajoute différentes quantités de retard à 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, juste sans contenu haute fréquence, tandis que le filtrage de phase minimum retarde le signal de manière causale :
la source
lfilter
n'est pas nécessairement à phase minimale, elle peut être n'importe quoi en fonction des coefficients de filtrage, mais en tout cas elle est causale , ce quifiltfilt
ne l'est pas. Ainsi, le résultat de la comparaison quifiltfilt
n'a aucun retard etlfilter
ajoute toujours un certain retard n'est pas exactement vrai, car ilfiltfilt
n'est pas causal en premier lieu. Ce qui compte réellement, c'est qu'ilfiltfilt
ne provoque aucune distorsion de phase, contrairementlfilter
à ce qui est le cas (à moins qu'il ne soit utilisé comme filtre FIR à phase linéaire, c'est-à-dire avec un dénominateur = 1).filtfilt
correspond au filtrage avec (2N-1) e ordre aveclfilter
.lfilter
oufiltfilt
. Ils se comportent différemment, comme indiquéLa réponse de @endolith est complète et correcte! Veuillez d'abord lire son article, puis celui-ci en plus. En raison de ma faible réputation, je n'ai pas pu répondre aux commentaires où @Thomas Arildsen et @endolith discutent de l'ordre effectif du filtre obtenu par
filtfilt
:lfilter
applique un filtre donné et dans l'espace de Fourier, c'est comme appliquer UNE FOIS la fonction de transfert de filtre.filtfilt
appliquer deux fois le même filtre et l'effet est comme appliquer la fonction de transfert de filtre SQUARED. En cas de filtre Butterworth (scipy.signal.butter
) avec la fonction de transfertle gain effectif sera
la source