diff --git a/openair1/PHY/NR_UE_TRANSPORT/srs_modulation_nr.c b/openair1/PHY/NR_UE_TRANSPORT/srs_modulation_nr.c index 44be6a578e..4d1d36a8a6 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/srs_modulation_nr.c +++ b/openair1/PHY/NR_UE_TRANSPORT/srs_modulation_nr.c @@ -177,61 +177,41 @@ uint16_t compute_n_b(frame_t frame_number, * See TS 38.211 - Section 6.4.1.4 Sounding reference signal * ***************************************************************************/ -int generate_srs_nr(nfapi_nr_srs_pdu_t *srs_config_pdu, - NR_DL_FRAME_PARMS *frame_parms, +int generate_srs_nr(NR_DL_FRAME_PARMS *frame_parms, c16_t **txdataF, uint16_t symbol_offset, + int bwp_start, nr_srs_info_t *nr_srs_info, int16_t amp, frame_t frame_number, slot_t slot_number) { -#ifdef SRS_DEBUG - LOG_I(NR_PHY,"Calling %s function\n", __FUNCTION__); -#endif - - // SRS config parameters - uint8_t B_SRS = srs_config_pdu->bandwidth_index; - uint8_t C_SRS = srs_config_pdu->config_index; - uint8_t b_hop = srs_config_pdu->frequency_hopping; - uint8_t K_TC = 2<comb_size; - uint8_t K_TC_overbar = srs_config_pdu->comb_offset; - uint8_t n_SRS_cs = srs_config_pdu->cyclic_shift; - uint8_t n_ID_SRS = srs_config_pdu->sequence_id; - uint8_t n_shift = srs_config_pdu->frequency_position; // It adjusts the SRS allocation to align with the common resource block grid in multiples of four - uint8_t n_RRC = srs_config_pdu->frequency_shift; - uint8_t groupOrSequenceHopping = srs_config_pdu->group_or_sequence_hopping; - uint8_t l_offset = srs_config_pdu->time_start_position; - uint16_t T_SRS = srs_config_pdu->t_srs; - uint16_t T_offset = srs_config_pdu->t_offset; - uint8_t R = 1<num_repetitions; + uint8_t K_TC = 2 << nr_srs_info->comb_size; /* Number of antenna ports (M) can't be higher than number of physical antennas (N): M <= N */ - uint8_t num_ant_ports = 1 << srs_config_pdu->num_ant_ports; // Number of antenna port for transmission - int N_ap = num_ant_ports > frame_parms->nb_antennas_tx ? frame_parms->nb_antennas_tx : num_ant_ports; - uint8_t N_symb_SRS = 1<num_symbols; // Number of consecutive OFDM symbols - uint8_t l0 = frame_parms->symbols_per_slot - 1 - l_offset; // Starting symbol position in the time domain - uint8_t n_SRS_cs_max = srs_max_number_cs[srs_config_pdu->comb_size]; - uint16_t m_SRS_b = get_m_srs(C_SRS, B_SRS); // Number of resource blocks + int N_ap = nr_srs_info->n_srs_ports > frame_parms->nb_antennas_tx ? frame_parms->nb_antennas_tx : nr_srs_info->n_srs_ports; + uint8_t l0 = frame_parms->symbols_per_slot - 1 - nr_srs_info->l_offset; // Starting symbol position in the time domain + uint8_t n_SRS_cs_max = srs_max_number_cs[nr_srs_info->comb_size]; + uint16_t m_SRS_b = get_m_srs(nr_srs_info->C_SRS, nr_srs_info->B_SRS); // Number of resource blocks uint16_t M_sc_b_SRS = m_SRS_b * NR_NB_SC_PER_RB/K_TC; // Length of the SRS sequence #ifdef SRS_DEBUG LOG_I(NR_PHY,"Frame = %i, slot = %i\n", frame_number, slot_number); - LOG_I(NR_PHY,"B_SRS = %i\n", B_SRS); - LOG_I(NR_PHY,"C_SRS = %i\n", C_SRS); - LOG_I(NR_PHY,"b_hop = %i\n", b_hop); + LOG_I(NR_PHY,"B_SRS = %i\n", nr_srs_info->B_SRS); + LOG_I(NR_PHY,"C_SRS = %i\n", nr_srs_info->C_SRS); + LOG_I(NR_PHY,"b_hop = %i\n", nr_srs_info->b_hop); LOG_I(NR_PHY,"K_TC = %i\n", K_TC); - LOG_I(NR_PHY,"K_TC_overbar = %i\n", K_TC_overbar); - LOG_I(NR_PHY,"n_SRS_cs = %i\n", n_SRS_cs); - LOG_I(NR_PHY,"n_ID_SRS = %i\n", n_ID_SRS); - LOG_I(NR_PHY,"n_shift = %i\n", n_shift); - LOG_I(NR_PHY,"n_RRC = %i\n", n_RRC); - LOG_I(NR_PHY,"groupOrSequenceHopping = %i\n", groupOrSequenceHopping); - LOG_I(NR_PHY,"l_offset = %i\n", l_offset); - LOG_I(NR_PHY,"T_SRS = %i\n", T_SRS); - LOG_I(NR_PHY,"T_offset = %i\n", T_offset); - LOG_I(NR_PHY,"R = %i\n", R); + LOG_I(NR_PHY,"K_TC_overbar = %i\n", nr_srs_info->K_TC_overbar); + LOG_I(NR_PHY,"n_SRS_cs = %i\n", nr_srs_info->n_SRS_cs); + LOG_I(NR_PHY,"n_ID_SRS = %i\n", nr_srs_info->n_ID_SRS); + LOG_I(NR_PHY,"n_shift = %i\n", nr_srs_info->n_shift); + LOG_I(NR_PHY,"n_RRC = %i\n", nr_srs_info->n_RRC); + LOG_I(NR_PHY,"groupOrSequenceHopping = %i\n", nr_srs_info->groupOrSequenceHopping); + LOG_I(NR_PHY,"l_offset = %i\n", nr_srs_info->l_offset); + LOG_I(NR_PHY,"T_SRS = %i\n", nr_srs_info->T_SRS); + LOG_I(NR_PHY,"T_offset = %i\n", nr_srs_info->T_offset); + LOG_I(NR_PHY,"R = %i\n", nr_srs_info->R); LOG_I(NR_PHY,"N_ap = %i\n", N_ap); - LOG_I(NR_PHY,"N_symb_SRS = %i\n", N_symb_SRS); + LOG_I(NR_PHY,"N_symb_SRS = %i\n", nr_srs_info->N_symb_SRS); LOG_I(NR_PHY,"l0 = %i\n", l0); LOG_I(NR_PHY,"n_SRS_cs_max = %i\n", n_SRS_cs_max); LOG_I(NR_PHY,"m_SRS_b = %i\n", m_SRS_b); @@ -240,28 +220,28 @@ int generate_srs_nr(nfapi_nr_srs_pdu_t *srs_config_pdu, // Validation of SRS config parameters - if (R == 0) { - LOG_E(NR_PHY, "generate_srs: this parameter repetition factor %d is not consistent !\n", R); + if (nr_srs_info->R == 0) { + LOG_E(NR_PHY, "generate_srs: this parameter repetition factor %d is not consistent !\n", nr_srs_info->R); return -1; - } else if (R > N_symb_SRS) { - LOG_E(NR_PHY, "generate_srs: R %d can not be greater than N_symb_SRS %d !\n", R, N_symb_SRS); + } else if (nr_srs_info->R > nr_srs_info->N_symb_SRS) { + LOG_E(NR_PHY, "generate_srs: R %d can not be greater than N_symb_SRS %d !\n", nr_srs_info->R, nr_srs_info->N_symb_SRS); return -1; } - if (n_SRS_cs >= n_SRS_cs_max) { - LOG_E(NR_PHY, "generate_srs: inconsistent parameter n_SRS_cs %d >= n_SRS_cs_max %d !\n", n_SRS_cs, n_SRS_cs_max); + if (nr_srs_info->n_SRS_cs >= n_SRS_cs_max) { + LOG_E(NR_PHY, "generate_srs: inconsistent parameter n_SRS_cs %d >= n_SRS_cs_max %d !\n", nr_srs_info->n_SRS_cs, n_SRS_cs_max); return -1; } - if (T_SRS == 0) { - LOG_E(NR_PHY, "generate_srs: inconsistent parameter T_SRS %d can not be equal to zero !\n", T_SRS); + if (nr_srs_info->T_SRS == 0) { + LOG_E(NR_PHY, "generate_srs: inconsistent parameter T_SRS %d can not be equal to zero !\n", nr_srs_info->T_SRS); return -1; } else { int index = 0; - while (srs_periodicity[index] != T_SRS) { + while (srs_periodicity[index] != nr_srs_info->T_SRS) { index++; if (index == SRS_PERIODICITY) { - LOG_E(NR_PHY, "generate_srs: inconsistent parameter T_SRS %d not specified !\n", T_SRS); + LOG_E(NR_PHY, "generate_srs: inconsistent parameter T_SRS %d not specified !\n", nr_srs_info->T_SRS); return -1; } } @@ -271,9 +251,9 @@ int generate_srs_nr(nfapi_nr_srs_pdu_t *srs_config_pdu, if(nr_srs_info) { nr_srs_info->srs_generated_signal_bits = log2_approx(amp); } - uint64_t subcarrier_offset = frame_parms->first_carrier_offset + srs_config_pdu->bwp_start*NR_NB_SC_PER_RB; + uint64_t subcarrier_offset = frame_parms->first_carrier_offset + bwp_start * NR_NB_SC_PER_RB; double sqrt_N_ap = sqrt(N_ap); - uint16_t n_b[B_SRS + 1]; + uint16_t n_b[nr_srs_info->B_SRS + 1]; // Find index of table which is for this SRS length uint16_t M_sc_b_SRS_index = 0; @@ -288,7 +268,7 @@ int generate_srs_nr(nfapi_nr_srs_pdu_t *srs_config_pdu, LOG_I(NR_PHY,"============ port %d ============\n", p_index); #endif - uint16_t n_SRS_cs_i = (n_SRS_cs + (n_SRS_cs_max * (SRS_antenna_port[p_index] - 1000)/N_ap))%n_SRS_cs_max; + uint16_t n_SRS_cs_i = (nr_srs_info->n_SRS_cs + (n_SRS_cs_max * (SRS_antenna_port[p_index] - 1000)/N_ap))%n_SRS_cs_max; double alpha_i = 2 * M_PI * ((double)n_SRS_cs_i / (double)n_SRS_cs_max); #ifdef SRS_DEBUG @@ -296,7 +276,7 @@ int generate_srs_nr(nfapi_nr_srs_pdu_t *srs_config_pdu, LOG_I(NR_PHY,"alpha_i = %f\n", alpha_i); #endif - for (int l_line = 0; l_line < N_symb_SRS; l_line++) { + for (int l_line = 0; l_line < nr_srs_info->N_symb_SRS; l_line++) { #ifdef SRS_DEBUG LOG_I(NR_PHY,":::::::: OFDM symbol %d ::::::::\n", l0+l_line); @@ -305,21 +285,21 @@ int generate_srs_nr(nfapi_nr_srs_pdu_t *srs_config_pdu, // Set group and sequence numbers (u,v) per OFDM symbol uint16_t u = 0; uint16_t v = 0; - switch(groupOrSequenceHopping) { + switch(nr_srs_info->groupOrSequenceHopping) { case neitherHopping: - u = n_ID_SRS%U_GROUP_NUMBER; + u = nr_srs_info->n_ID_SRS % U_GROUP_NUMBER; v = 0; break; case groupHopping: - u = group_number_hopping(slot_number, n_ID_SRS, l0, l_line); + u = group_number_hopping(slot_number, nr_srs_info->n_ID_SRS, l0, l_line); v = 0; break; case sequenceHopping: - u = n_ID_SRS%U_GROUP_NUMBER; - v = sequence_number_hopping(slot_number, n_ID_SRS, M_sc_b_SRS, l0, l_line); + u = nr_srs_info->n_ID_SRS % U_GROUP_NUMBER; + v = sequence_number_hopping(slot_number, nr_srs_info->n_ID_SRS, M_sc_b_SRS, l0, l_line); break; default: - LOG_E(NR_PHY, "generate_srs: unknown hopping setting %d !\n", groupOrSequenceHopping); + LOG_E(NR_PHY, "generate_srs: unknown hopping setting %d !\n", nr_srs_info->groupOrSequenceHopping); return -1; } @@ -330,16 +310,27 @@ int generate_srs_nr(nfapi_nr_srs_pdu_t *srs_config_pdu, // Compute the frequency position index n_b uint16_t sum_n_b = 0; - for (int b = 0; b <= B_SRS; b++) { - n_b[b] = compute_n_b(frame_number, slot_number, frame_parms->slots_per_frame, N_symb_SRS, B_SRS, - C_SRS, b_hop, n_RRC, R, T_offset, T_SRS, srs_config_pdu->resource_type, l_line, b); + for (int b = 0; b <= nr_srs_info->B_SRS; b++) { + n_b[b] = compute_n_b(frame_number, + slot_number, + frame_parms->slots_per_frame, + nr_srs_info->N_symb_SRS, + nr_srs_info->B_SRS, + nr_srs_info->C_SRS, + nr_srs_info->b_hop, + nr_srs_info->n_RRC, + nr_srs_info->R, + nr_srs_info->T_offset, + nr_srs_info->T_SRS, + nr_srs_info->resource_type, + l_line, + b); sum_n_b += n_b[b]; #ifdef SRS_DEBUG LOG_I(NR_PHY,"n_b[%i] = %i\n", b, n_b[b]); #endif - } #ifdef SRS_DEBUG @@ -348,14 +339,17 @@ int generate_srs_nr(nfapi_nr_srs_pdu_t *srs_config_pdu, // Compute the frequency-domain starting position uint8_t K_TC_p = 0; - if((n_SRS_cs >= n_SRS_cs_max/2)&&(n_SRS_cs < n_SRS_cs_max)&&(N_ap == 4) && ((SRS_antenna_port[p_index] == 1001) || (SRS_antenna_port[p_index] == 1003))) { - K_TC_p = (K_TC_overbar + K_TC/2)%K_TC; + if((nr_srs_info->n_SRS_cs >= n_SRS_cs_max/2) + && (nr_srs_info->n_SRS_cs < n_SRS_cs_max) + && (N_ap == 4) + && ((SRS_antenna_port[p_index] == 1001) || (SRS_antenna_port[p_index] == 1003))) { + K_TC_p = (nr_srs_info->K_TC_overbar + K_TC/2)%K_TC; } else { - K_TC_p = K_TC_overbar; + K_TC_p = nr_srs_info->K_TC_overbar; } uint8_t k_l_offset = 0; // If the SRS is configured by the IE SRS-PosResource-r16, the quantity k_l_offset is // given by TS 38.211 - Table 6.4.1.4.3-2, otherwise k_l_offset = 0. - uint8_t k_0_overbar_p = (n_shift*NR_NB_SC_PER_RB + (K_TC_p+k_l_offset))%K_TC; + uint8_t k_0_overbar_p = (nr_srs_info->n_shift * NR_NB_SC_PER_RB + (K_TC_p + k_l_offset)) % K_TC; uint8_t k_0_p = k_0_overbar_p + K_TC*M_sc_b_SRS*sum_n_b; nr_srs_info->k_0_p[p_index][l_line] = k_0_p; @@ -409,6 +403,28 @@ int generate_srs_nr(nfapi_nr_srs_pdu_t *srs_config_pdu, return 0; } +static void configure_srs_info(fapi_nr_ul_config_srs_pdu *srs_config_pdu, nr_srs_info_t *nr_srs_info) +{ + nr_srs_info->B_SRS = srs_config_pdu->bandwidth_index; + nr_srs_info->C_SRS = srs_config_pdu->config_index; + nr_srs_info->b_hop = srs_config_pdu->frequency_hopping; + nr_srs_info->comb_size = srs_config_pdu->comb_size; + nr_srs_info->K_TC_overbar = srs_config_pdu->comb_offset; + nr_srs_info->n_SRS_cs = srs_config_pdu->cyclic_shift; + nr_srs_info->n_ID_SRS = srs_config_pdu->sequence_id; + // It adjusts the SRS allocation to align with the common resource block grid in multiples of four + nr_srs_info->n_shift = srs_config_pdu->frequency_position; + nr_srs_info->n_RRC = srs_config_pdu->frequency_shift; + nr_srs_info->groupOrSequenceHopping = srs_config_pdu->group_or_sequence_hopping; + nr_srs_info->l_offset = srs_config_pdu->time_start_position; + nr_srs_info->T_SRS = srs_config_pdu->t_srs; + nr_srs_info->T_offset = srs_config_pdu->t_offset; + nr_srs_info->R = 1 << srs_config_pdu->num_repetitions; + nr_srs_info->N_symb_SRS = 1 << srs_config_pdu->num_symbols; // Number of consecutive OFDM symbols + nr_srs_info->n_srs_ports = 1 << srs_config_pdu->num_ant_ports; // Number of antenna port for transmission + nr_srs_info->resource_type = srs_config_pdu->resource_type; +} + /******************************************************************* * * NAME : ue_srs_procedures_nr @@ -433,9 +449,7 @@ int ue_srs_procedures_nr(PHY_VARS_NR_UE *ue, return -1; } - // TODO: This is wrong: casting from UE fapi to gNB NFAPI srs pdu - nfapi_nr_srs_pdu_t *srs_config_pdu = (nfapi_nr_srs_pdu_t *)&phy_data->srs_vars.srs_config_pdu; - + fapi_nr_ul_config_srs_pdu *srs_config_pdu = &phy_data->srs_vars.srs_config_pdu; int first_srs_symbol = ue->frame_parms.symbols_per_slot - 1 - srs_config_pdu->time_start_position; // Num consecutive SRS symbols according to 38.211 6.4.1.4.1 int num_srs_symbols[] = {1, 2, 4, 8, 12}; @@ -471,10 +485,11 @@ int ue_srs_procedures_nr(PHY_VARS_NR_UE *ue, LOG_I(NR_PHY,"srs_config_pdu->t_offset = %u\n", srs_config_pdu->t_offset); #endif + configure_srs_info(srs_config_pdu, ue->nr_srs_info); NR_DL_FRAME_PARMS *frame_parms = &(ue->frame_parms); uint16_t symbol_offset = (frame_parms->symbols_per_slot - 1 - srs_config_pdu->time_start_position)*frame_parms->ofdm_symbol_size; - if (generate_srs_nr(srs_config_pdu, frame_parms, txdataF, symbol_offset, ue->nr_srs_info, AMP, proc->frame_tx, proc->nr_slot_tx) + if (generate_srs_nr(frame_parms, txdataF, symbol_offset, srs_config_pdu->bwp_start, ue->nr_srs_info, AMP, proc->frame_tx, proc->nr_slot_tx) == 0) { return 0; } else { diff --git a/openair1/PHY/NR_UE_TRANSPORT/srs_modulation_nr.h b/openair1/PHY/NR_UE_TRANSPORT/srs_modulation_nr.h index 1bbe3a27ef..8735ca4527 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/srs_modulation_nr.h +++ b/openair1/PHY/NR_UE_TRANSPORT/srs_modulation_nr.h @@ -54,10 +54,10 @@ static const uint16_t srs_max_number_cs[3] = {8, 12, 6}; @param slot_number slot number @returns 0 on success -1 on error with message */ -int generate_srs_nr(nfapi_nr_srs_pdu_t *srs_config_pdu, - NR_DL_FRAME_PARMS *frame_parms, +int generate_srs_nr(NR_DL_FRAME_PARMS *frame_parms, c16_t **txdataF, uint16_t symbol_offset, + int bwp_start, nr_srs_info_t *nr_srs_info, int16_t amp, frame_t frame_number, diff --git a/openair1/PHY/defs_nr_common.h b/openair1/PHY/defs_nr_common.h index 67f7470d29..0d1cab4045 100644 --- a/openair1/PHY/defs_nr_common.h +++ b/openair1/PHY/defs_nr_common.h @@ -113,7 +113,24 @@ typedef struct { uint8_t k_0_p[MAX_NUM_NR_SRS_AP][MAX_NUM_NR_SRS_SYMBOLS]; uint8_t srs_generated_signal_bits; c16_t **srs_generated_signal; - nfapi_nr_srs_pdu_t srs_pdu; + bool is_signal_generated; + int B_SRS; + int C_SRS; + int b_hop; + int comb_size; + int K_TC_overbar; + int n_SRS_cs; + int n_ID_SRS; + int n_shift; + int n_RRC; + int groupOrSequenceHopping; + int l_offset; + int T_SRS; + int T_offset; + int R; + int N_symb_SRS; + int n_srs_ports; + int resource_type; } nr_srs_info_t; typedef struct NR_DL_FRAME_PARMS NR_DL_FRAME_PARMS; diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index 1e33183567..542e3377e2 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -779,18 +779,56 @@ int fill_srs_channel_matrix(uint8_t *channel_matrix, return 0; } -int check_srs_pdu(const nfapi_nr_srs_pdu_t *srs_pdu, nfapi_nr_srs_pdu_t *saved_srs_pdu) +static void copy_srs_info(const nfapi_nr_srs_pdu_t *srs_config_pdu, nr_srs_info_t *nr_srs_info) { - if (saved_srs_pdu->bwp_start == srs_pdu->bwp_start && - saved_srs_pdu->bwp_size == srs_pdu->bwp_size && - saved_srs_pdu->num_ant_ports == srs_pdu->num_ant_ports && - saved_srs_pdu->time_start_position == srs_pdu->time_start_position && - saved_srs_pdu->num_symbols == srs_pdu->num_symbols && - saved_srs_pdu->config_index == srs_pdu->config_index) { - return 1; + nr_srs_info->B_SRS = srs_config_pdu->bandwidth_index; + nr_srs_info->C_SRS = srs_config_pdu->config_index; + nr_srs_info->b_hop = srs_config_pdu->frequency_hopping; + nr_srs_info->comb_size = srs_config_pdu->comb_size; + nr_srs_info->K_TC_overbar = srs_config_pdu->comb_offset; + nr_srs_info->n_SRS_cs = srs_config_pdu->cyclic_shift; + nr_srs_info->n_ID_SRS = srs_config_pdu->sequence_id; + // It adjusts the SRS allocation to align with the common resource block grid in multiples of four + nr_srs_info->n_shift = srs_config_pdu->frequency_position; + nr_srs_info->n_RRC = srs_config_pdu->frequency_shift; + nr_srs_info->groupOrSequenceHopping = srs_config_pdu->group_or_sequence_hopping; + nr_srs_info->l_offset = srs_config_pdu->time_start_position; + nr_srs_info->T_SRS = srs_config_pdu->t_srs; + nr_srs_info->T_offset = srs_config_pdu->t_offset; + nr_srs_info->R = 1 << srs_config_pdu->num_repetitions; + nr_srs_info->N_symb_SRS = 1 << srs_config_pdu->num_symbols; // Number of consecutive OFDM symbols + nr_srs_info->n_srs_ports = 1 << srs_config_pdu->num_ant_ports; // Number of antenna port for transmission + nr_srs_info->resource_type = srs_config_pdu->resource_type; +} + +static bool srs_has_changed(const nfapi_nr_srs_pdu_t *srs_config_pdu, nr_srs_info_t *nr_srs_info) +{ + return nr_srs_info->B_SRS != srs_config_pdu->bandwidth_index + || nr_srs_info->C_SRS != srs_config_pdu->config_index + || nr_srs_info->b_hop != srs_config_pdu->frequency_hopping + || nr_srs_info->comb_size != srs_config_pdu->comb_size + || nr_srs_info->K_TC_overbar != srs_config_pdu->comb_offset + || nr_srs_info->n_SRS_cs != srs_config_pdu->cyclic_shift + || nr_srs_info->n_ID_SRS != srs_config_pdu->sequence_id + || nr_srs_info->n_shift != srs_config_pdu->frequency_position + || nr_srs_info->n_RRC != srs_config_pdu->frequency_shift + || nr_srs_info->groupOrSequenceHopping != srs_config_pdu->group_or_sequence_hopping + || nr_srs_info->l_offset != srs_config_pdu->time_start_position + || nr_srs_info->T_SRS != srs_config_pdu->t_srs + || nr_srs_info->T_offset != srs_config_pdu->t_offset + || nr_srs_info->R != 1 << srs_config_pdu->num_repetitions + || nr_srs_info->N_symb_SRS != 1 << srs_config_pdu->num_symbols + || nr_srs_info->n_srs_ports != 1 << srs_config_pdu->num_ant_ports + || nr_srs_info->resource_type != srs_config_pdu->resource_type; +} + +static bool check_and_configure_srs_info(nfapi_nr_srs_pdu_t *srs_config_pdu, nr_srs_info_t *nr_srs_info) +{ + if (srs_has_changed(srs_config_pdu, nr_srs_info)) { + copy_srs_info(srs_config_pdu, nr_srs_info); + return true; } - *saved_srs_pdu = *srs_pdu; - return 0; + return false; } int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx, NR_UL_IND_t *UL_INFO) @@ -1017,8 +1055,16 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx, N int8_t snr_per_rb[srs_pdu->bwp_size]; start_meas(&gNB->generate_srs_stats); - if (check_srs_pdu(srs_pdu, &gNB->nr_srs_info[i]->srs_pdu) == 0) { - generate_srs_nr(srs_pdu, frame_parms, gNB->nr_srs_info[i]->srs_generated_signal, 0, gNB->nr_srs_info[i], AMP, frame_rx, slot_rx); + + if (check_and_configure_srs_info(srs_pdu, gNB->nr_srs_info[i])) { + generate_srs_nr(frame_parms, + gNB->nr_srs_info[i]->srs_generated_signal, + 0, + srs_pdu->bwp_start, + gNB->nr_srs_info[i], + AMP, + frame_rx, + slot_rx); } stop_meas(&gNB->generate_srs_stats); c16_t **rxdataF = gNB->common_vars.rxdataF[srs->beam_nb];