diff --git a/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c b/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c index a901f8dba1..f9b4991cfd 100644 --- a/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c +++ b/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c @@ -123,12 +123,12 @@ void dump_nr_I0_stats(FILE *fd, PHY_VARS_gNB *gNB) fprintf(fd, "\nPRACH I0 = %d.%d dB\n", gNB->measurements.prach_I0 / 10, gNB->measurements.prach_I0 % 10); } -void gNB_I0_measurements(PHY_VARS_gNB *gNB, int slot, int first_symb, int num_symb, uint32_t rb_mask_ul[14][9]) +void gNB_I0_measurements(PHY_VARS_gNB *gNB, int slot, int first_symb, int num_symb, uint32_t rb_mask_ul[14][MAX_BWP_SIZE]) { NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms; NR_gNB_COMMON *common_vars = &gNB->common_vars; PHY_MEASUREMENTS_gNB *measurements = &gNB->measurements; - int nb_symb[275]={0}; + int nb_symb[MAX_BWP_SIZE] = {0}; unsigned int tmp_n0_subband[frame_parms->nb_antennas_rx][frame_parms->N_RB_UL]; memset(tmp_n0_subband, 0, sizeof(tmp_n0_subband)); @@ -137,7 +137,7 @@ void gNB_I0_measurements(PHY_VARS_gNB *gNB, int slot, int first_symb, int num_sy for (int s = first_symb; s < first_symb + num_symb; s++) { int offset0 = ((slot % RU_RX_SLOT_DEPTH) * frame_parms->symbols_per_slot + s) * frame_parms->ofdm_symbol_size; for (int rb = 0; rb < frame_parms->N_RB_UL; rb++) { - if ((rb_mask_ul[s][rb >> 5] & (1U << (rb & 31))) == 0 && // check that rb was not used in this subframe + if (rb_mask_ul[s][rb] == 0 && // check that rb was not used in this subframe !(I0_SKIP_DC && rb == frame_parms->N_RB_UL >> 1)) { // skip middle PRB because of artificial noise possibly created by FFT int offset = offset0 + (frame_parms->first_carrier_offset + (rb*12))%frame_parms->ofdm_symbol_size; nb_symb[rb]++; diff --git a/openair1/PHY/NR_ESTIMATION/nr_ul_estimation.h b/openair1/PHY/NR_ESTIMATION/nr_ul_estimation.h index 25b9c27414..34bf64cc51 100644 --- a/openair1/PHY/NR_ESTIMATION/nr_ul_estimation.h +++ b/openair1/PHY/NR_ESTIMATION/nr_ul_estimation.h @@ -40,7 +40,7 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB, void dump_nr_I0_stats(FILE *fd,PHY_VARS_gNB *gNB); -void gNB_I0_measurements(PHY_VARS_gNB *gNB, int slot, int first_symb, int num_symb, uint32_t rb_mask_ul[14][9]); +void gNB_I0_measurements(PHY_VARS_gNB *gNB, int slot, int first_symb, int num_symb, uint32_t rb_mask_ul[14][MAX_BWP_SIZE]); void nr_est_srs_timing_advance_offset(uint16_t ofdm_symbol_size, const c16_t srs_estimated_channel_time[][NR_SRS_IDFT_OVERSAMP_FACTOR * ofdm_symbol_size], diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index f9a1100724..686f88a5fa 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -531,8 +531,7 @@ static void nr_fill_indication(const PHY_VARS_gNB *gNB, // Function to fill UL RB mask to be used for N0 measurements static void fill_ul_rb_mask(PHY_VARS_gNB *gNB, fsn_t now, - uint32_t rb_mask_ul[14][9], - nfapi_nr_max_num_of_symbol_per_slot_t *slot_conf, + uint32_t rb_mask_ul[14][MAX_BWP_SIZE], const NR_gNB_PUCCH_job_t *pucch, int n_pucch, const NR_gNB_PUSCH_job_t *pusch, @@ -541,29 +540,20 @@ static void fill_ul_rb_mask(PHY_VARS_gNB *gNB, int n_srs) { for (int symbol = 0; symbol < 14; symbol++) { - for (int m = 0; m < 9; m++) { - rb_mask_ul[symbol][m] = 0; - for (int i = 0; i < 32; i++) { - int prbpos = (m * 32) + i; - if (prbpos > gNB->frame_parms.N_RB_UL) - break; - rb_mask_ul[symbol][m] |= (gNB->ulprbbl[prbpos] > 0 ? 1U : 0) << i; - } + for (int prb = 0; prb < MAX_BWP_SIZE; prb++) { + rb_mask_ul[symbol][prb] = gNB->ulprbbl[prb] > 0; } } for (int i = 0; i < n_pucch; ++i) { const nfapi_nr_pucch_pdu_t *pucch_pdu = &pucch[i].pucch_pdu; const int start = pucch_pdu->start_symbol_index; - for (int symbol = start; symbol < (start + pucch_pdu->nr_of_symbols); symbol++) { - if (gNB->frame_parms.frame_type == FDD || (gNB->frame_parms.frame_type == TDD && slot_conf[symbol].slot_config.value == 1)) { - for (int rb = 0; rb < pucch_pdu->prb_size; rb++) { - int rb2 = - rb + pucch_pdu->bwp_start - + ((symbol < start + (pucch_pdu->nr_of_symbols >> 1)) || (pucch_pdu->freq_hop_flag == 0) ? pucch_pdu->prb_start - : pucch_pdu->second_hop_prb); - rb_mask_ul[symbol][rb2 >> 5] |= 1U << (rb2 & 31); - } + for (int symbol = start; symbol < start + pucch_pdu->nr_of_symbols; symbol++) { + bool first_hop = symbol < start + (pucch_pdu->nr_of_symbols >> 1); + int prb_first_second = first_hop || pucch_pdu->freq_hop_flag == 0 ? pucch_pdu->prb_start : pucch_pdu->second_hop_prb; + for (int rb = 0; rb < pucch_pdu->prb_size; rb++) { + int prb = rb + pucch_pdu->bwp_start + prb_first_second; + rb_mask_ul[symbol][prb] = 1; } } } @@ -573,12 +563,9 @@ static void fill_ul_rb_mask(PHY_VARS_gNB *gNB, uint8_t symbol_start = pusch_pdu->start_symbol_index; uint8_t symbol_end = symbol_start + pusch_pdu->nr_of_symbols; for (int symbol = symbol_start; symbol < symbol_end; symbol++) { - if (gNB->frame_parms.frame_type == FDD || (gNB->frame_parms.frame_type == TDD && slot_conf[symbol].slot_config.value == 1)) { - LOG_D(PHY, "symbol %d Filling rb_mask_ul rb_size %d\n", symbol, pusch_pdu->rb_size); - for (int rb = 0; rb < pusch_pdu->rb_size; rb++) { - int rb2 = rb + pusch_pdu->rb_start + pusch_pdu->bwp_start; - rb_mask_ul[symbol][rb2 >> 5] |= 1U << (rb2 & 31); - } + for (int rb = 0; rb < pusch_pdu->rb_size; rb++) { + int prb = rb + pusch_pdu->rb_start + pusch_pdu->bwp_start; + rb_mask_ul[symbol][prb] = 1; } } } @@ -588,7 +575,7 @@ static void fill_ul_rb_mask(PHY_VARS_gNB *gNB, const uint8_t l0 = gNB->frame_parms.symbols_per_slot - 1 - srs_pdu->time_start_position; for (int symbol = 0; symbol < (1 << srs_pdu->num_symbols); symbol++) { for (int rb = srs_pdu->bwp_start; rb < (srs_pdu->bwp_start + srs_pdu->bwp_size); rb++) { - rb_mask_ul[l0 + symbol][rb >> 5] |= 1U << (rb & 31); + rb_mask_ul[l0 + symbol][rb] = 1; } } } @@ -1226,14 +1213,12 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx, N LOG_D(PHY,"phy_procedures_gNB_uespec_RX frame %d, slot %d\n",frame_rx,slot_rx); { // Mask of occupied RBs, per symbol and PRB - uint32_t rb_mask_ul[14][9]; - nfapi_nr_max_num_of_symbol_per_slot_t *slot_conf = NULL; - if (frame_parms->frame_type == TDD) - slot_conf = gNB->gNB_config.tdd_table.max_tdd_periodicity_list[slot_rx].max_num_of_symbol_per_slot_list; - fill_ul_rb_mask(gNB, now, rb_mask_ul, slot_conf, pucch, n_pucch, pusch, n_pusch_jobs, srs, n_srs); + uint32_t rb_mask_ul[14][MAX_BWP_SIZE] = {0}; + fill_ul_rb_mask(gNB, now, rb_mask_ul, pucch, n_pucch, pusch, n_pusch_jobs, srs, n_srs); int first_symb = 0, num_symb = 0; - if (frame_parms->frame_type == TDD) + if (frame_parms->frame_type == TDD) { + const nfapi_nr_max_num_of_symbol_per_slot_t *slot_conf = gNB->gNB_config.tdd_table.max_tdd_periodicity_list[slot_rx].max_num_of_symbol_per_slot_list; for (int symbol_count = 0; symbol_count < frame_parms->symbols_per_slot; symbol_count++) { if (slot_conf[symbol_count].slot_config.value == 1) { if (num_symb == 0) @@ -1241,8 +1226,9 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx, N num_symb++; } } - else + } else { num_symb = frame_parms->symbols_per_slot; + } gNB_I0_measurements(gNB, slot_rx, first_symb, num_symb, rb_mask_ul); } diff --git a/openair1/SIMULATION/NR_PHY/pucchsim.c b/openair1/SIMULATION/NR_PHY/pucchsim.c index 6674a94b14..40c6e454aa 100644 --- a/openair1/SIMULATION/NR_PHY/pucchsim.c +++ b/openair1/SIMULATION/NR_PHY/pucchsim.c @@ -630,27 +630,24 @@ int main(int argc, char **argv) rxlev_pucch += signal_energy((int32_t *)&rxdataF[aarx][startingSymbolIndex * frame_parms->ofdm_symbol_size], 12); // set UL mask for pucch allocation - uint32_t rb_mask_ul[14][9] = {0}; + uint32_t rb_mask_ul[14][MAX_BWP_SIZE] = {0}; if (format == 1) { for (int s = 0; s < frame_parms->symbols_per_slot; s++) { if (s >= startingSymbolIndex && s < (startingSymbolIndex + nrofSymbols / 2)) for (int rb = 0; rb < N_RB; rb++) { - int rb2 = rb + startingPRB; - rb_mask_ul[s][rb2 >> 5] |= (1 << (rb2 & 31)); + rb_mask_ul[s][rb + startingPRB] = 1; } else if (s >= (startingSymbolIndex + nrofSymbols / 2) && s < startingSymbolIndex + nrofSymbols) for (int rb = 0; rb < N_RB; rb++) { - int rb2 = rb + startingPRB_intraSlotHopping; - rb_mask_ul[s][rb2 >> 5] |= (1 << (rb2 & 31)); + rb_mask_ul[s][rb + startingPRB_intraSlotHopping] = 1; } } } else { for (int s = 0; s < frame_parms->symbols_per_slot; s++) { if (s >= startingSymbolIndex && s < (startingSymbolIndex + nrofSymbols)) for (int rb = 0; rb < N_RB; rb++) { - int rb2 = rb + startingPRB; - rb_mask_ul[s][rb2 >> 5] |= (1 << (rb2 & 31)); + rb_mask_ul[s][rb + startingPRB] = 1; } } }