From a7976e4365dfdb99280c9b624e902351ca1bcac7 Mon Sep 17 00:00:00 2001 From: Jens Ahrensfeld Date: Mon, 20 Jun 2022 10:58:03 +0000 Subject: [PATCH] - added statistics folder git-svn-id: http://moon:8086/svn/software/trunk/libsrc/cpp@1042 b431acfa-c32f-4a4a-93f1-934dc6c82436 --- radio/statistics/SlidingMinMax.hpp | 58 ++++++++++++++++++++++ radio/statistics/SlidingMinMax.tcc | 79 ++++++++++++++++++++++++++++++ 2 files changed, 137 insertions(+) create mode 100644 radio/statistics/SlidingMinMax.hpp create mode 100644 radio/statistics/SlidingMinMax.tcc diff --git a/radio/statistics/SlidingMinMax.hpp b/radio/statistics/SlidingMinMax.hpp new file mode 100644 index 0000000..7328d7f --- /dev/null +++ b/radio/statistics/SlidingMinMax.hpp @@ -0,0 +1,58 @@ +#ifndef _STATISTICS_SLIDINGMINMAX_HPP_ +#define _STATISTICS_SLIDINGMINMAX_HPP_ + +#pragma once + +#include +#include +#include +#include + + +namespace Radio +{ +namespace Statistics +{ + +// Sliding Min/Max based on MAXLIST-Algorithm, based on: +// "AN EFFICIENT ALGORITHM FOR RUNNING MAX MIN CALCULATION", 1996, S.C. Douglas, University of Utah +// Dependeding on 'mode' this algorithm calculates either minimum (mode = -1) or maximum (mode = +1) +template +class SlidingMinMax +{ +public: + enum Mode + { + Min, + Max + }; + + SlidingMinMax(Mode mode, size_t L, T P); + ~SlidingMinMax(); + void process(T const &xin); + T getWinner() + { + return m_win_value; + } +private: + size_t m_L; + T m_P; + size_t m_N; + Mode m_mode; + RealScalar m_mode_value; + T m_win_value; + size_t m_win_index; + + blaze::DynamicVector m_pU; + blaze::DynamicVector m_pU_last; + blaze::DynamicVector m_pP; + blaze::DynamicVector m_pP_last; + +}; + +#include "SlidingMinMax.tcc" + +} // Statistics +} // Radio + +#endif // _STATISTICS_SLIDINGMINMAX_HPP_ \ No newline at end of file diff --git a/radio/statistics/SlidingMinMax.tcc b/radio/statistics/SlidingMinMax.tcc new file mode 100644 index 0000000..c540c7a --- /dev/null +++ b/radio/statistics/SlidingMinMax.tcc @@ -0,0 +1,79 @@ +#include "SlidingMinMax.hpp" + +template +SlidingMinMax::SlidingMinMax(Mode mode, size_t L, T P) +: m_mode(mode) +, m_L(L) +, m_P(P) +, m_N(0) +, m_win_value(0) +, m_win_index(0) +{ + m_pP.resize(L); + m_pP_last.resize(L); + m_pU.resize(L); + m_pU_last.resize(L); + + m_pP = 0; + m_pP_last = 0; + m_pU = T(0); + m_pU_last = T(0); + m_pU_last[1] = P; + + m_mode_value = 1.0; + if (mode == Mode::Min) + { + m_mode_value = -1.0; + } + +} + +template +SlidingMinMax::~SlidingMinMax() +{ + +} + +template +void SlidingMinMax::process(T const &xin) +{ + T x = xin*m_mode_value; + + size_t m = 1; + if (m_pP_last[m_N] == m_L) + { + m = 0; + m_pU_last[m_N] = m_P; + } + + size_t i = 0; + while (x >= m_pU_last[i+1]) + { + i++; + } + m_N = m_N - i + m; + + for (size_t j=1; j < m_N; j++) + { + m_pU[j+1] = m_pU_last[j+i]; + m_pP[j+1] = m_pP_last[j+i] + 1; + } + m_pU[m_N+1] = m_P; + m_pU[1] = x; + m_pP[1] = 1; + + i=0; + while(m_pU[i] != m_P) + { + m_pU_last[i] = m_pU[i]; + m_pP_last[i] = m_pP[i]; + i++; + } + m_pU_last[i] = m_pU[i]; + m_pP_last[i] = m_pP[i]; + + m_win_value = m_pU[m_N]; + m_win_index = m_pP[m_N]; + +} +