jueves, 24 de marzo de 2011

Filtro software para suavizar las oscilaciones

La mayoría de las veces que disponemos de sistemas de adquisición de datos del exterior, ya sea por la sensibilidad o por tratarse de una señal física muy variable, nos podemos encontrar con que la señal fluctúa demasiado.

Podemos utilizar sistemas de filtrado como el filtro Kalman o Filtro de Wiener sin embargo en este post me gustaría explicar un sistema que es muy sencillo de implementar y muy apropiado para incluirlo en dispositivos con no demasiado rendimiento o que queremos que consuma muy pocos recursos en su aplicación.

Como base de pruebas vamos a utilizar una hoja de cálculo y generar una onda sinoidal y aplicarle una señal aleatoria de ruido, de esta manera podremos ver como actual el filtro al conocer el valor original y compararlo con el esperado. Esto lo podemos hacer siguiendo los siguientes pasos:

Utilizando nuestra hoja de cálculo preferida podemos generar una señal de pruebas. En este caso he generado una onda sinoidal basada en una columna de valores desde 0 hasta 359 y convirtiendo dichos valores en radianes


De esta manera se puede ver la onda sinoidal que se genera y será nuestra señal limpia.


Podemos generar ruido usando una función aleatoria y añadiendoselo a nuestra señal limpia. El valor aleatorio es entre 0 y 1 por lo que le restamos 0.5 para que sea entre -0.5 y 0.5 y así disponer de valores negativos y lo dividimos entre 6 para que no sea un ruido muy exagerado.


Ahora sumamos el valor de ruido que hemos generado a la señal limpia


Y así tenemos una onda sinoidal con ruido aleatorio


El filtro que utilizaremos será muy sencillo y se basará en combinar el valor actual y el anterior para generar el nuevo valor para la señal. De manera que la fórmula se quedará como

Valor Actual = (Valor Anterior)*k + (Valor Actual)*j

donde k y j deben ser entre 0 y 1 y ambos sumar 1. Si usamos k=0 y j=1 no estaríamos aplicando el filtro.


el factor k y j deciden cuanto peso o importancia tiene la señal anterior y actual o cuanto rápido olvida el filtro los valores anteriores.

En esta gráfica se han utilizado los valores de k=0.6 y j=0.4


En esta otra se aplican k=0.8 y j=0.2 viendo que el filtro suaviza más pero desplaza los valores al darle mucha importancia a la señal anterior.


Añadiendo otra columna, podríamos restar el valor filtrado con el valor limpio y así averiguar la bondad del sistema a nivel estadístico.

En este post he intentado mostrar una forma muy sencilla para la implementación de filtros donde, como podeis ver por su sencillez, es fácil transladar a nuestros Arduinos o cualquier otro sistema donde nos sea necesario, además de consumir pocos recursos y ser bastante rápido en su aplicación.

5 comentarios:

  1. Buenas!

    He estado mirando y no encuentro por ningún sitio un mail de contacto. Tengo un proyecto para el acelerometro y tengo unas cuantas dudas.

    Salu2 y enhorabuena pro el blog, está muy bien.

    ResponderEliminar
  2. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  3. puedes contactar conmigo en:

    i.martinezmarchena at gmail.com

    Salu2

    ResponderEliminar
  4. existe algún programa que haga oscilaciones por favor envíenme el link a mi correo boosterpablo@hotmail.com
    gracias.

    ResponderEliminar
  5. Muchas gracias por compartir información como esta.

    ResponderEliminar