From ed05c94c3e741f1e232523eccccf8ee1eaf2add7 Mon Sep 17 00:00:00 2001 From: Bartosz Podrygajlo Date: Tue, 30 Jul 2024 07:01:48 +0200 Subject: [PATCH] Fix signal_energy_nodc for lengths that are not multiples of 4 --- openair1/PHY/CMakeLists.txt | 7 +- .../PHY/LTE_ESTIMATION/lte_eNB_measurements.c | 18 ++--- .../PHY/LTE_ESTIMATION/lte_ue_measurements.c | 12 +-- .../PHY/LTE_TRANSPORT/ulsch_demodulation.c | 2 +- .../PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c | 6 +- .../PHY/NR_ESTIMATION/nr_measurements_gNB.c | 6 +- .../PHY/NR_TRANSPORT/nr_ulsch_demodulation.c | 2 +- openair1/PHY/NR_TRANSPORT/pucch_rx.c | 4 +- .../PHY/NR_UE_ESTIMATION/nr_ue_measurements.c | 2 +- openair1/PHY/TOOLS/CMakeLists.txt | 58 ++++++++------ openair1/PHY/TOOLS/signal_energy.c | 77 +++++-------------- openair1/PHY/TOOLS/tests/CMakeLists.txt | 5 ++ .../PHY/TOOLS/tests/test_signal_energy.cpp | 31 ++++++++ openair1/PHY/TOOLS/tools_defs.h | 2 +- openair1/SCHED/ru_procedures.c | 2 +- openair1/SCHED_NR/nr_ru_procedures.c | 2 +- openair1/SCHED_NR/phy_procedures_nr_gNB.c | 4 +- 17 files changed, 121 insertions(+), 119 deletions(-) create mode 100644 openair1/PHY/TOOLS/tests/CMakeLists.txt create mode 100644 openair1/PHY/TOOLS/tests/test_signal_energy.cpp diff --git a/openair1/PHY/CMakeLists.txt b/openair1/PHY/CMakeLists.txt index 6f364e4daf..b841d00601 100644 --- a/openair1/PHY/CMakeLists.txt +++ b/openair1/PHY/CMakeLists.txt @@ -1,7 +1,2 @@ -add_boolean_option(ENABLE_UESCOPE OFF "Whether to build the lte uescope" OFF) -add_boolean_option(ENABLE_ENBSCOPE OFF "Whether to build the lte enbcope" OFF) -add_boolean_option(ENABLE_NRSCOPE OFF "Whether to build the 5G scope" OFF) -if(ENABLE_UESCOPE OR ENABLE_ENBSCOPE OR ENABLE_NRSCOPE) - add_subdirectory(TOOLS) -endif() add_subdirectory(nr_phy_common) +add_subdirectory(TOOLS) diff --git a/openair1/PHY/LTE_ESTIMATION/lte_eNB_measurements.c b/openair1/PHY/LTE_ESTIMATION/lte_eNB_measurements.c index 9393bfc048..db6bdff2cd 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_eNB_measurements.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_eNB_measurements.c @@ -69,7 +69,7 @@ void lte_eNB_I0_measurements(PHY_VARS_eNB *eNB, uint32_t aarx /* ,rx_power_correction */; uint32_t rb; - int32_t *ul_ch; + c16_t *ul_ch; int32_t n0_power_tot; int64_t n0_power_tot2; int len; @@ -112,9 +112,9 @@ void lte_eNB_I0_measurements(PHY_VARS_eNB *eNB, for (aarx=0; aarxnb_antennas_rx; aarx++) { measurements->n0_subband_power[aarx][rb] = 0; for (int s=0;s<(14-(frame_parms->Ncp<<1));s++) { - offset = offset0 + (s*frame_parms->ofdm_symbol_size); - ul_ch = &common_vars->rxdataF[aarx][offset]; - len = 12; + offset = offset0 + (s*frame_parms->ofdm_symbol_size); + ul_ch = (c16_t *)&common_vars->rxdataF[aarx][offset]; + len = 12; // just do first half of middle PRB for odd number of PRBs if (((frame_parms->N_RB_UL&1) == 1) && (rb==(frame_parms->N_RB_UL>>1))) { @@ -154,7 +154,7 @@ void lte_eNB_srs_measurements(PHY_VARS_eNB *eNB, int32_t aarx,rx_power_correction; int32_t rx_power; uint32_t rb; - int32_t *ul_ch; + c16_t *ul_ch; //printf("Running eNB_srs_measurements for eNB_id %d\n",eNB_id); @@ -176,9 +176,9 @@ void lte_eNB_srs_measurements(PHY_VARS_eNB *eNB, measurements->rx_spatial_power[srs_id][0][aarx] = - ((signal_energy_nodc(&srs_vars->srs_ch_estimates[aarx][frame_parms->first_carrier_offset], + ((signal_energy_nodc((c16_t*)&srs_vars->srs_ch_estimates[aarx][frame_parms->first_carrier_offset], (frame_parms->N_RB_DL*6)) + - signal_energy_nodc(&srs_vars->srs_ch_estimates[aarx][1], + signal_energy_nodc((c16_t*)&srs_vars->srs_ch_estimates[aarx][1], (frame_parms->N_RB_DL*6)))*rx_power_correction) - measurements->n0_power[aarx]; @@ -219,9 +219,9 @@ void lte_eNB_srs_measurements(PHY_VARS_eNB *eNB, // printf("common_vars->srs_ch_estimates[0] => %x\n",common_vars->srs_ch_estimates[0]); if (rb < 12) - ul_ch = &srs_vars->srs_ch_estimates[aarx][frame_parms->first_carrier_offset + (rb*12)]; + ul_ch = (c16_t *)&srs_vars->srs_ch_estimates[aarx][frame_parms->first_carrier_offset + (rb * 12)]; else if (rb>12) - ul_ch = &srs_vars->srs_ch_estimates[aarx][6 + (rb-13)*12]; + ul_ch = (c16_t *)&srs_vars->srs_ch_estimates[aarx][6 + (rb - 13) * 12]; else { measurements->subband_cqi_dB[srs_id][aarx][rb] = 0; continue; diff --git a/openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c b/openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c index 453b8a3e79..c9ec2449e1 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c @@ -1062,7 +1062,7 @@ void lte_ue_measurements(PHY_VARS_UE *ue, for (aarx=0; aarxnb_antennas_rx; aarx++) { for (aatx=0; aatxnb_antenna_ports_eNB; aatx++) { ue->measurements.rx_spatial_power[eNB_id][aatx][aarx] = - (signal_energy_nodc(&ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id][(aatx<<1) + aarx][0], + (signal_energy_nodc((c16_t*)&ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].dl_ch_estimates[eNB_id][(aatx<<1) + aarx][0], (N_RB_DL*12))); //- ue->measurements.n0_power[aarx]; @@ -1169,7 +1169,7 @@ void lte_ue_measurements(PHY_VARS_UE *ue, msg("subband %d (%d) : %d,%d\n",subband,i,((short *)dl_ch0)[2*i],((short *)dl_ch0)[1+(2*i)]); */ ue->measurements.subband_cqi[eNB_id][aarx][subband] = - (signal_energy_nodc(dl_ch0,subband_size) + signal_energy_nodc(dl_ch1,subband_size)); + (signal_energy_nodc((c16_t*)dl_ch0,subband_size) + signal_energy_nodc((c16_t*)dl_ch1,subband_size)); if ( ue->measurements.subband_cqi[eNB_id][aarx][subband] < 0) ue->measurements.subband_cqi[eNB_id][aarx][subband]=0; @@ -1185,8 +1185,8 @@ void lte_ue_measurements(PHY_VARS_UE *ue, } else { // this is for the last subband which is smaller in size // for (i=0;i<12;i++) // printf("subband %d (%d) : %d,%d\n",subband,i,((short *)dl_ch0)[2*i],((short *)dl_ch0)[1+(2*i)]); - ue->measurements.subband_cqi[eNB_id][aarx][subband] = (signal_energy_nodc(dl_ch0,last_subband_size) + - signal_energy_nodc(dl_ch1,last_subband_size)); // - ue->measurements.n0_power[aarx]; + ue->measurements.subband_cqi[eNB_id][aarx][subband] = (signal_energy_nodc((c16_t*)dl_ch0,last_subband_size) + + signal_energy_nodc((c16_t*)dl_ch1,last_subband_size)); // - ue->measurements.n0_power[aarx]; ue->measurements.subband_cqi_tot[eNB_id][subband] += ue->measurements.subband_cqi[eNB_id][aarx][subband]; ue->measurements.subband_cqi_dB[eNB_id][aarx][subband] = dB_fixed2(ue->measurements.subband_cqi[eNB_id][aarx][subband], ue->measurements.n0_power[aarx]); @@ -1297,7 +1297,7 @@ void lte_ue_measurements(PHY_VARS_UE *ue, // for (i=0;i<48;i++) // printf("subband %d (%d) : %d,%d\n",subband,i,((short *)dl_ch0)[2*i],((short *)dl_ch0)[1+(2*i)]); ue->measurements.subband_cqi[eNB_id][aarx][subband] = - (signal_energy_nodc(dl_ch0,48) ) - ue->measurements.n0_power[aarx]; + (signal_energy_nodc((c16_t*)dl_ch0,48) ) - ue->measurements.n0_power[aarx]; ue->measurements.subband_cqi_tot[eNB_id][subband] += ue->measurements.subband_cqi[eNB_id][aarx][subband]; ue->measurements.subband_cqi_dB[eNB_id][aarx][subband] = dB_fixed2(ue->measurements.subband_cqi[eNB_id][aarx][subband], @@ -1305,7 +1305,7 @@ void lte_ue_measurements(PHY_VARS_UE *ue, } else { // for (i=0;i<12;i++) // printf("subband %d (%d) : %d,%d\n",subband,i,((short *)dl_ch0)[2*i],((short *)dl_ch0)[1+(2*i)]); - ue->measurements.subband_cqi[eNB_id][aarx][subband] = (signal_energy_nodc(dl_ch0,12) ) - ue->measurements.n0_power[aarx]; + ue->measurements.subband_cqi[eNB_id][aarx][subband] = (signal_energy_nodc((c16_t*)dl_ch0,12) ) - ue->measurements.n0_power[aarx]; ue->measurements.subband_cqi_tot[eNB_id][subband] += ue->measurements.subband_cqi[eNB_id][aarx][subband]; ue->measurements.subband_cqi_dB[eNB_id][aarx][subband] = dB_fixed2(ue->measurements.subband_cqi[eNB_id][aarx][subband], ue->measurements.n0_power[aarx]); diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c b/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c index 33425766ab..897f4b1371 100644 --- a/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c +++ b/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c @@ -843,7 +843,7 @@ void rx_ulsch(PHY_VARS_eNB *eNB, } for (i=0; inb_antennas_rx; i++) { - pusch_vars->ulsch_power[i] = signal_energy_nodc(pusch_vars->drs_ch_estimates[i], + pusch_vars->ulsch_power[i] = signal_energy_nodc((c16_t*)pusch_vars->drs_ch_estimates[i], ulsch[UE_id]->harq_processes[harq_pid]->nb_rb*12)/correction_factor; LOG_D(PHY,"%4.4d.%d power harq_pid %d rb %2.2d TBS %2.2d (MPR_times_Ks %d correction %d) power %d dBtimes10\n", proc->frame_rx, proc->subframe_rx, harq_pid, ulsch[UE_id]->harq_processes[harq_pid]->nb_rb, ulsch[UE_id]->harq_processes[harq_pid]->TBS,MPR_times_100Ks,correction_factor,dB_fixed_x10(pusch_vars->ulsch_power[i])); diff --git a/openair1/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c b/openair1/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c index 2e29fd41d1..b9ba9347cf 100644 --- a/openair1/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c +++ b/openair1/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c @@ -1955,7 +1955,7 @@ void dlsch_channel_compensation_TM56(int **rxdataF_ext, } Nre = (pilots==0) ? 12 : 8; - precoded_signal_strength += ((signal_energy_nodc(&dl_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_DL*Nre], + precoded_signal_strength += ((signal_energy_nodc((c16_t*)&dl_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_DL*Nre], (nb_rb*Nre))) - (measurements->n0_power[aarx])); } // rx_antennas @@ -2349,9 +2349,9 @@ void dlsch_channel_compensation_TM34(LTE_DL_FRAME_PARMS *frame_parms, } // rb loop Nre = (pilots==0) ? 12 : 8; - precoded_signal_strength0 += ((signal_energy_nodc(&dl_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_DL*Nre], + precoded_signal_strength0 += ((signal_energy_nodc((c16_t*)&dl_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_DL*Nre], (nb_rb*Nre))*rx_power_correction) - (measurements->n0_power[aarx])); - precoded_signal_strength1 += ((signal_energy_nodc(&dl_ch_estimates_ext[aarx+2][symbol*frame_parms->N_RB_DL*Nre], + precoded_signal_strength1 += ((signal_energy_nodc((c16_t*)&dl_ch_estimates_ext[aarx+2][symbol*frame_parms->N_RB_DL*Nre], (nb_rb*Nre))*rx_power_correction) - (measurements->n0_power[aarx])); } // rx_antennas diff --git a/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c b/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c index a45734e791..e36471c25d 100644 --- a/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c +++ b/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c @@ -143,12 +143,12 @@ void gNB_I0_measurements(PHY_VARS_gNB *gNB, int slot, int first_symb, int num_sy 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++) { - int32_t *ul_ch = (int32_t *)&common_vars->rxdataF[aarx][offset]; + c16_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))) { signal_energy = signal_energy_nodc(ul_ch, 6); - ul_ch = (int32_t *)&common_vars->rxdataF[aarx][offset0]; + ul_ch = &common_vars->rxdataF[aarx][offset0]; signal_energy += signal_energy_nodc(ul_ch, 6); } else { signal_energy = signal_energy_nodc(ul_ch, 12); @@ -229,7 +229,7 @@ void nr_gnb_measurements(PHY_VARS_gNB *gNB, for (int aatx = 0; aatx < nrOfLayers; aatx++){ rx_spatial_power[aatx][aarx] = - (signal_energy_nodc(&pusch_vars->ul_ch_estimates[aatx * fp->nb_antennas_rx + aarx][ch_offset], + (signal_energy_nodc((c16_t*)&pusch_vars->ul_ch_estimates[aatx * fp->nb_antennas_rx + aarx][ch_offset], N_RB_UL * NR_NB_SC_PER_RB)); if (rx_spatial_power[aatx][aarx] < 0) { diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c index 96266e279a..2d33e0f55b 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c +++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c @@ -1522,7 +1522,7 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB, } for (int aatx = 0; aatx < rel15_ul->nrOfLayers; aatx++) { pusch_vars->ulsch_power[aarx] += signal_energy_nodc( - &pusch_vars->ul_ch_estimates[aatx * gNB->frame_parms.nb_antennas_rx + aarx][symbol * frame_parms->ofdm_symbol_size], + (c16_t*)&pusch_vars->ul_ch_estimates[aatx * gNB->frame_parms.nb_antennas_rx + aarx][symbol * frame_parms->ofdm_symbol_size], rel15_ul->rb_size * 12); } for (int rb = 0; rb < rel15_ul->rb_size; rb++) diff --git a/openair1/PHY/NR_TRANSPORT/pucch_rx.c b/openair1/PHY/NR_TRANSPORT/pucch_rx.c index 05d7f03832..412edf9d35 100644 --- a/openair1/PHY/NR_TRANSPORT/pucch_rx.c +++ b/openair1/PHY/NR_TRANSPORT/pucch_rx.c @@ -266,7 +266,7 @@ void nr_decode_pucch0(PHY_VARS_gNB *gNB, printf("x (%d,%d), xr (%ld,%ld)\n", x_re[l][n], x_im[l][n], xr[aa][l][n].r, xr[aa][l][n].i); #endif } - int energ = signal_energy_nodc((int32_t *)rp, nb_re_pucch); + int energ = signal_energy_nodc(rp, nb_re_pucch); signal_energy += energ; if (aa == 0) signal_energy_ant0 += energ; @@ -1629,7 +1629,7 @@ void nr_decode_pucch2(PHY_VARS_gNB *gNB, uci_pdu->pucch_format=0; uci_pdu->ul_cqi=cqi; uci_pdu->timing_advance=0xffff; // currently not valid - uci_pdu->rssi=1280 - (10*dB_fixed(32767*32767)-dB_fixed_times10(signal_energy_nodc((int32_t *)&rxdataF[0][soffset+(l2*frame_parms->ofdm_symbol_size)+re_offset[0]],12*pucch_pdu->prb_size))); + uci_pdu->rssi=1280 - (10*dB_fixed(32767*32767)-dB_fixed_times10(signal_energy_nodc(&rxdataF[0][soffset+(l2*frame_parms->ofdm_symbol_size)+re_offset[0]],12*pucch_pdu->prb_size))); if (pucch_pdu->bit_len_harq>0) { int harq_bytes=pucch_pdu->bit_len_harq>>3; if ((pucch_pdu->bit_len_harq&7) > 0) harq_bytes++; diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_ue_measurements.c b/openair1/PHY/NR_UE_ESTIMATION/nr_ue_measurements.c index 30ff7a2f9b..28d8062588 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_ue_measurements.c +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_ue_measurements.c @@ -113,7 +113,7 @@ void nr_ue_measurements(PHY_VARS_NR_UE *ue, ue->measurements.rx_power[gNB_id][aarx] = 0; for (aatx = 0; aatx < frame_parms->nb_antenna_ports_gNB; aatx++){ - const int z=signal_energy_nodc(&dl_ch_estimates[gNB_id][ch_offset], N_RB_DL * NR_NB_SC_PER_RB); + const int z=signal_energy_nodc((c16_t*)&dl_ch_estimates[gNB_id][ch_offset], N_RB_DL * NR_NB_SC_PER_RB); rx_spatial_power[gNB_id][aatx][aarx] = z; if (rx_spatial_power[gNB_id][aatx][aarx] < 0) diff --git a/openair1/PHY/TOOLS/CMakeLists.txt b/openair1/PHY/TOOLS/CMakeLists.txt index 8acd528617..93ef4f5cc7 100644 --- a/openair1/PHY/TOOLS/CMakeLists.txt +++ b/openair1/PHY/TOOLS/CMakeLists.txt @@ -29,29 +29,37 @@ #* \warning #*/ -find_library(forms NAMES forms) -if(NOT forms) - message(FATAL_ERROR "required library forms not found for building scopes") -else() - message(STATUS "libforms library, required for scopes, found at ${forms}") +add_boolean_option(ENABLE_UESCOPE OFF "Whether to build the lte uescope" OFF) +add_boolean_option(ENABLE_ENBSCOPE OFF "Whether to build the lte enbcope" OFF) +add_boolean_option(ENABLE_NRSCOPE OFF "Whether to build the 5G scope" OFF) +if(ENABLE_UESCOPE OR ENABLE_ENBSCOPE OR ENABLE_NRSCOPE) + find_library(forms NAMES forms) + if(NOT forms) + message(FATAL_ERROR "required library forms not found for building scopes") + else() + message(STATUS "libforms library, required for scopes, found at ${forms}") + endif() + + include_directories ("/usr/include/X11") + add_library(xforms_common OBJECT + lte_phy_scope.c + ../../../executables/stats.c) + target_link_libraries(xforms_common PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs) + + add_library(enbscope MODULE lte_enb_scope.c $) + target_link_libraries(enbscope PUBLIC forms PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs) + + add_library(uescope MODULE lte_ue_scope.c $) + target_link_libraries(uescope PUBLIC forms PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs) + + add_library(nrscope MODULE nr_phy_scope.c) + target_link_libraries(nrscope PUBLIC forms PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs) + + # all libraries should be written to root build dir (default creates the same hierarchie under build as existing for sources) + set_target_properties(enbscope uescope nrscope + PROPERTIES LIBRARY_OUTPUT_DIRECTORY ../../.. + ) +endif() +if (ENABLE_TESTS) + add_subdirectory(tests) endif() - -include_directories ("/usr/include/X11") -add_library(xforms_common OBJECT - lte_phy_scope.c - ../../../executables/stats.c) -target_link_libraries(xforms_common PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs) - -add_library(enbscope MODULE lte_enb_scope.c $) -target_link_libraries(enbscope PUBLIC forms PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs) - -add_library(uescope MODULE lte_ue_scope.c $) -target_link_libraries(uescope PUBLIC forms PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs) - -add_library(nrscope MODULE nr_phy_scope.c) -target_link_libraries(nrscope PUBLIC forms PRIVATE asn1_nr_rrc_hdrs asn1_lte_rrc_hdrs) - -# all libraries should be written to root build dir (default creates the same hierarchie under build as existing for sources) -set_target_properties(enbscope uescope nrscope - PROPERTIES LIBRARY_OUTPUT_DIRECTORY ../../.. -) diff --git a/openair1/PHY/TOOLS/signal_energy.c b/openair1/PHY/TOOLS/signal_energy.c index 3f2b9a456d..affee5dac4 100644 --- a/openair1/PHY/TOOLS/signal_energy.c +++ b/openair1/PHY/TOOLS/signal_energy.c @@ -112,30 +112,32 @@ int32_t signal_energy_amp_shift(int32_t *input,uint32_t length) return((temp>0)?temp:1); } -int32_t signal_energy_nodc(int32_t *input,uint32_t length) +int32_t signal_energy_nodc(const c16_t *input, uint32_t length) { - int32_t i; - int32_t temp; + // init + simde__m128 mm0 = simde_mm_setzero_ps(); - simde__m128i in; - simde__m128 mm0; - -//init - mm0 = simde_mm_setzero_ps(); -//Acc - for (i=0; i<(length>>2); i++) { - in = simde_mm_loadu_si128((simde__m128i *)input); - mm0 = simde_mm_add_ps(mm0,simde_mm_cvtepi32_ps(simde_mm_madd_epi16(in,in))); + // Acc + for (int32_t i = 0; i < (length >> 2); i++) { + simde__m128i in = simde_mm_loadu_si128((simde__m128i *)input); + mm0 = simde_mm_add_ps(mm0, simde_mm_cvtepi32_ps(simde_mm_madd_epi16(in, in))); input += 4; } - //Ave - temp = (int)((((float*)&mm0)[0] + - ((float*)&mm0)[1] + - ((float*)&mm0)[2] + - ((float*)&mm0)[3])/(float)length); - return temp; + // leftover + float leftover_sum = 0; + c16_t *leftover_input = (c16_t *)input; + uint16_t lefover_count = length - ((length >> 2) << 2); + for (int32_t i = 0; i < lefover_count; i++) { + leftover_sum += leftover_input[i].r * leftover_input[i].r + leftover_input[i].i * leftover_input[i].i; + } + + // Ave + float sums[4]; + simde_mm_store_ps(sums, mm0); + return (int)((sums[0] + sums[1] + sums[2] + sums[3] + leftover_sum) / (float)length); } + double signal_energy_fp(double *s_re[2],double *s_im[2],uint32_t nb_antennas,uint32_t length,uint32_t offset) { @@ -164,45 +166,6 @@ double signal_energy_fp2(struct complexd *s,uint32_t length) } return(V/length); } - // -#ifdef MAIN -#define LENGTH 256 -#include -#include -#include -#include -main(int argc,char **argv) -{ - - int input[LENGTH]; - int energy=0,dc_r=0,dc_i=0; - int16_t s=1,i; - int amp; - - amp = atoi(argv[1]);// arguments to integer - - if (argc>1) - printf("Amp = %d\n",amp); - - for (i=0; i +extern "C" { +#include "openair1/PHY/TOOLS/tools_defs.h" +extern int32_t signal_energy_nodc(const c16_t *input, uint32_t length); +} +#include +#include + +int32_t signal_energy_nodc_ref(const c16_t *input, uint32_t length) +{ + float sum = 0; + for (auto i = 0U; i < length; i++) { + sum += input[i].r * input[i].r + input[i].i * input[i].i; + } + return sum / length; +} + +TEST(signal_energy_nodc, size_6) +{ + std::vector input; + input.resize(6); + std::fill(input.begin(), input.end(), (c16_t){42, 42}); + EXPECT_EQ(signal_energy_nodc(input.data(), input.size()), + signal_energy_nodc_ref(input.data(), input.size())); +} + +int main(int argc, char **argv) +{ + testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} diff --git a/openair1/PHY/TOOLS/tools_defs.h b/openair1/PHY/TOOLS/tools_defs.h index 771f488b54..c6926ff752 100644 --- a/openair1/PHY/TOOLS/tools_defs.h +++ b/openair1/PHY/TOOLS/tools_defs.h @@ -761,7 +761,7 @@ int32_t subcarrier_energy(int32_t *,uint32_t, int32_t *subcarrier_energy, uint16 /*!\fn int32_t signal_energy_nodc(int32_t *,uint32_t); \brief Computes the signal energy per subcarrier, without DC removal */ -int32_t signal_energy_nodc(int32_t *,uint32_t); +int32_t signal_energy_nodc(const c16_t *input, uint32_t length); int32_t signal_power(int32_t *,uint32_t); int32_t interference_power(int32_t *,uint32_t); diff --git a/openair1/SCHED/ru_procedures.c b/openair1/SCHED/ru_procedures.c index fdeb58ead1..96e32c6444 100644 --- a/openair1/SCHED/ru_procedures.c +++ b/openair1/SCHED/ru_procedures.c @@ -444,7 +444,7 @@ void feptx_ofdm(RU_t *ru, stop_meas(&ru->ofdm_mod_stats); LOG_D(PHY,"feptx_ofdm (TXPATH): frame %d, subframe %d: txp (time %p) %d dB, txp (freq) %d dB\n", frame,subframe,txdata,dB_fixed(signal_energy((int32_t*)txdata,fp->samples_per_tti)), - dB_fixed(signal_energy_nodc(ru->common.txdataF_BF[aa],2*slot_sizeF))); + dB_fixed(signal_energy_nodc((c16_t*)ru->common.txdataF_BF[aa],2*slot_sizeF))); } } VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPTX_OFDM+ru->idx , 0 ); diff --git a/openair1/SCHED_NR/nr_ru_procedures.c b/openair1/SCHED_NR/nr_ru_procedures.c index 93619732ae..16a06c6e97 100644 --- a/openair1/SCHED_NR/nr_ru_procedures.c +++ b/openair1/SCHED_NR/nr_ru_procedures.c @@ -166,7 +166,7 @@ void nr_feptx_ofdm(RU_t *ru,int frame_tx,int tti_tx) { LOG_D(PHY,"feptx_ofdm (TXPATH): frame %d, slot %d: txp (time %p) %d dB, txp (freq) %d dB\n", frame_tx,slot,txdata,dB_fixed(signal_energy((int32_t*)txdata,fp->get_samples_per_slot( - slot,fp))),dB_fixed(signal_energy_nodc(ru->common.txdataF_BF[aa],2*slot_sizeF))); + slot,fp))),dB_fixed(signal_energy_nodc((c16_t*)ru->common.txdataF_BF[aa],2*slot_sizeF))); } diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index a12d203ae7..15ae40fac2 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -746,7 +746,7 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) "frame %d, slot %d: UL signal energy %d\n", frame_rx, slot_rx, - signal_energy_nodc((int32_t *)&gNB->common_vars.rxdataF[0][soffset + offset + (47 * 12)], 12 * 18)); + signal_energy_nodc(&gNB->common_vars.rxdataF[0][soffset + offset + (47 * 12)], 12 * 18)); start_meas(&gNB->phy_proc_rx); @@ -778,7 +778,7 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) "frame %d, slot %d: PUCCH signal energy %d\n", frame_rx, slot_rx, - signal_energy_nodc((int32_t *)&gNB->common_vars.rxdataF[0][soffset + offset], 12)); + signal_energy_nodc(&gNB->common_vars.rxdataF[0][soffset + offset], 12)); nr_decode_pucch0(gNB, frame_rx,