Filtro paso bajo y paso alto exponencial (EMA) en Arduino Deja un comentario

Llevamos unas entradas hablando sobre cómo reducir el ruido en mediciones mediante el muestreo múltiple y la aplicación de filtros como el filtro de media móvil.

En esta entrada vamos a ver el filtro exponencial EMA (Exponential Moving Average). El filtrado exponencial EMA es uno de los más empleados en electrónica digital por sus buenos resultados unidos a una increíblemente sencilla y eficiente implementación.

El filtro EMA consiste en obtener un valor filtrado a partir de una medición mediante la aplicación de la siguiente expresión

A_n = alpha M + left ( 1 - alpha right ) A_{n-1}

Siendo An el valor filtrado, An-1 el valor filtrado anterior, M es el valor muestreado de la señal a filtrar, y alpha es un factor entre 0 y 1.

Por tanto, el filtro EMA presenta un aporte de información “nueva” a través de la medición M, y un efecto de suavizado basado en la memoria que aporta el valor filtrado anterior An-1. El resultado de un filtro exponencial EMA es una señal suavizada donde la cantidad de suavizado depende del factor alpha, como analizaremos posteriormente.

Las ventajas en cuanto a sencillez y eficiencia computacional son evidentes. El cálculo requiere una única instrucción sencilla. En cuanto a requisitos de memoria necesitamos almacenar únicamente el valor filtrado anterior. Esto supone una gran ventaja computacional frente a otros filtros que requieren guardar N valores y ejecutar cálculos sobre todos ellos.

Como todos los filtros que suavizan una señal (no es exclusivo del filtro EMA) podemos emplear el filtro exponencial como un filtro paso bajo, es decir, un algoritmo que (idealmente) deja pasar los componentes frecuenciales inferiores a una frecuencia de corte.

Podemos emplear el filtro paso bajo para eliminar el ruido de alta frecuencia superpuesto a la señal, lo que podemos emplear para mejorar la medición de sensores y las comunicaciones, entre otros usos.

Lamentablemente, ningún filtro real es perfecto y los filtros que podemos generar en la realidad tienen limitaciones que lo alejan del comportamiento ideal.

Además, aunque pudiéramos genera un filtro ideal tampoco significa que pudiéramos eliminar por completo el ruido, ya que ciertas frecuencias pueden superponerse con las frecuencias de interés de la propia señal (las variaciones reales de la señal).

Aunque menos frecuentes, también es posible obtener un filtro paso alto, es decir, eliminar las frecuencias inferiores a una frecuencia de corte.

Un filtro de paso alto puede servir, por ejemplo, para eliminar digitalmente el componente de corriente continua de una señal (bias), variaciones lentas comparadas con la frecuencia de interés, detección de cambios bruscos en la señal, entre otros.

Si pudiéramos construir un filtro de paso bajo ideal, para obtener el filtro de paso alto únicamente tenemos que restar la señal tras el filtro paso bajo a la señal original.

Por descontado, en el mundo real también es imposible construir un filtro de paso alto ideal. En el caso (muy frecuente) de construir el filtro de paso alto a partir de un filtro de paso bajo, las limitaciones que obtendremos son el resultado de las del filtro paso bajo empleado.

El factor Alpha condiciona el comportamiento del filtro exponencial y está relacionado con la frecuencia de corte del filtro. Sin embargo una relación sencilla no es siempre posible ya que depende del tiempo de muestreo de nuestro sistema que, en principio, es desconocido y posiblemente variable entre ciclos.

De forma cuantitativa:

  • Un valor Alpha = 1 proporciona la señal sin filtrar, ya que prescinde del efecto filtrado que proporciona la medición anterior.
  • Un valor de Alpha = 0 provoca que el valor filtrado siempre sea 0, ya que prescinde la información nueva que aporta la medición al sistema.

Disminuir el factor Alpha aumenta el suavizado de la señal, pero a costa de introducir consecuencias también negativas. Por un lado, podemos eliminar componentes frecuenciales que realmente nos fueran de interés, clasificando como ruido algo que realmente era una variación real de la señal.

Por otro lado, disminuir el factor Alpha aumenta el tiempo de respuesta del sistema, es decir, el tiempo que tarda el sistema en estabilizarse ante una entrada constante. Esto se traduce en la introducción de un retraso entre la señal original y la señal filtrada.

Lógicamente el valor de Alpha adecuado dependerá de las características de nuestro sistema, de la señal muestreada, y el ruido que queramos eliminar. En principio, deberemos ajustar el valor para que resulte adecuado a nuestro montaje, siendo valores habituales 0.2-0.6.

Para ilustrar la variación del comportamiento del filtro paso bajo y paso alto vamos a ver el efecto para distintos valores de Alpha ante una misma señal simulada. La señal tiene un componente senoidal principal y superpuesto ruidos de distintas frecuencias.

Aquí tenemos el resultado de filtro paso bajo para un valor de Alpha de 0.6 (un valor bastante común en el mundo real). Vemos que se ha eliminado una parte del ruido de alta frecuencia, y conservado la mayor parte de la señal.

El resultado de filtro paso bajo para un valor de 0.2. El suavizado se ha incrementado y hemos eliminado todo el ruido de alta frecuencia. Por contra, el retraso de la señal filtrada empieza a hacerse evidente.

Y el resultado del filtro paso bajo para un valor bajo de 0.05. Se ha eliminado todos los componentes de la señal excepto el principal, pero a cambio tenemos un retraso muy importante de la señal filtrada.

