Estoy escribiendo un programa para filtrar una señal de 20,000 muestras con un filtro Butterworth de quinto orden fuera de línea. Tengo acceso a una implementación de FFT. Parece que hay dos alternativas para implementar el filtrado:
- convolucionando la señal con la respuesta al impulso en el dominio del tiempo, o
- multiplicando la señal con la respuesta al impulso en el dominio de frecuencia y transformando inversamente el resultado
Estos métodos serían idénticos en el caso teórico de FT. Sin embargo, hacerlo en la vida real con el DFT, supongo que las cosas son diferentes. ¿Es uno de los métodos numéricamente más estable? ¿Hay otros problemas que debería tener en cuenta? El número de cálculos no es importante.
Respuestas:
Con convolución, no se encontrará con ningún problema de estabilidad, ya que no existe un filtrado recursivo, por lo que no acumulará ningún error. En otras palabras, el sistema es todo ceros, no polos. He escuchado anecdóticamente, pero no verificado por mí mismo, que la convolución basada en FFT tiene un error menor que la convolución en el dominio del tiempo, simplemente porque tiene operaciones aritméticas O (n log n) en lugar de O (n ^ 2).
Por lo general, hasta donde yo sé, los filtros de Butterworth se implementan como filtros recursivos (IIR), por lo que ese es un tema diferente. Los filtros IIR tienen polos y ceros, por lo que puede haber problemas de estabilidad en la práctica. Además, para los filtros IIR, los métodos basados en FFT no son una opción, pero por el lado positivo, los filtros IIR tienden a ser de muy bajo orden.
En cuanto a los problemas de estabilidad con los filtros IIR, tienden a tener problemas en los pedidos más altos: simplemente arrojaré un número y diré que aproximadamente el sexto orden lo está presionando. En cambio, generalmente se implementan como biquads en cascada (secciones de filtro de segundo orden). Para su filtro de quinto orden, escríbalo como una función de transferencia de dominio z (será una función racional de quinto grado), y luego factoríelo en sus 5 polos y 5 ceros. Recoge los conjugados complejos y tendrás dos biquads y un filtro de primer orden. En general, los problemas de estabilidad tienden a surgir a medida que los polos se acercan al círculo unitario.
También puede haber problemas con el ruido y los ciclos límite en los filtros IIR, por lo que hay diferentes topologías de filtro (es decir, forma directa I, forma directa II) que tienen diferentes propiedades numéricas, pero no pensaría demasiado en este punto, solo use doble- precisión y seguramente será lo suficientemente bueno.
fuente
y(n) = b0 * x(n) + b1 * x(n-1) + b2 * x(n-2) - a1 * y(n-1) - a2 * y(n-2)
. Tenga en cuenta que esta es una combinación de las muestras de entrada anteriores (los valores de x) y las muestras de salida anteriores (los valores de y). Un filtro FIR solo depende de las entradas pasadas, por lo que admite una implementación eficiente del dominio de frecuencia. Un filtro IIR no lo hace, pero de todos modos es muy eficiente porque los filtros IIR tienden a ser mucho más bajos.En casi todos los casos, su mejor opción no es convolución ni FFT, sino simplemente aplicar el filtro IIR directamente (usando, por ejemplo, la función sosfilt ()). Esto será mucho más eficiente en términos de consumo de CPU y memoria.
Si hace una diferencia numérica depende del filtro específico. El único caso en el que puede surgir alguna diferencia es si los polos están muy, muy cerca del círculo unitario. Incluso hay algunos trucos que pueden ayudar. NO USE la representación de la función de transferencia y filter (), pero use polos y ceros con sosfilt (). Aquí hay un ejemplo de la diferencia.
filter () falla en un corte de aproximadamente 15Hz a 44.1kHz. Para sosfilt (), el límite puede estar muy por debajo de 1/100 de Hz a 44,1 kHz sin ningún problema.
SI tiene problemas de estabilidad, la FFT tampoco ayuda mucho. Como su filtro es un filtro IIR, la respuesta al impulso es infinita y primero debería truncarse. A estas frecuencias muy bajas, la respuesta al impulso se prolonga tanto que la FFT tampoco resulta práctica.
Por ejemplo, si desea un límite de 1/100 Hz a 44,1 kHz y desea un rango dinámico en la respuesta al impulso de 100 dB, ¡necesita aproximadamente 25 millones de muestras! Eso es casi 10 minutos a 44.1 kHz y muchas, muchas veces más que su señal original
fuente
filter
- ¡gracias! Mi corte de paso alto es de 0,5 Hz a 250 Hz. ¿Cuál es la razón de los problemas confilter
? Estoy escribiendo la implementación yo mismo.¿Por qué supones que las cosas serán diferentes? Los conceptos teóricos deberían traducirse en aplicaciones prácticas, con la única diferencia de los problemas de coma flotante, de los que no podemos escapar. Puede verificar fácilmente con un ejemplo simple en MATLAB:
Como puede ver, los errores son del orden de precisión de la máquina. No debería haber ninguna razón para no usar el método FFT. Como mencionó Endolith, es mucho más común usar el enfoque FFT para filtrar / convolucionar / correlacionar, etc. y mucho más rápido, excepto para muestras muy pequeñas (como en este ejemplo). No es que el procesamiento en el dominio del tiempo nunca se haga ... todo se reduce a la aplicación, necesidades y restricciones.
fuente