¿Cómo mejorar mi filtro digital para extraer DC de los ruidos?

Descripción del filtro digital:

  1. La entrada del filtro son datos del sensor y la salida se proporcionará a un controlador PID.

  2. Tasa de muestreo: 64kHz

  3. Espectro de ruidos: de DC a 10kHz

  4. Objetivo del filtro: obtener solo el componente de CC y reducir los ruidos tanto como sea posible.

  5. Característica de DC: varía muy lentamente, digamos a 0.000001Hz.

Más sobre el sistema

  1. La entrada del sistema (ref o referencia es cero). Y, en realidad, el objetivo del controlador es mantener la salida del sistema en cero.

  2. En este sistema también hay perturbaciones y ruidos. La perturbación tiene la forma de una rampa, sin embargo, por naturaleza, se parece más a eventos aleatorios a muy baja frecuencia.

  3. El controlador es un controlador PI simple. Se esfuerza por compensar la influencia de las perturbaciones mientras se deshace de los ruidos.

  4. Los ruidos son de sensores y el filtro entre el controlador y el sensor es sobre lo que estoy buscando ayuda aquí.

ingrese la descripción de la imagen aquí

Mi forma actual de diseño de filtro:

  1. Los datos irán a un diezmador para la aniquilación en primer lugar. El diezmador es un filtro promedio de 320 toques, que promedia cada 320 datos y exporta un resultado promediado. Los resultados serán a 200Hz.

  2. Los datos promediados luego entrarán en un diezmador promedio de 20 toques. Los resultados serán a 10Hz.

  3. Por último, los datos a 10 Hz entrarán en un IIR o, de nuevo, en un filtro de media móvil. El resultado final oscilará entre 1 Hz y 0,2 Hz.

Mis preocupaciones: diseño insuficiente

El diezmador promedio puede no ser lo suficientemente agudo, ya que son básicamente FIR con los mismos coeficientes de 1/320. Dado que los filtros no son lo suficientemente nítidos, el diezmado (reducción de muestreo) puede introducir un mapeo de ruidos de alta frecuencia en los resultados filtrados.

El siguiente diagrama es la respuesta para el filtro promedio 1/320ingrese la descripción de la imagen aquí

puede que no sea malo

Dado que las varias etapas de diezmado son básicamente promediar las señales. Los resultados serán componente DC, ya que así se define DC.

Consejo necesario

¿Cómo mejorar mi diseño actual?

¿Por qué no estás usando un filtro IIR?
@BrianDrummond ¿Para etapas de destrucción o para la última etapa de filtrado? Para las etapas de diezmado, un FIR (en este caso promediando) ahorra recursos de cómputo, ya que el diezmado solo calcula el resultado necesario y no se preocupa por los arrojados. Sin embargo, un IIR depende de los valores históricos y tiene que procesar todos los datos.
@richieqianle Creo que un FIR de 320 toques es algo exagerado. Tal vez usando coeficientes de filtro (en lugar del filtro de media móvil 1/n_taps) y 32 toques o 64, obtenga una mejor respuesta y un retraso más bajo.
@MarkoBuršič ¿Crees que seguirá siendo un problema si solo hablamos del componente de CC? Y el retraso no sería una preocupación, solo el ruido lo es.
Bueno, si tu ruido es blanco, el filtro óptimo es el promedio móvil, lo que significa que puedes descartar toda esta complejidad extrema para hacer algo muy simple.
@richieqianle ¿Es esta una aplicación en tiempo real o solo un cálculo de valores registrados? Además, qué plataforma usa y la precisión de los números de punto flotante.
@MarkoBuršič sí, es en tiempo real pero con una tasa de actualización baja: digamos que 1 Hz es lo suficientemente bueno. Está en un Arm Cortex4 con DSP y precisión de 32 bits.
@pipe, ¿quieres decir que mi diseño actual es lo suficientemente bueno?
@pipe Pero lo que OP propone es un filtro de promedio móvil, y no está contento con la atenuación de aproximadamente -40dB, supongo.
@richieqianle En la descripción, dijo que la frecuencia de muestreo es de 64 kHz, ¿cómo llega a 1 Hz?
@MarkoBuršič Doh, me confundí con todos los toques. Normalmente no es así como se hace un promedio móvil. :)
@pipe Purga la muestra más antigua en el fifo, toma la más nueva y la multiplica con 1/Nr_taps (en este caso 1/320) y luego suma todos los elementos en el fifo, este es un filtro de promedio móvil, lo mismo que FIR siendo todos los coeficientes de derivación iguales. No sé cómo puede hacer el filtro de promedio móvil de manera diferente (otro es: en lugar de multiplicar 1/320 en el nuevo elemento, no lo hace y al final los suma todos y multiplica 1/320 en el fin).
@MarkoBuršič Se puede implementar un promedio móvil mucho más rápido si se da cuenta de que todo en el fifo siempre sumará el mismo valor, excepto el más nuevo y el más antiguo. Cada pasada ahora se simplifica a una suma (nueva), una resta (antigua) y una división (o multiplicación por 1/N). De esa manera, lo único que lo detiene es la memoria disponible para el fifo, no el tiempo de procesamiento.
@pipe Porque no es solo un promedio móvil, también es una aniquilación. De ahí vienen los grifos.
@MarkoBuršič La señal de 64 kHz es la señal de entrada del filtro. Solo se necesita un resultado de 1 Hz.

