From 4a47fbbef7639c922eb79d14b455c11bcebfc13a Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Thu, 9 Apr 2026 10:46:18 +0200 Subject: [PATCH] Remove global gNB SRS memory This means that as of this commit, the signal has to be permanently regenerated. In fact, with the SRS queue to be introduced in a follow-up commit, we don't have an easy way to cache the sequence generation, as there is no "index" to which we could refer to (hence, caching would be tricky). Instead, the next commits further refactor this to reduce the time for SRS sequence generation as well as the memory footprint. Signed-off-by: Robert Schmidt --- openair1/PHY/INIT/nr_init.c | 19 ------ .../PHY/NR_TRANSPORT/nr_transport_proto.h | 3 +- openair1/PHY/defs_gNB.h | 3 - openair1/PHY/defs_nr_common.h | 2 - openair1/SCHED_NR/phy_procedures_nr_gNB.c | 63 ++++++------------- openair1/SIMULATION/NR_PHY/srssim.c | 1 - 6 files changed, 21 insertions(+), 70 deletions(-) diff --git a/openair1/PHY/INIT/nr_init.c b/openair1/PHY/INIT/nr_init.c index 5845b14d51..7d56f8b410 100644 --- a/openair1/PHY/INIT/nr_init.c +++ b/openair1/PHY/INIT/nr_init.c @@ -141,16 +141,6 @@ void phy_init_nr_gNB(PHY_VARS_gNB *gNB) init_DLSCH_struct(gNB); - gNB->nr_srs_info = (nr_srs_info_t **)malloc16_clear(gNB->max_nb_srs * sizeof(nr_srs_info_t*)); - for (int id = 0; id < gNB->max_nb_srs; id++) { - gNB->nr_srs_info[id] = (nr_srs_info_t *)malloc16_clear(sizeof(nr_srs_info_t)); - gNB->nr_srs_info[id]->srs_generated_signal = malloc16_clear(MAX_NUM_NR_SRS_AP * sizeof(c16_t *)); - for(int ap=0; apnr_srs_info[id]->srs_generated_signal[ap] = - malloc16_clear(fp->ofdm_symbol_size * MAX_NUM_NR_SRS_SYMBOLS * sizeof(c16_t)); - } - } - /* Do NOT allocate per-antenna rxdataF: the gNB gets a pointer to the * RU to copy/recover freq-domain memory from there */ common_vars->rxdataF = (c16_t ***)malloc16(common_vars->num_beams_period * sizeof(c16_t**)); @@ -212,15 +202,6 @@ void phy_free_nr_gNB(PHY_VARS_gNB *gNB) PHY_MEASUREMENTS_gNB *meas = &gNB->measurements; free_and_zero(meas->n0_subband_power); - for (int id = 0; id < gNB->max_nb_srs; id++) { - for(int i=0; inr_srs_info[id]->srs_generated_signal[i]); - } - free_and_zero(gNB->nr_srs_info[id]->srs_generated_signal); - free_and_zero(gNB->nr_srs_info[id]); - } - free_and_zero(gNB->nr_srs_info); - free_ul_reference_signal_sequences(); free_gnb_lowpapr_sequences(); diff --git a/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h b/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h index 43ecb0d006..d1431b6237 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h +++ b/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h @@ -202,7 +202,7 @@ int nr_get_srs_signal(PHY_VARS_gNB *gNB, c16_t srs_received_signal[][gNB->frame_parms.ofdm_symbol_size * (1 << srs_pdu->num_symbols)], c16_t srs_received_noise[][gNB->frame_parms.ofdm_symbol_size * (1 << srs_pdu->num_symbols)]); -void nr_srs_rx_procedures(PHY_VARS_gNB *gNB, +nr_srs_info_t nr_srs_rx_procedures(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx, uint8_t nb_antennas_rx, @@ -210,7 +210,6 @@ void nr_srs_rx_procedures(PHY_VARS_gNB *gNB, uint8_t N_symb_SRS, uint16_t ofdm_symbol_size, NR_gNB_SRS_t *srs, - nr_srs_info_t *nr_srs_info, int *srs_est, c16_t srs_estimated_channel_freq[][N_ap][ofdm_symbol_size * N_symb_SRS], c16_t srs_estimated_channel_time[][N_ap][NR_SRS_IDFT_OVERSAMP_FACTOR * ofdm_symbol_size], diff --git a/openair1/PHY/defs_gNB.h b/openair1/PHY/defs_gNB.h index 6c805b5d16..ef357508d7 100644 --- a/openair1/PHY/defs_gNB.h +++ b/openair1/PHY/defs_gNB.h @@ -394,9 +394,6 @@ typedef struct PHY_VARS_gNB_s { NR_gNB_PHY_STATS_t phy_stats[MAX_MOBILES_PER_GNB]; t_nrPolar_params **polarParams; - /// SRS variables - nr_srs_info_t **nr_srs_info; - // reference amplitude for TX int16_t TX_AMP; diff --git a/openair1/PHY/defs_nr_common.h b/openair1/PHY/defs_nr_common.h index 7cd439bcee..8b50f36290 100644 --- a/openair1/PHY/defs_nr_common.h +++ b/openair1/PHY/defs_nr_common.h @@ -77,8 +77,6 @@ typedef enum{ 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; - bool is_signal_generated; int B_SRS; int C_SRS; int b_hop; diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index 1f330ae58e..59285dd884 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -696,37 +696,7 @@ static void copy_srs_info(const nfapi_nr_srs_pdu_t *srs_config_pdu, nr_srs_info_ 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; - } - return false; -} - -void nr_srs_rx_procedures(PHY_VARS_gNB *gNB, +nr_srs_info_t nr_srs_rx_procedures(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx, uint8_t nb_antennas_rx, @@ -734,7 +704,6 @@ void nr_srs_rx_procedures(PHY_VARS_gNB *gNB, uint8_t N_symb_SRS, uint16_t ofdm_symbol_size, NR_gNB_SRS_t *srs, - nr_srs_info_t *nr_srs_info, int *srs_est, c16_t srs_estimated_channel_freq[][N_ap][ofdm_symbol_size * N_symb_SRS], c16_t srs_estimated_channel_time[][N_ap][NR_SRS_IDFT_OVERSAMP_FACTOR * ofdm_symbol_size], @@ -750,12 +719,20 @@ void nr_srs_rx_procedures(PHY_VARS_gNB *gNB, start_meas(&gNB->generate_srs_stats); - if (check_and_configure_srs_info(srs_pdu, nr_srs_info)) { + nr_srs_info_t nr_srs_info = {0}; + copy_srs_info(srs_pdu, &nr_srs_info); + + // TODO permanently allocate? + c16_t srs_generated_signal_tmp[N_ap][ofdm_symbol_size * MAX_NUM_NR_SRS_SYMBOLS]; + c16_t *srs_generated_signal[N_ap]; + for (int i = 0; i < N_ap; ++i) + srs_generated_signal[i] = srs_generated_signal_tmp[i]; + if (true) { generate_srs_nr(frame_parms, - nr_srs_info->srs_generated_signal, + srs_generated_signal, 0, srs_pdu->bwp_start, - nr_srs_info, + &nr_srs_info, AMP, frame_rx, slot_rx, @@ -765,7 +742,7 @@ void nr_srs_rx_procedures(PHY_VARS_gNB *gNB, stop_meas(&gNB->generate_srs_stats); c16_t **rxdataF = gNB->common_vars.rxdataF[srs->beam_nb]; start_meas(&gNB->get_srs_signal_stats); - *srs_est = nr_get_srs_signal(gNB, rxdataF, slot_rx, srs_pdu, nr_srs_info, srs_received_signal, srs_received_noise); + *srs_est = nr_get_srs_signal(gNB, rxdataF, slot_rx, srs_pdu, &nr_srs_info, srs_received_signal, srs_received_noise); stop_meas(&gNB->get_srs_signal_stats); uint32_t signal_power_avg = 0; @@ -784,8 +761,8 @@ void nr_srs_rx_procedures(PHY_VARS_gNB *gNB, frame_parms->first_carrier_offset, N_symb_SRS, srs_pdu, - nr_srs_info, - nr_srs_info->srs_generated_signal[p_ind], + &nr_srs_info, + srs_generated_signal[p_ind], srs_received_signal[ant_rx_ind], srs_ls_estimated_channel[ant_rx_ind][p_ind], &delay_aux); @@ -803,7 +780,7 @@ void nr_srs_rx_procedures(PHY_VARS_gNB *gNB, frame_parms->first_carrier_offset, N_symb_SRS, srs_pdu, - nr_srs_info, + &nr_srs_info, srs_ls_estimated_channel[ant_rx_ind][p_ind], delay.est_delay, srs_received_noise[ant_rx_ind], @@ -848,7 +825,7 @@ void nr_srs_rx_procedures(PHY_VARS_gNB *gNB, frame_parms->first_carrier_offset, N_symb_SRS, srs_pdu, - nr_srs_info, + &nr_srs_info, signal_power_avg, srs_received_noise[ant_rx_ind], &noise_power_per_ant, @@ -892,6 +869,7 @@ void nr_srs_rx_procedures(PHY_VARS_gNB *gNB, T_INT(slot_rx), T_BUFFER(timing_advance_offset_nsec, nb_antennas_rx * sizeof(int16_t))); } + return nr_srs_info; } static void handle_pucch(PHY_VARS_gNB *gNB, c16_t **rxdataF, const NR_gNB_PUCCH_job_t *pucch, nfapi_nr_uci_t *uci) @@ -1197,7 +1175,7 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx, N c16_t srs_estimated_channel_time[nb_antennas_rx][N_ap][NR_SRS_IDFT_OVERSAMP_FACTOR * ofdm_symbol_size] __attribute__((aligned(32))); - nr_srs_rx_procedures(gNB, + nr_srs_info_t srs_info = nr_srs_rx_procedures(gNB, frame_rx, slot_rx, nb_antennas_rx, @@ -1205,7 +1183,6 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx, N N_symb_SRS, ofdm_symbol_size, srs, - gNB->nr_srs_info[i], &srs_est, srs_estimated_channel_freq, srs_estimated_channel_time, @@ -1308,7 +1285,7 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx, N nfapi_nr_srs_normalized_channel_iq_matrix_t nr_srs_channel_iq_matrix; fill_srs_channel_matrix(&nr_srs_channel_iq_matrix, srs_pdu, - gNB->nr_srs_info[i], + &srs_info, srs_pdu->srs_parameters_v4.iq_representation, nb_antennas_rx, srs_pdu->srs_parameters_v4.num_total_ue_antennas, diff --git a/openair1/SIMULATION/NR_PHY/srssim.c b/openair1/SIMULATION/NR_PHY/srssim.c index 6fcc763970..fc6186c0f1 100644 --- a/openair1/SIMULATION/NR_PHY/srssim.c +++ b/openair1/SIMULATION/NR_PHY/srssim.c @@ -577,7 +577,6 @@ int main(int argc, char *argv[]) N_symb_SRS, ofdm_symbol_size, srs, - gNB->nr_srs_info[0], &srs_est, srs_estimated_channel_freq, srs_estimated_channel_time,