Filtro de media móvil exponencial

Este es posiblemente uno de los filtros más sencillos de implementar que hay. Su funcionamiento es similar al filtro de media móvil, pero solo tiene en cuenta el valor actual V y el anterior Vant. El filtro consiste en multiplicar Vant por un valor a y V por (1-a) y luego sumarlos.

V = ((1-a) * V) + (a * Vant)

Siendo a un valor entre 0 y 1. Cuanto mayor sea el valor de a mayor importancia se le dan a los valores anteriores, sería como aumentar la n, el número de muestras, del filtro de media móvil. Al igual que con la n, a mayor valor tenga a, mayor retardo se produce en la señal. Los valores habituales para a suelen oscilar entre 0,2 y 0,6.

Veamos en nuestro simulador como usarlo para, partiendo de una señal sinusoidal (verde)a la que añadimos ruido (azul) la filtramos usando un filtro de media móvil (naranja):

Filtro de media móvil exponencial

Es un filtro simple, rápido y no requiere prácticamente recursos, pero hay un un caso especial que es computacionalmente aun más rápido. Cuando a vale 0,5, en ese caso el filtro se resume en:

V = (V + Vant) / 2 

La división por dos se puede reemplazar por un desplazamiento a la derecha lo que permite usar números enteros. De esta forma el coste de aplicar este filtro es mínimo.

Filtro elimina banda o stop banda por software

Un filtro elimina banda es un filtro con dos frecuencias de corte, el filtro atenúa las frecuencias entre esas dos frecuencias de corte. Se podría ver cómo lo contrario a un filtro paso banda.

Una de las formas más simples de hacerlo es usar un filtro paso alto que deje solo las frecuencias por encima a la frecuencia de corte superior y uno paso bajo que deje solo las frecuencias inferiores a la de corte inferior. Para obtener el resultado sería necesario sumar de ambos filtros.

Veamos un poco de código:

//filtro paso bajo
double a_low = dt / (RC_low + dt)
output_low[t] = output_low[t-1] + a * (sensor[t] - output_low[t-1]); 

//filtro paso alto
double a_high = RC_high / (RC_high + dt);
output_high[t] = a_high * (output_high[t-1] + sensor[t] - sensor[t-1]);

//sumamos ambos
output = output_high[t] + output_low[t];

En nuestro simulador podemos usarlo para hacer una curiosa prueba, partiendo de una señal sinusoidal (verde), le añadimos ruido (azul) y usamos el filtro elimina banda para eliminar la señal y dejar solo el ruido (naranja):

Filtro elimina banda

Filtro paso banda por software

Un filtro paso banda es un filtro que tiene dos frecuencias de corte. Una por debajo, atenúa las frecuencias por debajo de ella y otra encima, atenúa toda frecuencia por encima de ella.

Hay muchas formas de implementarlo, una de las más sencillas es usar dos filtros paso bajo, cada uno de ellos ajustado a una de las frecuencias. La forma de funcionar de este filtro es muy sencilla. Un filtro atenúa todo lo que hay por encima de la frecuencia superior y el otro filtro atenúa todo lo que hay por encima de la frecuencia inferior. Un momento, si queremos quedarnos con las frecuencias entre ambos filtros y el filtro inferior atenúa todo lo que hay por encima de su frecuencia de corte. ¿No está atenuando las frecuencias que queremos conservar? Efectivamente. La idea es que solo queden las frecuencias por debajo de la frecuencia inferior para restarlas del resultado obtenido por el filtro superior. Eso nos dejara solo las frecuencias comprendidas entre ambos filtros.

Veamos un poco de código:

//filtro paso bajo frecuencia inferior
double a_low = dt / (RC_low + dt)
output_low[t] = output_low[t-1] + a * (sensor[t] - output_low[t-1]); 

//filtro paso bajo frecuencia superior
double a_high = dt / (RC_high + dt)
output_high[t] = output_high[t-1] + a * (sensor[t] - output_high[t-1]); 

//restamos
output[t] = output_high[t] - output_low[t]; 

Y ahora usaremos nuestro simulador para hacer una prueba y eliminar ruido. En la imagen resultante podemos ver como la señal original (verde) es afectada por el ruido (azul) y que tras el filtrado (naranja) se elimina gran parte del mismo acercando la forma de la señal a la original.

Filtro paso banda

Filtro paso alto por software

Un filtro paso alto es un filtro que fija una frecuencia de corte y deja pasar cualquier frecuencia superior a esa, mientras que atenúa frecuencias inferiores, Al menos esa es la teoría, en la realidad «el corte» no es tan limpio y se ven afectadas otras frecuencias. En realidad la frecuencia de corte e inferiores no sufren una caída completa a cero si no una gran atenuación.

En electrónica el modelo más sencillo de filtro paso alto es un filtro RC usando una resistencia y un condensador. En la imagen inferior se puede ver como montarla y como afecta a una señal ruidosa reduciendo el ruido de baja frecuencia, dejando solo la señal de alta frecuencia.

Filtro paso lato RC

Para realizar nuestro filtro paso bajo por software vamos a modelar matemáticamente el filtro RC.

double a = RC / (RC + dt);
output[t] = a * (output[t-1] + sensor[t] - sensor[t-1]);

