From bf2477276614c5f1933443c59f5f98531f4222d6 Mon Sep 17 00:00:00 2001 From: Khalid Ahmed Date: Fri, 6 Sep 2019 19:11:33 +0200 Subject: [PATCH] PUSCH DMRS generation - added get_l_prime function - added Table 6.4.1.1.3-3 - added added is_dmrs_symbol function --- openair1/PHY/NR_REFSIG/dmrs_nr.h | 13 +++ openair1/PHY/NR_TRANSPORT/nr_sch_dmrs.c | 6 -- openair1/PHY/NR_TRANSPORT/nr_sch_dmrs.h | 7 +- openair1/PHY/NR_UE_TRANSPORT/dmrs_nr.c | 118 +++++++++++++++++++++ openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c | 17 ++- openair1/PHY/impl_defs_nr.h | 1 + 6 files changed, 153 insertions(+), 9 deletions(-) diff --git a/openair1/PHY/NR_REFSIG/dmrs_nr.h b/openair1/PHY/NR_REFSIG/dmrs_nr.h index 5c4f218512..45c1f275b3 100644 --- a/openair1/PHY/NR_REFSIG/dmrs_nr.h +++ b/openair1/PHY/NR_REFSIG/dmrs_nr.h @@ -57,6 +57,19 @@ void generate_dmrs_pbch(uint32_t dmrs_pbch_bitmap[DMRS_PBCH_I_SSB][DMRS_PBCH_N_H uint8_t get_l0_ul(uint8_t mapping_type, uint8_t dmrs_typeA_position); uint16_t get_dmrs_freq_idx_ul(uint16_t n, uint8_t k_prime, uint8_t delta, uint8_t dmrs_type); +int32_t get_l_prime(uint8_t duration_in_symbols, uint8_t mapping_type, pusch_dmrs_AdditionalPosition_t additional_pos); + +uint8_t is_dmrs_symbol(uint8_t l, + uint16_t k, + uint16_t start_sc, + uint8_t k_prime, + uint16_t n, + uint8_t delta, + uint8_t duration_in_symbols, + dmrs_UplinkConfig_t *dmrs_UplinkConfig, + uint8_t mapping_type, + uint16_t ofdm_symbol_size); + #undef EXTERN #endif /* DMRS_NR_H */ diff --git a/openair1/PHY/NR_TRANSPORT/nr_sch_dmrs.c b/openair1/PHY/NR_TRANSPORT/nr_sch_dmrs.c index 303282929f..63922c8c65 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_sch_dmrs.c +++ b/openair1/PHY/NR_TRANSPORT/nr_sch_dmrs.c @@ -32,7 +32,6 @@ #include "nr_sch_dmrs.h" - /*Table 7.4.1.1.2-1 and 7.4.1.1.2-2 38211 Columns: ap - CDM group - Delta - Wf(0) - Wf(1) - Wt(0) - Wt(1)*/ /*Table 6.4.1.1.3-1 is identical to Table 7.4.1.1.2-1 and Table 6.4.1.1.3-2 is identical to Table 7.4.1.1.2-2. UL DMRS can reuse these tables*/ int8_t pdsch_dmrs_1[8][7] = {{0,0,0,1,1,1,1}, @@ -57,11 +56,6 @@ int8_t pdsch_dmrs_2[12][7] = {{0,0,0,1,1,1,1}, {10,2,4,1,1,1,-1}, {11,2,4,1,-1,1,-1}}; -void get_l_prime(uint8_t *l_prime, uint8_t n_symbs) { - for (int i=0; i0,"invalid l_prime < 0\n"); + + return l_prime; +} + +/******************************************************************* +* +* NAME : is_dmrs_symbol +* +* PARAMETERS : l ofdm symbol index within slot +* k subcarrier index +* start_sc first subcarrier index +* k_prime index alternating 0 and 1 +* n index starting 0,1,... +* delta see Table 6.4.1.1.3 +* duration_in_symbols number of scheduled PUSCH ofdm symbols +* dmrs_UplinkConfig DMRS uplink configuration +* mapping_type PUSCH mapping type (A or B) +* ofdm_symbol_size IFFT size +* +* RETURN : 0 if symbol(k,l) is data, or 1 if symbol(k,l) is dmrs +* +* DESCRIPTION : 3GPP TS 38.211 6.4.1.1 Demodulation reference signal for PUSCH +* +*********************************************************************/ + +uint8_t is_dmrs_symbol(uint8_t l, + uint16_t k, + uint16_t start_sc, + uint8_t k_prime, + uint16_t n, + uint8_t delta, + uint8_t duration_in_symbols, + dmrs_UplinkConfig_t *dmrs_UplinkConfig, + uint8_t mapping_type, + uint16_t ofdm_symbol_size) { + + uint8_t is_dmrs_freq, is_dmrs_time, dmrs_type, l0; + int32_t l_prime_mask; + pusch_dmrs_AdditionalPosition_t additional_pos; + + is_dmrs_freq = 0; + is_dmrs_time = 0; + dmrs_type = dmrs_UplinkConfig->pusch_dmrs_type; + additional_pos = dmrs_UplinkConfig->pusch_dmrs_AdditionalPosition; + + + l0 = get_l0_ul(mapping_type, 2); + l_prime_mask = get_l_prime(duration_in_symbols, mapping_type, additional_pos); + + if (k == ((start_sc+get_dmrs_freq_idx_ul(n, k_prime, delta, dmrs_type))%ofdm_symbol_size)) + is_dmrs_freq = 1; + + + if (l_prime_mask == 1){ + + if (l == l0) + is_dmrs_time = 1; + + } else if ( (l==l0) || (((l_prime_mask>>l)&1) == 1 && l!=0) ) + is_dmrs_time = 1; + + if (dmrs_UplinkConfig->pusch_maxLength == pusch_len2){ + + if (((l_prime_mask>>(l-1))&1) == 1 && l!=0 && l!=1) + is_dmrs_time = 1; + + if (l-1 == l0) + is_dmrs_time = 1; + + } + + if (is_dmrs_time && is_dmrs_freq) + return 1; + else + return 0; + +} + /******************************************************************* * * NAME : pseudo_random_gold_sequence diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c index d2dbd6fef2..cdea8f58be 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c @@ -287,17 +287,32 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE, uint8_t k_prime=0; + uint8_t is_dmrs; uint16_t m=0, n=0, dmrs_idx=0, k=0; for (l=start_symbol; lnumber_of_symbols; l++) { k = start_sc; + n = 0; for (i=0; inb_rb*NR_NB_SC_PER_RB; i++) { sample_offsetF = l*frame_parms->ofdm_symbol_size + k; - if ((l == dmrs_symbol) && (k == ((start_sc+get_dmrs_freq_idx_ul(n, k_prime, delta, dmrs_type))%(frame_parms->ofdm_symbol_size)))) { + is_dmrs = 0; + + is_dmrs = is_dmrs_symbol(l, + k, + start_sc, + k_prime, + n, + delta, + harq_process_ul_ue->number_of_symbols, + &UE->dmrs_UplinkConfig, + mapping_type, + frame_parms->ofdm_symbol_size); + + if (is_dmrs == 1) { ((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; diff --git a/openair1/PHY/impl_defs_nr.h b/openair1/PHY/impl_defs_nr.h index 05e14f5e8d..43333857d6 100644 --- a/openair1/PHY/impl_defs_nr.h +++ b/openair1/PHY/impl_defs_nr.h @@ -537,6 +537,7 @@ typedef enum { typedef enum { pusch_dmrs_pos0 = 0, pusch_dmrs_pos1 = 1, + pusch_dmrs_pos2 = 2, pusch_dmrs_pos3 = 3, } pusch_dmrs_AdditionalPosition_t; typedef enum {