Você está na página 1de 16

9/3/2018 Filtro de paso banda y stop banda exponencial en Arduino

       

LUIS LLAMAS
Ingeniería, informática y diseño

TUTORIALES ARDUINO TUTORIALES ARDUINO AVANZADOS

FILTRO DE PASO BANDA Y STOP BANDA


EXPONENCIAL EN ARDUINO

5 ABRIL, 2017

     

En la entrada anterior vimos de forma intensiva el ltro exponencial


EMA aplicado a ltrado de paso bajo y paso alto. En esta entrada vamos a
profundizar en el tema y extenderlo a ltros paso banda y ltros stop
banda.

Para recapitular, recordemos que una señal puede ser considerada


como una suma de componentes frecuenciales. Un ltro de paso bajo
ideal (que es imposible de obtener en el mundo real) dejaría pasar los

https://www.luisllamas.es/arduino-paso-banda/ 1/16
9/3/2018 Filtro de paso banda y stop banda exponencial en Arduino

componentes por debajo de una frecuencia de corte (Fc). Por su parte, un


ltro de paso alto ideal dejaría pasar los componentes por encima de una
frecuencia de corte.

Los ltros de tipo paso banda y stop banda requieren dos


frecuencias de corte que, de forma genérica, denominaremos frecuencia
de corte inferior (Fci) y frecuencia de corte superior (Fcs).

Un ltro de paso banda ideal deja pasar únicamente las frecuencias


superiores al corte inferior e inferiores al corte superior, es decir, los
componentes frecuenciales en una banda entre ambas frecuencias de
corte (Fci a Fcs)

Los ltros de paso tienen una amplia aplicación en electrónica. Los


usáis diariamente cada vez que usáis un aparato que “sintonice” una señal.
Eso incluye todas las formas de comunicación, desde radio, televisión,
móvil, Wi , entre una casi in nita cantidad de aplicaciones.

Por su parte el ltro 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 +∞.

Si bien no son tan frecuentes, igualmente 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, ltrar
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 arti ciales alimentadas con corriente alterna.

GENERAR UN FILTRO DE PASO


BANDA Y STOP BANDA
Para generar un ltro de paso banda o stop banda generalmente
partimos de un ltro de paso bajo y obtenemos el resto mediante
operaciones con la señal original. Los resultados serían análogos partiendo
de un ltro de paso alto, pero los algoritmos para generar directamente un
ltro de paso alto son mucho menos frecuentes que los de paso bajo.

https://www.luisllamas.es/arduino-paso-banda/ 2/16
9/3/2018 Filtro de paso banda y stop banda exponencial en Arduino

Recordemos que si dispusiéramos de nuestro imaginario (y a esta


altura casi famoso) ltro de paso bajo ideal, generar un ltro de paso alto
sería tan sencillo como restar a la señal original el ltro de paso bajo.

Para visualizarlo, imaginemos el espectro de la señal con sus


componentes frecuenciales de -∞ a +∞. El ltro de paso bajo deja pasar
únicamente las frecuencias inferiores a la frecuencia de corte (Fc), es decir,
las frecuencias de -∞ a Fc.

Por tanto, restar al espectro el resultado del ltro paso baja deja pasar
las frecuencias de Fc a +∞ lo que corresponde, precisamente, con el
comportamiento de un ltro de paso alto.

Por extensión, para generar un ltro de paso banda únicamente


tenemos que restar al ltro de paso bajo de la frecuencia de superior
el ltro de paso bajo de la frecuencia inferior.

El ltro de paso bajo superior dejara las frecuencias de -∞ a Fcs, y el


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

Finalmente, para obtener el ltro de stop banda únicamente tenemos


que restar a la señal original el ltro del paso banda, lo que dejará
pasar las frecuencias de -∞ a Fci y Fcs a +∞.

En este punto cabe recordar que la mayor parte de lo explicado aquí


es de aplicación para gran variedad de ltros. En esta entrada usamos el
ltro exponencial EMA porque es ampliamente empleado y obtiene
buenos resultados con una implementación sencilla y alta e ciencia
computacional.

Sin embargo, cualquier algoritmo que “suavice” una señal puede ser
empleado como ltro de paso bajo (con mejores o peores características)
y, por tanto, es susceptible de dar origen a un ltro de paso alto, paso
banda, y stop banda.

https://www.luisllamas.es/arduino-paso-banda/ 3/16
9/3/2018 Filtro de paso banda y stop banda exponencial en Arduino

RESULTADOS DEL FILTRO PASO


BANDA
Como dijimos en la entrada anterior, en el ltro de tipo 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 ltrada y la señal original.

En un ltro 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.