Donde:

  • dt – Es el tiempo, en sg, entre las muestras t-1 y t
  • RC – Resistencia * Capacidad del condensador
  • output[t] – Es la señal filtrada en el momento t.
  • sensor[t] – Es la entrada sin filtrar en el momento t.

RC en nuestro caso es un valor numérico que emula el comportamiento Para calcular RC partiremos de la frecuencia de corte «fc» que deseemos en Herzios:

RC = 1 / (2 * Pi * fc)

Tras esta visión general vamos a los detalles.

Cuando t = 0 se puede usar como output:

output[0] = sensor[0]

Si no necesitamos guardar los valores no hace falta que usemos un array, podemos usar una sola variable output que almacena el valor del resultado anterior:

output = a * (output + sensor[t] – sensor[t-1]);

Veamos un ejemplo de señal (verde) sinusoidal sometida a ruido de baja frecuencia (azul) que la hace oscilar y filtrada usando un filtro de paso bajo (naranja):

Ejemplo de filtrado con filtro de paso alto

Puedes probar aquí un simulador que cree para mostrar como funcionan los diferentes filtros.

Puedes ver esta misma explicación para filtros de paso bajo.

Filtro paso bajo por software

Un filtro paso bajo es un filtro que fija una frecuencia de corte y deja pasar cualquier frecuencia inferior a esa, mientras que atenúa frecuencias superiores. Al menos esa es la teoría, en la realidad «el corte» no es tan limpio y se ven afectadas las demás frecuencias. En realidad la frecuencia de corte y superiores no sufren una caída completa a cero si no una gran atenuación.

En electrónica el modelo más sencillo de filtro paso bajo es un filtro RC usando una resistencia y un condensador. En la imagen inferior se puede ver como montarla y como afecta a una señal ruidosa reduciendo el ruido de alta frecuencia.

Filtro paso bajo RC

Para realizar nuestro filtro paso bajo por software vamos a modelar matemáticamente un filtro RC.

double a = dt / (RC + dt)
output[t] = output[t-1] + a * (sensor[t] - output[t-1]); 

Donde:

  • dt – Es el tiempo, en sg, entre las muestras t-1 y t
  • RC – Resistencia * Capacidad del condensador
  • output[t] – Es la señal filtrada en el momento t.
  • sensor[t] – Es la entrada sin filtrar en el momento t.

RC en nuestro caso es un valor numérico que emula el comportamiento Para calcular RC partiremos de la frecuencia de corte «fc» que deseemos en Herzios:

RC = 1 / (2 * Pi * fc)

Tras esta visión general vamos a los detalles.

Cuando t = 0 se puede usar como output:

output[0] = a * sensor[0]

Si no necesitamos guardar los valores no hace falta que usemos un array, podemos usar una sola variable output guardando el valor del resultado anterior:

output = output + a * (sensor – output)

Veamos un ejemplo de señal (verde) sinusoidal sometida a ruido de alta frecuencia (azul) y filtrada usando un filtro de paso bajo (naranja):

Ejemplo de filtro paso bajo

Puedes probar aquí un simulador que cree para mostrar como funcionan los diferentes filtros.

Puedes ver esta misma explicación para filtros de paso alto.

Filtro de media móvil

Hemos visto que una forma de reducir el ruido es calcular la media. Pero esto plantea un problema cuando medimos un valor que cambia más rápido de lo que somos capaces de tomar las muestras necesarias. En ese caso hay que cambiar de estrategia, en lugar de capturar n mediciones del mismo valor, se captura solo una y se suman las anteriores n-1 mediciones. Es decir se borra la medición más antigua, se introduce la nueva y se vuelve a calcular la media, de esa forma que el número de mediciones a tener en cuenta para la media nunca cambia.

Los pasos serian los siguientes:

1. Capturar muestras hasta llegar a n muestras
2. Sumar todas las muestras
3. Dividir la suma entre n. Ese es el valor de la señal en ese punto.
4. Eliminar el valor más antiguo
5. Volver al punto 1

Lo ideal es que el tiempo entre mediciones sea el mismo y que sea suficiente para que la señal no varíe demasiado. Si la señal varía de forma continua y suave es posible que el filtro casi no afecte a la forma original de la señal. Sin embargo si hay cambios bruscos puede suavizar estos cambios (por ejemplo en una señal cuadrada). Dependiendo de la duración de la señal, el número de muestras que se usan para calcular la media y el tiempo entre ellas puede afectar más o menos a la señal original.

En la imagen inferior se puede ver como una señal cuadrada (verde) se ve afectada por un filtro de media movil (naranja)

Media móvil de una onda cuadrada

En la siguiente imagen se puede ver como una señal con forma de onda sinusoidal (verde) y su salida tras aplicar un filtro de media movil (naranja). Como la señal es continua y varia de forma suave no se ve casi afectada en la forma, pero si que hay un pequeño desfase en el tiempo, debido a que la media «tarda» en alcanzar el valor original. A mayor sea el número de muestras usadas para calcular la media mayor será este desfase.

Media móvil de una onda sinusoidal

Veamos un ejemplo de la misma señal pero añadiendo ruido de alta frecuencia y aleatorio:

Señal sinusoidal con ruido

Y el resultado tras añadirle un filtro de media movil:

Señal filtrada con un filtro de mediamovil

Para probar este y otros filtros puedes usar este pequeño simulador que cree para ilustrar estos articulos.