Respuestas (2)

Su primer problema no es un diseño insuficiente, sino una especificación insuficiente. Tenga en cuenta que "tanto como sea posible" no es una especificación.

En lugar de preguntarse si algún filtro en particular es lo suficientemente nítido y puede introducir ruidos de alta frecuencia en los resultados, sería más constructivo especificar cuánta atenuación se requiere en qué frecuencias y luego diseñar un filtro que proporcione esta atenuación.

Uno de los primeros puntos de especificación es cuál debe ser la frecuencia de muestreo de salida. La tasa más baja que mencionas es de 10 Hz, pero luego se filtra después de eso. ¿Es esa la tasa de producción, o se reduce? Si su CC varía a 1uHz, ¡entonces incluso 10Hz podría considerarse sobremuestreado!

No estoy seguro de cómo llegaste a usar un filtro de primera etapa de 320 toques.

De todos modos, la aniquilación profunda como la que está haciendo aquí normalmente implicará dos etapas.

Primera etapa: obtenga una gran reducción en la frecuencia de muestreo hasta unas pocas veces su frecuencia final, utilizando un filtro de paso bajo crudo, para tener nulos de rechazo profundos alrededor de su frecuencia de muestreo final, nulos lo suficientemente amplios como para acomodar su ancho de banda final. Este filtro se ejecuta con frecuencia, por lo que deberá ser breve. Este podría ser un filtro CIC, aunque requiere una precisión muy alta, puede necesitar números grandes para un cambio de tasa grande. Un FIR diezmador de bajo orden es quizás una mejor opción para una implementación de software.

Segunda etapa: diseñe un filtro final que elimine el ruido que ha sido alterado por el filtro de la primera etapa y reduzca la tasa a la final deseada. Este filtro rara vez se ejecuta, por lo que puede ser muy largo.

Cuando la tasa de salida sobremuestrea el ancho de banda requerido por un factor importante, puede permitirse ser muy ineficiente con el diseño de su filtro. En estos casos, parece que el caso que describe, un filtro IIR iterado de primer orden es una opción razonable.

La belleza de un filtro IIR de primer orden es que la longitud efectiva se ajusta simplemente estableciendo el valor de k en la relación de recurrencia. Puede iterarlo para mejorar ligeramente la inclinación, o simplemente sobremuestrear mucho para permitir que la pobre banda de parada no influya en sus resultados. Existe el problema muy real de que una k pequeña y/o una relación de diezmado grande pueden llevarlo a problemas de precisión numérica si no tiene cuidado.

Este puede no ser el filtro más fácil de diseñar por foro. Me complace ayudarlo a reafirmar su especificación y ayudarlo a diseñarlo fuera de línea, solo para los lols.

