diff --git a/radio/metrics/IMinMax.hpp b/radio/metrics/IMinMax.hpp new file mode 100644 index 0000000..2f90f6d --- /dev/null +++ b/radio/metrics/IMinMax.hpp @@ -0,0 +1,21 @@ +#include + +namespace Radio +{ +namespace Metrics +{ +class IMinMax +{ +public: + virtual ~IMinMax() = default; + + virtual radio_float_t min_i() const = 0; + virtual radio_float_t min_q() const = 0; + virtual radio_float_t min_mag() const = 0; + + virtual radio_float_t max_i() const = 0; + virtual radio_float_t max_q() const = 0; + virtual radio_float_t max_mag() const = 0; +}; +} // Metrics +} // Radio diff --git a/radio/metrics/Statistics.cpp b/radio/metrics/Statistics.cpp new file mode 100644 index 0000000..57715fe --- /dev/null +++ b/radio/metrics/Statistics.cpp @@ -0,0 +1,45 @@ +#include "Statistics.hpp" +#include + +namespace Radio +{ +namespace Metrics +{ +Statistics::Statistics(radio_float_t updateInterval_minMax) +: m_provider_minMax(*this) +{ + SlidingMinMaxInit(&m_sl_min_I, updateInterval_minMax, (radio_float_t)1E12, -1); + SlidingMinMaxInit(&m_sl_min_Q, updateInterval_minMax, (radio_float_t)1E12, -1); + SlidingMinMaxInit(&m_sl_min_mag, updateInterval_minMax, (radio_float_t)1E12, -1); + SlidingMinMaxInit(&m_sl_max_I, updateInterval_minMax, (radio_float_t)1E12, +1); + SlidingMinMaxInit(&m_sl_max_Q, updateInterval_minMax, (radio_float_t)1E12, +1); + SlidingMinMaxInit(&m_sl_max_mag, updateInterval_minMax, (radio_float_t)1E12, +1); +} + +Statistics::~Statistics() +{ + SlidingMinMaxFree(&m_sl_min_I); + SlidingMinMaxFree(&m_sl_min_Q); + SlidingMinMaxFree(&m_sl_min_mag); + SlidingMinMaxFree(&m_sl_max_I); + SlidingMinMaxFree(&m_sl_max_Q); + SlidingMinMaxFree(&m_sl_max_mag); + +} + +IMinMax const& Statistics::provider_minMax() const +{ + return m_provider_minMax; +} + +void Statistics::process(ComplexScalar const &x) +{ + SlidingMinMaxProcess(&m_sl_min_I, x.real()); + SlidingMinMaxProcess(&m_sl_min_Q, x.imag()); + SlidingMinMaxProcess(&m_sl_min_mag, CpxMagS(toCpx(x))); + SlidingMinMaxProcess(&m_sl_max_I, x.real()); + SlidingMinMaxProcess(&m_sl_max_Q, x.imag()); + SlidingMinMaxProcess(&m_sl_max_mag, CpxMagS(toCpx(x))); +} +} // Metrics +} // Radio diff --git a/radio/metrics/Statistics.hpp b/radio/metrics/Statistics.hpp new file mode 100644 index 0000000..35aa98d --- /dev/null +++ b/radio/metrics/Statistics.hpp @@ -0,0 +1,75 @@ +#ifndef _METRICS_STATISTICS_HPP_ +#define _METRICS_STATISTICS_HPP_ + +#pragma once + +#include +#include + +#include "IMinMax.hpp" + +namespace Radio +{ +namespace Metrics +{ +class Statistics +{ +public: + friend class MinMaxProvider; + Statistics(radio_float_t updateInterval_minMax); + ~Statistics(); + void process(ComplexScalar const &xin); + IMinMax const& provider_minMax() const; + + class MinMaxProvider : public IMinMax + { + Statistics &m_parent; + public: + MinMaxProvider(Statistics &parent) + : m_parent(parent) + { + + } + radio_float_t min_i() const + { + return SlidingMinMaxGet(&m_parent.m_sl_min_I); + + } + radio_float_t min_q() const + { + return SlidingMinMaxGet(&m_parent.m_sl_min_Q); + } + radio_float_t min_mag() const + { + return SlidingMinMaxGet(&m_parent.m_sl_min_mag); + } + + radio_float_t max_i() const + { + return SlidingMinMaxGet(&m_parent.m_sl_max_I); + } + radio_float_t max_q() const + { + return SlidingMinMaxGet(&m_parent.m_sl_max_Q); + } + radio_float_t max_mag() const + { + return SlidingMinMaxGet(&m_parent.m_sl_max_mag); + } + }; + +private: + sl_minmax_t m_sl_min_I; + sl_minmax_t m_sl_min_Q; + sl_minmax_t m_sl_min_mag; + + sl_minmax_t m_sl_max_I; + sl_minmax_t m_sl_max_Q; + sl_minmax_t m_sl_max_mag; + MinMaxProvider m_provider_minMax; + +}; +} // Metrics +} // Radio + +#endif // _METRICS_STATISTICS_HPP_ \ No newline at end of file diff --git a/radio/metrics/Tracker.cpp b/radio/metrics/Tracker.cpp new file mode 100644 index 0000000..d74ff4d --- /dev/null +++ b/radio/metrics/Tracker.cpp @@ -0,0 +1,23 @@ +#include "Tracker.hpp" + + +namespace Radio +{ +namespace Metrics +{ + +Tracker::Tracker(IMinMax const &prov_minMax) +: m_prov_minMax(prov_minMax) +{ +} + +Tracker::~Tracker() +{ +} + +void Tracker::process(ComplexScalar const &x) +{ +} + +} // Metrics +} // Radio \ No newline at end of file diff --git a/radio/metrics/Tracker.hpp b/radio/metrics/Tracker.hpp new file mode 100644 index 0000000..9c9d5d4 --- /dev/null +++ b/radio/metrics/Tracker.hpp @@ -0,0 +1,27 @@ +#ifndef _METRICS_TRACKER_HPP_ +#define _METRICS_TRACKER_HPP_ + +#pragma once + +#include +#include "IMinMax.hpp" + +namespace Radio +{ +namespace Metrics +{ + +class Tracker +{ +public: + Tracker(IMinMax const &statsProvider); + virtual ~Tracker(); + void process(ComplexScalar const &x); +private: + IMinMax const &m_prov_minMax; +}; + +} // Metrics +} // Radio + +#endif // _METRICS_TRACKER_HPP_ \ No newline at end of file