aboutsummaryrefslogtreecommitdiff
path: root/src/util.h
diff options
context:
space:
mode:
authorGavin Andresen <gavinandresen@gmail.com>2011-09-29 10:50:40 -0700
committerGavin Andresen <gavinandresen@gmail.com>2011-09-29 10:50:40 -0700
commit9a7e5ed3b000a9788f3e3e2a145c4504473d812e (patch)
treea555362fbbf25d6f26f5ee9f048555bb0864d2f2 /src/util.h
parent7dd4001b40b65b66ba5d47e628f10253ccb5d99c (diff)
parent20091df725e56376f6df0f71d19c63a34a5bf71d (diff)
Merge pull request #539 from laanwj/qt2
Qt GUI updates
Diffstat (limited to 'src/util.h')
-rw-r--r--src/util.h45
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;
+ }
+ }
+};
+