From 91ff55ca0eb5f0e5d340ac4ac77e4e81007d82a7 Mon Sep 17 00:00:00 2001 From: Matteo Cypriani Date: Tue, 19 Jun 2012 17:56:10 +0200 Subject: [PATCH] [Positioner] Measurement: variance in dBm Along with the variance in mW, compute the variance of the dBm values. --- owlps-positioner/src/measurement.cc | 29 +++++++++++++++++++++++------ owlps-positioner/src/measurement.hh | 20 ++++++++++++++++---- 2 files changed, 39 insertions(+), 10 deletions(-) diff --git a/owlps-positioner/src/measurement.cc b/owlps-positioner/src/measurement.cc index 4cf1f86..9756f14 100644 --- a/owlps-positioner/src/measurement.cc +++ b/owlps-positioner/src/measurement.cc @@ -108,7 +108,7 @@ void Measurement::merge(const Measurement &source) /** * - #ap is not deleted, only initialised to NULL. * - #ss_list is cleared. - * - #average_dbm, #average_mw and #variance_mw are reset to 0. + * - average and variance variables are reset to 0. */ void Measurement::clear() { @@ -116,7 +116,9 @@ void Measurement::clear() average_dbm = 0 ; average_mw = 0 ; variance_mw = 0 ; + variance_dbm = 0 ; variance_mw_m2 = 0 ; + variance_dbm_m2 = 0 ; variance_size = 0 ; ap = NULL ; } @@ -186,7 +188,9 @@ void Measurement::recalculate_average() average_dbm = 0 ; average_mw = 0 ; variance_mw = 0 ; + variance_dbm = 0 ; variance_mw_m2 = 0 ; + variance_dbm_m2 = 0 ; variance_size = 0 ; for (map::const_iterator @@ -204,14 +208,19 @@ void Measurement::update_average(ss_t ss_dbm) float ss_mw = pow(10, static_cast(ss_dbm) / 10.0) ; // Update the average: - float delta = ss_mw - average_mw ; - average_mw += delta / variance_size ; + float delta_mw = ss_mw - average_mw ; + average_mw += delta_mw / variance_size ; average_dbm = 10.0 * log10(average_mw) ; + float delta_dbm = ss_dbm - average_dbm ; // Update the variance: - variance_mw_m2 += delta * (ss_mw - average_mw) ; + variance_mw_m2 += delta_mw * (ss_mw - average_mw) ; + variance_dbm_m2 += delta_dbm * (ss_dbm - average_dbm) ; if (variance_size > 1) - variance_mw = variance_mw_m2 / (variance_size - 1) ; + { + variance_mw = variance_mw_m2 / (variance_size - 1) ; + variance_dbm = variance_dbm_m2 / (variance_size - 1) ; + } } @@ -229,7 +238,9 @@ Measurement& Measurement::operator=(const Measurement &m) average_dbm = m.average_dbm ; average_mw = m.average_mw ; variance_mw = m.variance_mw ; + variance_dbm = m.variance_mw ; variance_mw_m2 = m.variance_mw_m2 ; + variance_dbm_m2 = m.variance_mw_m2 ; variance_size = m.variance_size ; return *this ; @@ -294,7 +305,13 @@ ostream &operator<<(ostream &os, const Measurement &m) os << static_cast(i->second) << '(' << i->first << ')' ; } - os << " [AVG_dBm=" << m.average_dbm << ";AVG_mW=" << m.average_mw << ";VAR_mW=" << m.variance_mw << ";STD_mW=" << m.get_std_deviation_mw() << "]" ; + os << " [AVG_dBm=" << m.average_dbm + << ";VAR_dBm=" << m.variance_dbm + << ";STD_dBm=" << m.get_std_deviation_dbm() + << ";AVG_mW=" << m.average_mw + << ";VAR_mW=" << m.variance_mw + << ";STD_mW=" << m.get_std_deviation_mw() + << "]" ; return os ; } diff --git a/owlps-positioner/src/measurement.hh b/owlps-positioner/src/measurement.hh index 59bbfd7..5b31abf 100644 --- a/owlps-positioner/src/measurement.hh +++ b/owlps-positioner/src/measurement.hh @@ -31,10 +31,14 @@ protected: float average_mw ; /// Variance of all the captured signal strengths (mW) float variance_mw ; + /// Variance of all the captured signal strengths (dBm) + float variance_dbm ; private: /// Intermediate variable used to compute the variance (mW) float variance_mw_m2 ; + /// Intermediate variable used to compute the variance (dBm) + float variance_dbm_m2 ; /// Number of elements taken into account in the variance computation unsigned int variance_size ; @@ -56,14 +60,14 @@ protected: public: Measurement(const AccessPoint *_ap = NULL): ap(const_cast(_ap)), average_dbm(0), - average_mw(0), variance_mw(0), variance_mw_m2(0), - variance_size(0) {} + average_mw(0), variance_mw(0), variance_dbm(0), + variance_mw_m2(0), variance_dbm_m2(0), variance_size(0) {} Measurement(const Measurement &source): ap(source.ap), ss_list(source.ss_list), average_dbm(source.average_dbm), average_mw(source.average_mw), - variance_mw(source.variance_mw), variance_mw_m2(0), - variance_size(0) {} + variance_mw(source.variance_mw), variance_dbm(source.variance_dbm), + variance_mw_m2(0), variance_dbm_m2(0), variance_size(0) {} ~Measurement(void) ; @@ -79,6 +83,8 @@ public: float get_variance_mw() const ; /// Returns the standard deviation of the SS list (mW) float get_std_deviation_mw() const ; + /// Returns the standard deviation of the SS list (dBm) + float get_std_deviation_dbm() const ; /// Returns the number of SS in the SS list int get_nb_ss() const ; //@} @@ -158,6 +164,12 @@ inline float Measurement::get_std_deviation_mw() const } +inline float Measurement::get_std_deviation_dbm() const +{ + return sqrt(variance_dbm) ; +} + + inline int Measurement::get_nb_ss() const { return ss_list.size() ;