From 1ec87df5a66fd389f0b847ff0f740c6084d5a773 Mon Sep 17 00:00:00 2001 From: Khalid Ahmed Date: Wed, 3 Apr 2019 18:58:03 +0200 Subject: [PATCH] adding UL dmrs funtionalities to dmrs_nr.c in NR_UE_TRANSPORT --- openair1/PHY/MODULATION/nr_modulation.h | 2 ++ openair1/PHY/NR_REFSIG/dmrs_nr.h | 2 ++ openair1/PHY/NR_TRANSPORT/nr_dlsch.c | 2 +- openair1/PHY/NR_TRANSPORT/nr_sch_dmrs.c | 7 ++--- openair1/PHY/NR_TRANSPORT/nr_sch_dmrs.h | 3 +- openair1/PHY/NR_UE_TRANSPORT/dmrs_nr.c | 39 +++++++++++++++++++++++++ openair1/SIMULATION/NR_PHY/ulsim.c | 6 ++-- 7 files changed, 50 insertions(+), 11 deletions(-) diff --git a/openair1/PHY/MODULATION/nr_modulation.h b/openair1/PHY/MODULATION/nr_modulation.h index e7cda27302..dbe6214ff4 100644 --- a/openair1/PHY/MODULATION/nr_modulation.h +++ b/openair1/PHY/MODULATION/nr_modulation.h @@ -25,6 +25,8 @@ #include #include "PHY/defs_nr_common.h" +#define DMRS_MOD_ORDER 2 + /*! \brief Perform NR modulation. TS 38.211 V15.4.0 subclause 5.1 @param[in] in, Pointer to input bits @param[in] length, size of input bits diff --git a/openair1/PHY/NR_REFSIG/dmrs_nr.h b/openair1/PHY/NR_REFSIG/dmrs_nr.h index a695006304..9b02d2b1af 100644 --- a/openair1/PHY/NR_REFSIG/dmrs_nr.h +++ b/openair1/PHY/NR_REFSIG/dmrs_nr.h @@ -54,6 +54,8 @@ int pseudo_random_sequence(int M_PN, uint32_t *c, uint32_t cinit); void lte_gold_new(LTE_DL_FRAME_PARMS *frame_parms, uint32_t lte_gold_table[20][2][14], uint16_t Nid_cell); void generate_dmrs_pbch(uint32_t dmrs_pbch_bitmap[DMRS_PBCH_I_SSB][DMRS_PBCH_N_HF][DMRS_BITMAP_SIZE], uint16_t Nid_cell); +uint8_t get_l0_ul(uint8_t mapping_type, uint8_t dmrs_typeA_position); +uint16_t get_dmrs_freq_idx_ul(uint8_t n, uint8_t k_prime, uint8_t delta, uint8_t dmrs_type); #undef EXTERN diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c index 3316e507c6..9a4df38895 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c @@ -172,7 +172,7 @@ for (int l=0; lnb_layers; l++) uint8_t dmrs_type = config->pdsch_config.dmrs_type.value; uint8_t mapping_type = config->pdsch_config.mapping_type.value; - l0 = get_l0(mapping_type, 2, 0);//config->pdsch_config.dmrs_typeA_position.value); + l0 = get_l0(mapping_type, 2);//config->pdsch_config.dmrs_typeA_position.value); nr_modulation(pdsch_dmrs[l0][0], n_dmrs, DMRS_MOD_ORDER, mod_dmrs); // currently only codeword 0 is modulated. Qm = 2 as DMRS is QPSK modulated #ifdef DEBUG_DLSCH diff --git a/openair1/PHY/NR_TRANSPORT/nr_sch_dmrs.c b/openair1/PHY/NR_TRANSPORT/nr_sch_dmrs.c index 1254ae67b6..8d9bf00639 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_sch_dmrs.c +++ b/openair1/PHY/NR_TRANSPORT/nr_sch_dmrs.c @@ -90,11 +90,8 @@ uint16_t get_dmrs_freq_idx(uint8_t n, uint8_t k_prime, uint8_t delta, uint8_t dm return dmrs_idx; } -uint8_t get_l0(uint8_t mapping_type, uint8_t dmrs_typeA_position, int ul_flag) { +uint8_t get_l0(uint8_t mapping_type, uint8_t dmrs_typeA_position) { - if (ul_flag) - return ((mapping_type==NFAPI_NR_PDSCH_MAPPING_TYPE_A)?dmrs_typeA_position:0); - else - return ((mapping_type==typeA)?dmrs_typeA_position:0); + return ((mapping_type==NFAPI_NR_PDSCH_MAPPING_TYPE_A)?dmrs_typeA_position:0); } diff --git a/openair1/PHY/NR_TRANSPORT/nr_sch_dmrs.h b/openair1/PHY/NR_TRANSPORT/nr_sch_dmrs.h index ab8f21395e..3351b63a0d 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_sch_dmrs.h +++ b/openair1/PHY/NR_TRANSPORT/nr_sch_dmrs.h @@ -34,7 +34,6 @@ #define NR_PDSCH_DMRS_ANTENNA_PORT0 1000 #define NR_PDSCH_DMRS_NB_ANTENNA_PORTS 12 -#define DMRS_MOD_ORDER 2 void get_l_prime(uint8_t *l_prime, uint8_t n_symbs); @@ -48,4 +47,4 @@ uint8_t get_delta(uint8_t ap, uint8_t config); uint16_t get_dmrs_freq_idx(uint8_t n, uint8_t k_prime, uint8_t delta, uint8_t dmrs_type); -uint8_t get_l0(uint8_t mapping_type, uint8_t dmrs_typeA_position, int ul_flag); +uint8_t get_l0(uint8_t mapping_type, uint8_t dmrs_typeA_position); diff --git a/openair1/PHY/NR_UE_TRANSPORT/dmrs_nr.c b/openair1/PHY/NR_UE_TRANSPORT/dmrs_nr.c index 1bccda4dc1..13a2246e69 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/dmrs_nr.c +++ b/openair1/PHY/NR_UE_TRANSPORT/dmrs_nr.c @@ -224,6 +224,45 @@ void lte_gold_new(LTE_DL_FRAME_PARMS *frame_parms, uint32_t lte_gold_table[20][2 #endif } +/******************************************************************* +* +* NAME : get_l0_ul +* +* PARAMETERS : mapping_type : PUSCH mapping type +* dmrs_typeA_position : higher layer parameter +* +* RETURN : demodulation reference signal for PUSCH +* +* DESCRIPTION : see TS 38.211 V15.4.0 Demodulation reference signals for PUSCH +* +*********************************************************************/ + +uint8_t get_l0_ul(uint8_t mapping_type, uint8_t dmrs_typeA_position) { + + return ((mapping_type==typeA)?dmrs_typeA_position:0); + +} + +/******************************************************************* +* +* NAME : get_dmrs_freq_idx_ul +* +* PARAMETERS : n : index of DMRS symbol +* k_prime : k_prime = {0,1} +* delta : given by Tables 6.4.1.1.3-1 and 6.4.1.1.3-2 +* dmrs_type : DMRS configuration type +* +* RETURN : demodulation reference signal for PUSCH +* +* DESCRIPTION : see TS 38.211 V15.4.0 Demodulation reference signals for PUSCH +* +*********************************************************************/ + +uint16_t get_dmrs_freq_idx_ul(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; +} + /******************************************************************* * * NAME : get_dmrs_pbch diff --git a/openair1/SIMULATION/NR_PHY/ulsim.c b/openair1/SIMULATION/NR_PHY/ulsim.c index 47fec1f25b..e8d5d6973c 100644 --- a/openair1/SIMULATION/NR_PHY/ulsim.c +++ b/openair1/SIMULATION/NR_PHY/ulsim.c @@ -46,7 +46,7 @@ #include "PHY/NR_TRANSPORT/nr_transport.h" #include "PHY/NR_TRANSPORT/nr_dlsch.h" #include "PHY/NR_TRANSPORT/nr_ulsch.h" -#include "PHY/NR_TRANSPORT/nr_sch_dmrs.h" +#include "PHY/NR_REFSIG/dmrs_nr.h" #include "PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h" #include "PHY/NR_TRANSPORT/nr_transport_proto.h" #include "SCHED_NR/sched_nr.h" @@ -592,7 +592,7 @@ int main(int argc, char **argv) { dmrs_type = UE->dmrs_UplinkConfig.pusch_dmrs_type; mapping_type = UE->pusch_config.pusch_TimeDomainResourceAllocation[0]->mappingType; - l0 = get_l0(mapping_type, 2, 1); + l0 = get_l0_ul(mapping_type, 2); nr_modulation(pusch_dmrs[l0][0], n_dmrs, DMRS_MOD_ORDER, mod_dmrs); // currently only codeword 0 is modulated. Qm = 2 as DMRS is QPSK modulated @@ -642,7 +642,7 @@ int main(int argc, char **argv) { sample_offsetF = l*frame_parms->ofdm_symbol_size + k; for (i=0; iofdm_symbol_size)))) { + if ((l == dmrs_symbol) && (k == ((start_sc+get_dmrs_freq_idx_ul(n, k_prime, delta, dmrs_type))%(frame_parms->ofdm_symbol_size)))) { ((int16_t*)txdataF[ap])[(sample_offsetF)<<1] = (Wt[l_prime[0]]*Wf[k_prime]*amp*mod_dmrs[dmrs_idx<<1]) >> 15; ((int16_t*)txdataF[ap])[((sample_offsetF)<<1) + 1] = (Wt[l_prime[0]]*Wf[k_prime]*amp*mod_dmrs[(dmrs_idx<<1) + 1]) >> 15; #ifdef DEBUG_PUSCH_MAPPING