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
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.
Buenas!
ResponderEliminarHe 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.
Este comentario ha sido eliminado por el autor.
ResponderEliminarpuedes contactar conmigo en:
ResponderEliminari.martinezmarchena at gmail.com
Salu2
existe algún programa que haga oscilaciones por favor envíenme el link a mi correo boosterpablo@hotmail.com
ResponderEliminargracias.
Muchas gracias por compartir información como esta.
ResponderEliminar