diff --git a/lib/include/srsran/phy/utils/bit.h b/lib/include/srsran/phy/utils/bit.h index c9267a441..77e55a0b7 100644 --- a/lib/include/srsran/phy/utils/bit.h +++ b/lib/include/srsran/phy/utils/bit.h @@ -26,6 +26,10 @@ #include "srsran/config.h" +#ifdef __cplusplus +extern "C" { +#endif + typedef struct { uint32_t nof_bits; uint16_t* interleaver; @@ -78,4 +82,8 @@ SRSRAN_API uint32_t srsran_bit_diff(const uint8_t* x, const uint8_t* y, int nbit SRSRAN_API uint32_t srsran_bit_count(uint32_t n); +#ifdef __cplusplus +} +#endif + #endif // SRSRAN_BIT_H diff --git a/lib/include/srsran/phy/utils/random.h b/lib/include/srsran/phy/utils/random.h index 4383f2d0c..7eab3c180 100644 --- a/lib/include/srsran/phy/utils/random.h +++ b/lib/include/srsran/phy/utils/random.h @@ -39,6 +39,8 @@ SRSRAN_API float srsran_random_gauss_dist(srsran_random_t q, float std_dev); SRSRAN_API bool srsran_random_bool(srsran_random_t q, float prob_true); +SRSRAN_API void srsran_random_byte_vector(srsran_random_t q, uint8_t* c, uint32_t nsamples); + SRSRAN_API void srsran_random_bit_vector(srsran_random_t q, uint8_t* c, uint32_t nsamples); SRSRAN_API void srsran_random_free(srsran_random_t q); diff --git a/lib/src/phy/utils/random.cpp b/lib/src/phy/utils/random.cpp index 848a7745b..04a01f3be 100644 --- a/lib/src/phy/utils/random.cpp +++ b/lib/src/phy/utils/random.cpp @@ -11,6 +11,7 @@ */ #include "srsran/phy/utils/random.h" +#include "srsran/phy/utils/bit.h" #include #include @@ -53,6 +54,20 @@ public: } } + void bit_vector(uint8_t* buffer, uint32_t n) + { + if (buffer == NULL || n == 0) { + return; + } + + uint32_t i = 0; + uint8_t* ptr = buffer; + for (; i < n / 32; i++) { + srsran_bit_unpack((uint32_t)(*mt19937)(), &ptr, 32); + } + srsran_bit_unpack((uint32_t)(*mt19937)(), &ptr, n - i * 32); + } + float gauss_dist(float sigma) { std::normal_distribution dist(sigma); @@ -130,7 +145,7 @@ bool srsran_random_bool(srsran_random_t q, float prob_true) return srsran_random_uniform_real_dist(q, 0, 1) < prob_true; } -void srsran_random_bit_vector(srsran_random_t q, uint8_t* c, uint32_t nsamples) +void srsran_random_byte_vector(srsran_random_t q, uint8_t* c, uint32_t nsamples) { if (q == nullptr) { return; @@ -139,6 +154,15 @@ void srsran_random_bit_vector(srsran_random_t q, uint8_t* c, uint32_t nsamples) h->byte_vector(c, nsamples); } +void srsran_random_bit_vector(srsran_random_t q, uint8_t* c, uint32_t nsamples) +{ + if (q == nullptr) { + return; + } + auto* h = (random_wrap*)q; + h->bit_vector(c, nsamples); +} + void srsran_random_free(srsran_random_t q) { if (q) { diff --git a/lib/test/phy/phy_dl_test.c b/lib/test/phy/phy_dl_test.c index 07b95edb7..78c9ed5c5 100644 --- a/lib/test/phy/phy_dl_test.c +++ b/lib/test/phy/phy_dl_test.c @@ -524,9 +524,7 @@ int main(int argc, char** argv) for (uint32_t sf_idx = 0; sf_idx < nof_subframes; sf_idx++) { /* Generate random data */ for (int j = 0; j < SRSRAN_MAX_TB; j++) { - for (int i = 0; i < MAX_DATABUFFER_SIZE; i++) { - data_tx[j][i] = (uint8_t)srsran_random_uniform_int_dist(random, 0, 255); - } + srsran_random_byte_vector(random, data_tx[j], MAX_DATABUFFER_SIZE); } /*