33 CHECK_GT(window_size_, 0);
38double MF::GetMin()
const {
39 if (min_candidates_.empty()) {
40 return std::numeric_limits<double>::infinity();
42 return min_candidates_.front().second;
46double MF::GetMax()
const {
47 if (max_candidates_.empty()) {
48 return -std::numeric_limits<double>::infinity();
50 return max_candidates_.front().second;
56 CHECK_LE(values_.size(), window_size_);
57 CHECK_LE(min_candidates_.size(), window_size_);
58 CHECK_LE(max_candidates_.size(), window_size_);
60 time_ %=
static_cast<std::uint_fast8_t
>(2 * window_size_);
61 if (values_.size() == window_size_) {
65 if (values_.size() > 2) {
66 return (sum_ - GetMin() - GetMax()) /
67 static_cast<double>(values_.size() - 2);
69 return sum_ /
static_cast<double>(values_.size());
73bool MF::ShouldPopOldestCandidate(
const uint8 old_time)
const {
74 if (old_time < window_size_) {
75 CHECK_LE(time_, old_time + window_size_);
76 return old_time + window_size_ == time_;
77 }
else if (time_ < window_size_) {
78 CHECK_GE(old_time, time_ + window_size_);
79 return old_time == time_ + window_size_;
85void MF::RemoveEarliest() {
86 CHECK_EQ(values_.size(), window_size_);
87 double removed = values_.front();
90 if (ShouldPopOldestCandidate(min_candidates_.front().first)) {
91 min_candidates_.pop_front();
93 if (ShouldPopOldestCandidate(max_candidates_.front().first)) {
94 max_candidates_.pop_front();
98void MF::Insert(
const double value) {
99 values_.push_back(value);
101 while (min_candidates_.size() > 0 && min_candidates_.back().second > value) {
102 min_candidates_.pop_back();
104 min_candidates_.push_back(std::make_pair(time_, value));
105 while (max_candidates_.size() > 0 && max_candidates_.back().second < value) {
106 max_candidates_.pop_back();
108 max_candidates_.push_back(std::make_pair(time_, value));
The MeanFilter class is used to smoothen a series of noisy numbers, such as sensor data or the output...
double Update(const double measurement)
Processes a new measurement in amortized constant time.
MeanFilter()=default
Default constructor; defers initialization.
Defines the MeanFilter class.
std::pair< uint8, double > TimedValue
const uint8 kMaxWindowSize