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.
 
 
 
 
 
 

73 lines
1.7 KiB

// -----------------------------------------------------------------------------
// Stream Injector
// -----------------------------------------------------------------------------
#pragma once
class MedianFilter {
public:
MedianFilter() {
_data = new std::vector<double>();
}
~MedianFilter() {
if (_data) delete _data;
}
virtual void reset() {
double last = _data->empty() ? 0 : _data->back();
_data->clear();
add(last);
}
virtual void add(double value) {
_data->push_back(value);
}
virtual double median(bool do_reset = false) {
double sum = 0;
if (_data->size() == 1) {
sum = _data->back();
} else if (_data->size() == 2) {
sum = _data->front();
} else 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);
}
if (do_reset) reset();
return sum;
}
virtual unsigned char count() {
return _data->size();
}
private:
std::vector<double> *_data;
};