A continuación veremos el efecto de estos factores con los resultados


del ltro 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 ltro inferior ha eliminado el bias pasadas unas pocas
oscilaciones, mientras que el ltro superior ha suavizado parte del ruido de
alta frecuencia

https://www.luisllamas.es/arduino-paso-banda/ 4/16
9/3/2018 Filtro de paso banda y stop banda exponencial en Arduino

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 compontes excepto los armónicos
fundamentales de la señal del ejemplo.

Es decir, en un único ltro hemos eliminado el ruido de alta frecuencia


y el bias de la señal. ¿No está mal para un ltro tan sencillo, verdad?

https://www.luisllamas.es/arduino-paso-banda/ 5/16
9/3/2018 Filtro de paso banda y stop banda exponencial en Arduino

FILTRO DE PASO BANDA Y STOP


BANDA EN ARDUINO
Aquí tenemos una implementación sencilla de un ltro de paso
banda y stop banda exponencial (EMA). En el ejemplo vamos a ltrar 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á camente de forma
sencilla.

1 float EMA_ALPHA_LOW = 0.025;


2 float EMA_ALPHA_HIGH = 0.1;
3 int EMA_LP_LOW = 0;
4 int EMA_LP_HIGH = 0;
5 int EMA_BP = 0;
6 int EMA_BS = 0;
7  
8 int values[] = { 7729, 7330, 10075, 10998, 11502, 11781, 12413,
12530, 14070, 13789, 18186, 14401, 16691, 16654, 17424, 21104, 1
7230, 20656, 21584, 21297, 19986, 20808, 19455, 24029, 21455, 21
350, 19854, 23476, 19349, 16996, 20546, 17187, 15548, 9179, 8586
, 7095, 9718, 5148, 4047, 3873, 4398, 2989, 3848, 2916, 1142, 24
27, 250, 2995, 1918, 4297, 617, 2715, 1662, 1621, 960, 500, 2114
, 2354, 2900, 4878, 8972, 9460, 11283, 16147, 16617, 16778, 1871
1, 22036, 28432, 29756, 24944, 27199, 27760, 30706, 31671, 32185
, 32290, 30470, 32616, 32075, 32210, 28822, 30823, 29632, 29157,
31585, 24133, 23245, 22516, 18513, 18330, 15450, 12685, 11451,
11280, 9116, 7975, 8263, 8203, 4641, 5232, 5724, 4347, 4319, 304
5, 1099, 2035, 2411, 1727, 852, 1134, 966, 2838, 6033, 2319, 329
4, 3587, 9076, 5194, 6725, 6032, 6444, 10293, 9507, 10881, 11036
, 12789, 12813, 14893, 16465, 16336, 16854, 19249, 23126, 21461,
18657, 20474, 24871, 20046, 22832, 21681, 21978, 23053, 20569,
24801, 19045, 20092, 19470, 18446, 18851, 18210, 15078, 16309, 1
5055, 14427, 15074, 10776, 14319, 14183, 7984, 8344, 7071, 9675,
5985, 3679, 2321, 6757, 3291, 5003, 1401, 1724, 1857, 2605, 803
, 2742, 2971, 2306, 3722, 3332, 4427, 5762, 5383, 7692, 8436, 13
9 660, 8018, 9303, 10626, 16171, 14163, 17161, 19214, 21171, 17274
10 , 20616, 18281, 21171, 18220, 19315, 22558, 21393, 22431, 20186,
11 24619, 21997, 23938, 20029, 20694, 20648, 21173, 20377, 19147,
12 18578, 16839, 15735, 15907, 18059, 12111, 12178, 11201, 10577, 1
13 1160, 8485, 7065, 7852, 5865, 4856, 3955, 6803, 3444, 1616, 717,
14 3105, 704, 1473, 1948, 4534, 5800, 1757, 1038, 2435, 4677, 8155
15 , 6870, 4611, 5372, 6304, 7868, 10336, 9091 };
16 int valuesLength = sizeof(values) / sizeof(int);
17  
18 int getMeasure()
19 {
20    int static index = 0;
21    index++;
22    return values[index-1];
23 }
https://www.luisllamas.es/arduino-paso-banda/ 6/16
9/3/2018 Filtro de paso banda y stop banda exponencial en Arduino
24  
25 void setup()
26 {
27    Serial.begin(115200);
28  
29    for (int iCount = 0; iCount < valuesLength; iCount++)
30    {
31       int value = getMeasure();
32       int filteredBP = EMABandPassFilter(value);
33       int filteredBS = EMABandStopFilter(value);
34       Serial.print(value);
35       Serial.print(",");
36       Serial.print(filteredBP);
37       Serial.print(",");
38       Serial.println(filteredBS);
39    }
40 }
41  
42 void loop()
43 {
44    delay(10000);
45 }
46  
47 int EMABandPassFilter(int value)
48 {
49    EMA_LP_LOW = EMA_ALPHA_LOW * value + (1 - EMA_ALPHA_LOW) * EM
50 A_LP_LOW;
51    EMA_LP_HIGH = EMA_ALPHA_HIGH * value + (1 - EMA_ALPHA_HIGH) *
52 EMA_LP_HIGH;
53    EMA_BP = EMA_LP_HIGH - EMA_LP_LOW;
54    return EMA_BP;
55 }
 
