Fork of the espurna firmware for `mhsw` switches
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

51 lines
1.2 KiB

// -----------------------------------------------------------------------------
// Median Filter
// -----------------------------------------------------------------------------
#pragma once
#include "AggregatorBase.h"
class AggregatorMedian : public AggregatorBase {
public:
virtual void reset() {
double last = _data->empty() ? 0 : _data->back();
_data->clear();
add(last);
}
virtual double result() {
double sum = 0;
if (_data->size() > 2) {
for (unsigned char i = 1; i <= _data->size() - 2; i++) {
double previous = _data->at(i-1);
double current = _data->at(i);
double next = _data->at(i+1);
if (previous > current) std::swap(previous, current);
if (current > next) std::swap(current, next);
if (previous > current) std::swap(previous, current);
sum += current;
}
sum /= (_data->size() - 2);
} else if (_data->size() > 0) {
sum = _data->front();
}
return sum;
}
};