- 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 <iostream>
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
+12 -7
View File
@@ -4,6 +4,7 @@
#pragma once
#include <cpp/radio/Vector.hpp>
#include <cpp/radio/statistics/SlidingMinMax.hpp>
#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