int EMABandStopFilter(int value)
{
   EMA_LP_LOW = EMA_ALPHA_LOW * value + (1 - EMA_ALPHA_LOW) * EM
A_LP_LOW;
   EMA_LP_HIGH = EMA_ALPHA_HIGH * value + (1 - EMA_ALPHA_HIGH) *
EMA_LP_HIGH;
   EMA_BP = EMA_LP_HIGH - EMA_LP_LOW;
   EMA_BS = value - EMA_BP;
   return EMA_BS;
}

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


siguientes,

https://www.luisllamas.es/arduino-paso-banda/ 7/16
9/3/2018 Filtro de paso banda y stop banda exponencial en Arduino

FILTRO DE PASO BANDA Y STOP


BANDA EN UNA LIBRERÍA
¿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 Double 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

 Arduino,Arduino avanzado,Filtrado

PREVIOUS

LIBRERÍA ARDUINO SINGLE EMA PARA FILTRO PASO BAJO Y


ALTO
https://www.luisllamas.es/arduino-paso-banda/ 8/16
9/3/2018 Filtro de paso banda y stop banda exponencial en Arduino

NEXT

LIBRERÍA ARDUINO DOUBLE EMA FILTRO PASO BANDA Y STOP


BANDA

TAMBIÉN TE PUEDE GUSTAR

IMPLEMENTAR UNA RED DE PETRI EN ARDUINO

LIBRERÍA DE ARDUINO PETRINET

https://www.luisllamas.es/arduino-paso-banda/ 9/16
9/3/2018 Filtro de paso banda y stop banda exponencial en Arduino

IMPLEMENTAR UNA MÁQUINA DE ESTADOS FINITOS EN ARDUINO

LIBRERÍA DE ARDUINO STATEMACHINE

https://www.luisllamas.es/arduino-paso-banda/ 10/16
9/3/2018 Filtro de paso banda y stop banda exponencial en Arduino

COCHE ROBOT 2WD BARATO CON ARDUINO: ESQUEMA ELÉCTRICO

DETECTAR GESTOS CON ARDUINO Y SENSOR APDS-9960

¡DEJA UN COMENTARIO!...

Únete a la conversación

 newest  oldest

https://www.luisllamas.es/arduino-paso-banda/ 11/16
9/3/2018 Filtro de paso banda y stop banda exponencial en Arduino

Vale 

Que vendrian a ser cada forma de onda expuesta en la


Guest gra ca?

Reply  3 months ago

https://www.luisllamas.es/arduino-paso-banda/ 12/16
9/3/2018 Filtro de paso banda y stop banda exponencial en Arduino

https://www.luisllamas.es/arduino-paso-banda/ 13/16
9/3/2018 Filtro de paso banda y stop banda exponencial en Arduino

https://www.luisllamas.es/arduino-paso-banda/ 14/16
9/3/2018 Filtro de paso banda y stop banda exponencial en Arduino

Excepto notación expresa, los contenidos de este sitio se ofrecen bajo


licencia Creative Commons License BY-NC-SA.

Más información

https://www.luisllamas.es/arduino-paso-banda/ 15/16
9/3/2018 Filtro de paso banda y stop banda exponencial en Arduino

IMPLEMENTAR UNA RED DE PETRI EN ARDUINO


3 MARZO, 2018

LIBRERÍA DE ARDUINO PETRINET


3 MARZO, 2018

INSTALAR RASPBERRY PI EN UNA MÁQUINA VIRTUAL CON VIRTUALBOX


28 FEBRERO, 2018

Este web utiliza cookies propias y de terceros para ofrecerle una mejor
experiencia y servicio. Al navegar o utilizar nuestros servicios el usuario
acepta el uso de las mismas. El usuario tiene la opción de impedir la
generación de cookies y la eliminación de las mismas mediante la selección
de la correspondiente opción en su navegador.

Copyright ©, All Rights Reserved

https://www.luisllamas.es/arduino-paso-banda/ 16/16

Você também pode gostar