From 2574de4d2db73d8f068bbcedbf6ab7c040fbfdf6 Mon Sep 17 00:00:00 2001 From: Guillem Foreman Date: Tue, 16 Jul 2019 17:01:20 +0200 Subject: [PATCH] Fixed soft demodulator --- lib/src/phy/modem/demod_soft.c | 81 +++++++++++++++++------------ lib/src/phy/modem/test/modem_test.c | 23 ++++---- 2 files changed, 57 insertions(+), 47 deletions(-) diff --git a/lib/src/phy/modem/demod_soft.c b/lib/src/phy/modem/demod_soft.c index 350cc153a..f63f6f9e3 100644 --- a/lib/src/phy/modem/demod_soft.c +++ b/lib/src/phy/modem/demod_soft.c @@ -413,51 +413,66 @@ void demod_64qam_lte_b(const cf_t *symbols, int8_t *llr, int nsymbols) void demod_256qam_lte(const cf_t* symbols, float* llr, int nsymbols) { for (int i = 0; i < nsymbols; i++) { - float real = crealf(symbols[i]); - float imag = cimagf(symbols[i]); - - llr[8 * i + 0] = -real; - llr[8 * i + 1] = -imag; - llr[8 * i + 2] = fabsf(real) - 8 / sqrt(170); - llr[8 * i + 3] = fabsf(imag) - 8 / sqrt(170); - llr[8 * i + 4] = fabsf(llr[8 * i + 2]) - 4 / sqrt(170); - llr[8 * i + 5] = fabsf(llr[8 * i + 3]) - 4 / sqrt(170); - llr[8 * i + 6] = fabsf(llr[8 * i + 4]) - 2 / sqrt(170); - llr[8 * i + 7] = fabsf(llr[8 * i + 5]) - 2 / sqrt(170); + float real = -__real__ symbols[i]; + float imag = -__imag__ symbols[i]; + *(llr++) = real; + *(llr++) = imag; + real = fabsf(real) - 8.0f / sqrtf(170.0f); + imag = fabsf(imag) - 8.0f / sqrtf(170.0f); + *(llr++) = real; + *(llr++) = imag; + real = fabsf(real) - 4.0f / sqrtf(170.0f); + imag = fabsf(imag) - 4.0f / sqrtf(170.0f); + *(llr++) = real; + *(llr++) = imag; + real = fabsf(real) - 2.0f / sqrtf(170.0f); + imag = fabsf(imag) - 2.0f / sqrtf(170.0f); + *(llr++) = real; + *(llr++) = imag; } } void demod_256qam_lte_b(const cf_t* symbols, int8_t* llr, int nsymbols) { for (int i = 0; i < nsymbols; i++) { - float real = SCALE_BYTE_CONV_QAM256 * crealf(symbols[i]); - float imag = SCALE_BYTE_CONV_QAM256 * cimagf(symbols[i]); - - llr[8 * i + 0] = -real; - llr[8 * i + 1] = -imag; - llr[8 * i + 2] = fabsf(real) - SCALE_BYTE_CONV_QAM256 * 8 / sqrt(170); - llr[8 * i + 3] = fabsf(imag) - SCALE_BYTE_CONV_QAM256 * 8 / sqrt(170); - llr[8 * i + 4] = fabsf(llr[8 * i + 2]) - SCALE_BYTE_CONV_QAM256 * 4 / sqrt(170); - llr[8 * i + 5] = fabsf(llr[8 * i + 3]) - SCALE_BYTE_CONV_QAM256 * 4 / sqrt(170); - llr[8 * i + 6] = fabsf(llr[8 * i + 4]) - SCALE_BYTE_CONV_QAM256 * 2 / sqrt(170); - llr[8 * i + 7] = fabsf(llr[8 * i + 5]) - SCALE_BYTE_CONV_QAM256 * 2 / sqrt(170); + float real = -__real__ symbols[i]; + float imag = -__imag__ symbols[i]; + *(llr++) = SCALE_BYTE_CONV_QAM256 * real; + *(llr++) = SCALE_BYTE_CONV_QAM256 * imag; + real = fabsf(real) - 8.0f / sqrtf(170.0f); + imag = fabsf(imag) - 8.0f / sqrtf(170.0f); + *(llr++) = SCALE_BYTE_CONV_QAM256 * real; + *(llr++) = SCALE_BYTE_CONV_QAM256 * imag; + real = fabsf(real) - 4.0f / sqrtf(170.0f); + imag = fabsf(imag) - 4.0f / sqrtf(170.0f); + *(llr++) = SCALE_BYTE_CONV_QAM256 * real; + *(llr++) = SCALE_BYTE_CONV_QAM256 * imag; + real = fabsf(real) - 2.0f / sqrtf(170.0f); + imag = fabsf(imag) - 2.0f / sqrtf(170.0f); + *(llr++) = SCALE_BYTE_CONV_QAM256 * real; + *(llr++) = SCALE_BYTE_CONV_QAM256 * imag; } } void demod_256qam_lte_s(const cf_t* symbols, short* llr, int nsymbols) { for (int i = 0; i < nsymbols; i++) { - float real = SCALE_SHORT_CONV_QAM256 * crealf(symbols[i]); - float imag = SCALE_SHORT_CONV_QAM256 * cimagf(symbols[i]); - - llr[8 * i + 0] = -real; - llr[8 * i + 1] = -imag; - llr[8 * i + 2] = fabsf(real) - SCALE_SHORT_CONV_QAM256 * 8 / sqrt(170); - llr[8 * i + 3] = fabsf(imag) - SCALE_SHORT_CONV_QAM256 * 8 / sqrt(170); - llr[8 * i + 4] = fabsf(llr[8 * i + 2]) - SCALE_SHORT_CONV_QAM256 * 4 / sqrt(170); - llr[8 * i + 5] = fabsf(llr[8 * i + 3]) - SCALE_SHORT_CONV_QAM256 * 4 / sqrt(170); - llr[8 * i + 6] = fabsf(llr[8 * i + 4]) - SCALE_SHORT_CONV_QAM256 * 2 / sqrt(170); - llr[8 * i + 7] = fabsf(llr[8 * i + 5]) - SCALE_SHORT_CONV_QAM256 * 2 / sqrt(170); + float real = -__real__ symbols[i]; + float imag = -__imag__ symbols[i]; + *(llr++) = SCALE_SHORT_CONV_QAM256 * real; + *(llr++) = SCALE_SHORT_CONV_QAM256 * imag; + real = fabsf(real) - 8.0f / sqrtf(170.0f); + imag = fabsf(imag) - 8.0f / sqrtf(170.0f); + *(llr++) = SCALE_SHORT_CONV_QAM256 * real; + *(llr++) = SCALE_SHORT_CONV_QAM256 * imag; + real = fabsf(real) - 4.0f / sqrtf(170.0f); + imag = fabsf(imag) - 4.0f / sqrtf(170.0f); + *(llr++) = SCALE_SHORT_CONV_QAM256 * real; + *(llr++) = SCALE_SHORT_CONV_QAM256 * imag; + real = fabsf(real) - 2.0f / sqrtf(170.0f); + imag = fabsf(imag) - 2.0f / sqrtf(170.0f); + *(llr++) = SCALE_SHORT_CONV_QAM256 * real; + *(llr++) = SCALE_SHORT_CONV_QAM256 * imag; } } diff --git a/lib/src/phy/modem/test/modem_test.c b/lib/src/phy/modem/test/modem_test.c index ed2b8efb2..553b39918 100644 --- a/lib/src/phy/modem/test/modem_test.c +++ b/lib/src/phy/modem/test/modem_test.c @@ -82,11 +82,12 @@ void parse_args(int argc, char **argv) { int main(int argc, char **argv) { + int ret = SRSLTE_SUCCESS; int i; srslte_modem_table_t mod; uint8_t *input, *input_bytes, *output; cf_t *symbols, *symbols_bytes; - float *llr, *llr2; + float* llr; parse_args(argc, argv); @@ -137,12 +138,6 @@ int main(int argc, char **argv) { exit(-1); } - llr2 = srslte_vec_malloc(sizeof(float) * num_bits); - if (!llr2) { - perror("malloc"); - exit(-1); - } - /* generate random data */ for (i=0;i=0 ? 1 : 0; } /* check errors */ - for (i=0;i