diff --git a/lib/include/srslte/phy/utils/vector.h b/lib/include/srslte/phy/utils/vector.h index c06c15504..c135dbc87 100644 --- a/lib/include/srslte/phy/utils/vector.h +++ b/lib/include/srslte/phy/utils/vector.h @@ -174,6 +174,7 @@ SRSLTE_API void srslte_vec_conj_cc(const cf_t* x, cf_t* y, const uint32_t len); /* average vector power */ SRSLTE_API float srslte_vec_avg_power_cf(const cf_t* x, const uint32_t len); +SRSLTE_API float srslte_vec_avg_power_sf(const int16_t* x, const uint32_t len); /* Correlation between complex vectors x and y */ SRSLTE_API float srslte_vec_corr_ccc(const cf_t* x, cf_t* y, const uint32_t len); diff --git a/lib/src/phy/utils/vector.c b/lib/src/phy/utils/vector.c index d0cc852c9..e8b782749 100644 --- a/lib/src/phy/utils/vector.c +++ b/lib/src/phy/utils/vector.c @@ -459,6 +459,28 @@ float srslte_vec_avg_power_cf(const cf_t* x, const uint32_t len) return crealf(srslte_vec_dot_prod_conj_ccc(x, x, len)) / len; } +float srslte_vec_avg_power_sf(const int16_t* x, const uint32_t len) +{ + // Accumulator + float acc = 0.0f; + + for (uint32_t i = 0; i < len; i++) { + // Read value and typecast to float + float t = (float)x[i]; + + // Square value + acc += t * t; + } + + // Do average + if (len) { + acc /= len; + } + + // Return accumulated value + return acc; +} + // Correlation assumes zero-mean x and y float srslte_vec_corr_ccc(const cf_t* x, cf_t* y, const uint32_t len) {