Commit 4a47fbbe authored by Robert Schmidt's avatar Robert Schmidt

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: default avatarRobert Schmidt <robert.schmidt@openairinterface.org>
parent 2213235f
......@@ -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; ap<MAX_NUM_NR_SRS_AP; ap++) {
gNB->nr_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; i<MAX_NUM_NR_SRS_AP; i++) {
free_and_zero(gNB->nr_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();
......
......@@ -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],
......
......@@ -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;
......
......@@ -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;
......
......@@ -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,
......
......@@ -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,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment