From bb791dbac576f8459d522bd14b07afa50c298739 Mon Sep 17 00:00:00 2001 From: David Protzman Date: Sat, 11 Jun 2022 12:55:31 -0400 Subject: [PATCH] Added functions for mean and var --- .../gr-droneid/include/droneid/misc_utils.h | 9 ++++ gnuradio/gr-droneid/lib/misc_utils.cc | 43 +++++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/gnuradio/gr-droneid/include/droneid/misc_utils.h b/gnuradio/gr-droneid/include/droneid/misc_utils.h index 1d809f3..8f58489 100644 --- a/gnuradio/gr-droneid/include/droneid/misc_utils.h +++ b/gnuradio/gr-droneid/include/droneid/misc_utils.h @@ -46,6 +46,15 @@ namespace gr { static std::vector> create_zc_sequence(double sample_rate, uint32_t root); static std::vector> conj(const std::vector> & input); + static std::complex mean(const std::vector> & samples); + static float var(const std::vector> & samples); + static float var_no_mean(const std::vector> & samples); + + static std::complex mean(const std::complex * samples, uint32_t sample_count); + static float var(const std::complex * samples, uint32_t sample_count); + + static float var_no_mean(const std::complex * samples, uint32_t sample_count); + static void write(const std::string & path, const void * element, uint32_t element_size, uint32_t element_count); static void write(const std::string & path, const std::vector & elements); static void write_samples(const std::string &path, const std::complex * samples, uint32_t element_count); diff --git a/gnuradio/gr-droneid/lib/misc_utils.cc b/gnuradio/gr-droneid/lib/misc_utils.cc index c896453..b95343d 100644 --- a/gnuradio/gr-droneid/lib/misc_utils.cc +++ b/gnuradio/gr-droneid/lib/misc_utils.cc @@ -341,6 +341,49 @@ namespace gr { return bits; } + std::complex misc_utils::mean(const std::vector> &samples) { + return mean(&samples[0], samples.size()); + } + + float misc_utils::var(const std::vector> &samples) { + return var(&samples[0], samples.size()); + } + + std::complex misc_utils::mean(const std::complex *const samples, const uint32_t sample_count) { + auto sum = std::accumulate(samples, samples + sample_count, std::complex{0, 0}); + return sum / static_cast(sample_count); + } + + float misc_utils::var(const std::complex *const samples, uint32_t sample_count) { + const auto mean_val = mean(samples, sample_count); + const auto recip = 1.0f / static_cast(sample_count - 1); + float var_val = 0; + + for (uint32_t idx = 0; idx < sample_count; idx++) { + const auto sample = samples[idx] - mean_val; + var_val += (static_cast(std::pow(sample.real(), 2) + std::pow(sample.imag(), 2))) * recip; + } + + return var_val; + } + + float misc_utils::var_no_mean(const std::complex *samples, uint32_t sample_count) { + const auto recip = 1.0f / static_cast(sample_count - 1); + float var_val = 0; + + for (uint32_t idx = 0; idx < sample_count; idx++) { + const auto & sample = samples[idx]; + var_val += (static_cast(std::pow(sample.real(), 2) + std::pow(sample.imag(), 2))) * recip; + } + + return var_val; + } + + float misc_utils::var_no_mean(const std::vector> &samples) { + return var_no_mean(&samples[0], samples.size()); + } + + } /* namespace droneid */ } /* namespace gr */