Vi en un hilo SO una sugerencia de uso filtfilt
que realiza el filtrado hacia atrás / adelante en lugar de lfilter
.
¿Cuál es la motivación para usar una técnica contra la otra?
Vi en un hilo SO una sugerencia de uso filtfilt
que realiza el filtrado hacia atrás / adelante en lugar de lfilter
.
¿Cuál es la motivación para usar una técnica contra la otra?
filtfilt
hace el mismo filtro dos veces, en direcciones opuestas, por lo que no es más lento que hacerlolfilter
dos veces en una dirección, así es como obtendría la misma respuesta de frecuencia.Respuestas:
filtfilt
es un filtro de fase cero, que no cambia la señal mientras se filtra. Como la fase es cero en todas las frecuencias, también es de fase lineal. Filtrar hacia atrás en el tiempo requiere que prediga el futuro, por lo que no se puede usar en aplicaciones de la vida real "en línea", solo para el procesamiento fuera de línea de grabaciones de señales.lfilter
es un filtrado causal directo en el tiempo solamente, similar a un filtro electrónico de la vida real. No puede ser de fase cero. Puede ser de fase lineal (FIR simétrica), pero generalmente no lo es. Por lo general, agrega diferentes cantidades de retraso a diferentes frecuencias.Un ejemplo y una imagen deberían hacerlo obvio. Aunque la magnitud de la respuesta de frecuencia de los filtros es idéntica (arriba a la izquierda y arriba a la derecha), el paso bajo de fase cero se alinea con la señal original, simplemente sin contenido de alta frecuencia, mientras que el filtrado de fase mínimo retrasa la señal de manera causal :
fuente
lfilter
no es necesariamente una fase mínima, puede ser cualquier cosa dependiendo de los coeficientes del filtro, pero en cualquier caso es causal , lo quefiltfilt
no lo es. Por lo tanto, el resultado de la comparación quefiltfilt
tiene un retraso cero ylfilter
siempre agrega algo de retraso no es exactamente cierto, porquefiltfilt
en primer lugar no es causal. Lo que realmente importa es quefiltfilt
no causa distorsiones de fase, mientras que lolfilter
hace (a menos que se use como un filtro FIR de fase lineal, es decir, con denominador = 1).filtfilt
corresponde al filtrado con (2N-1) enésimo orden conlfilter
.lfilter
ofiltfilt
. Se comportan de manera diferente, como se muestra¡La respuesta de @endolith es completa y correcta! Lea primero su publicación, y luego esta además de ella. Debido a mi baja reputación, no pude responder a los comentarios donde @Thomas Arildsen y @endolith discuten sobre el orden efectivo del filtro obtenido por
filtfilt
:lfilter
aplica el filtro dado y en el espacio de Fourier esto es como aplicar la función de transferencia de filtro UNA VEZ.filtfilt
aplica el mismo filtro dos veces y el efecto es como aplicar la función de transferencia de filtro CUADRADO. En el caso del filtro Butterworth (scipy.signal.butter
) con la función de transferenciala ganancia efectiva será
fuente