¿Son los filtros IIR (y específicamente el filtro Butterworth) causales?
Soy nuevo en el procesamiento de señales. Ahora estoy aprendiendo sobre el filtrado y estoy tratando de implementar un filtro de paso alto (HPF) y un filtro de paso de banda posterior (BPF). Implemento los filtros Python 3.8
con NumPy
y SciPy
.
Para el caso fuera de línea (filtrando un tiempo pregrabado) diseñé un filtro de paso alto Butterworth y lo apliqué a la señal en el dominio del tiempo usando la signal.filtfilt
función. Sin embargo, como muestra la documentación, este enfoque es bueno solo para casos fuera de línea y no para tiempo real, ya que el filtro escanea la señal hacia adelante y luego hacia atrás. Puedo recuperar la respuesta de frecuencia del filtro usando la signal.freqz
función.
Ahora quiero que este filtro funcione también en tiempo real (por lo que debe ser causal, y pregunto si esto es posible para este tipo de filtros. Aquí están mis preguntas:
- Si lo entiendo correctamente, los filtros Butterworth son filtros IIR (respuesta de impulso infinito). ¿Es verdad?
- ¿Son los filtros IIR causales? Puede ser que todos los filtros IIR no sean causales y puede ser que algunos lo sean y otros no. ¿Cuáles son los casos en los que los filtros IIR son causales?
- ¿Son los filtros Butterworth causales? Si no siempre, ¿en qué caso son causales?
- Si la respuesta a 3 es verdadera, ¿cómo implementar un filtro Butterworth causal, tanto en el dominio del tiempo como en el dominio de la frecuencia? (Puedo usar
SciPy
funciones comosignal.butter
,signal.freqz
etc.)
Enlaces relevantes:
- Ayudar a diseñar el filtro Butterworth
- filtfilt: https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.filtfilt.html
Gracias.
Respuestas
- Sí, Butterworth es IIR. La decadencia de un impulso técnicamente dura para siempre.
- Sí, todas las IIR [implementables] son causales.
- Sí, por los números 1 y 2.
- No lo use signal.filtfilt. Utilice signal.lfilter.
filtfilt
hace lo mismo quelfilter
, excepto dos veces, en direcciones opuestas, que cambia un filtro causal en un filtro de fase cero.
Sin embargo, como sugiere la documentación para ambas funciones, para un uso más práctico, debería usar las variantes SOS en su lugar:
La función
sosfilt
(y el uso del diseño del filtrooutput='sos'
) debe preferirselfilter
a la mayoría de las tareas de filtrado, ya que las secciones de segundo orden tienen menos problemas numéricos.
Para resumir las funciones:
- lfilter: Filtrado causal de una sola etapa (solo pedidos bajos)
- filtfilt: Filtrado de fase cero de una sola etapa (solo pedidos bajos)
- sosfilt: Filtrado de secciones causales de segundo orden
- sosfiltfilt: Filtrado de secciones de segundo orden de fase cero
Realmente, la única razón para usar lfilter
o filtfilt
es si sus coeficientes ya están en b, a
formato, si está implementando algo de un libro de texto, etc.
Si está diseñando el filtro usted mismo, utilice el formulario SOS, que reduce el error numérico.
Tenga en cuenta que las filtfilt
funciones aplican el filtro dos veces, por lo que tendrá el doble del orden del filtro original.
¿Son los filtros IIR causales? Puede ser que todos los filtros IIR no sean causales y puede ser que algunos lo sean y otros no. ¿Cuáles son los casos en los que los filtros IIR son causales?
Todos los filtros IIR reales son causales. Todos los sistemas reales son causales, a menos que el universo sea mucho más extraño de lo que parece.
Puede definir un filtro que actúe sobre información futura; es decir, podrías decir que$y_n = 0.9 y_{n+1} + x_n$. Eso describiría (con muchas palabras para superar el escepticismo del lector) un filtro cuya respuesta al impulso es$$h_\kappa = \begin{cases} 0 & \kappa > 0 \\ 0.9^{-\kappa} & \kappa \le 0 \end{cases}$$
Sin embargo, no podría implementar dicho filtro en la vida real.