- 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:
+30
-12
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user