diff --git a/cmake_targets/autotests/test_case_list.xml b/cmake_targets/autotests/test_case_list.xml
index 8ea193b816..5afe683055 100755
--- a/cmake_targets/autotests/test_case_list.xml
+++ b/cmake_targets/autotests/test_case_list.xml
@@ -387,7 +387,8 @@
(Test10: PUSCH Type B, 3 DMRS, 2 PTRS, 3 Interpolated Symbols),
(Test11: 25 PRBs, 15 kHz SCS),
(Test12: MCS 0, low SNR performance)
- (Test13: MCS 28, 106 PRBs, Time shift 8)
+ (Test13: MCS 28, 106 PRBs, Time shift 8)
+ (Test14: SRS, SNR 40 dB)
nr_ulsim
-n100 -m9 -r106 -s5
-n100 -m16 -s10
@@ -401,8 +402,9 @@
-n100 -s5 -a4 -b8 -T 1,2 -U 1,3,1,1
-n100 -u0 -m0 -R25 -r25 -i 1,0
-n100 -m0 -S -0.6 -i 1,0
- -n100 -m 28 -R106 -r106 -t90 -s24 -S24 -d 8
- test1 test2 test3 test4 test5 test6 test7 test8 test9 test10 test11 test12 test13
+ -n100 -m 28 -R106 -r106 -t90 -s24 -S24 -d 8
+ -n100 -s40 -E 1
+ test1 test2 test3 test4 test5 test6 test7 test8 test9 test10 test11 test12 test13 test14
PUSCH test OK
segmentation fault|assertion|exiting|fatal
3
diff --git a/openair1/PHY/INIT/nr_init.c b/openair1/PHY/INIT/nr_init.c
index e015fbbac8..57d9bbc8eb 100644
--- a/openair1/PHY/INIT/nr_init.c
+++ b/openair1/PHY/INIT/nr_init.c
@@ -504,7 +504,7 @@ void init_nr_transport(PHY_VARS_gNB *gNB)
gNB->max_nb_pucch = buffer_ul_slots ? MAX_MOBILES_PER_GNB * buffer_ul_slots : 1;
gNB->max_nb_pusch = buffer_ul_slots ? MAX_MOBILES_PER_GNB * buffer_ul_slots : 1;
- gNB->max_nb_srs = buffer_ul_slots << 1; // assuming at most 2 SRS per slot
+ gNB->max_nb_srs = buffer_ul_slots ? buffer_ul_slots << 1 : 1; // assuming at most 2 SRS per slot
gNB->pucch = (NR_gNB_PUCCH_t *)malloc16(gNB->max_nb_pucch * sizeof(NR_gNB_PUCCH_t));
for (int i = 0; i < gNB->max_nb_pucch; i++) {
diff --git a/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c b/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c
index 0226cadf84..b8b44eceb6 100644
--- a/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c
+++ b/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c
@@ -597,17 +597,6 @@ void nr_pusch_ptrs_processing(PHY_VARS_gNB *gNB,
} // Antenna loop
}
-uint32_t calc_power(const int16_t *x, const uint32_t size) {
- int64_t sum_x = 0;
- int64_t sum_x2 = 0;
- for(int k = 0; knb_antennas_rx * N_ap * M_sc_b_SRS;
- int16_t ch_real[arr_len];
- memset(ch_real, 0, arr_len * sizeof(int16_t));
-
- int16_t ch_imag[arr_len];
- memset(ch_imag, 0, arr_len * sizeof(int16_t));
-
- int16_t noise_real[arr_len];
- memset(noise_real, 0, arr_len * sizeof(int16_t));
-
- int16_t noise_imag[arr_len];
- memset(noise_imag, 0, arr_len * sizeof(int16_t));
+ c16_t ch[arr_len];
+ memset(ch, 0, arr_len * sizeof(c16_t));
- int16_t ls_estimated[2];
+ c16_t noise[arr_len];
+ memset(noise, 0, arr_len * sizeof(c16_t));
uint8_t mem_offset = ((16 - ((long)&srs_estimated_channel_freq[0][0][subcarrier_offset + nr_srs_info->k_0_p[0][0]])) & 0xF) >> 2; // >> 2 <=> /sizeof(int32_t)
// filt16_end is {4096,8192,8192,8192,12288,16384,16384,16384,0,0,0,0,0,0,0,0}
// The End of OFDM symbol corresponds to the position of last 16384 in the filter
- // The multadd_real_vector_complex_scalar applies the remaining 8 zeros of filter, therefore, to avoid a buffer overflow,
+ // The c16multaddVectRealComplex applies the remaining 8 zeros of filter, therefore, to avoid a buffer overflow,
// we added 8 in the array size
- int32_t srs_est[frame_parms->ofdm_symbol_size*(1<num_symbols) + mem_offset + 8] __attribute__ ((aligned(32)));
+ int32_t srs_est[frame_parms->ofdm_symbol_size * (1 << srs_pdu->num_symbols) + mem_offset + 8] __attribute__((aligned(32)));
+ c16_t ls_estimated = {0};
for (int ant = 0; ant < frame_parms->nb_antennas_rx; ant++) {
@@ -682,14 +664,12 @@ int nr_srs_channel_estimation(
subcarrier -= frame_parms->ofdm_symbol_size;
}
- int16_t *srs_estimated_channel16 = (int16_t *)&srs_est[subcarrier + mem_offset];
+ c16_t *srs_estimated_channel16 = (c16_t *)&srs_est[subcarrier + mem_offset];
for (int k = 0; k < M_sc_b_SRS; k++) {
if (k%fd_cdm==0) {
-
- ls_estimated[0] = 0;
- ls_estimated[1] = 0;
+ ls_estimated = (c16_t){0, 0};
uint16_t subcarrier_cdm = subcarrier;
for (int cdm_idx = 0; cdm_idx < fd_cdm; cdm_idx++) {
@@ -701,8 +681,8 @@ int nr_srs_channel_estimation(
// We know that nr_srs_info->srs_generated_signal_bits bits are enough to represent the generated_real and generated_imag.
// So we only need a nr_srs_info->srs_generated_signal_bits shift to ensure that the result fits into 16 bits.
- ls_estimated[0] += (int16_t)(((int32_t)generated_real*received_real + (int32_t)generated_imag*received_imag)>>nr_srs_info->srs_generated_signal_bits);
- ls_estimated[1] += (int16_t)(((int32_t)generated_real*received_imag - (int32_t)generated_imag*received_real)>>nr_srs_info->srs_generated_signal_bits);
+ ls_estimated.r += (int16_t)(((int32_t)generated_real*received_real + (int32_t)generated_imag*received_imag)>>nr_srs_info->srs_generated_signal_bits);
+ ls_estimated.i += (int16_t)(((int32_t)generated_real*received_imag - (int32_t)generated_imag*received_real)>>nr_srs_info->srs_generated_signal_bits);
// Subcarrier increment
subcarrier_cdm += K_TC;
@@ -712,8 +692,7 @@ int nr_srs_channel_estimation(
}
}
- srs_ls_estimated_channel[subcarrier].r = ls_estimated[0];
- srs_ls_estimated_channel[subcarrier].i = ls_estimated[1];
+ srs_ls_estimated_channel[subcarrier] = ls_estimated;
#ifdef SRS_DEBUG
int subcarrier_log = subcarrier-subcarrier_offset;
@@ -728,48 +707,48 @@ int nr_srs_channel_estimation(
subcarrier_log,
((c16_t*)srs_generated_signal[p_index])[subcarrier].r, ((c16_t*)srs_generated_signal[p_index])[subcarrier].i,
((c16_t*)srs_received_signal[ant])[subcarrier].r, ((c16_t*)srs_received_signal[ant])[subcarrier].i,
- ls_estimated[0], ls_estimated[1]);
+ ls_estimated.r, ls_estimated.i);
#endif
const uint16_t sc_offset = subcarrier + mem_offset;
// Channel interpolation
- if(srs_pdu->comb_size == 0) {
- if(k == 0) { // First subcarrier case
+ if (srs_pdu->comb_size == 0) {
+ if (k == 0) { // First subcarrier case
// filt8_start is {12288,8192,4096,0,0,0,0,0}
- multadd_real_vector_complex_scalar(filt8_start, ls_estimated, srs_estimated_channel16, 8);
- } else if(subcarrier < K_TC) { // Start of OFDM symbol case
+ c16multaddVectRealComplex(filt8_start, &ls_estimated, srs_estimated_channel16, 8);
+ } else if (subcarrier < K_TC) { // Start of OFDM symbol case
// filt8_start is {12288,8192,4096,0,0,0,0,0}
- srs_estimated_channel16 = (int16_t *)&srs_est[subcarrier];
+ srs_estimated_channel16 = (c16_t *)&srs_est[subcarrier];
const short *filter = mem_offset == 0 ? filt8_start : filt8_start_shift2;
- multadd_real_vector_complex_scalar(filter, ls_estimated, srs_estimated_channel16, 8);
- } else if((subcarrier+K_TC)>=frame_parms->ofdm_symbol_size || k == (M_sc_b_SRS-1)) { // End of OFDM symbol or last subcarrier cases
+ c16multaddVectRealComplex(filter, &ls_estimated, srs_estimated_channel16, 8);
+ } else if ((subcarrier + K_TC) >= frame_parms->ofdm_symbol_size || k == (M_sc_b_SRS - 1)) { // End of OFDM symbol or last subcarrier cases
// filt8_end is {4096,8192,12288,16384,0,0,0,0}
const short *filter = mem_offset == 0 || k == (M_sc_b_SRS - 1) ? filt8_end : filt8_end_shift2;
- multadd_real_vector_complex_scalar(filter, ls_estimated, srs_estimated_channel16, 8);
- } else if(k%2 == 1) { // 1st middle case
+ c16multaddVectRealComplex(filter, &ls_estimated, srs_estimated_channel16, 8);
+ } else if (k % 2 == 1) { // 1st middle case
// filt8_middle2 is {4096,8192,8192,8192,4096,0,0,0}
- multadd_real_vector_complex_scalar(filt8_middle2, ls_estimated, srs_estimated_channel16, 8);
- } else if(k%2 == 0) { // 2nd middle case
+ c16multaddVectRealComplex(filt8_middle2, &ls_estimated, srs_estimated_channel16, 8);
+ } else if (k % 2 == 0) { // 2nd middle case
// filt8_middle4 is {0,0,4096,8192,8192,8192,4096,0}
- multadd_real_vector_complex_scalar(filt8_middle4, ls_estimated, srs_estimated_channel16, 8);
- srs_estimated_channel16 = (int16_t *)&srs_est[sc_offset];
+ c16multaddVectRealComplex(filt8_middle4, &ls_estimated, srs_estimated_channel16, 8);
+ srs_estimated_channel16 = (c16_t *)&srs_est[sc_offset];
}
} else {
- if(k == 0) { // First subcarrier case
+ if (k == 0) { // First subcarrier case
// filt16_start is {12288,8192,8192,8192,4096,0,0,0,0,0,0,0,0,0,0,0}
- multadd_real_vector_complex_scalar(filt16_start, ls_estimated, srs_estimated_channel16, 16);
- } else if(subcarrier < K_TC) { // Start of OFDM symbol case
- srs_estimated_channel16 = (int16_t *)&srs_est[sc_offset];
+ c16multaddVectRealComplex(filt16_start, &ls_estimated, srs_estimated_channel16, 16);
+ } else if (subcarrier < K_TC) { // Start of OFDM symbol case
+ srs_estimated_channel16 = (c16_t *)&srs_est[sc_offset];
// filt16_start is {12288,8192,8192,8192,4096,0,0,0,0,0,0,0,0,0,0,0}
- multadd_real_vector_complex_scalar(filt16_start, ls_estimated, srs_estimated_channel16, 16);
- } else if((subcarrier+K_TC)>=frame_parms->ofdm_symbol_size || k == (M_sc_b_SRS-1)) { // End of OFDM symbol or last subcarrier cases
+ c16multaddVectRealComplex(filt16_start, &ls_estimated, srs_estimated_channel16, 16);
+ } else if ((subcarrier + K_TC) >= frame_parms->ofdm_symbol_size || k == (M_sc_b_SRS - 1)) { // End of OFDM symbol or last subcarrier cases
// filt16_end is {4096,8192,8192,8192,12288,16384,16384,16384,0,0,0,0,0,0,0,0}
- multadd_real_vector_complex_scalar(filt16_end, ls_estimated, srs_estimated_channel16, 16);
+ c16multaddVectRealComplex(filt16_end, &ls_estimated, srs_estimated_channel16, 16);
} else { // Middle case
// filt16_middle4 is {4096,8192,8192,8192,8192,8192,8192,8192,4096,0,0,0,0,0,0,0}
- multadd_real_vector_complex_scalar(filt16_middle4, ls_estimated, srs_estimated_channel16, 16);
- srs_estimated_channel16 = (int16_t *)&srs_est[sc_offset];
+ c16multaddVectRealComplex(filt16_middle4, &ls_estimated, srs_estimated_channel16, 16);
+ srs_estimated_channel16 = (c16_t *)&srs_est[sc_offset];
}
}
@@ -790,15 +769,14 @@ int nr_srs_channel_estimation(
if (subcarrier>frame_parms->ofdm_symbol_size) {
subcarrier -= frame_parms->ofdm_symbol_size;
}
- uint16_t base_idx = ant*N_ap*M_sc_b_SRS + p_index*M_sc_b_SRS;
+ uint16_t base_idx = ant * N_ap * M_sc_b_SRS + p_index * M_sc_b_SRS;
for (int k = 0; k < M_sc_b_SRS; k++) {
- ch_real[base_idx+k] = ((c16_t*)srs_estimated_channel_freq[ant][p_index])[subcarrier].r;
- ch_imag[base_idx+k] = ((c16_t*)srs_estimated_channel_freq[ant][p_index])[subcarrier].i;
- noise_real[base_idx+k] = abs(srs_ls_estimated_channel[subcarrier].r - ch_real[base_idx+k]);
- noise_imag[base_idx+k] = abs(srs_ls_estimated_channel[subcarrier].i - ch_imag[base_idx+k]);
+ ch[base_idx + k] = ((c16_t *)srs_estimated_channel_freq[ant][p_index])[subcarrier];
+ noise[base_idx + k].r = abs(srs_ls_estimated_channel[subcarrier].r - ch[base_idx + k].r);
+ noise[base_idx + k].i = abs(srs_ls_estimated_channel[subcarrier].i - ch[base_idx + k].i);
subcarrier += K_TC;
if (subcarrier >= frame_parms->ofdm_symbol_size) {
- subcarrier=subcarrier-frame_parms->ofdm_symbol_size;
+ subcarrier = subcarrier - frame_parms->ofdm_symbol_size;
}
}
@@ -824,9 +802,10 @@ int nr_srs_channel_estimation(
subcarrier_log,
srs_ls_estimated_channel[subcarrier].r,
srs_ls_estimated_channel[subcarrier].i,
- ((c16_t*)srs_estimated_channel_freq[ant][p_index])[subcarrier].r,
- ((c16_t*)srs_estimated_channel_freq[ant][p_index])[subcarrier].i,
- noise_real[base_idx+(k/K_TC)], noise_imag[base_idx+(k/K_TC)]);
+ ((c16_t *)srs_estimated_channel_freq[ant][p_index])[subcarrier].r,
+ ((c16_t *)srs_estimated_channel_freq[ant][p_index])[subcarrier].i,
+ noise[base_idx + (k / K_TC)].r,
+ noise[base_idx + (k / K_TC)].i);
// Subcarrier increment
subcarrier++;
@@ -853,7 +832,7 @@ int nr_srs_channel_estimation(
} // for (int ant = 0; ant < frame_parms->nb_antennas_rx; ant++)
// Compute signal power
- uint32_t signal_power = calc_power(ch_real, arr_len) + calc_power(ch_imag, arr_len);
+ uint32_t signal_power = max(signal_energy_nodc(ch, arr_len), 1);
#ifdef SRS_DEBUG
LOG_I(NR_PHY,"signal_power = %u\n", signal_power);
@@ -865,11 +844,6 @@ int nr_srs_channel_estimation(
}
// Compute noise power
-
- const uint8_t signal_power_bits = log2_approx(signal_power);
- const uint8_t factor_bits = signal_power_bits < 32 ? 32 - signal_power_bits : 0; // 32 due to input of dB_fixed(uint32_t x)
- const int32_t factor_dB = dB_fixed(1<comb_size == 0 ? 6 : 3;
const uint8_t n_noise_est = frame_parms->nb_antennas_rx*N_ap*srs_symbols_per_rb;
uint64_t sum_re = 0;
@@ -886,19 +860,19 @@ int nr_srs_channel_estimation(
for (int ant = 0; ant < frame_parms->nb_antennas_rx; ant++) {
for (int p_index = 0; p_index < N_ap; p_index++) {
- uint16_t base_idx = ant*N_ap*M_sc_b_SRS + p_index*M_sc_b_SRS + rb*srs_symbols_per_rb;
+ uint16_t base_idx = ant * N_ap * M_sc_b_SRS + p_index * M_sc_b_SRS + rb * srs_symbols_per_rb;
for (int srs_symb = 0; srs_symb < srs_symbols_per_rb; srs_symb++) {
- sum_re = sum_re + noise_real[base_idx+srs_symb];
- sum_re2 = sum_re2 + noise_real[base_idx+srs_symb]*noise_real[base_idx+srs_symb];
- sum_im = sum_im + noise_imag[base_idx+srs_symb];
- sum_im2 = sum_im2 + noise_imag[base_idx+srs_symb]*noise_imag[base_idx+srs_symb];
+ sum_re = sum_re + noise[base_idx + srs_symb].r;
+ sum_re2 = sum_re2 + noise[base_idx + srs_symb].r * noise[base_idx + srs_symb].r;
+ sum_im = sum_im + noise[base_idx + srs_symb].i;
+ sum_im2 = sum_im2 + noise[base_idx + srs_symb].i * noise[base_idx + srs_symb].i;
} // for (int srs_symb = 0; srs_symb < srs_symbols_per_rb; srs_symb++)
} // for (int p_index = 0; p_index < N_ap; p_index++)
} // for (int ant = 0; ant < frame_parms->nb_antennas_rx; ant++)
noise_power_per_rb[rb] = max(sum_re2 / n_noise_est - (sum_re / n_noise_est) * (sum_re / n_noise_est) +
sum_im2 / n_noise_est - (sum_im / n_noise_est) * (sum_im / n_noise_est), 1);
- snr_per_rb[rb] = dB_fixed((int32_t)((signal_power<0)?temp:1);
}
-int32_t signal_energy_nodc(const c16_t *input, uint32_t length)
+uint32_t signal_energy_nodc(const c16_t *input, uint32_t length)
{
// init
simde__m128 mm0 = simde_mm_setzero_ps();
@@ -134,7 +134,7 @@ int32_t signal_energy_nodc(const c16_t *input, uint32_t length)
// Ave
float sums[4];
simde_mm_store_ps(sums, mm0);
- return (int)((sums[0] + sums[1] + sums[2] + sums[3] + leftover_sum) / (float)length);
+ return (uint32_t)((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)
diff --git a/openair1/PHY/TOOLS/tests/test_signal_energy.cpp b/openair1/PHY/TOOLS/tests/test_signal_energy.cpp
index 8767570664..a185a8435b 100644
--- a/openair1/PHY/TOOLS/tests/test_signal_energy.cpp
+++ b/openair1/PHY/TOOLS/tests/test_signal_energy.cpp
@@ -1,7 +1,7 @@
#include
extern "C" {
#include "openair1/PHY/TOOLS/tools_defs.h"
-extern int32_t signal_energy_nodc(const c16_t *input, uint32_t length);
+extern uint32_t signal_energy_nodc(const c16_t *input, uint32_t length);
}
#include
#include
diff --git a/openair1/PHY/TOOLS/tools_defs.h b/openair1/PHY/TOOLS/tools_defs.h
index d219760586..d1ed050f6f 100644
--- a/openair1/PHY/TOOLS/tools_defs.h
+++ b/openair1/PHY/TOOLS/tools_defs.h
@@ -758,10 +758,10 @@ int32_t signal_energy_amp_shift(int32_t *input, uint32_t length);
int32_t subcarrier_energy(int32_t *,uint32_t, int32_t *subcarrier_energy, uint16_t rx_power_correction);
#endif
-/*!\fn int32_t signal_energy_nodc(int32_t *,uint32_t);
+/*!\fn uint32_t signal_energy_nodc(c16_t *,uint32_t);
\brief Computes the signal energy per subcarrier, without DC removal
*/
-int32_t signal_energy_nodc(const c16_t *input, uint32_t length);
+uint32_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/PHY/defs_gNB.h b/openair1/PHY/defs_gNB.h
index e62bb05e11..da316de8aa 100644
--- a/openair1/PHY/defs_gNB.h
+++ b/openair1/PHY/defs_gNB.h
@@ -264,6 +264,8 @@ typedef struct {
uint32_t frame;
/// Slot where current SRS pdu was received
uint32_t slot;
+ /// Measured SNR
+ int8_t snr;
/// ULSCH PDU
nfapi_nr_srs_pdu_t srs_pdu;
} NR_gNB_SRS_t;
diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c
index 289b7bbf29..7148b28fe7 100644
--- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c
+++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c
@@ -786,7 +786,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;
int offset = pucch_pdu->start_symbol_index*gNB->frame_parms.ofdm_symbol_size + (gNB->frame_parms.first_carrier_offset+pucch_pdu->prb_start*12);
- LOG_D(PHY,
+ LOG_D(NR_PHY,
"frame %d, slot %d: PUCCH signal energy %d\n",
frame_rx,
slot_rx,
@@ -953,7 +953,6 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx)
int32_t srs_estimated_channel_time[frame_parms->nb_antennas_rx][1 << srs_pdu->num_ant_ports][frame_parms->ofdm_symbol_size] __attribute__((aligned(32)));
int32_t srs_estimated_channel_time_shifted[frame_parms->nb_antennas_rx][1 << srs_pdu->num_ant_ports][frame_parms->ofdm_symbol_size];
int8_t snr_per_rb[srs_pdu->bwp_size];
- int8_t snr = 0;
start_meas(&gNB->generate_srs_stats);
if (check_srs_pdu(srs_pdu, &gNB->nr_srs_info[i]->srs_pdu) == 0) {
@@ -978,11 +977,11 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx)
srs_estimated_channel_time,
srs_estimated_channel_time_shifted,
snr_per_rb,
- &snr);
+ &gNB->srs->snr);
stop_meas(&gNB->srs_channel_estimation_stats);
}
- if ((snr * 10) < gNB->srs_thres) {
+ if ((gNB->srs->snr * 10) < gNB->srs_thres) {
srs_est = -1;
}
@@ -1055,7 +1054,7 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx)
nfapi_nr_srs_beamforming_report_t nr_srs_bf_report;
nr_srs_bf_report.prg_size = srs_pdu->beamforming.prg_size;
nr_srs_bf_report.num_symbols = 1 << srs_pdu->num_symbols;
- nr_srs_bf_report.wide_band_snr = srs_est >= 0 ? (snr + 64) << 1 : 0xFF; // 0xFF will be set if this field is invalid
+ nr_srs_bf_report.wide_band_snr = srs_est >= 0 ? (gNB->srs->snr + 64) << 1 : 0xFF; // 0xFF will be set if this field is invalid
nr_srs_bf_report.num_reported_symbols = 1 << srs_pdu->num_symbols;
fill_srs_reported_symbol_list(&nr_srs_bf_report.prgs, srs_pdu, frame_parms->N_RB_UL, snr_per_rb, srs_est);
diff --git a/openair1/SIMULATION/NR_PHY/ulsim.c b/openair1/SIMULATION/NR_PHY/ulsim.c
index ba01c14f86..910d076e0f 100644
--- a/openair1/SIMULATION/NR_PHY/ulsim.c
+++ b/openair1/SIMULATION/NR_PHY/ulsim.c
@@ -724,7 +724,7 @@ int main(int argc, char *argv[])
NR_gNB_ULSCH_t *ulsch_gNB = &gNB->ulsch[UE_id];
- NR_Sched_Rsp_t *Sched_INFO = malloc(sizeof(*Sched_INFO));
+ NR_Sched_Rsp_t *Sched_INFO = malloc16_clear(sizeof(*Sched_INFO));
memset((void*)Sched_INFO,0,sizeof(*Sched_INFO));
nfapi_nr_ul_tti_request_t *UL_tti_req = &Sched_INFO->UL_tti_req;
Sched_INFO->sched_response_id = -1;
@@ -937,6 +937,7 @@ int main(int argc, char *argv[])
}
//---------------
int ret = 1;
+ int srs_ret = do_SRS;
for (SNR = snr0; SNR <= snr1; SNR += snr_step) {
varArray_t *table_rx=initVarArray(1000,sizeof(double));
@@ -972,6 +973,9 @@ int main(int argc, char *argv[])
int max_pusch_delay = INT_MIN;
int delay_pusch_est_count = 0;
+ int64_t sum_srs_snr = 0;
+ int srs_snr_count = 0;
+
for (trial = 0; trial < n_trials; trial++) {
uint8_t round = 0;
@@ -1071,6 +1075,7 @@ int main(int argc, char *argv[])
srs_pdu->subcarrier_spacing = frame_parms->subcarrier_spacing;
srs_pdu->num_ant_ports = n_tx == 4 ? 2 : n_tx == 2 ? 1 : 0;
srs_pdu->sequence_id = 40;
+ srs_pdu->time_start_position = frame_parms->symbols_per_slot - 1;
srs_pdu->config_index = rrc_get_max_nr_csrs(srs_pdu->bwp_size, srs_pdu->bandwidth_index);
srs_pdu->resource_type = NR_SRS_Resource__resourceType_PR_periodic;
srs_pdu->t_srs = 1;
@@ -1436,6 +1441,10 @@ int main(int argc, char *argv[])
max_pusch_delay = max(ulsch_gNB->delay.est_delay, max_pusch_delay);
delay_pusch_est_count++;
+ if (do_SRS == 1) {
+ sum_srs_snr += gNB->srs->snr;
+ srs_snr_count++;
+ }
} // trial loop
roundStats/=((float)n_trials);
@@ -1471,8 +1480,14 @@ int main(int argc, char *argv[])
printf(") Avg round %.2f, Eff Rate %.4f bits/slot, Eff Throughput %.2f, TBS %u bits/slot\n", roundStats,effRate,effTP,TBS);
- printf("DMRS-PUSCH delay estimation: min %i, max %i, average %f\n",
- min_pusch_delay >> 1, max_pusch_delay >> 1, (double)sum_pusch_delay / (2 * delay_pusch_est_count));
+ double av_delay = (double)sum_pusch_delay / (2 * delay_pusch_est_count);
+ printf("DMRS-PUSCH delay estimation: min %i, max %i, average %2.1f\n", min_pusch_delay >> 1, max_pusch_delay >> 1, av_delay);
+
+ if (do_SRS == 1) {
+ float srs_snr_av = (float)sum_srs_snr / srs_snr_count;
+ srs_ret = srs_snr_av >= 0.7 * SNR || srs_snr_av > 30 ? 0 : 1;
+ printf("SNR based on SRS: %2.1f dB\n", srs_snr_av);
+ }
printf("*****************************************\n");
printf("\n");
@@ -1519,7 +1534,7 @@ int main(int argc, char *argv[])
if(n_trials==1)
break;
- if ((float)effTP >= eff_tp_check) {
+ if (srs_ret == 0 && (float)effTP >= eff_tp_check) {
printf("*************\n");
printf("PUSCH test OK\n");
printf("*************\n");
diff --git a/openair2/GNB_APP/L1_nr_paramdef.h b/openair2/GNB_APP/L1_nr_paramdef.h
index 1c3d7e98ec..b6d2e87d9c 100644
--- a/openair2/GNB_APP/L1_nr_paramdef.h
+++ b/openair2/GNB_APP/L1_nr_paramdef.h
@@ -78,7 +78,7 @@
{CONFIG_STRING_L1_PUCCH0_DTX_THRESHOLD, NULL, 0, .uptr=NULL, .defintval=100, TYPE_UINT, 0}, \
{CONFIG_STRING_L1_PRACH_DTX_THRESHOLD, NULL, 0, .uptr=NULL, .defintval=150, TYPE_UINT, 0}, \
{CONFIG_STRING_L1_PUSCH_DTX_THRESHOLD, NULL, 0, .uptr=NULL, .defintval=50, TYPE_UINT, 0}, \
- {CONFIG_STRING_L1_SRS_DTX_THRESHOLD, NULL, 0, .uptr=NULL, .defintval=50, TYPE_UINT, 0}, \
+ {CONFIG_STRING_L1_SRS_DTX_THRESHOLD, NULL, 0, .uptr=NULL, .defintval=30, TYPE_UINT, 0}, \
{CONFIG_STRING_L1_MAX_LDPC_ITERATIONS, NULL, 0, .uptr=NULL, .defintval=8, TYPE_UINT, 0}, \
{CONFIG_STRING_L1_RX_THREAD_CORE, NULL, 0, .uptr=NULL, .defintval=-1, TYPE_UINT, 0}, \
{CONFIG_STRING_L1_TX_THREAD_CORE, NULL, 0, .uptr=NULL, .defintval=-1, TYPE_UINT, 0}, \