diff --git a/openair1/PHY/INIT/nr_init_ue.c b/openair1/PHY/INIT/nr_init_ue.c index 612d77677b..fd5cd3d3f5 100644 --- a/openair1/PHY/INIT/nr_init_ue.c +++ b/openair1/PHY/INIT/nr_init_ue.c @@ -740,6 +740,14 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue, /////////// // default values until overwritten by RRCConnectionReconfiguration + + for (i=0;ipusch_config.pusch_TimeDomainResourceAllocation[i] = (PUSCH_TimeDomainResourceAllocation_t *)malloc16(sizeof(PUSCH_TimeDomainResourceAllocation_t)); + ue->pusch_config.pusch_TimeDomainResourceAllocation[i]->mappingType = typeA; + } + + + //------------- config DMRS parameters--------------// ue->dmrs_UplinkConfig.pusch_dmrs_type = pusch_dmrs_type1; ue->dmrs_UplinkConfig.pusch_dmrs_AdditionalPosition = pusch_dmrs_pos0; @@ -780,7 +788,7 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue, for (i=0; inb_antennas_tx; i++) { common_vars->txdata[i] = (int32_t*)malloc16_clear( fp->samples_per_subframe*10*sizeof(int32_t) ); - common_vars->txdataF[i] = (int32_t *)malloc16_clear( fp->ofdm_symbol_size*fp->symbols_per_slot*10*sizeof(int32_t) ); + common_vars->txdataF[i] = (int32_t *)malloc16_clear( fp->ofdm_symbol_size*fp->symbols_per_slot*fp->slots_per_frame*sizeof(int32_t) ); } // init RX buffers diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c index 6a72887b27..51a3ffb517 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c @@ -65,10 +65,6 @@ void nr_pdsch_codeword_scrambling(uint8_t *in, } -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; -} uint8_t nr_generate_pdsch(NR_gNB_DLSCH_t *dlsch, NR_gNB_DCI_ALLOC_t *dci_alloc, @@ -176,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);//config->pdsch_config.dmrs_typeA_position.value); + l0 = get_l0(mapping_type, 2, 0);//config->pdsch_config.dmrs_typeA_position.value); nr_modulation(pdsch_dmrs[l0][0], n_dmrs, 2, mod_dmrs); // currently only codeword 0 is modulated. Qm = 2 as DMRS is QPSK modulated #ifdef DEBUG_DLSCH @@ -220,7 +216,7 @@ ap, Wt[0], Wt[1], Wf[0], Wf[1], delta, l_prime[0], l0, dmrs_symbol); for (int l=rel15->start_symbol; lstart_symbol+rel15->nb_symbols; l++) { k = start_sc; for (int i=0; in_prb*NR_NB_SC_PER_RB; i++) { - if ((l == dmrs_symbol) && (k == ((start_sc+get_pdsch_dmrs_idx(n, k_prime, delta, dmrs_type))%(frame_parms->ofdm_symbol_size)))) { + if ((l == dmrs_symbol) && (k == ((start_sc+get_dmrs_freq_idx(n, k_prime, delta, dmrs_type))%(frame_parms->ofdm_symbol_size)))) { ((int16_t*)txdataF[ap])[(l*frame_parms->ofdm_symbol_size + k)<<1] = (Wt[l_prime[0]]*Wf[k_prime]*amp*mod_dmrs[dmrs_idx<<1]) >> 15; ((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1] = (Wt[l_prime[0]]*Wf[k_prime]*amp*mod_dmrs[(dmrs_idx<<1) + 1]) >> 15; #ifdef DEBUG_DLSCH_MAPPING diff --git a/openair1/PHY/NR_TRANSPORT/nr_sch_dmrs.c b/openair1/PHY/NR_TRANSPORT/nr_sch_dmrs.c index 409ff45798..1254ae67b6 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_sch_dmrs.c +++ b/openair1/PHY/NR_TRANSPORT/nr_sch_dmrs.c @@ -34,6 +34,7 @@ /*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}, {1,0,0,1,-1,1,1}, {2,1,1,1,1,1,1}, @@ -84,6 +85,16 @@ uint8_t get_delta(uint8_t ap, uint8_t config) { return ((config==NFAPI_NR_DMRS_TYPE1)?(pdsch_dmrs_1[ap][2]):(pdsch_dmrs_2[ap][2])); } -uint8_t get_l0(uint8_t mapping_type, uint8_t dmrs_typeA_position) { - return ((mapping_type==NFAPI_NR_PDSCH_MAPPING_TYPE_A)?dmrs_typeA_position:0); +uint16_t get_dmrs_freq_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; +} + +uint8_t get_l0(uint8_t mapping_type, uint8_t dmrs_typeA_position, int ul_flag) { + + 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); + } diff --git a/openair1/PHY/NR_TRANSPORT/nr_sch_dmrs.h b/openair1/PHY/NR_TRANSPORT/nr_sch_dmrs.h index 14a7d50e36..c655753012 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_sch_dmrs.h +++ b/openair1/PHY/NR_TRANSPORT/nr_sch_dmrs.h @@ -45,4 +45,6 @@ void get_Wf(int8_t *Wf, uint8_t ap, uint8_t config); uint8_t get_delta(uint8_t ap, uint8_t config); -uint8_t get_l0(uint8_t mapping_type, uint8_t dmrs_typeA_position); +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); diff --git a/openair1/SIMULATION/NR_PHY/ulsim.c b/openair1/SIMULATION/NR_PHY/ulsim.c index b2968263bc..441ff4577c 100644 --- a/openair1/SIMULATION/NR_PHY/ulsim.c +++ b/openair1/SIMULATION/NR_PHY/ulsim.c @@ -130,7 +130,9 @@ int main(int argc, char **argv) { double SNR, SNR_lin, snr0 = -2.0, snr1 = 2.0; double snr_step = 0.1; uint8_t snr1set = 0; + int slot = 0; int **txdata; + int32_t **txdataF; double **s_re, **s_im, **r_re, **r_im; FILE *output_fd = NULL; //uint8_t write_output_file = 0; @@ -155,9 +157,11 @@ int main(int argc, char **argv) { float target_error_rate = 0.01; uint64_t SSB_positions=0x01; uint16_t nb_symb_sch = 12; + int start_symbol = 14 - nb_symb_sch; uint16_t nb_rb = 50; uint8_t Imcs = 9; int eNB_id = 0; + int ap; cpuf = get_cpu_freq_GHz(); @@ -434,7 +438,7 @@ int main(int argc, char **argv) { uint8_t is_crnti = 0, llr8_flag = 0; unsigned int TBS = 8424; unsigned int available_bits; - uint8_t nb_re_dmrs = 6; + uint8_t nb_re_dmrs = UE->dmrs_UplinkConfig.pusch_maxLength*(UE->dmrs_UplinkConfig.pusch_dmrs_type == pusch_dmrs_type1)?6:4; uint16_t length_dmrs = 1; uint8_t N_PRB_oh; uint16_t N_RE_prime; @@ -443,6 +447,10 @@ int main(int argc, char **argv) { uint8_t rvidx = 0; uint8_t UE_id = 1; uint8_t cwd; + uint16_t start_sc, start_rb; + int8_t Wf[2], Wt[2], l0, l_prime[2], delta; + uint32_t ***pusch_dmrs; + NR_gNB_ULSCH_t *ulsch_gNB = gNB->ulsch[UE_id][0]; nfapi_nr_ul_config_ulsch_pdu_rel15_t *rel15_ul = &ulsch_gNB->harq_processes[harq_pid]->ulsch_pdu.ulsch_pdu_rel15; @@ -482,6 +490,10 @@ int main(int argc, char **argv) { uint32_t scrambling_index; int16_t **tx_layers; int32_t *mod_symbols[MAX_NUM_NR_RE]; + uint16_t n_dmrs; + uint8_t dmrs_type; + uint8_t mapping_type; + int amp; test_input = (unsigned char *) malloc16(sizeof(unsigned char) * TBS / 8); @@ -573,16 +585,96 @@ int main(int argc, char **argv) { } + /////////////////////////DMRS Modulation///////////////////////// + /////////// + + pusch_dmrs = UE->nr_gold_pusch_dmrs[slot]; + n_dmrs = (nb_rb*nb_re_dmrs); + int16_t mod_dmrs[n_dmrs<<1]; + dmrs_type = UE->dmrs_UplinkConfig.pusch_dmrs_type; + mapping_type = UE->pusch_config.pusch_TimeDomainResourceAllocation[0]->mappingType; + + l0 = get_l0(mapping_type, 2, 1); + nr_modulation(pusch_dmrs[l0][0], n_dmrs, 2, mod_dmrs); // currently only codeword 0 is modulated. Qm = 2 as DMRS is QPSK modulated + + + /////////// + //////////////////////////////////////////////////////////////////////// + /////////////////////////ULSCH layer mapping///////////////////////// /////////// tx_layers = (int16_t **)pusch_ue->txdataF_layers; nr_layer_mapping((int16_t **)mod_symbols, - Nl, + harq_process_ul_ue->Nl, available_bits/mod_order, tx_layers); + /////////// + //////////////////////////////////////////////////////////////////////// + + /////////////////////////ULSCH RE mapping///////////////////////// + /////////// + + txdataF = UE->common_vars.txdataF; + amp = AMP; + + start_rb = 10; + start_sc = frame_parms->first_carrier_offset + start_rb*NR_NB_SC_PER_RB; + + if (start_sc >= frame_parms->ofdm_symbol_size) + start_sc -= frame_parms->ofdm_symbol_size; + + + + for (ap=0; apNl; ap++) { + + // DMRS params for this ap + get_Wt(Wt, ap, dmrs_type); + get_Wf(Wf, ap, dmrs_type); + delta = get_delta(ap, dmrs_type); + l_prime[0] = 0; // single symbol ap 0 + uint8_t dmrs_symbol = l0+l_prime[0]; // Assuming dmrs-AdditionalPosition = 0 + + uint8_t k_prime=0, l; + uint16_t m=0, n=0, dmrs_idx=0, k=0; + + for (l=start_symbol; lofdm_symbol_size)))) { + ((int16_t*)txdataF[ap])[(l*frame_parms->ofdm_symbol_size + k)<<1] = (Wt[l_prime[0]]*Wf[k_prime]*amp*mod_dmrs[dmrs_idx<<1]) >> 15; + ((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1] = (Wt[l_prime[0]]*Wf[k_prime]*amp*mod_dmrs[(dmrs_idx<<1) + 1]) >> 15; +#ifdef DEBUG_PUSCH_MAPPING +printf("dmrs_idx %d\t l %d \t k %d \t k_prime %d \t n %d \t txdataF: %d %d\n", +dmrs_idx, l, k, k_prime, n, ((int16_t*)txdataF[ap])[(l*frame_parms->ofdm_symbol_size + k)<<1], +((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1]); +#endif + dmrs_idx++; + k_prime++; + k_prime&=1; + n+=(k_prime)?0:1; + } + + else { + + ((int16_t*)txdataF[ap])[(l*frame_parms->ofdm_symbol_size + k)<<1] = (amp * tx_layers[ap][m<<1]) >> 15; + ((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1] = (amp * tx_layers[ap][(m<<1) + 1]) >> 15; +#ifdef DEBUG_PUSCH_MAPPING +printf("m %d\t l %d \t k %d \t txdataF: %d %d\n", +m, l, k, ((int16_t*)txdataF[ap])[(l*frame_parms->ofdm_symbol_size + k)<<1], +((int16_t*)txdataF[ap])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1]); +#endif + m++; + } + if (++k >= frame_parms->ofdm_symbol_size) + k -= frame_parms->ofdm_symbol_size; + } + } + } + + /////////// ////////////////////////////////////////////////////////////////////////