diff --git a/openair1/PHY/defs_gNB.h b/openair1/PHY/defs_gNB.h index 04ece4f0d9952eb932ecfb0d533662650fc885e7..0f2f41c47041926516aa808411660a8217ab6bc0 100644 --- a/openair1/PHY/defs_gNB.h +++ b/openair1/PHY/defs_gNB.h @@ -742,6 +742,14 @@ typedef struct PHY_VARS_gNB_s { time_stats_t ulsch_rbs_extraction_stats; time_stats_t ulsch_mrc_stats; time_stats_t ulsch_llr_stats; + time_stats_t rx_srs_stats; + time_stats_t generate_srs_stats; + time_stats_t get_srs_signal_stats; + time_stats_t srs_channel_estimation_stats; + time_stats_t srs_timing_advance_stats; + time_stats_t srs_report_tlv_stats; + time_stats_t srs_beam_report_stats; + time_stats_t srs_iq_matrix_stats; /* time_stats_t rx_dft_stats; diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index 7bb81f97efb225bf3fd4c11ef8c6d898be87cc26..a5609f743789f9a976666b8e00df676a7deee523 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -867,6 +867,8 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) { if ((srs->active == 1) && (srs->frame == frame_rx) && (srs->slot == slot_rx)) { LOG_D(NR_PHY, "(%d.%d) gNB is waiting for SRS, id = %i\n", frame_rx, slot_rx, i); + start_meas(&gNB->rx_srs_stats); + NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms; nfapi_nr_srs_pdu_t *srs_pdu = &srs->srs_pdu; uint8_t N_symb_SRS = 1 << srs_pdu->num_symbols; @@ -877,10 +879,16 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) { int8_t snr_per_rb[srs_pdu->bwp_size]; int8_t snr; + start_meas(&gNB->generate_srs_stats); 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); + stop_meas(&gNB->generate_srs_stats); + + start_meas(&gNB->get_srs_signal_stats); int srs_est = nr_get_srs_signal(gNB, frame_rx, slot_rx, srs_pdu, gNB->nr_srs_info[i], srs_received_signal); + stop_meas(&gNB->get_srs_signal_stats); if (srs_est >= 0) { + start_meas(&gNB->srs_channel_estimation_stats); nr_srs_channel_estimation(gNB, frame_rx, slot_rx, @@ -893,6 +901,7 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) { srs_estimated_channel_time_shifted, snr_per_rb, &snr); + stop_meas(&gNB->srs_channel_estimation_stats); } if ((snr * 10) < gNB->srs_thres) { @@ -922,7 +931,9 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) { nfapi_nr_srs_indication_pdu_t *srs_indication = &gNB->srs_pdu_list[gNB->UL_INFO.srs_ind.number_of_pdus]; srs_indication->handle = srs_pdu->handle; srs_indication->rnti = srs_pdu->rnti; + start_meas(&gNB->srs_timing_advance_stats); srs_indication->timing_advance_offset = srs_est >= 0 ? nr_est_timing_advance_srs(frame_parms, srs_estimated_channel_time[0]) : 0xFFFF; + stop_meas(&gNB->srs_timing_advance_stats); srs_indication->timing_advance_offset_nsec = srs_est >= 0 ? (int16_t)((((int32_t)srs_indication->timing_advance_offset - 31) * ((int32_t)TC_NSEC_x32768)) >> 15) : 0xFFFF; switch (srs_pdu->srs_parameters_v4.usage) { case 0: @@ -961,8 +972,10 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) { srs_indication->report_tlv->tag = 0; srs_indication->report_tlv->length = 0; + start_meas(&gNB->srs_report_tlv_stats); switch (srs_indication->srs_usage) { case NR_SRS_ResourceSet__usage_beamManagement: { + start_meas(&gNB->srs_beam_report_stats); nfapi_nr_srs_beamforming_report_t nr_srs_beamforming_report; nr_srs_beamforming_report.prg_size = srs_pdu->beamforming.prg_size; nr_srs_beamforming_report.num_symbols = 1 << srs_pdu->num_symbols; @@ -987,10 +1000,12 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) { #endif srs_indication->report_tlv->length = pack_nr_srs_beamforming_report(&nr_srs_beamforming_report, srs_indication->report_tlv->value, 16384 * sizeof(uint32_t)); + stop_meas(&gNB->srs_beam_report_stats); break; } case NR_SRS_ResourceSet__usage_codebook: { + start_meas(&gNB->srs_iq_matrix_stats); nfapi_nr_srs_normalized_channel_iq_matrix_t nr_srs_normalized_channel_iq_matrix; nr_srs_normalized_channel_iq_matrix.normalized_iq_representation = srs_pdu->srs_parameters_v4.iq_representation; nr_srs_normalized_channel_iq_matrix.num_gnb_antenna_elements = gNB->frame_parms.nb_antennas_rx; @@ -1036,7 +1051,7 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) { srs_indication->report_tlv->length = pack_nr_srs_normalized_channel_iq_matrix(&nr_srs_normalized_channel_iq_matrix, srs_indication->report_tlv->value, 16384 * sizeof(uint32_t)); - + stop_meas(&gNB->srs_iq_matrix_stats); break; } @@ -1048,6 +1063,7 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) { default: AssertFatal(1 == 0, "Invalid SRS usage\n"); } + stop_meas(&gNB->srs_report_tlv_stats); #ifdef SRS_IND_DEBUG LOG_I(NR_PHY, "srs_indication->report_tlv->tag = %i\n", srs_indication->report_tlv->tag); @@ -1060,6 +1076,8 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) { gNB->UL_INFO.srs_ind.number_of_pdus += 1; srs->active = 0; + + stop_meas(&gNB->rx_srs_stats); } } } diff --git a/openair1/SIMULATION/NR_PHY/ulsim.c b/openair1/SIMULATION/NR_PHY/ulsim.c index 5f0c6764d9a1eb5a4fb80228975c416f54113900..cd776b009d4469be328413f350147fb15ef640f9 100644 --- a/openair1/SIMULATION/NR_PHY/ulsim.c +++ b/openair1/SIMULATION/NR_PHY/ulsim.c @@ -1093,6 +1093,14 @@ int main(int argc, char **argv) reset_meas(&UE->ulsch_rate_matching_stats); reset_meas(&UE->ulsch_interleaving_stats); reset_meas(&UE->ulsch_encoding_stats); + reset_meas(&gNB->rx_srs_stats); + reset_meas(&gNB->generate_srs_stats); + reset_meas(&gNB->get_srs_signal_stats); + reset_meas(&gNB->srs_channel_estimation_stats); + reset_meas(&gNB->srs_timing_advance_stats); + reset_meas(&gNB->srs_report_tlv_stats); + reset_meas(&gNB->srs_beam_report_stats); + reset_meas(&gNB->srs_iq_matrix_stats); uint32_t errors_scrambling[16] = {0}; int n_errors[16] = {0}; @@ -1672,6 +1680,14 @@ int main(int argc, char **argv) //printStatIndent2(&gNB->ulsch_deinterleaving_stats,"ULSCH deinterleaving"); //printStatIndent2(&gNB->ulsch_rate_unmatching_stats,"ULSCH rate matching rx"); //printStatIndent2(&gNB->ulsch_ldpc_decoding_stats,"ULSCH ldpc decoding"); + printStatIndent(&gNB->rx_srs_stats,"RX SRS time"); + printStatIndent2(&gNB->generate_srs_stats,"Generate SRS sequence time"); + printStatIndent2(&gNB->get_srs_signal_stats,"Get SRS signal time"); + printStatIndent2(&gNB->srs_channel_estimation_stats,"SRS channel estimation time"); + printStatIndent2(&gNB->srs_timing_advance_stats,"SRS timing advance estimation time"); + printStatIndent2(&gNB->srs_report_tlv_stats,"SRS report TLV build time"); + printStatIndent3(&gNB->srs_beam_report_stats,"SRS beam report build time"); + printStatIndent3(&gNB->srs_iq_matrix_stats,"SRS IQ matrix build time"); printf("\n"); }