Un filtro paso bajo con Arduino permite dejar pasar las variaciones lentas de una señal y atenuar las variaciones rápidas, por lo que resulta especialmente útil para limpiar las mediciones de sensores, reducir el ruido y observar tendencias con mayor estabilidad.
Una de las implementaciones más sencillas y eficientes es el filtro exponencial EMA (Exponential Moving Average), que necesita almacenar únicamente el valor filtrado anterior y realizar una operación matemática por muestra.
Qué es un filtro paso bajo
Los filtros paso bajo permiten el paso de señales por debajo de una frecuencia de corte (banda de paso) y atenúan señales por encima de la frecuencia de corte (banda de atenuación). Los filtros paso bajo, en especial los filtros de media móvil o los filtros Savitzky-Golay, se utilizan a menudo para limpiar señales, eliminar ruido, crear un efecto de suavizado, calcular los promedios de datos, y diseñar diezmadores e interpoladores.
Los filtros paso bajo producen cambios lentos en los valores de salida para facilitar la observación de tendencias y aumentar la proporción de señal a ruido con una degradación mínima de la señal. 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.
Un filtro paso bajo ideal dejaría pasar los componentes por debajo de una frecuencia de corte (Fc). Por su parte, atenuaría los componentes situados por encima de esa frecuencia.
En la práctica, 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).

