From dce7a3caded533584307d313a0f84c86af0c3316 Mon Sep 17 00:00:00 2001 From: Jens Ahrensfeld Date: Mon, 20 Jun 2022 10:55:26 +0000 Subject: [PATCH] - do not use StatisticsProvider - make cheap and accurate trackers git-svn-id: http://moon:8086/svn/software/trunk/libsrc/cpp@1040 b431acfa-c32f-4a4a-93f1-934dc6c82436 --- radio/metrics/Tracker.cpp | 42 ++++++++++++++++++++++++++++----------- radio/metrics/Tracker.hpp | 19 +++++++++++------- 2 files changed, 42 insertions(+), 19 deletions(-) diff --git a/radio/metrics/Tracker.cpp b/radio/metrics/Tracker.cpp index 2e5237d..5657f5b 100644 --- a/radio/metrics/Tracker.cpp +++ b/radio/metrics/Tracker.cpp @@ -1,14 +1,20 @@ #include "Tracker.hpp" +#include + +using namespace std; namespace Radio { namespace Metrics { -Tracker::Tracker(IMinMax const &prov_minMax) -: m_prov_minMax(prov_minMax) +Tracker::Tracker(RealScalar rho, RealScalar smoothness) +: m_mags(NUM_QUADRRANTS) +, m_rho(rho) +, m_smoothness(smoothness) { + m_mags = 0; } Tracker::~Tracker() @@ -22,18 +28,30 @@ ComplexScalar const* Tracker::trackers() const void Tracker::process(ComplexScalar const &x) { - radio_float_t alpha = 0.002; - radio_float_t beta = 1.0 - alpha; - radio_float_t min_i = m_prov_minMax.min_i(); - radio_float_t min_q = m_prov_minMax.min_q(); - radio_float_t max_i = m_prov_minMax.max_i(); - radio_float_t max_q = m_prov_minMax.max_q(); + size_t qu = getQuadrant(x); + m_mags[qu] *= m_rho; - m_trackers[0] = beta*m_trackers[0] + alpha*ComplexScalar(max_i, min_q); - m_trackers[1] = beta*m_trackers[1] + alpha*ComplexScalar(max_i, max_q); - m_trackers[2] = beta*m_trackers[2] + alpha*ComplexScalar(min_i, max_q); - m_trackers[3] = beta*m_trackers[3] + alpha*ComplexScalar(min_i, min_q); + RealScalar mag = abs(x); + if (mag > m_mags[qu]) + { + m_mags[qu] = mag; + m_trackers[qu] = m_smoothness*x + (RealScalar(1.0)-m_smoothness)*m_trackers[qu]; + } +} +size_t Tracker::getQuadrant(ComplexScalar const &x) +{ + size_t result = 0; + + if (x.real() < 0) + { + result |= 0x02; + } + if (x.imag() < 0) + { + result |= 0x01; + } + return result; } } // Metrics diff --git a/radio/metrics/Tracker.hpp b/radio/metrics/Tracker.hpp index 1efa3e4..aaf9a33 100644 --- a/radio/metrics/Tracker.hpp +++ b/radio/metrics/Tracker.hpp @@ -4,6 +4,7 @@ #pragma once #include +#include #include "IMinMax.hpp" namespace Radio @@ -13,16 +14,20 @@ namespace Metrics class Tracker { + static const size_t NUM_QUADRRANTS = 4; public: - Tracker(IMinMax const &statsProvider); - virtual ~Tracker(); - void process(ComplexScalar const &x); - ComplexScalar const* trackers() const; - + Tracker(RealScalar rho, RealScalar smoothness=0.5); + virtual ~Tracker(); + void process(ComplexScalar const &x); + ComplexScalar const* trackers() const; + private: - IMinMax const &m_prov_minMax; - ComplexScalar m_trackers[4]; + RVec m_mags; + RealScalar m_rho; + RealScalar m_smoothness; + ComplexScalar m_trackers[NUM_QUADRRANTS]; + size_t getQuadrant(ComplexScalar const &x); }; } // Metrics