diff --git a/lib/include/srslte/phy/utils/vector_simd.h b/lib/include/srslte/phy/utils/vector_simd.h index 49268ca43..8139d0e78 100644 --- a/lib/include/srslte/phy/utils/vector_simd.h +++ b/lib/include/srslte/phy/utils/vector_simd.h @@ -120,6 +120,8 @@ SRSLTE_API void srslte_vec_abs_square_cf_simd(const cf_t *x, float *z, const int /* Other Functions */ SRSLTE_API void srslte_vec_lut_sss_simd(const short *x, const unsigned short *lut, short *y, const int len); +SRSLTE_API void srslte_vec_convert_if_simd(const int16_t *x, float *z, const float scale, const int len); + SRSLTE_API void srslte_vec_convert_fi_simd(const float *x, int16_t *z, const float scale, const int len); SRSLTE_API void srslte_vec_cp_simd(const cf_t *src, cf_t *dst, int len); diff --git a/lib/src/phy/utils/test/vector_test.c b/lib/src/phy/utils/test/vector_test.c index ebda516ea..55ff2944e 100644 --- a/lib/src/phy/utils/test/vector_test.c +++ b/lib/src/phy/utils/test/vector_test.c @@ -452,6 +452,28 @@ TEST(srslte_vec_convert_fi, free(z); ) +TEST(srslte_vec_convert_if, + MALLOC(int16_t, x); + MALLOC(float, z); + float scale = 1000.0f; + + float gold; + float k = 1.0f/scale; + for (int i = 0; i < block_size; i++) { + x[i] = (int16_t) RANDOM_S(); + } + + TEST_CALL(srslte_vec_convert_if(x, scale, z, block_size)) + + for (int i = 0; i < block_size; i++) { + gold = ((float)x[i]) * k; + mse += fabsf(gold - z[i]); + } + + free(x); + free(z); +) + TEST(srslte_vec_prod_fff, MALLOC(float, x); MALLOC(float, y); @@ -596,7 +618,7 @@ TEST(srslte_vec_div_ccc, for (int i = 0; i < block_size; i++) { gold = x[i] / y[i]; - mse += cabsf(gold - z[i]); + mse += cabsf(gold - z[i]) / cabsf(gold); } mse /= block_size; @@ -614,14 +636,14 @@ TEST(srslte_vec_div_cfc, cf_t gold; for (int i = 0; i < block_size; i++) { x[i] = RANDOM_CF(); - y[i] = RANDOM_F(); + y[i] = RANDOM_F() + 0.0001f; } TEST_CALL(srslte_vec_div_cfc(x, y, z, block_size)) for (int i = 0; i < block_size; i++) { gold = x[i] / y[i]; - mse += cabsf(gold - z[i])/cabsf(gold); + mse += cabsf(gold - z[i]) / cabsf(gold); } mse /= block_size; @@ -638,15 +660,15 @@ TEST(srslte_vec_div_fff, cf_t gold; for (int i = 0; i < block_size; i++) { - x[i] = RANDOM_F() + 0.0001; - y[i] = RANDOM_F()+ 0.0001; + x[i] = RANDOM_F(); + y[i] = RANDOM_F() + 0.0001f; } TEST_CALL(srslte_vec_div_fff(x, y, z, block_size)) for (int i = 0; i < block_size; i++) { gold = x[i] / y[i]; - mse += cabsf(gold - z[i]); + mse += cabsf(gold - z[i]) / cabsf(gold); } mse /= block_size; @@ -753,6 +775,9 @@ int main(int argc, char **argv) { passed[func_count][size_count] = test_srslte_vec_convert_fi(func_names[func_count], &timmings[func_count][size_count], block_size); func_count++; + passed[func_count][size_count] = test_srslte_vec_convert_if(func_names[func_count], &timmings[func_count][size_count], block_size); + func_count++; + passed[func_count][size_count] = test_srslte_vec_prod_fff(func_names[func_count], &timmings[func_count][size_count], block_size); func_count++; diff --git a/lib/src/phy/utils/vector.c b/lib/src/phy/utils/vector.c index 195ac98cb..b97583bb8 100644 --- a/lib/src/phy/utils/vector.c +++ b/lib/src/phy/utils/vector.c @@ -93,10 +93,7 @@ void srslte_vec_sc_prod_ccc(const cf_t *x, const cf_t h, cf_t *z, const uint32_t // Used in turbo decoder void srslte_vec_convert_if(const int16_t *x, const float scale, float *z, const uint32_t len) { - int i; - for (i=0;i