¿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.
fuente
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 defiltfilt
, 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.filtfilt
en 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.Respuestas:
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
fuente
scipy
documentación delfilter_zi
, que es la predeterminadascipy.signal.filtfilt
para 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_gust
en la fuente).La
zi = (...)\(...)
línea en la pregunta del OP determina el estado inicial del filtro. Creo que el mismo enfoque es utilizado por Pythonscipy
. De acuerdo con los documentos scipy :(mi énfasis)
Tenga en cuenta que
filtfilt
calcula el estado inicialzi
, lo escala por el primer valor de muestra y luego lo pasafilter
, 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 .fuente