From 73db162804afcfc348868cfbbe37afd9e5b390a3 Mon Sep 17 00:00:00 2001 From: Khalid Ahmed <ahmedkd@iis.fraunhofer.de> Date: Fri, 8 Mar 2019 10:03:05 +0100 Subject: [PATCH] Renaming and moving nr_layer_mapping to a common liberary between UE and gNB --- openair1/PHY/MODULATION/nr_modulation.c | 70 ++++++++++++++++++++++++ openair1/PHY/MODULATION/nr_modulation.h | 12 ++++ openair1/PHY/NR_TRANSPORT/nr_dlsch.c | 73 +------------------------ openair1/PHY/NR_TRANSPORT/nr_dlsch.h | 5 -- 4 files changed, 83 insertions(+), 77 deletions(-) diff --git a/openair1/PHY/MODULATION/nr_modulation.c b/openair1/PHY/MODULATION/nr_modulation.c index 8a6a5550ca..6c4d9c85ca 100644 --- a/openair1/PHY/MODULATION/nr_modulation.c +++ b/openair1/PHY/MODULATION/nr_modulation.c @@ -49,4 +49,74 @@ void nr_modulation(uint32_t *in, out[i<<1] = nr_mod_table[(offset+idx)<<1]; out[(i<<1)+1] = nr_mod_table[((offset+idx)<<1)+1]; } +} + +void nr_layer_mapping(int16_t **mod_symbs, + uint8_t n_layers, + uint16_t n_symbs, + int16_t **tx_layers) { + + switch (n_layers) { + + case 1: + memcpy((void*)tx_layers[0], (void*)mod_symbs[0], (n_symbs<<1)*sizeof(int16_t)); + break; + + case 2: + case 3: + case 4: + for (int i=0; i<n_symbs/n_layers; i++) + for (int l=0; l<n_layers; l++) { + tx_layers[l][i<<1] = mod_symbs[0][(n_layers*i+l)<<1]; + tx_layers[l][(i<<1)+1] = mod_symbs[0][((n_layers*i+l)<<1)+1]; + } + break; + + case 5: + for (int i=0; i<n_symbs>>1; i++) + for (int l=0; l<2; l++) { + tx_layers[l][i<<1] = mod_symbs[0][((i<<1)+l)<<1]; + tx_layers[l][(i<<1)+1] = mod_symbs[0][(((i<<1)+l)<<1)+1]; + } + for (int i=0; i<n_symbs/3; i++) + for (int l=2; l<5; l++) { + tx_layers[l][i<<1] = mod_symbs[1][(3*i+l)<<1]; + tx_layers[l][(i<<1)+1] = mod_symbs[1][((3*i+l)<<1)+1]; + } + break; + + case 6: + for (int q=0; q<2; q++) + for (int i=0; i<n_symbs/3; i++) + for (int l=0; l<3; l++) { + tx_layers[l][i<<1] = mod_symbs[q][(3*i+l)<<1]; + tx_layers[l][(i<<1)+1] = mod_symbs[q][((3*i+l)<<1)+1]; + } + break; + + case 7: + for (int i=0; i<n_symbs/3; i++) + for (int l=0; l<3; l++) { + tx_layers[l][i<<1] = mod_symbs[1][(3*i+l)<<1]; + tx_layers[l][(i<<1)+1] = mod_symbs[1][((3*i+l)<<1)+1]; + } + for (int i=0; i<n_symbs/4; i++) + for (int l=3; l<7; l++) { + tx_layers[l][i<<1] = mod_symbs[0][((i<<2)+l)<<1]; + tx_layers[l][(i<<1)+1] = mod_symbs[0][(((i<<2)+l)<<1)+1]; + } + break; + + case 8: + for (int q=0; q<2; q++) + for (int i=0; i<n_symbs>>2; i++) + for (int l=0; l<3; l++) { + tx_layers[l][i<<1] = mod_symbs[q][((i<<2)+l)<<1]; + tx_layers[l][(i<<1)+1] = mod_symbs[q][(((i<<2)+l)<<1)+1]; + } + break; + + default: + AssertFatal(0, "Invalid number of layers %d\n", n_layers); + } } \ No newline at end of file diff --git a/openair1/PHY/MODULATION/nr_modulation.h b/openair1/PHY/MODULATION/nr_modulation.h index 8f4e5f3761..e7cda27302 100644 --- a/openair1/PHY/MODULATION/nr_modulation.h +++ b/openair1/PHY/MODULATION/nr_modulation.h @@ -37,4 +37,16 @@ void nr_modulation(uint32_t *in, uint16_t mod_order, int16_t *out); +/*! \brief Perform NR layer mapping. TS 38.211 V15.4.0 subclause 7.3.1.3 + @param[in] mod_symbs, double Pointer to modulated symbols for each codeword + @param[in] n_layers, number of layers + @param[in] n_symbs, number of modulated symbols + @param[out] tx_layers, modulated symbols for each layer +*/ + +void nr_layer_mapping(int16_t **mod_symbs, + uint8_t n_layers, + uint16_t n_symbs, + int16_t **tx_layers); + #endif \ No newline at end of file diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c index 8428483153..8f6cbd7055 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c @@ -65,77 +65,6 @@ void nr_pdsch_codeword_scrambling(uint8_t *in, } - -void nr_pdsch_layer_mapping(int16_t **mod_symbs, - uint8_t n_layers, - uint16_t n_symbs, - int16_t **tx_layers) { - - switch (n_layers) { - - case 1: - memcpy((void*)tx_layers[0], (void*)mod_symbs[0], (n_symbs<<1)*sizeof(int16_t)); - break; - - case 2: - case 3: - case 4: - for (int i=0; i<n_symbs/n_layers; i++) - for (int l=0; l<n_layers; l++) { - tx_layers[l][i<<1] = mod_symbs[0][(n_layers*i+l)<<1]; - tx_layers[l][(i<<1)+1] = mod_symbs[0][((n_layers*i+l)<<1)+1]; - } - break; - - case 5: - for (int i=0; i<n_symbs>>1; i++) - for (int l=0; l<2; l++) { - tx_layers[l][i<<1] = mod_symbs[0][((i<<1)+l)<<1]; - tx_layers[l][(i<<1)+1] = mod_symbs[0][(((i<<1)+l)<<1)+1]; - } - for (int i=0; i<n_symbs/3; i++) - for (int l=2; l<5; l++) { - tx_layers[l][i<<1] = mod_symbs[1][(3*i+l)<<1]; - tx_layers[l][(i<<1)+1] = mod_symbs[1][((3*i+l)<<1)+1]; - } - break; - - case 6: - for (int q=0; q<2; q++) - for (int i=0; i<n_symbs/3; i++) - for (int l=0; l<3; l++) { - tx_layers[l][i<<1] = mod_symbs[q][(3*i+l)<<1]; - tx_layers[l][(i<<1)+1] = mod_symbs[q][((3*i+l)<<1)+1]; - } - break; - - case 7: - for (int i=0; i<n_symbs/3; i++) - for (int l=0; l<3; l++) { - tx_layers[l][i<<1] = mod_symbs[1][(3*i+l)<<1]; - tx_layers[l][(i<<1)+1] = mod_symbs[1][((3*i+l)<<1)+1]; - } - for (int i=0; i<n_symbs/4; i++) - for (int l=3; l<7; l++) { - tx_layers[l][i<<1] = mod_symbs[0][((i<<2)+l)<<1]; - tx_layers[l][(i<<1)+1] = mod_symbs[0][(((i<<2)+l)<<1)+1]; - } - break; - - case 8: - for (int q=0; q<2; q++) - for (int i=0; i<n_symbs>>2; i++) - for (int l=0; l<3; l++) { - tx_layers[l][i<<1] = mod_symbs[q][((i<<2)+l)<<1]; - tx_layers[l][(i<<1)+1] = mod_symbs[q][(((i<<2)+l)<<1)+1]; - } - break; - - default: - AssertFatal(0, "Invalid number of layers %d\n", n_layers); - } -} - static inline uint16_t get_pdsch_dmrs_idx(uint8_t n, uint8_t k_prime, uint8_t delta, uint8_t dmrs_type) { uint16_t dmrs_idx = (dmrs_type)? (6*n+k_prime+delta):((n<<2)+(k_prime<<1)+delta); return dmrs_idx; @@ -223,7 +152,7 @@ for (int i=0; i<nb_symbols>>3; i++) { /// Layer mapping - nr_pdsch_layer_mapping(mod_symbs, + nr_layer_mapping(mod_symbs, rel15->nb_layers, nb_symbols, tx_layers); diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.h b/openair1/PHY/NR_TRANSPORT/nr_dlsch.h index 22ae2a49ca..b5a954a730 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.h +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.h @@ -68,11 +68,6 @@ void nr_pdsch_codeword_scrambling(uint8_t *in, uint32_t n_RNTI, uint32_t* out); -void nr_pdsch_layer_mapping(int16_t **mod_symbs, - uint8_t n_layers, - uint16_t n_symbs, - int16_t **tx_layers); - void nr_fill_dlsch(PHY_VARS_gNB *gNB, int frame, int slot, -- 2.26.2