Por qué las señales necesitan filtrado
En electrónica, cuando se trabaja con señales eléctricas como las medidas de un sensor o una señal de audio, es práctica habitual utilizar filtros. Estos filtros se utilizan para modificar estas señales con el fin de corregirlas, analizarlas o utilizarlas correctamente. Es lo que se conoce como tratamiento de señales.
Una señal es la representación de la información que pasa por un sistema. Una señal electrónica está limitada físicamente en cuanto a precisión, velocidad y alcance. También puede verse modificada por perturbaciones externas.
Por ejemplo, la medición de un sensor suele contener una perturbación que hace que el valor del sensor varíe en torno al valor medido. Esta perturbación se denomina ruido de medición y puede proceder de campos electromagnéticos y de la sensibilidad del sensor. Este ruido de medición debe despreciarse o eliminarse mediante un filtro para obtener un valor correcto.
En teoría, una señal puede tener una representación matemática simple como una función sinusoidal con una frecuencia y amplitud fijas. En la práctica, una señal puede describirse como una superposición de señales con frecuencias y amplitudes diferentes. Son los componentes espectrales.
Qué hace un filtro electrónico
En electrónica, un filtro es un elemento que modifica los componentes espectrales de una señal de entrada. Los filtros pueden amplificar, suprimir o atenuar una señal en una frecuencia determinada.
Existen tres tipos principales de filtros filtros analógicos pasivos que utilizan componentes electrónicos pasivos (resistencias, condensadores, inductores) filtros analógicos activos que utilizan componentes electrónicos pasivos y activos (transistor, amplificador operacional, circuito integrado) filtros digitales producidos mediante un procesador y un programa informático.
Con las señales analógicas, como la medida de un sensor o una señal de audio, es habitual encontrar filtros analógicos pasivos o activos. Pasivos para filtrar el ruido de la medición; activos para amplificar la señal.
Una vez instalado el circuito que realiza el filtrado, la función de filtrado no puede modificarse. Los filtros digitales se gestionan mediante código informático, por lo que no están grabados en piedra.
Suelen utilizarse para procesar y analizar datos con el fin de resaltar determinadas características (colores en una imagen, frecuencia dominante en una señal, etc.).
Tipos de filtro
Hemos dicho que un filtro modifica los componentes espectrales de una señal. En otras palabras, amplifica, suprime o atenúa una señal en una frecuencia determinada.
- paso bajo: atenuar las frecuencias altas
- paso alto: eliminar las frecuencias bajas
- paso banda: paso de una gama de frecuencias
- notch: atenuar una gama de frecuencias
Los filtros electrónicos se utilizan en muchos sistemas electrónicos y a menudo son necesarios para que el sistema funcione correctamente. Un filtro permite limpiar para obtener una mejor lectura de la señal, eliminar un componente en una frecuencia no deseada porque es parásito o interfiere con el sistema, y corregir para obtener una señal coherente.
Filtro EMA: una solución sencilla para Arduino
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
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.
La forma habitual de escribir la operación es la siguiente:
An = An-1 + alpha · (Mn − 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.
Influencia del factor alpha
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.
| Valor de alpha | Comportamiento |
|---|---|
| Alpha = 1 | Proporciona la señal sin filtrar |
| Alpha = 0 | El valor filtrado siempre sea 0 |
| alpha pequeño | Mayor suavizado y mayor retraso |
| alpha grande | Menor suavizado y respuesta más rápida |
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.
Relación entre alpha y frecuencia de corte
En el filtro exponencial la cantidad de suavizado se controla a través del factor alpha. No es sencillo encontrar una relación sencilla con la frecuencia de corte, entre otras cosas, porque la frecuencia de muestreo es desconocida y variable.
Lo que sí sabemos es que cuanto menor sea el factor alpha mayor será el suavizado de la señal, y por tanto, menor la frecuencia de corte. Recordar que, como punto negativo, también será mayor el retraso entre la señal filtrada y la señal original.
Por este motivo, alpha no debe elegirse de forma aislada. El resultado depende de la velocidad con la que Arduino adquiere las muestras, del tipo de señal, de la rapidez de los cambios que deben conservarse y del ruido que se desea atenuar.
Resultados del filtro paso bajo
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.
| Alpha | Resultado observado |
|---|---|
| 0.6 | Se elimina una parte del ruido de alta frecuencia y se conserva la mayor parte de la señal |
| 0.2 | Se incrementa el suavizado y se elimina todo el ruido de alta frecuencia |
| 0.05 | Se eliminan todos los componentes excepto el principal, con un retraso muy importante |

Implementación del filtro paso bajo en Arduino
La implementación digital del filtro EMA puede realizarse directamente sobre cada lectura del sensor. En cada ciclo se obtiene una nueva medición, se calcula la diferencia respecto al valor filtrado anterior y se añade al resultado una fracción de esa diferencia.
Una versión sencilla para Arduino puede escribirse así:
double alpha = 0.2;
double filtered = 0;
filtered = filtered + alpha * (measurement - filtered);
El valor de measurement representa la lectura actual y filtered conserva el resultado anterior. El valor de alpha debe estar comprendido entre 0 y 1.
Si empleáis el Serial Plotter del IDE Standard podréis ver los resultados gráficamente de forma sencilla.
Ejemplo con lecturas de sensor
El siguiente esquema muestra la lógica básica de funcionamiento:
- Leer el sensor.
- Aplicar la expresión del filtro EMA.
- Utilizar el valor filtrado en el programa.
- Enviar la lectura original y la filtrada al puerto serie para compararlas.
Un ejemplo de código completo puede seguir esta estructura:
const int sensorPin = A0;
double alpha = 0.2;
double filtered = 0;
void setup() {
Serial.begin(9600);
}
void loop() {
double measurement = analogRead(sensorPin);
filtered = filtered + alpha * (measurement - filtered);
Serial.print(measurement);
Serial.print('\t');
Serial.println(filtered);
delay(10);
}
El retardo entre muestras influye en la respuesta observada, porque la relación entre alpha y la frecuencia de corte depende del tiempo de muestreo de nuestro sistema.
Inicialización del valor filtrado
La inicialización de filtered influye en el comportamiento de las primeras muestras. Si se inicia con cero y el sensor presenta otro nivel constante, el filtro necesitará un transitorio para acercarse al valor real.
Este comportamiento se observa también en el filtro paso alto: pasado un cierto transitorio se ha eliminado por completo el bias de la señal, que ahora aparece centrada en el origen.
Cuando se dispone de una primera medición válida, puede utilizarse como valor inicial del filtro para reducir el transitorio inicial.
Filtro paso alto derivado del filtro paso bajo
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.
La operación puede expresarse así:
highPass = signal - lowPass
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.
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 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.
Filtro paso banda con dos filtros paso bajo
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.
El filtro de paso bajo superior deja pasar las frecuencias de -∞ a Fcs, y el filtro paso bajo inferior las frecuencias de -∞ a Fci, por lo que restar ambos valores dejará las frecuencias de Fci a Fcs, que es justamente lo que queremos.
La operación fundamental es:
bandPass = lowPassHigh - lowPassLow
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.
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.
Código del filtro paso banda
El esquema de implementación es el siguiente:
//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];
En la implementación con EMA, los dos filtros deben procesar la misma medición de entrada, pero conservar estados independientes.
En un filtro paso banda y stop banda tendremos dos factores alpha que denominaremos Low y High que corresponden, respectivamente, con la frecuencia de corte inferior y superior.
Un valor alpha menor produce más suavizado y una frecuencia de corte menor. Por ello, el filtro asociado al corte inferior y el filtro asociado al corte superior deben elegirse de forma que definan una banda de frecuencias coherente.
Filtro stop banda
Por su parte el filtro de stop banda es el caso opuesto, es decir, elimina los componentes comprendidos entre ambas frecuencias de corte, por lo que únicamente deja pasar las frecuencias de -∞ a Fci y de Fcs a +∞.
Para obtener el filtro de stop banda únicamente tenemos que restar a la señal original el filtro del paso banda, lo que dejará pasar las frecuencias de -∞ a Fci y Fcs a +∞.
La operación puede expresarse así:
stopBand = signal - bandPass
Los filtros de stop banda tienen un enorme campo de aplicación cuando queremos eliminar una señal de frecuencia conocida. Por ejemplo, podemos eliminar las frecuencias de corriente alterna, filtrar las vibraciones de una máquina girando a unas revoluciones conocidas, o eliminar el parpadeo en sensores ópticos y cámaras originados por las luces artificiales alimentadas con corriente alterna.
Resultados del filtro paso banda
A continuación veremos el efecto de estos factores con los resultados del filtro paso banda para distintas combinaciones de alpha Low y High aplicados a la misma señal.
Estos son los resultados para un alpha Low de 0.025 y alpha High de 0.5. Observar que el filtro inferior ha eliminado el bias pasadas unas pocas oscilaciones, mientras que el filtro superior ha suavizado parte del ruido de alta frecuencia.
Si disminuimos el factor alpha high a 0.3, manteniendo el low a 0.025, vemos que se elimina la mayor parte del ruido de alta frecuencia.
Y si disminuimos aún más el factor de alpha high a 0.15 veremos que hemos eliminado todos los componentes excepto los armónicos fundamentales de la señal del ejemplo.
Es decir, en un único filtro hemos eliminado el ruido de alta frecuencia y el bias de la señal.
| alpha Low | alpha High | Resultado |
|---|---|---|
| 0.025 | 0.5 | El filtro inferior elimina el bias y el filtro superior suaviza parte del ruido de alta frecuencia |
| 0.025 | 0.3 | Se elimina la mayor parte del ruido de alta frecuencia |
| 0.025 | 0.15 | Se conservan los armónicos fundamentales de la señal del ejemplo |

Implementación del filtro paso banda y stop banda en Arduino
Aquí tenemos una implementación sencilla de un filtro de paso banda y stop banda 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.
La estructura básica puede escribirse así:
double alphaLow = 0.025;
double alphaHigh = 0.15;
double low = 0;
double high = 0;
double bandPass = 0;
double stopBand = 0;
double measurement = GetMeasure();
low = low + alphaLow * (measurement - low);
high = high + alphaHigh * (measurement - high);
bandPass = high - low;
stopBand = measurement - bandPass;
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.
El resultado permite comparar la señal original con las salidas paso bajo, paso banda y stop banda, y observar cómo cambia el comportamiento al modificar los dos factores alpha.
Ejemplo completo con Arduino y Serial Plotter
El siguiente programa aplica simultáneamente un filtro paso bajo, un filtro paso alto, un filtro paso banda y un filtro stop banda a las lecturas de una entrada analógica:
const int sensorPin = A0;
const double alphaLow = 0.025;
const double alphaHigh = 0.15;
double low = 0;
double high = 0;
void setup() {
Serial.begin(115200);
}
void loop() {
double measurement = analogRead(sensorPin);
low = low + alphaLow * (measurement - low);
high = high + alphaHigh * (measurement - high);
double lowPass = high;
double highPass = measurement - lowPass;
double bandPass = high - low;
double stopBand = measurement - bandPass;
Serial.print(measurement);
Serial.print('\t');
Serial.print(lowPass);
Serial.print('\t');
Serial.print(highPass);
Serial.print('\t');
Serial.print(bandPass);
Serial.print('\t');
Serial.println(stopBand);
delay(10);
}
Los resultados en el Serial Plotter del IDE Estándar serán los siguientes,
Por qué el filtro EMA reduce el ruido
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.
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.
Generalizando podemos escribir,
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.
Esta memoria ponderada explica por qué una variación rápida y aislada tiene una influencia limitada en la salida, mientras que una tendencia sostenida consigue desplazar progresivamente el valor filtrado.
Condiciones de estabilidad del filtro
¿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?
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.
Con lo que las restricciones sobre alpha y beta quedan explicadas.
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.
FIR e IIR: alternativas al filtro EMA
Puede utilizar MATLAB® para diseñar filtros basados en respuesta finita al impulso (FIR) y respuesta infinita al impulso (IIR), dos métodos frecuentes de filtro paso bajo.
Los filtros FIR son muy populares porque son inherentemente estables. Se pueden diseñar para que tengan una fase lineal que introduce un retardo en la señal filtrada mientras se mantiene la forma de onda.
Sin embargo, estos filtros pueden tener respuestas transitorias largas y podrían imponer una alta carga computacional en ciertas aplicaciones. Los filtros FIR son útiles en aplicaciones de audio, biomédicas, de radar y otras en las que la forma de onda proporciona información útil.
Algunos de los métodos frecuentes de diseño de filtros paso bajo basados en FIR son ventana de Kaiser, mínimos cuadrados y rizado constante.
Los filtros IIR son útiles cuando los recursos computacionales son limitados. Sin embargo, los filtros IIR estables y causales no tienen una fase perfectamente lineal.
Los filtros IIR se utilizan frecuentemente en ecualización de audio, procesamiento de señales de sensores biomédicos, sensores inteligentes IoT/IIoT y aplicaciones de telecomunicaciones/RF de alta velocidad.
Entre los métodos de diseño de filtros basados en IIR se encuentran Butterworth, Chebyshev (tipo I y tipo II) y elíptico.
El filtro EMA es especialmente apropiado cuando se necesita una implementación ligera, poca memoria y una respuesta ajustable mediante un único parámetro.
Filtro paso bajo en una librería para Arduino
¿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.
Para los filtros paso banda y stop banda puede utilizarse una librería Double EMA Filter para Arduino.
El uso de una librería permite separar la lógica del filtrado del resto del programa, conservar el estado interno de cada filtro y reutilizar la misma implementación en distintos proyectos.
Aplicaciones prácticas con Arduino
El algoritmo de la media móvil es una forma sencilla de crear un filtro de paso bajo y eliminar el ruido.
Después de estas definiciones, he aquí algunos ejemplos comunes de procesamiento de señales con Arduino.
- Algoritmo antirrebote: este filtro se utiliza para suprimir el ruido de transición en una señal digital, como la detección de la presión de un pulsador.
- Media móvil: el algoritmo de la media móvil es una forma sencilla de crear un filtro de paso bajo y eliminar el ruido.
- Histéresis: puede utilizarse para evitar cambios repetidos cuando una señal oscila alrededor de un umbral.
- Medición de sensores: el filtrado permite obtener una lectura más estable y facilitar la observación de tendencias.
- Detección de cambios: el filtro paso alto permite conservar variaciones rápidas y eliminar cambios lentos o el bias.
Los filtros paso bajo permiten limpiar señales, eliminar ruido, crear un efecto de suavizado, calcular los promedios de datos y facilitar la observación de tendencias.
Filtro paso bajo [2 PLACAS ARDUINO por SERIAL] 🔊
tags: #filtro #pasa #bajos #arduino
Publicaciones populares:
- Ventajas de las bolsas de carbón activado Prima Klima para filtros de aire
- Riesgos de consumir agua destilada
- Cómo elegir pastillas antialgas para estanque: consejos prácticos
- Cambios de motor en depuradoras AstralPool: tutorial completo
- Consejos para disfrutar juntos de actividades al aire libre
