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