Filtro de fase cero: determinación de las condiciones iniciales para el filtrado hacia adelante y hacia atrás

7

¿Alguien está familiarizado con el algoritmo de Gustafson para minimizar los transitorios en el filtrado hacia adelante y hacia atrás [1]? Estoy tratando de implementarlo y mi primera suposición fue verificar filtfilt.m de Matlab, ya que están haciendo referencia al documento. En la función Matlab también se resuelve un sistema de ecuaciones lineales para encontrar las condiciones iniciales zi que minimizan los transitorios de inicio, pero la relación entre referencia y código no me resulta obvia. Las únicas líneas de código con respecto a la minimización son (nfilt es la longitud de los vectores de coeficiente):

zi = ( eye(nfilt-1) - [-a(2:nfilt), [eye(nfilt-2); zeros(1,nfilt-2)]] ) \...
 ( b(2:nfilt) - b(1)*a(2:nfilt) );

¿Alguien puede señalarme en la dirección correcta sobre cómo esas líneas se relacionan con el algoritmo descrito en el artículo de Gustafson?

[1] Gustafsson, F. "Determinación de los estados iniciales en el filtrado hacia adelante y hacia atrás". Transacciones IEEE® sobre procesamiento de señales. Vol. 44, abril de 1996, págs. 988–992.

usuario967493
fuente
los estados iniciales de cualquier filtro IIR deben ser cero al comienzo del paso de filtrado hacia adelante y deben ser cero al comienzo del paso de filtrado hacia atrás. en ambas pasadas, el archivo de señal (o el búfer) que se filtra se alargará según la longitud aparente del IIR (cuánto tiempo tarda la salida en decaer lo suficientemente cerca de cero como para poder cortar el resto de la decadencia) .
robert bristow-johnson
En el artículo, el autor afirma que los filtros hacia adelante y hacia atrás son diferentes en su representación del espacio de estado. ¿Puedes explicar porque?
Maxtron
bueno, como entiendo el uso de filtfilt()no puedo ver por qué. No he leído el documento de Gustafson (no soy IEEE y no puedo obtenerlo de forma gratuita, cualquiera que tenga una copia puede enviarme un .pdf). Al usar el concepto de filtfilt, uno puede hacerlo a un archivo completo de muestras (para mí sería un archivo de audio o sonido, como un .wav) primero filtre el sonido hacia adelante con relleno de cero en el extremo siempre que espera que sea la respuesta al impulso del filtro hacia adelante. eso alarga el archivo, pero la salida llega prácticamente a cero. luego ejecute el archivo resultante a través del filtro hacia atrás.
Robert Bristow-Johnson
hay otro uso, basado en un documento de Powell y Chau que lo hace filtfilten tiempo real al dividir la entrada en bloques de muestras, rellenando con ceros cada bloque, filtrando los bloques hacia atrás pero manteniendo las "colas" volteándolas hacia adelante y superposición de adición. Powell-Chau no hizo esto, pero creo que esta es una buena aplicación de los filtros Truncated IIR, para que sepa cuándo termina la salida del bloque en descomposición.
Robert Bristow-Johnson
1
@ robertbristow-johnson: Me encontré con esta copia del artículo de Gustafsson .
djvg

Respuestas:

5

Para cualquiera que esté interesado, casualmente encontré un artículo que describe el método implementado en filtfilt.m de matlab. Se adjunta un enlace al documento. Al menos, según tengo entendido, filtfilt.m de matlab no implementa el algoritmo Gustafson.

Sadovsky, P .; Bartusek, K: Optimización de la respuesta transitoria de un filtro digital, Radioingeniería vol. 9, N ° 2, 2000

usuario967493
fuente
Consulte también la scipy documentación de lfilter_zi, que es la predeterminada scipy.signal.filtfiltpara determinar las condiciones iniciales, como puede ver en la fuente . En este caso, el relleno 'impar' se usa por defecto, pero puede usar el método de Gustafsson como una opción (eche un vistazo a la definición _filtfilt_gusten la fuente).
djvg
0

La zi = (...)\(...)línea en la pregunta del OP determina el estado inicial del filtro. Creo que el mismo enfoque es utilizado por Python scipy. De acuerdo con los documentos scipy :

Un filtro lineal con orden m tiene una representación de espacio de estado (A, B, C, D), para la cual la salida y del filtro se puede expresar como:

z (n + 1) = A z (n) + B x (n)

y (n) = C z (n) + D x (n)

donde z (n) es un vector de longitud m, A tiene forma (m, m), B tiene forma (m, 1), C tiene forma (1, m) y D tiene forma (1, 1) (suponiendo x (n) es un escalar). lfilter_zi resuelve:

zi = A * zi + B

En otras palabras, encuentra la condición inicial para la cual la respuesta a una entrada de todos es una constante .

(mi énfasis)

Tenga en cuenta que filtfiltcalcula el estado inicial zi, lo escala por el primer valor de muestra y luego lo pasa filter, que realmente lo aplica ( docs ).

Aquízi se proporciona un ejemplo básico de cómo se puede aplicar este estado inicial en un filtro, utilizando la representación del espacio de estados .

djvg
fuente