Respecto al filtro de paso alto, aquí tenemos el resultado para el filtro paso alto para un valor de Alpha de 0.6. Vemos que se elimina las componentes de baja frecuencia de la señal, dejando las variaciones más rápidas, que aparecen centradas en el eje Y0.

Y aquí el resultado del filtro de paso alto para un valor de Alpha de 0.025. Observamos que se conserva la forma de la señal original, pero pasado un cierto transitorio se ha eliminado por completo el bias de la señal, que ahora aparece centrada en el origen.

Como veis tenemos una gran variedad de comportamientos con el mismo filtro y da lugar a resultados muy interesantes, desde suavizado de señal y filtrado de ruido de alta frecuencia con el filtro paso bajo, a eliminación del bias u obtención de frecuencias principales con el filtro paso alto.

Resulta habitual encontrar bibliografía y proyectos donde se emplea un filtrado exponencial EMA. Lo que no es tan frecuente de encontrar es explicar por qué funciona un filtro EMA.

Así que ¿Por qué esta sencilla operación es capaz de filtrar el ruido de una señal?

A_n = alpha M + left ( 1 - alpha right ) A_{n-1}

Atención, a continuación llega un apartado de uso demostraciones matemáticas “denso”. Si no te gustan las matemáticas, o no te apetece calentarte la cabeza ahora mismo, puedes pasar al siguiente apartado.

En realidad el filtro exponencial EMA es un caso particular de media de pesos ponderados, es decir, un cálculo de media en la que cada uno de los elementos Xi dispone de un factor Wi que pondera su efecto en el cálculo global de la media.

M_{ponderada} = frac{sum left ( w_i cdot x_i right )} {sum left ( w_i right )}

¿Cómo es que la formulación que hemos visto anteriormente para el filtro EMA puede deducirse de un caso particular de media ponderada?

Partamos de una expresión genérica para obtener una serie de valores filtrados Ai a partir de una serie de mediciones Mi, sujeta a dos parámetros alpha y beta.

A_i = alpha M_i + beta A_{i-1}

Analizando lo que ocurre al emplear esta expresión a la serie de mediciones

A_0 = alpha M_0
A_1 = alpha M_1 + beta A_0 = alpha M_1 + beta alpha M_0
A_2 = alpha M_2 + beta A_1 = alpha M_2 + beta alpha M_1 + beta^2 alpha M_0

Generalizando podemos escribir,

A_{n+1} = alpha M_{n+1} + beta A_n = alpha sum_{t=0}^{n} left ( beta^t M_{n-t} right )

Por tanto, el próximo valor filtrado es la suma de todas las mediciones anteriores ponderados por un factor exponencial beta (que da origen al nombre del filtro) y escalado con un factor alpha.

La teoría indica que la media calcula el efecto de todas las mediciones anteriores, aunque el factor beta^n haga que su efecto sea reducido. No obstante en el mundo real, a consecuencia del redondeo, la contribución de los términos es nula pasada unas cuantas iteraciones.

¿De donde viene las restricciones de que tanto alpha como beta deben ser menor que 1, y que ambos sumados deben ser igual a 1? Bueno, ¿supongo que a estas alturas decir que porque resulta intuitivo no os satisface no? Ya que estoy metido en harina vamos a llegar hasta el final.

En primer lugar, dado que el valor filtrado se obtiene a partir de una serie de tipo geométrico se deduce que, salvo que todas las mediciones sean igual a 0, cualquier factor de beta mayor que 1 provocará una señal general retroalimente rápidamente para tender a infinito.

Por otro lado, valores de beta negativos producirían soluciones oscilantes. Por tanto, se deduce que para obtener una estabilidad beta debe estar comprendido entre 0 y 1.

Para comprobar la relación entre alpha y beta, supongamos como simplificación que introducimos como entrada un valor constante C. Es razonable esperar que el valor filtrado obtenido sea igualmente C. (menudo filtro sería si introducimos constantemente, por ejemplo, 10, y el nos diera 8, o 12 ¿no?)

C = alpha sum_{t=0}^{n} left ( beta^t Cright ) = alpha C sum_{t=0}^{n} left ( beta^t right )

Siendo B

C = alpha C frac{1}{1-beta}

Que finalmente se reduce a,

beta = 1 - alpha

Con lo que las restricciones sobre alpha y beta quedan explicadas. También podríais haber aceptado la respuesta de que desde el punto de vista de una formulación variacional del problema las restricciones sobre alpha y beta permiten el invariante del funcional de energía. ¡Pero oye! Habéis preferido la demostración con series.

Con esto hemos demostrado que la expresión general del filtro EMA es en realidad una media ponderada cuyos factores de ponderación siguen una progresión exponencial de parámetro beta, y que es necesario que beta sea mayor o igual a 0 y menor que 1 para que el sistema sea estable.

Aquí tenemos una implementación sencilla de un filtro de paso bajo y paso alto exponencial (EMA). En el ejemplo vamos a filtrar una serie de integer desordenados que simulan una señal como la que podríamos obtener al realizar una medición. Accedemos a estos valores a través de la función GetMeasure(), que simula el proceso de adquisición de datos.

Los resultados se muestran por puerto serie. Si empleáis el Serial Plotter del IDE Standard podréis ver los resultados gráficamente de forma sencilla.

Los resultados en el Serial Plotter del IDE Estándar serán los siguientes,

¿Y si lo metemos en una librería para que sea más cómodo de usar? Por supuesto que sí, aquí una librería Single EMA Filter para Arduino. ¡A disfrutarlo!

 

Si te ha gustado esta entrada y quieres leer más sobre Arduino puedes consultar la sección
tutoriales de Arduino

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Enviar Whatsapp
Hola 👋
¿En qué podemos ayudarte?