From 607d8a0bc220dc6a88876f14a7381088e71d62c8 Mon Sep 17 00:00:00 2001 From: francescomani Date: Thu, 11 Sep 2025 14:28:21 +0200 Subject: [PATCH] simplify compute_n_b and compute_F_b functions by using common structure --- .../PHY/NR_UE_TRANSPORT/srs_modulation_nr.c | 108 ++++++------------ 1 file changed, 38 insertions(+), 70 deletions(-) diff --git a/openair1/PHY/NR_UE_TRANSPORT/srs_modulation_nr.c b/openair1/PHY/NR_UE_TRANSPORT/srs_modulation_nr.c index 4d1d36a8a6..954ea09b14 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/srs_modulation_nr.c +++ b/openair1/PHY/NR_UE_TRANSPORT/srs_modulation_nr.c @@ -85,80 +85,62 @@ uint16_t sequence_number_hopping(int slot_number, return v; } -uint16_t compute_F_b(frame_t frame_number, - slot_t slot_number, - uint16_t slots_per_frame, - uint8_t N_symb_SRS, - uint8_t B_SRS, - uint8_t C_SRS, - uint8_t b_hop, - uint8_t R, - uint16_t T_offset, - uint16_t T_SRS, - resourceType_t resource_type, - uint8_t l_line, - uint8_t b) { - +static int compute_F_b(frame_t frame_number, + slot_t slot_number, + int slots_per_frame, + nr_srs_info_t *nr_srs_info, + uint8_t l_line, + uint8_t b) +{ // Compute the number of SRS transmissions uint16_t n_SRS = 0; - if (resource_type == aperiodic) { - n_SRS = l_line / R; + if (nr_srs_info->resource_type == aperiodic) { + n_SRS = l_line / nr_srs_info->R; } else { - n_SRS = ((slots_per_frame*frame_number + slot_number - T_offset)/T_SRS)*(N_symb_SRS/R)+(l_line / R); + int t = (slots_per_frame * frame_number + slot_number - nr_srs_info->T_offset) / nr_srs_info->T_SRS; + n_SRS = t * (nr_srs_info->N_symb_SRS / nr_srs_info->R) + (l_line / nr_srs_info->R); } uint16_t product_N_b = 1; - for (unsigned int b_prime = b_hop; b_prime < B_SRS; b_prime++) { - if (b_prime != b_hop) { - product_N_b *= get_N_b_srs(C_SRS, b_prime); + for (unsigned int b_prime = nr_srs_info->b_hop; b_prime < nr_srs_info->B_SRS; b_prime++) { + if (b_prime != nr_srs_info->b_hop) { + product_N_b *= get_N_b_srs(nr_srs_info->C_SRS, b_prime); } } - uint16_t F_b = 0; - uint8_t N_b = get_N_b_srs(C_SRS, b); + int F_b = 0; + uint8_t N_b = get_N_b_srs(nr_srs_info->C_SRS, b); if (N_b & 1) { // Nb odd - F_b = (N_b/2)*(n_SRS/product_N_b); + F_b = (N_b / 2) * (n_SRS / product_N_b); } else { // Nb even uint16_t product_N_b_B_SRS = product_N_b; - product_N_b_B_SRS *= get_N_b_srs(C_SRS, B_SRS); /* product for b_hop to b */ - F_b = (N_b/2)*((n_SRS%product_N_b_B_SRS)/product_N_b) + ((n_SRS%product_N_b_B_SRS)/2*product_N_b); + product_N_b_B_SRS *= get_N_b_srs(nr_srs_info->C_SRS, nr_srs_info->B_SRS); /* product for b_hop to b */ + F_b = (N_b / 2) * ((n_SRS % product_N_b_B_SRS) / product_N_b) + ((n_SRS % product_N_b_B_SRS) / 2 * product_N_b); } - return F_b; } -uint16_t compute_n_b(frame_t frame_number, - slot_t slot_number, - uint16_t slots_per_frame, - uint8_t N_symb_SRS, - uint8_t B_SRS, - uint8_t C_SRS, - uint8_t b_hop, - uint8_t n_RRC, - uint8_t R, - uint16_t T_offset, - uint16_t T_SRS, - resourceType_t resource_type, - uint8_t l_line, - uint8_t b) { - - uint8_t N_b = get_N_b_srs(C_SRS, b); - uint16_t m_SRS_b = get_m_srs(C_SRS, B_SRS); - - uint16_t n_b = 0; - if (b_hop >= B_SRS) { - n_b = (4 * n_RRC/m_SRS_b)%N_b; +static int compute_n_b(frame_t frame_number, + slot_t slot_number, + uint16_t slots_per_frame, + nr_srs_info_t *nr_srs_info, + uint8_t l_line, + uint8_t b, + int m_SRS_b) +{ + uint8_t N_b = get_N_b_srs(nr_srs_info->C_SRS, b); + int n_b = 0; + if (nr_srs_info->b_hop >= nr_srs_info->B_SRS) { + n_b = (4 * nr_srs_info->n_RRC / m_SRS_b) % N_b; } else { - if (b <= b_hop) { - n_b = (4 * n_RRC/m_SRS_b)%N_b; + if (b <= nr_srs_info->b_hop) { + n_b = (4 * nr_srs_info->n_RRC / m_SRS_b) % N_b; } else { // Compute the hopping offset Fb - uint16_t F_b = compute_F_b(frame_number, slot_number, slots_per_frame, N_symb_SRS, B_SRS, C_SRS, b_hop, R, - T_offset, T_SRS, resource_type, l_line, b); - n_b = (F_b + (4 * n_RRC/m_SRS_b))%N_b; + int F_b = compute_F_b(frame_number, slot_number, slots_per_frame, nr_srs_info, l_line, b); + n_b = (F_b + (4 * nr_srs_info->n_RRC / m_SRS_b)) % N_b; } } - return n_b; } @@ -191,7 +173,7 @@ int generate_srs_nr(NR_DL_FRAME_PARMS *frame_parms, 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 + int 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 @@ -253,7 +235,7 @@ int generate_srs_nr(NR_DL_FRAME_PARMS *frame_parms, } 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[nr_srs_info->B_SRS + 1]; + int 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; @@ -311,21 +293,7 @@ int generate_srs_nr(NR_DL_FRAME_PARMS *frame_parms, // Compute the frequency position index n_b uint16_t sum_n_b = 0; 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); - + n_b[b] = compute_n_b(frame_number, slot_number, frame_parms->slots_per_frame, nr_srs_info, l_line, b, m_SRS_b); sum_n_b += n_b[b]; #ifdef SRS_DEBUG