diff --git a/movext.hh b/movext.hh index b52bfcd..eae53b5 100644 --- a/movext.hh +++ b/movext.hh @@ -6,6 +6,7 @@ Copyright 2020 Ahmet Inan #pragma once +#include "delay.hh" #include "deque.hh" namespace DSP { @@ -44,22 +45,60 @@ public: template class MovMin { - MovExt, std::less, NUM> movmin; + Delay window; + Deque dispenser, refill; public: + MovMin() : window(std::numeric_limits::max()) + { + dispenser.push_front(std::numeric_limits::max()); + } TYPE operator () (TYPE input) { - return movmin(input); + if (window(input) == dispenser.front()) + dispenser.pop_front(); + + while (!refill.empty() && input < refill.front()) + refill.pop_front(); + refill.push_front(input); + + if (dispenser.empty()) { + while (!refill.empty()) { + dispenser.push_front(refill.front()); + refill.pop_front(); + } + return dispenser.front(); + } + return dispenser.front() < refill.back() ? dispenser.front() : refill.back(); } }; template class MovMax { - MovExt, std::greater, NUM> movmax; + Delay window; + Deque dispenser, refill; public: + MovMax() : window(std::numeric_limits::min()) + { + dispenser.push_front(std::numeric_limits::min()); + } TYPE operator () (TYPE input) { - return movmax(input); + if (window(input) == dispenser.front()) + dispenser.pop_front(); + + while (!refill.empty() && input > refill.front()) + refill.pop_front(); + refill.push_front(input); + + if (dispenser.empty()) { + while (!refill.empty()) { + dispenser.push_front(refill.front()); + refill.pop_front(); + } + return dispenser.front(); + } + return dispenser.front() > refill.back() ? dispenser.front() : refill.back(); } };