henrik-muehe / Arduino-MedianFilter

Librería para filtro de mediana rápido en Arduino

Home Page:https://www.luisllamas.es/libreria-arduino-median-filter/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Librería Arduino Median Filter

La librería median Filter implementa un filtro de mediana móvil. La librería almacena los N últimos elementos de la ventana y calcula la mediana. La clase emplea templates para permitir funcionar con distintos tipos (int, long, float,…).
Más información https://www.luisllamas.es/libreria-arduino-median-filter/

Instrucciones de uso

La clase median Filter sigue el algoritmo propuesto por Phil Ekstrom para el cálculo rápido del filtro mediana. Emplea un buffer circular para almacenar los valores por antigüedad junto con una linkedlist para mantener el orden de los elementos.
La clase median Filter emplea una excepción en el caso de que el tamaño de la ventana sea igual a 3, empleando una implementación directa para mejorar la eficiencia. Para tamaño de ventana distinto de 3 se emplea el algoritmo genérico.

Constructor

El filtro de mediana móvil se instancia a través de su constructor que recibe el tamaño de la ventana como único parámetro.

medianFilter<T> medianFilter(windowSize);

Uso del filtro

// Añadir un nuevo valor al filtro y devolver el valor filtrado
medianFilter.AddValue(value);
 
//Obtiene el ultimo valor filtrado (el mismo que el devuelto al añadir el valor al filtro)
medianFilter.GetFiltered();

Ejemplos

La librería Median Filter incluye los siguientes ejemplos para ilustrar su uso.

  • MedianFilterInt: Ejemplo de filtrado para variables integer.
#include "MedianFilterLib.h"

int values[] = { 7729, 7330, 10075, 10998, 11502, 11781, 12413, 12530, 14070, 13789, 18186, 14401, 16691, 16654, 17424, 21104, 17230, 20656, 21584, 21297, 19986, 20808, 19455, 24029, 21455, 21350, 19854, 23476, 19349, 16996, 20546, 17187, 15548, 9179, 8586, 7095, 9718, 5148, 4047, 3873, 4398, 2989, 3848, 2916, 1142, 2427, 250, 2995, 1918, 4297, 617, 2715, 1662, 1621, 960, 500, 2114, 2354, 2900, 4878, 8972, 9460, 11283, 16147, 16617, 16778, 18711, 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, 3045, 1099, 2035, 2411, 1727, 852, 1134, 966, 2838, 6033, 2319, 3294, 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, 15055, 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, 13660, 8018, 9303, 10626, 16171, 14163, 17161, 19214, 21171, 17274, 20616, 18281, 21171, 18220, 19315, 22558, 21393, 22431, 20186, 24619, 21997, 23938, 20029, 20694, 20648, 21173, 20377, 19147, 18578, 16839, 15735, 15907, 18059, 12111, 12178, 11201, 10577, 11160, 8485, 7065, 7852, 5865, 4856, 3955, 6803, 3444, 1616, 717, 3105, 704, 1473, 1948, 4534, 5800, 1757, 1038, 2435, 4677, 8155, 6870, 4611, 5372, 6304, 7868, 10336, 9091 };
size_t valuesLength = sizeof(values) / sizeof(values[0]);

int getMeasure()
{
	size_t static index = 0;
	index++;
	return values[index - 1];
}

MedianFilter<int> medianFilter(5);

void setup()
{
	Serial.begin(115200);

	float timeMean = 0;
	for (size_t iCount = 0; iCount < valuesLength; iCount++)
	{
		int rawMeasure = getMeasure();

		unsigned long timeCount = micros();
		int median = medianFilter.AddValue(rawMeasure);
		timeCount = micros() - timeCount;
		timeMean += timeCount;

		Serial.print(rawMeasure);
		Serial.print(",");
		Serial.println(median);
	}
	Serial.println(timeMean / valuesLength);
}

void loop()
{
}
  • MedianFilterFloat: Ejemplo de filtrado para variables float.
#include "MedianFilterLib.h"

float values[] = { 7729, 7330, 10075, 10998, 11502, 11781, 12413, 12530, 14070, 13789, 18186, 14401, 16691, 16654, 17424, 21104, 17230, 20656, 21584, 21297, 19986, 20808, 19455, 24029, 21455, 21350, 19854, 23476, 19349, 16996, 20546, 17187, 15548, 9179, 8586, 7095, 9718, 5148, 4047, 3873, 4398, 2989, 3848, 2916, 1142, 2427, 250, 2995, 1918, 4297, 617, 2715, 1662, 1621, 960, 500, 2114, 2354, 2900, 4878, 8972, 9460, 11283, 16147, 16617, 16778, 18711, 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, 3045, 1099, 2035, 2411, 1727, 852, 1134, 966, 2838, 6033, 2319, 3294, 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, 15055, 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, 13660, 8018, 9303, 10626, 16171, 14163, 17161, 19214, 21171, 17274, 20616, 18281, 21171, 18220, 19315, 22558, 21393, 22431, 20186, 24619, 21997, 23938, 20029, 20694, 20648, 21173, 20377, 19147, 18578, 16839, 15735, 15907, 18059, 12111, 12178, 11201, 10577, 11160, 8485, 7065, 7852, 5865, 4856, 3955, 6803, 3444, 1616, 717, 3105, 704, 1473, 1948, 4534, 5800, 1757, 1038, 2435, 4677, 8155, 6870, 4611, 5372, 6304, 7868, 10336, 9091 };
size_t valuesLength = sizeof(values) / sizeof(values[0]);

int getMeasure()
{
	size_t static index = 0;
	index++;
	return values[index - 1];
}

MedianFilter<float> medianFilter(5);

void setup()
{
	Serial.begin(115200);

	float timeMean = 0;
	for (size_t iCount = 0; iCount < valuesLength; iCount++)
	{
		float rawMeasure = getMeasure();

		unsigned long timeCount = micros();
		float median = medianFilter.AddValue(rawMeasure);
		timeCount = micros() - timeCount;
		timeMean += timeCount;

		Serial.print(rawMeasure);
		Serial.print(",");
		Serial.println(median);
	}
	Serial.println(timeMean / valuesLength);
}

void loop()
{
}

About

Librería para filtro de mediana rápido en Arduino

https://www.luisllamas.es/libreria-arduino-median-filter/

License:Apache License 2.0


Languages

Language:C++ 100.0%