From 3b0cad7bb5beb8d35d50689c096e2d7fee93e481 Mon Sep 17 00:00:00 2001 From: francescomani Date: Thu, 27 Oct 2022 18:48:57 +0200 Subject: [PATCH 1/4] removing middle PRB to avoid wrong noise level computation for PUSCH --- openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c b/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c index d8cf2fdc1b..5fecdc8acd 100644 --- a/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c +++ b/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c @@ -162,7 +162,8 @@ void gNB_I0_measurements(PHY_VARS_gNB *gNB,int slot, int first_symb,int num_symb measurements->n0_subband_power[aarx][rb]=0; } int offset0 = (slot&3)*(frame_parms->symbols_per_slot * frame_parms->ofdm_symbol_size) + (frame_parms->first_carrier_offset + (rb*12))%frame_parms->ofdm_symbol_size; - if ((gNB->rb_mask_ul[s][rb >> 5] & (1U << (rb & 31))) == 0) { // check that rb was not used in this subframe + if ((gNB->rb_mask_ul[s][rb >> 5] & (1U << (rb & 31))) == 0 && // check that rb was not used in this subframe + rb != (frame_parms->N_RB_UL+1)>>1) { // skip middle PRB because of artificial noise possibly created by FFT nb_symb[rb]++; for (int aarx=0; aarxnb_antennas_rx; aarx++) { int offset = offset0 + (s*frame_parms->ofdm_symbol_size); @@ -174,6 +175,7 @@ void gNB_I0_measurements(PHY_VARS_gNB *gNB,int slot, int first_symb,int num_symb } AssertFatal(ul_ch, "RX signal buffer (freq) problem\n"); measurements->n0_subband_power[aarx][rb] += signal_energy_nodc(ul_ch,len); + LOG_D(PHY,"aarx %d RB %d n0_subband_power %d\n", aarx, rb, measurements->n0_subband_power[aarx][rb]); } //antenna } } //rb From 5aa75cb6891a4a144d4d07e44c35f78971b770f9 Mon Sep 17 00:00:00 2001 From: Thomas Schlichter Date: Fri, 11 Nov 2022 10:34:22 +0100 Subject: [PATCH 2/4] fix noise calculation also for odd number of PRBs --- .../PHY/NR_ESTIMATION/nr_measurements_gNB.c | 40 +++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c b/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c index 5fecdc8acd..710856d0b7 100644 --- a/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c +++ b/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c @@ -35,6 +35,8 @@ #include "PHY/phy_extern.h" #include "nr_ul_estimation.h" +#define I0_SKIP_DC 1 + extern openair0_config_t openair0_cfg[MAX_CARDS]; int nr_est_timing_advance_pusch(PHY_VARS_gNB* gNB, int UE_id) @@ -155,45 +157,43 @@ void gNB_I0_measurements(PHY_VARS_gNB *gNB,int slot, int first_symb,int num_symb memset(measurements->n0_subband_power, 0, sizeof(measurements->n0_subband_power)); for (int s=first_symb;s<(first_symb+num_symb);s++) { + int offset0 = ((slot&3)*frame_parms->symbols_per_slot + s) * frame_parms->ofdm_symbol_size; for (rb=0; rbN_RB_UL; rb++) { - if (s==first_symb /*&& ((gNB->rb_mask_ul[s][rb>>5]&(1<<(rb&31))) == 0)*/) { - nb_symb[rb]=0; - for (int aarx=0; aarxnb_antennas_rx;aarx++) - measurements->n0_subband_power[aarx][rb]=0; - } - int offset0 = (slot&3)*(frame_parms->symbols_per_slot * frame_parms->ofdm_symbol_size) + (frame_parms->first_carrier_offset + (rb*12))%frame_parms->ofdm_symbol_size; if ((gNB->rb_mask_ul[s][rb >> 5] & (1U << (rb & 31))) == 0 && // check that rb was not used in this subframe - rb != (frame_parms->N_RB_UL+1)>>1) { // skip middle PRB because of artificial noise possibly created by FFT - nb_symb[rb]++; + !(I0_SKIP_DC && rb == frame_parms->N_RB_UL>>1)) { // skip middle PRB because of artificial noise possibly created by FFT + int offset = offset0 + (frame_parms->first_carrier_offset + (rb*12))%frame_parms->ofdm_symbol_size; + nb_symb[rb]++; for (int aarx=0; aarxnb_antennas_rx; aarx++) { - int offset = offset0 + (s*frame_parms->ofdm_symbol_size); - int32_t *ul_ch = &common_vars->rxdataF[aarx][offset]; - int len = 12; + int32_t *ul_ch = &common_vars->rxdataF[aarx][offset]; + int32_t signal_energy; if (((frame_parms->N_RB_UL&1) == 1) && (rb==(frame_parms->N_RB_UL>>1))) { - len=6; + signal_energy = signal_energy_nodc(ul_ch, 6); + ul_ch = &common_vars->rxdataF[aarx][offset0]; + signal_energy += signal_energy_nodc(ul_ch, 6); + } else { + signal_energy = signal_energy_nodc(ul_ch, 12); } - AssertFatal(ul_ch, "RX signal buffer (freq) problem\n"); - measurements->n0_subband_power[aarx][rb] += signal_energy_nodc(ul_ch,len); - LOG_D(PHY,"aarx %d RB %d n0_subband_power %d\n", aarx, rb, measurements->n0_subband_power[aarx][rb]); + measurements->n0_subband_power[aarx][rb] += signal_energy; + LOG_D(PHY,"slot %d symbol %d RB %d aarx %d n0_subband_power %d\n", slot, s, rb, aarx, signal_energy); } //antenna } } //rb } // symb int nb_rb=0; int32_t n0_subband_tot=0; - int32_t n0_subband_tot_perPRB=0; - int32_t n0_subband_tot_perANT[1+frame_parms->nb_antennas_rx]; + int32_t n0_subband_tot_perANT[frame_parms->nb_antennas_rx]; + + memset(n0_subband_tot_perANT, 0, sizeof(n0_subband_tot_perANT)); for (int rb = 0 ; rbN_RB_UL;rb++) { - n0_subband_tot_perPRB=0; + int32_t n0_subband_tot_perPRB=0; if (nb_symb[rb] > 0) { for (int aarx=0;aarxnb_antennas_rx;aarx++) { measurements->n0_subband_power[aarx][rb]/=nb_symb[rb]; measurements->n0_subband_power_dB[aarx][rb] = dB_fixed(measurements->n0_subband_power[aarx][rb]); n0_subband_tot_perPRB+=measurements->n0_subband_power[aarx][rb]; - if (rb==0) n0_subband_tot_perANT[aarx]=measurements->n0_subband_power[aarx][rb]; - else n0_subband_tot_perANT[aarx]+=measurements->n0_subband_power[aarx][rb]; + n0_subband_tot_perANT[aarx]+=measurements->n0_subband_power[aarx][rb]; } n0_subband_tot_perPRB/=frame_parms->nb_antennas_rx; measurements->n0_subband_power_tot_dB[rb] = dB_fixed(n0_subband_tot_perPRB); From b257959dd4ae318b6e29cb3ed9ccf8affea73280 Mon Sep 17 00:00:00 2001 From: Thomas Schlichter Date: Fri, 11 Nov 2022 10:48:16 +0100 Subject: [PATCH 3/4] fix display of UL signal energy and PUCCH signal energy --- openair1/SCHED_NR/phy_procedures_nr_gNB.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index 68eb160c15..e75c0095cd 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -696,8 +696,9 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) { else num_symb=NR_NUMBER_OF_SYMBOLS_PER_SLOT; gNB_I0_measurements(gNB,slot_rx,first_symb,num_symb); + const int soffset = (slot_rx&3) * gNB->frame_parms.symbols_per_slot * gNB->frame_parms.ofdm_symbol_size; int offset = 10*gNB->frame_parms.ofdm_symbol_size + gNB->frame_parms.first_carrier_offset; - int power_rxF = signal_energy_nodc(&gNB->common_vars.rxdataF[0][offset+(47*12)],12*18); + int power_rxF = signal_energy_nodc(&gNB->common_vars.rxdataF[0][soffset+offset+(47*12)],12*18); LOG_D(PHY,"frame %d, slot %d: UL signal energy %d\n",frame_rx,slot_rx,power_rxF); start_meas(&gNB->phy_proc_rx); @@ -726,7 +727,7 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) { nfapi_nr_uci_pucch_pdu_format_0_1_t *uci_pdu_format0 = &gNB->uci_pdu_list[num_ucis].pucch_pdu_format_0_1; offset = pucch_pdu->start_symbol_index*gNB->frame_parms.ofdm_symbol_size + (gNB->frame_parms.first_carrier_offset+pucch_pdu->prb_start*12); - power_rxF = signal_energy_nodc(&gNB->common_vars.rxdataF[0][offset],12); + power_rxF = signal_energy_nodc(&gNB->common_vars.rxdataF[0][soffset+offset],12); LOG_D(PHY,"frame %d, slot %d: PUCCH signal energy %d\n",frame_rx,slot_rx,power_rxF); nr_decode_pucch0(gNB, From 9eb1d24504abbc684e9a19bbbaa0cdd37c8f8b65 Mon Sep 17 00:00:00 2001 From: Thomas Schlichter Date: Fri, 11 Nov 2022 10:50:09 +0100 Subject: [PATCH 4/4] fix size of arrays n0_subband_power and n0_subband_power_dB --- openair1/PHY/defs_gNB.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openair1/PHY/defs_gNB.h b/openair1/PHY/defs_gNB.h index 77b8548d83..d009e53671 100644 --- a/openair1/PHY/defs_gNB.h +++ b/openair1/PHY/defs_gNB.h @@ -648,9 +648,9 @@ typedef struct { //! estimated avg noise power (dB) unsigned int n0_power_tot_dB; //! estimated avg noise power per RB per RX ant (lin) - unsigned int n0_subband_power[MAX_NUM_RU_PER_gNB][275]; + unsigned int n0_subband_power[NB_ANTENNAS_RX][275]; //! estimated avg noise power per RB per RX ant (dB) - unsigned int n0_subband_power_dB[MAX_NUM_RU_PER_gNB][275]; + unsigned int n0_subband_power_dB[NB_ANTENNAS_RX][275]; //! estimated avg subband noise power (dB) unsigned int n0_subband_power_avg_dB; //! estimated avg subband noise power per antenna (dB)