ms: flexible template for value_type buffer sum
Manual attempts to get the number of complex and single samples right
turned out to be a bit error prone at times...
Change-Id: I3c9953073555e3a7f70b78b0946dfdf949175a82
diff --git a/Transceiver52M/ms/ms.h b/Transceiver52M/ms/ms.h
index 8ca9b02..ad2d056 100644
--- a/Transceiver52M/ms/ms.h
+++ b/Transceiver52M/ms/ms.h
@@ -84,16 +84,19 @@
template <typename T>
struct is_complex : std::false_type {
using baset = T;
+ static const unsigned int len_mul = 1;
};
template <typename T>
struct is_complex<std::complex<T>> : std::true_type {
using baset = typename std::complex<T>::value_type;
+ static const unsigned int len_mul = 2;
};
template <typename T>
struct is_complex<Complex<T>> : std::true_type {
using baset = typename Complex<T>::value_type;
+ static const unsigned int len_mul = 2;
};
} // namespace cvt_internal
@@ -106,6 +109,19 @@
return cvt_internal::convert_and_scale_i((vd *)dst, (vs *)src, src_len, scale);
}
+template <typename array_t>
+float normed_abs_sum(array_t *src, int len)
+{
+ using vd = typename cvt_internal::is_complex<array_t>::baset;
+ auto len_mul = cvt_internal::is_complex<array_t>::len_mul;
+ auto ptr = reinterpret_cast<const vd *>(src);
+ float sum = 0;
+ for (unsigned int i = 0; i < len * len_mul; i++)
+ sum += std::abs(ptr[i]);
+ sum /= len * len_mul;
+ return sum;
+}
+
struct one_burst {
one_burst()
{