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

  1. // -----------------------------------------------------------------------------
  2. // Median Filter
  3. // -----------------------------------------------------------------------------
  4. #pragma once
  5. #include "AggregatorBase.h"
  6. class AggregatorMedian : public AggregatorBase {
  7. public:
  8. virtual void reset() {
  9. double last = _data->empty() ? 0 : _data->back();
  10. _data->clear();
  11. add(last);
  12. }
  13. virtual double result() {
  14. double sum = 0;
  15. if (_data->size() > 2) {
  16. for (unsigned char i = 1; i <= _data->size() - 2; i++) {
  17. double previous = _data->at(i-1);
  18. double current = _data->at(i);
  19. double next = _data->at(i+1);
  20. if (previous > current) std::swap(previous, current);
  21. if (current > next) std::swap(current, next);
  22. if (previous > current) std::swap(previous, current);
  23. sum += current;
  24. }
  25. sum /= (_data->size() - 2);
  26. } else if (_data->size() > 0) {
  27. sum = _data->front();
  28. }
  29. return sum;
  30. }
  31. };