- 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
This commit is contained in:
2022-06-20 10:55:26 +00:00
parent aab65930bc
commit dce7a3cade
2 changed files with 42 additions and 19 deletions
+30 -12
View File
@@ -1,14 +1,20 @@
#include "Tracker.hpp" #include "Tracker.hpp"
#include <iostream>
using namespace std;
namespace Radio namespace Radio
{ {
namespace Metrics namespace Metrics
{ {
Tracker::Tracker(IMinMax const &prov_minMax) Tracker::Tracker(RealScalar rho, RealScalar smoothness)
: m_prov_minMax(prov_minMax) : m_mags(NUM_QUADRRANTS)
, m_rho(rho)
, m_smoothness(smoothness)
{ {
m_mags = 0;
} }
Tracker::~Tracker() Tracker::~Tracker()
@@ -22,18 +28,30 @@ ComplexScalar const* Tracker::trackers() const
void Tracker::process(ComplexScalar const &x) void Tracker::process(ComplexScalar const &x)
{ {
radio_float_t alpha = 0.002; size_t qu = getQuadrant(x);
radio_float_t beta = 1.0 - alpha; m_mags[qu] *= m_rho;
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();
m_trackers[0] = beta*m_trackers[0] + alpha*ComplexScalar(max_i, min_q); RealScalar mag = abs(x);
m_trackers[1] = beta*m_trackers[1] + alpha*ComplexScalar(max_i, max_q); if (mag > m_mags[qu])
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); 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 } // Metrics
+12 -7
View File
@@ -4,6 +4,7 @@
#pragma once #pragma once
#include <cpp/radio/Vector.hpp> #include <cpp/radio/Vector.hpp>
#include <cpp/radio/statistics/SlidingMinMax.hpp>
#include "IMinMax.hpp" #include "IMinMax.hpp"
namespace Radio namespace Radio
@@ -13,16 +14,20 @@ namespace Metrics
class Tracker class Tracker
{ {
static const size_t NUM_QUADRRANTS = 4;
public: public:
Tracker(IMinMax const &statsProvider); Tracker(RealScalar rho, RealScalar smoothness=0.5);
virtual ~Tracker(); virtual ~Tracker();
void process(ComplexScalar const &x); void process(ComplexScalar const &x);
ComplexScalar const* trackers() const; ComplexScalar const* trackers() const;
private: private:
IMinMax const &m_prov_minMax; RVec m_mags;
ComplexScalar m_trackers[4]; RealScalar m_rho;
RealScalar m_smoothness;
ComplexScalar m_trackers[NUM_QUADRRANTS];
size_t getQuadrant(ComplexScalar const &x);
}; };
} // Metrics } // Metrics