Correo: [email protected] - Teléfono: +56979962128

Básicamente este filtro encuentra un valor filtrado de una medición. Para ello utiliza la fórmula de la forma:
EMA 1
aporta un suavizado que depende directamente del valor , tiene ventajas en el cálculo ya que utiliza una única instrucción y almacena en memoria solo el valor filtrado anterior. En esta ocasión utilizaremos el filtro exponencial como filtro pasa bajos para eliminar ruidos de altas frecuencias en la señal que permite estabilizar la medición de sensores
  El factor Alpha es un condicionante para el filtro exponencial y sus valores variables van entre 0 y 1, con ello Alpha = 1, entrega una señal sin filtrar Alpha = 0, entrega un valor filtrado siempre 0 Una disminución del valor Alpha aumenta la suavidad de la señal, haciéndola más estable y menos susceptible a cualquier ruido, pero esto también provoca un aumento del tiempo de respuesta del sistema, de alguna forma retrasa la señal respecto de la original. Los valores más habituales van desde 0,2 a 0,6 Ahora bien ¿Cómo utilizamos esto en nuestro Arduino? Debemos utilizar la librería del filtro EMA, la puedes descargar en el link. Si nunca has descargado librerías, lo que debes hacer es presionar el botón virtual “code” y posteriormente “Download zip”. Esto último será una constante en la incorporación de librerías externas, siempre debe estar en formato de compresión zip y respetar cierta estructura para que el IDE de Arduino pueda utilizarla, estructura como la de la imagen.
EMA 2
  Para este caso en particular, la librería fue descargada de GitHub (plataforma para crear proyectos abiertos, por ello el código puede ser descargado por cualquier usuario) y pertenece al desarrollador Luis Llamas. Tras la descarga cargamos la librería al IDE, desde “Programa”, “Incluir librería”, “Añadir biblioteca .zip
EMA 3
 

Buscamos la librería y presionamos abrir. Si todo está correcto en la estructura y el formato tendremos el mensaje de tranquilidad.

EMA 4
  Ya podemos aplicar el filtro a cualquier señal. Haremos una prueba con un sensor de humedad (higrómetro) conectado al pin analógico 0, en un programa simple y lo contrastaremos con la señal filtrada con los parámetros óptimos mencionados, recordemos que variaban de un alpha entre 0,2 y 0,6 como recomendación. Las instrucciones básicas usadas para esta librería son:
  • SingleEMAFilter<int> singleEMAFilter(alpha);
    • Asigna Alpha para condición de filtrado
  • addValue(valor);
    • añade el valor al filtro y devuelve el valor de un filtro pasa bajos
  • GetLowPass();
    • Ultimo valor filtrado como pasa bajos (devuelve mismo valor anterior)
  • GetHighPass();
    • Ultimo valor filtrado como pasa altos
El código es una simple lectura analógica, con la inclusión de la librería, el factor de filtrado y el filtro propiamente tal, además del arreglo para graficas.
#include                        //librería EMA

int humedad;                   //declaración de tipo de dato y variable

int humedadfiltrada;           //declaración de tipo de dato y variable filtrada

SingleEMAFilter singleEMAFilter(0.6);       //filtro, idealmente entre 0,2 y 0,6

void setup() {

  Serial.begin(9600);                           //inicio de comunicación serial

}

void loop() {

 humedad = analogRead(A0);                     //lectura analógica

 humedadfiltrada = singleEMAFilter.AddValue(humedad); //filtro valor analógico

 Serial.print(humedad);                        //primera variable a graficar

 Serial.print(«,»);         //separador necesario para graficar otra variable

 Serial.println(humedadfiltrada);             //ultima variable a graficar

 delay(50);                                   //delay para evitar ruido excesivo

}
  Para visualizar el filtro pasa bajos utilizamos directamente la instrucción addvalue, para realizar el ejemplo del filtro con solo una línea de comandos. Si quisieran usar un pasa altos, la gráfica debe realizarse a partir de la instrucción singleEMAFilter.GetHighPass() y no de addvalue. Para todas las gráficas el color azul es la variable directamente leída y el color rojo es la variable filtrada de acuerdo al valor de alpha. Todos los gráficos están considerados con el mismo tiempo. Primero veremos la prueba con un filtro de 0,1, fuera del rango optimo recomendado. Podemos ver que la señal filtrada se vuelve lenta en relación a la variable sin filtrar, puede ser útil para un display donde no es importante la rapidez de la respuesta de la lectura de información.  
EMA 5
Continuamos con el valor mínimo recomendado, un filtro con un alpha de 0,2, es posible ver que la señal filtrada se acerca mucho más a la variable sin filtrar, algo amortiguada, pero con mayor respuesta. Este es un valor más indicado si necesitamos que la respuesta sea estable y algo cercana a los tiempos de la variable.  
EMA 6
Para efectos prácticos analizaremos el factor alpha de 0,6 y no mayor. Esto porque si nos acercamos a 1, básicamente no existe filtro y todo lo que veremos será prácticamente un par de señales superpuestas.    
EMA7
La señal filtrada es mucho más rápida, casi tanto como la variable no filtrada, simplemente algo más suavizada. Estos valores elevados son ideales para ejecutar controles que requieran ser más precisos, cuando necesitemos respuestas eficientes ante perturbaciones, sin embargo, se sacrifica la estabilidad ganada con valores pequeños de factor alpha. Dadas las características de tus proyectos, esta herramienta puede ser muy útil, pero debes equilibrar las necesidades, mayor velocidad de respuesta (levemente suavizada la señal filtrada) y menor estabilidad o estabilidad (menores fluctuaciones en cambios de valores) sobre velocidad de respuesta. Visita nuestra pagina de Arduino y nuestra Tienda para mas información.    

Preguntas frecuentes

¿Qué es un filtro exponencial EMA?

Es un filtro que obtiene un valor filtrado a partir de una medición aplicando una fórmula de media móvil exponencial. Se usa como filtro pasa bajos para eliminar el ruido de alta frecuencia y estabilizar la lectura de un sensor.

¿Qué ventaja tiene el filtro EMA frente a otros?

Que es muy liviano: se calcula con una única instrucción y solo necesita guardar en memoria el valor filtrado anterior. Eso lo hace ideal para microcontroladores con recursos limitados.

¿Qué hace el factor alpha en un filtro EMA?

Determina cuánto suavizado se aplica. Es el parámetro que condiciona el comportamiento del filtro: define qué peso tiene la medición nueva frente al valor filtrado anterior.

¿Cuándo conviene usar un filtro EMA en un proyecto con Arduino?

Cuando la lectura de un sensor viene con ruido de altas frecuencias y salta de un valor a otro. El filtro estabiliza la medición sin necesidad de promediar muchas muestras ni guardar un historial largo.

Aprende esto en un curso

Si prefieres verlo en vivo y con alguien que resuelva tus dudas, estos cursos presenciales de MCI Educación cubren el tema de este tutorial: