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 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 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.

Reducir ruido usando umbrales

Los umbrales son la forma más intuitiva de filtrado de errores. Consiste en establecer valores a partir de los cuales no confiamos en las medidas de nuestros sensores. Estos umbrales pueden establecerse por varios motivos.

  • Limite de funcionamiento de nuestro sensor. Son los limites más alla de los cuales sabemos que nuestro sensor no trabaja correctamente. Por ejemplo muchos sensores de distancia comienzan a dar lecturas muy poco confiables a partir de ciertas distancias tanto de muy cerca como de muy lejos.

  • Limites del entorno. Limites esperados del entorno donde nuestro sensor esta situado. Por ejemplo un sensor de teperatura colocado en una habitación normal de una vivienda se pueden fijar como limites como límite inferior 0° y como limite superior 60° aunque el sensor trabaje en un rango mayor de temperaturas.

Umbrales para el valor

Se aplican directamente al valor medido por el sensor. Las lecturas que excedan los limites son eliminadas. Estos filtros con los primeros que se comprueban y facilitan el trabajo de los filtros que apliquemos después al eliminar valores erroneos extremos. Su implementación es muy sencilla.

Siendo S el valor medido por el sensor , y Tmin y Tmax los umbrales mínimo y máximo S será válido si:

S > Tmin & S < Tmax

Umbrales para el cambio

Se aplican a la cantidad que cambia el valor medido por el sensor en un tiempo determinado. Para poder usar este filtro es necesario conocer el tiempo que a transcurrido entre medidas del sensor. Se fija un valor máximo de cambio por unidad de tiempo. El valor del sensor se considerará valido si el cambio de valor respecto de la lectura anterior es menor que el tiempo transcurrido por el valor máximo de la unidad de cambio

Siendo S el valor medido por el sensor, t el momento actual, dt el periodo de tiempo transcurrido desde la anterior medida de valores del sensor,  T el umbral de cambio máximo permitido S será válido si:

S(t) < S(t-dt) + (T * dt) & S(t) > S(t-dt) – (T * dt)

Hay que tener en cuenta que S puede ser un valor correcto dentro de los umbrales Tmin y Tmax, pero que ha cambiado demasiado rápido para considerar la lectura correcta. por ejemplo tenemos un sensor de temperatura dentro de una habitación y en un segundo la temperatura pasa de 12º a 35º, obviamente hay algo mal.

Histéresis

El ruido puede causar comportamiento errático. En este caso vamos a ver que problemas puede causar cuando hay un umbral de activación en un sistema. Por ejemplo una célula fotoeléctrica que determina cuando encender o apagar unas luces. Para ello hemos programado un microcontrolador «lea» el valor de la célula y cuando sea menor de 100 encienda la luz. Cuando el valor se aproxime a este punto puede devolver lecturas como estas:

100, 99, 98, 101, 102, 99, 100, 97

Que traducido a la luz que controla sería:

Off, On, On, Off, Off, On, Off, On

La bombilla parpadea sin parar, va parecer que los espíritus tratan de comunicarse con nosotros a través de ella. Para evitar eso se puede separar el umbral en dos. Uno para encender la luz y otro para apagarla. A este hueco se le llama histéresis. Por ejemplo se podría decidir que por debajo de 100 se enciende pero no se apaga hasta que el valor sea 105. Esta distancia sirve para evitar que la luz actúe erraticamente encendiéndose y apagándose sin parar cuando el valor es próximo al del umbral de activación.

El resultado seria:

100, 99, 98, 101, 102, 99, 100, 97

Off, On, On, On, On, On, On, On

Evitando que la luz parpadee todo el rato.

Reducir ruido usando la media y la desviación típica

Este metido es para detectar y reducir los ruidos intensos y poco frecuentes. La idea principal es que el valor leído más el ruido de baja intensidad se comportan como una función de normal. Se podría ver como que a mayor intensidad del ruido menos probable es que aparezca. Visto en forma de gráfica:

Standard deviation diagram micro.svg
De AinaliTrabajo propio, CC BY-SA 3.0, Enlace

En la imagen se puede ver que según un valor se aleja de la media (μ) menos probable es que pertenezca a la muestra. Así que según su distancia a la muestra podemos saber lo probable que es que pertenezca. Sabiendo esto se ponen una distancia máxima a la media de tal forma que habrá dos umbrales (μ+distancia y μ-distancia) los valores que queden fuera de esos umbrales de eliminan. Valores habituales de filtrado corresponde a μ±σμ±2σ y μ±3σ. O aproximadamente dejan fuera el 16%, 2% y 0.1% de los valores (a cada lado del umbral). Para filtrar valores fijamos la probabilidad de pertenencia a la muestra que les «exigimos». Por ejemplo si un valor solo puede pertenecer a la muestra con una seguridad del 5% lo descartamos.

Este proceso lo podemos aplica una vez o varias, repitiéndolo hasta que no se elimine ninguno de los valores.

Una vez eliminados los valores que quedan fuera del umbral podemos aplicar alguno de los filtros ya vista como la moda, mediana o media para calcular el valor.

Ejemplo:

Usamos como limite 2σ. repetiremos el filtrado hasta que no haya descartes en las muestras

Iteración 1

muestras iniciales: [23, 4, 5, 5, 6, 4, 5, 4, 5, 6, 4, 12]

media: 6.9167

desviación estándar: 5.5179

tolerancias: 6.9167+(2 * 5.5179) = 17.953         6.9167-(2 * 5.5179) = -4.1191

muestras admitidas: [4, 5, 5, 6, 4, 5, 4, 5, 6, 4, 12]

Iteración 2

muestras iniciales: [4, 5, 5, 6, 4, 5, 4, 5, 6, 4, 12]

media: 5.4545

desviación estándar: 2.2962

tolerancias: 5.4545 + (2 * 2.2962) = 10.047       5.4545 – (2 * 2.2962) = 0.8621

muestras admitidas: [4, 5, 5, 6, 4, 5, 4, 5, 6, 4]

Iteración 3

muestras iniciales: [4, 5, 5, 6, 4, 5, 4, 5, 6, 4]

media: 4.8

desviación estándar: 0.7888

tolerancia: 4.8 + (2 * 0.7888) = 6.3776        4.8 – (2 * 0.7888) = 3.2224

muestras admitidas: [4, 5, 5, 6, 4, 5, 4, 5, 6, 4]

Ahora calculamos los distintos valores usando al media, moda y mediana

media: 4.8 

moda: 4

mediana: 5

Comparamos entre los resultados entre los datos filtrados y sin filtrar:

Filtrado Sin filtrar
Media 4.8 6.9167
Mediana 5 5
Moda 4 4

Es normal que solo se haya visto afectada la media, ya que tanto la moda como la mediana están libres de la influencia de los valores en los extremos.

Reducir ruido usando la mediana

Otra idea para reducir el ruido es ordenar todos los valores y coger el central. La idea es muy parecida a la de la media. Se considera el ruido como la suma de una pequeña cantidad aleatoria cuyo valor oscila entre -e y e. Si el valor real es V las muestras se dividirán entre la que sumen el ruido (V+e) y la que lo resten (V-e) . Quedando el valor real V mas o menos en el centro de todos los valores. La mediana es precisamente eso, el valor en el centro de todos los valores. Para calcularlo es necesario ordenar la lista de muestras. Este es su punto débil ya que aumenta el coste computacional de calcular la mediana.

Tiene varias ventajas:

  • Es sencillo
  • Es insensible al ruido intenso pero poco frecuente.

También tiene sus inconvenientes:

  • Ordenar las muestras puede ser una tarea costosa a nivel computacional
  • Solo se puede usar cuando se puedan tomar varias muestras de la misma medida

Ejemplo:

Partimos de las siguientes muestras [23, 4, 5, 5, 6, 4, 5, 4, 5, 6, 4, 12]

Mediana: 5

El resultado no se ha visto influido por los valores extremos (12 y 23)

Reducir ruido usando la moda

El uso de la moda para evitar el ruido es parecida al caso de la media, pero en lugar de sumar todos los valores se selecciona el que más veces se repite. La idea en que se basa en que la mayoría del ruido es pequeño así que el valor que más veces aparezca es el más cercano al real.

Al igual que la media, esta técnica solo sirve si se pueden capturar suficiente numero de muestras sin que el valor cambie de forma apreciable. En este caso necesitamos mas valores que en caso de la media.

Tiene varias ventajas:

  • Es sencillo
  • Requiere poco «coste computacional»
  • Es insensible al ruido intenso pero poco frecuente.

También tiene sus inconvenientes:

  • Solo se puede usar cuando se puedan tomar varias muestras de la misma medida
  • Requiere muchas medidas para ser exacto
  • Por lo general supone perder «resolución» en la medida para poder «agrupar» las medidas y calcular la moda. Por ejemplo si tenemos los valores 4,13 y 4,18 hay que eliminar el último decimal para poder contar ambos como el mismo valor 4,1

Ejemplo:

Partimos de las siguientes muestras [23, 4, 5, 5, 6, 4, 5, 4, 5, 6, 4, 12]

Moda: 4

El resultado no se ha visto influido por los valores extremos (12 y 23)

Reducir ruido usando la media

Vamos a ver una técnica para ocuparnos del ruido habitual pero de baja intensidad. En el caso de que podamos tomar varias medidas sin que haya a penas variación del valor a medir. Es decir, estamos midiendo un valor que no cambia o lo hace tan lentamente que podemos capturar varias muestras sin que cambie.

Podemos ver el ruido como la suma de una pequeña cantidad aleatoria cuyo valor oscila entre -e y e. Eso significa que si tomamos suficiente muestras y las sumamos entre ellas lo mas probable es que los diferentes incrementos y decrementos que el ruido produce al valor medido se «neutralice» entre si. Ese calculo, sumar varios valores y dividir la suma entre el número de valores es precisamente la media.

Tiene varias ventajas:

  • Es sencillo
  • Requiere poco «coste computacional»
  • Se puede aplicar a cualquier número de muestras, aunque a mayor número de muestras mejores resultados.

También tiene sus inconvenientes:

  • Solo se puede usar cuando se puedan tomar varias muestras de la misma medida.
  • Hay que filtrar primero los valores de ruido más intenso ya que «desplazan» el valor de la media y son tan poco habituales que no se «neutralizan» al sumar las medidas
  • No todos los ruidos siguen el modelo propuesto de valor aleatorio entre e y -e

Ejemplo:

Partimos de las siguientes muestras [23, 4, 5, 5, 6, 4, 5, 4, 5, 6, 4, 12]

Media: 6.9167

Se puede ver como el 12 y el 23 han influido «desplazando» la media hacia su lado.