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

  1. // -----------------------------------------------------------------------------
  2. // Stream Injector
  3. // -----------------------------------------------------------------------------
  4. #pragma once
  5. class MedianFilter {
  6. public:
  7. MedianFilter() {
  8. _data = new std::vector<double>();
  9. }
  10. ~MedianFilter() {
  11. if (_data) delete _data;
  12. }
  13. virtual void reset() {
  14. double last = _data->empty() ? 0 : _data->back();
  15. _data->clear();
  16. add(last);
  17. }
  18. virtual void add(double value) {
  19. _data->push_back(value);
  20. }
  21. virtual double median(bool do_reset = false) {
  22. double sum = 0;
  23. if (_data->size() == 1) {
  24. sum = _data->back();
  25. } else if (_data->size() == 2) {
  26. sum = _data->front();
  27. } else if (_data->size() > 2) {
  28. for (unsigned char i = 1; i <= _data->size() - 2; i++) {
  29. double previous = _data->at(i-1);
  30. double current = _data->at(i);
  31. double next = _data->at(i+1);
  32. if (previous > current) std::swap(previous, current);
  33. if (current > next) std::swap(current, next);
  34. if (previous > current) std::swap(previous, current);
  35. sum += current;
  36. }
  37. sum /= (_data->size() - 2);
  38. }
  39. if (do_reset) reset();
  40. return sum;
  41. }
  42. virtual unsigned char count() {
  43. return _data->size();
  44. }
  45. private:
  46. std::vector<double> *_data;
  47. };