diff options
author | Gavin Andresen <gavinandresen@gmail.com> | 2011-09-29 10:50:40 -0700 |
---|---|---|
committer | Gavin Andresen <gavinandresen@gmail.com> | 2011-09-29 10:50:40 -0700 |
commit | 9a7e5ed3b000a9788f3e3e2a145c4504473d812e (patch) | |
tree | a555362fbbf25d6f26f5ee9f048555bb0864d2f2 /src/util.h | |
parent | 7dd4001b40b65b66ba5d47e628f10253ccb5d99c (diff) | |
parent | 20091df725e56376f6df0f71d19c63a34a5bf71d (diff) |
Merge pull request #539 from laanwj/qt2
Qt GUI updates
Diffstat (limited to 'src/util.h')
-rw-r--r-- | src/util.h | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/src/util.h b/src/util.h index 33013a2f81..60e99431b1 100644 --- a/src/util.h +++ b/src/util.h @@ -566,6 +566,51 @@ inline uint160 Hash160(const std::vector<unsigned char>& vch) } +// Median filter over a stream of values +// Returns the median of the last N numbers +template <typename T> class CMedianFilter +{ +private: + std::vector<T> vValues; + std::vector<T> vSorted; + int nSize; +public: + CMedianFilter(int size, T initial_value): + nSize(size) + { + vValues.reserve(size); + vValues.push_back(initial_value); + vSorted = vValues; + } + + void input(T value) + { + if(vValues.size() == nSize) + { + vValues.erase(vValues.begin()); + } + vValues.push_back(value); + + vSorted.resize(vValues.size()); + std::copy(vValues.begin(), vValues.end(), vSorted.begin()); + std::sort(vSorted.begin(), vSorted.end()); + } + + T median() const + { + int size = vSorted.size(); + assert(size>0); + if(size & 1) // Odd number of elements + { + return vSorted[size/2]; + } + else // Even number of elements + { + return (vSorted[size/2-1] + vSorted[size/2]) / 2; + } + } +}; + |