// -----------------------------------------------------------------------------
|
|
// Stream Injector
|
|
// -----------------------------------------------------------------------------
|
|
|
|
#pragma once
|
|
|
|
/*
|
|
class SpikesFilter {
|
|
|
|
public:
|
|
|
|
SpikesFilter() {
|
|
reset();
|
|
}
|
|
|
|
virtual void reset() {
|
|
_sum = 0;
|
|
_spike = false;
|
|
}
|
|
|
|
virtual void add(double value) {
|
|
|
|
// add previous value
|
|
if (_last > 0) {
|
|
_sum += _last;
|
|
}
|
|
|
|
// flag new possible spike
|
|
if (value > 0) {
|
|
_spike = (_last == 0);
|
|
|
|
// delete previous spike
|
|
} else if (_spike) {
|
|
_sum -= _last;
|
|
_spike = false;
|
|
}
|
|
|
|
_last = value;
|
|
|
|
}
|
|
|
|
virtual double sum() {
|
|
return _sum;
|
|
}
|
|
|
|
private:
|
|
|
|
double _last = 0;
|
|
double _sum = 0;
|
|
bool _spike = false;
|
|
|
|
};
|
|
*/
|
|
|
|
class MedianFilter {
|
|
|
|
public:
|
|
|
|
MedianFilter(unsigned char size) {
|
|
_size = size;
|
|
_data = new double[_size+1];
|
|
reset();
|
|
}
|
|
|
|
virtual void reset() {
|
|
_data[0] = _data[_size];
|
|
_pointer = 1;
|
|
for (unsigned char i=_pointer; i<=_size; i++) _data[i] = 0;
|
|
}
|
|
|
|
virtual void add(double value) {
|
|
if (_pointer <= _size) {
|
|
_data[_pointer] = value;
|
|
++_pointer;
|
|
}
|
|
}
|
|
|
|
virtual double average(bool do_reset = false) {
|
|
|
|
double sum = 0;
|
|
for (unsigned char i = 1; i<_size; i++) {
|
|
|
|
double previous = _data[i-1];
|
|
double current = _data[i];
|
|
double next = _data[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;
|
|
|
|
}
|
|
|
|
if (do_reset) reset();
|
|
|
|
return sum / (_size-1);
|
|
|
|
}
|
|
|
|
virtual unsigned char count() {
|
|
return _pointer - 1;
|
|
}
|
|
|
|
private:
|
|
|
|
double *_data;
|
|
unsigned char _size = 0;
|
|
unsigned char _pointer = 0;
|
|
|
|
};
|