Muchas gracias por tu respuesta Neil, ya estoy aprendiendo CIC. 1. Para la especificación: el Vpp de ruido de nuestro diseño actual (como se describe arriba) es 2,5 veces mayor que el de nuestros competidores. No estoy seguro de tener una especificación ahora, ya que el objetivo es cuanto más pequeño, mejor. Pero voy a tratar de llegar a uno. Gracias Neil.
2. La velocidad de salida vuelve a bajar después de 10 Hz. La frecuencia de salida final oscila entre 0,2 Hz y 1 Hz. La salida del filtro irá a un controlador en realidad. 3. Acerca de los 320 toques de la primera etapa: compruebe la parte "puede que no sea mala" de la publicación. Pensé en obtener DC, promediar es la mejor manera. Por lo tanto promedié cada 320 datos para obtener un resultado. 320 se usa solo porque coincide con el temporizador MCU más fácilmente.
4. ¿Podría comentar sobre eso: para obtener DC, el promedio es suficiente? Si este es el caso, ¿aún necesitamos un CIC? Y si nuestra plataforma es una MCU rápida de 32 bits con DSP, ¿es razonable ejecutar CIC en ella? 5. Realmente aprecio su amable ayuda para diseñar el filtro y confirmar las especificaciones. ¡Vamos a hacer eso!
Estoy un poco preocupado por la línea desechable en un comentario de que la salida va a un controlador. No sé qué es un controlador. ¿Se retroalimenta para controlar lo que estás midiendo? Si es así, deberá expandir el sistema en cuestión para incluir todo el bucle e identificar dónde el ruido es 2,5 veces peor de lo que desea. ¿La razón? Un bucle de control es un filtro de paso bajo en sí mismo. Es posible que deba cambiar la dinámica del bucle si el ruido proviene del efector, o puede que no sea posible en absoluto si el ruido está en el sensor.
Oh Neil, me encantan tus preguntas que son realmente buenas y me recuerdan mucho lo que debo aprender. 1. Creo que los ruidos son la principal preocupación ahora: pueden provenir del ruido agregado del filtro o la falta de atenuación de la banda de parada. 2. Agregar todas las muestras de 64k juntas durante 1 segundo no es suficiente, ya que así es como lo estoy haciendo ahora. Tiene grandes ruidos. 3. Estoy usando Matlab y puedo trazar espectros. 4. Aprenderé sobre el ancho de banda del controlador. Me falta teoría sobre eso, ahora solo estoy ajustando los coeficientes PID.
5. Sí, es un controlador de retroalimentación integrado PID. Creo que los ruidos provienen del sensor y esa es la razón por la que estoy tratando de construir un filtro más nítido, buscando asesoramiento sobre el diseño del filtro.
¡Buen consejo! Para el espectro de lo controlado, ¿qué se debe proporcionar, la salida del filtro (medidas filtradas) en el lazo de control o la salida del controlador?
Tienes razón Neil. Gracias por señalar eso. He agregado más detalles sobre el sistema y actualizaré los espectros más adelante. Para el espectro de bucle cerrado, ¿debo proporcionar la salida del controlador o las medidas filtradas?
¿Supongo que le están pagando para que la producción de la 'planta' sea cero? Puede reducir la 'perturbación' dentro del ancho de banda del bucle, llegará a la 'planta' fuera de ese ancho de banda. 'Ruido' dentro del ancho de banda del bucle de irreductible, pero es posible que no tenga el mejor ancho de banda del bucle. La latencia del 'filtro' limita el ancho de banda de su bucle debido a problemas de estabilidad, a menudo es mejor omitir el 'filtro' y reducir el 'ruido' reduciendo el ancho de banda del bucle. ¿El espectro de 'perturbación' y 'ruido' puede hacer que su especificación sea inalcanzable? Muestre el espectro para cada flecha en su diagrama. Etiquete las flechas S0, S1, etc. para su identificación.
Entonces, ¿qué trazar? Espectros de: salida del sensor de bucle abierto para una entrada cero limpia (¿es esto 'ruido'?), 'perturbación', ganancia de bucle abierto del bucle preferiblemente sin el filtro de diezmado si puede hacerlo (esto permite la respuesta de filtrado de bucle cerrado del bucle por determinar), salida de 'planta' de bucle cerrado que muestra a qué frecuencias no cumple con sus expectativas, y cualquier otra cosa que considere relevante.
¡Te has quedado callado! ¿Es porque estás preparando las tramas o te intimida el esfuerzo necesario para hacerlo correctamente? El punto es que como su filtro diezmador está dentro del lazo de control, no puede tener simultáneamente un ancho de banda de lazo grande para controlar la 'perturbación' y un filtro estrecho para rechazar el 'ruido', porque ese filtro estrecho requerirá un ancho de banda de lazo pequeño para mantener la estabilidad.
Gracias por tu recordatorio Neil. De hecho, estoy preparando los datos y modificando el sistema para la exportación de datos. Entiendo la compensación y, en realidad, la perturbación es muy lenta, a un nivel de 1 mHz a 1 uHz. Esta fue mi tesis de licenciatura y ahora estoy tratando de mejorarla para ver si existe la posibilidad de que podamos satisfacer las necesidades de nuestros clientes potenciales.

Ha definido su DC como variable a 0.000001Hz. ¿Sabes que esto es 1000000s, o 1,9 años? Si esa es realmente su intención, con una frecuencia de muestreo de 64 000 Hz, ¡necesita promediar 64 000 000 000 muestras para obtener su medición de 1 CC! Me imagino que realmente no se refiere a una tasa de CC tan baja, pero asumiendo algo en la región de Hz bajos, le sugiero que lo haga mediante filtrado analógico y establezca su frecuencia de muestreo mucho más baja. Deje que el filtrado del condensador analógico tome la molestia y realice el muestreo digital mucho más lentamente para evitar desperdiciar la lógica digital.