From fe7ee4d2fe9c54bf45bb1ddffe9965e834a6f878 Mon Sep 17 00:00:00 2001 From: Bo Zhao Date: Fri, 15 Oct 2021 15:59:34 +0200 Subject: [PATCH 01/13] Scaling LLR for different QAM schemes --- openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c | 2 +- openair1/PHY/NR_TRANSPORT/nr_ulsch_llr_computation.c | 10 +++++----- .../PHY/NR_UE_TRANSPORT/nr_dlsch_llr_computation.c | 4 +++- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c index 355830c078..2ffece0182 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c +++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c @@ -1298,7 +1298,7 @@ int nr_rx_pusch(PHY_VARS_gNB *gNB, for (aarx=0;aarxnb_antennas_rx;aarx++) avgs = cmax(avgs,avg[aatx*frame_parms->nb_antennas_rx+aarx]); - gNB->pusch_vars[ulsch_id]->log2_maxh = (log2_approx(avgs)/2)+2; + gNB->pusch_vars[ulsch_id]->log2_maxh = (log2_approx(avgs)/2)+1; gNB->pusch_vars[ulsch_id]->cl_done = 1; } diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_llr_computation.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_llr_computation.c index bf96a76106..421dab37f3 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_llr_computation.c +++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_llr_computation.c @@ -50,13 +50,13 @@ void nr_ulsch_qpsk_llr(int32_t *rxdataF_comp, if (!llr32) { LOG_E(PHY,"nr_ulsch_qpsk_llr: llr is null, symbol %d, llr32 = %p\n",symbol, llr32); } - /* - for (i = 0; i < nb_re; i++) { - *llr32 = *rxF; + for (int i = 0; i < nb_re; i++) { + //*llr32 = *rxF; + ((int16_t *)llr32)[0] = ((int16_t *)rxF)[0] / 8; + ((int16_t *)llr32)[1] = ((int16_t *)rxF)[1] / 8; rxF++; llr32++; - }*/ - memcpy1((void*)llr32,(void*)rxF,nb_re<<2); + } } //---------------------------------------------------------------------------------------------- diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_llr_computation.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_llr_computation.c index 7c75884fa6..de018f334a 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_llr_computation.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_llr_computation.c @@ -656,7 +656,9 @@ int nr_dlsch_qpsk_llr(NR_DL_FRAME_PARMS *frame_parms, llr32); */ for (i=0; i Date: Mon, 15 Nov 2021 10:41:44 +0100 Subject: [PATCH 02/13] Implement PDCCH channel estimation averaging over PRB (no interpolation) --- openair1/PHY/NR_UE_ESTIMATION/filt16a_32.c | 4 +- .../nr_dl_channel_estimation.c | 39 ++++++++++++++++++- 2 files changed, 40 insertions(+), 3 deletions(-) diff --git a/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.c b/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.c index 0c520aabe7..c4add88b7f 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.c +++ b/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.c @@ -93,7 +93,7 @@ short filt16a_m3_dc[16] = { -9831,-6554,-3277,0,3276,6553,9830,16384,12288,8192,4096,0,0,0,0,0}; short filt16a_1[16] = { -16384,16384,16384,16384,16384,16384,16384,16384,16384,16384,16384,16384}; +16384,16384,16384,16384,16384,16384,16384,16384,16384,16384,16384,16384,0,0,0,0}; short filt16a_2l0[16] = { 16384,12288,8192,4096,-4096,0,0,0,0,0,0,0,0,0,0,0}; @@ -282,4 +282,4 @@ short filt16_middle4[16] = { 4096,8192,8192,8192,8192,8192,8192,8192,4096,0,0,0,0,0,0,0}; short filt16_end[16] = { - 4096,8192,8192,8192,12288,16384,16384,16384,0,0,0,0,0,0,0,0}; \ No newline at end of file + 4096,8192,8192,8192,12288,16384,16384,16384,0,0,0,0,0,0,0,0}; diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c index 30836ded01..b1e2acea05 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c @@ -33,7 +33,7 @@ //#define DEBUG_PDSCH //#define DEBUG_PDCCH - +#define CH_INTERP 0 int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, @@ -520,6 +520,7 @@ int nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue, printf("dl_ch addr %p\n",dl_ch); #endif + #if CH_INTERP // if ((ue->frame_parms.N_RB_DL&1)==0) { // Treat first 2 pilots specially (left edge) ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); @@ -648,6 +649,42 @@ int nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue, rxF += 8; k += 4; } + #else //ELSE CH_INTERP + int ch_sum[2]; + + for ( pilot_cnt=0; pilot_cnt<(3*nb_rb_coreset); pilot_cnt += 3 ) { + if (k >= ue->frame_parms.ofdm_symbol_size){ + k-=ue->frame_parms.ofdm_symbol_size; + rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+k+1)]; + } +#ifdef DEBUG_PDCCH + printf("pilot[%d] = (%d, %d)\trxF[%d] = (%d, %d)\n", pilot_cnt+0, pil[0], pil[1], k+1, rxF[0], rxF[1]); +#endif + ch_sum[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); + ch_sum[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15); + pil += 2; + rxF += 8; +#ifdef DEBUG_PDCCH + printf("pilot[%d] = (%d, %d)\trxF[%d] = (%d, %d)\n", pilot_cnt+1, pil[0], pil[1], k+5, rxF[0], rxF[1]); +#endif + ch_sum[0] += (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); + ch_sum[1] += (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15); + pil += 2; + rxF += 8; +#ifdef DEBUG_PDCCH + printf("pilot[%d] = (%d, %d)\trxF[%d] = (%d, %d)\n", pilot_cnt+2, pil[0], pil[1], k+9, rxF[0], rxF[1]); +#endif + ch_sum[0] += (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); + ch_sum[1] += (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15); + pil += 2; + rxF += 8; + ch[0] = ch_sum[0]/3; + ch[1] = ch_sum[1]/3; + multadd_real_vector_complex_scalar(filt16a_1, ch, dl_ch, 16); + dl_ch += 24; + k += 12; + } + #endif //END CH_INTERP //} From dd374c7e039ac13ec549a6f2f77688bb4bcdb173 Mon Sep 17 00:00:00 2001 From: Thomas Schlichter Date: Fri, 25 Mar 2022 09:16:19 +0100 Subject: [PATCH 03/13] add more detailed statistics to nr_dlsim output --- executables/softmodem-common.h | 2 + openair1/PHY/NR_TRANSPORT/nr_dlsch.c | 4 + openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c | 8 ++ openair1/PHY/defs_gNB.h | 2 + openair1/SIMULATION/NR_PHY/dlsim.c | 150 ++++++++++++-------- 5 files changed, 104 insertions(+), 62 deletions(-) diff --git a/executables/softmodem-common.h b/executables/softmodem-common.h index 48ce73149f..a404cd6c69 100644 --- a/executables/softmodem-common.h +++ b/executables/softmodem-common.h @@ -204,6 +204,7 @@ extern int usrp_tx_thread; #define SOFTMODEM_NONBIOT_BIT (1<<2) #define SOFTMODEM_RFSIM_BIT (1<<10) #define SOFTMODEM_SIML1_BIT (1<<12) +#define SOFTMODEM_DLSIM_BIT (1<<13) #define SOFTMODEM_DOSCOPE_BIT (1<<15) #define SOFTMODEM_RECPLAY_BIT (1<<16) #define SOFTMODEM_TELNETCLT_BIT (1<<17) @@ -220,6 +221,7 @@ extern int usrp_tx_thread; #define IS_SOFTMODEM_NONBIOT ( get_softmodem_optmask() & SOFTMODEM_NONBIOT_BIT) #define IS_SOFTMODEM_RFSIM ( get_softmodem_optmask() & SOFTMODEM_RFSIM_BIT) #define IS_SOFTMODEM_SIML1 ( get_softmodem_optmask() & SOFTMODEM_SIML1_BIT) +#define IS_SOFTMODEM_DLSIM ( get_softmodem_optmask() & SOFTMODEM_DLSIM_BIT) #define IS_SOFTMODEM_DOSCOPE ( get_softmodem_optmask() & SOFTMODEM_DOSCOPE_BIT) #define IS_SOFTMODEM_IQPLAYER ( get_softmodem_optmask() & SOFTMODEM_RECPLAY_BIT) #define IS_SOFTMODEM_TELNETCLT_BIT ( get_softmodem_optmask() & SOFTMODEM_TELNETCLT_BIT) diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c index 47d6c48373..c46879e39c 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c @@ -38,6 +38,7 @@ #include "PHY/NR_REFSIG/ptrs_nr.h" #include "common/utils/LOG/vcd_signal_dumper.h" #include "common/utils/nr/nr_common.h" +#include "executables/softmodem-common.h" //#define DEBUG_DLSCH //#define DEBUG_DLSCH_MAPPING @@ -147,6 +148,9 @@ void nr_generate_pdsch(processingData_L1tx_t *msgTx, printf("\n"); #endif + if (IS_SOFTMODEM_DLSIM) + memcpy(harq->f, output, encoded_length); + /// scrambling start_meas(dlsch_scrambling_stats); for (int q=0; qNrOfCodewords; q++) { diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c index 229f59032e..95305a7b07 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c @@ -69,6 +69,10 @@ void free_gNB_dlsch(NR_gNB_DLSCH_t **dlschptr, free16(harq->b, a_segments * 1056); harq->b = NULL; } + if (harq->f) { + free16(harq->f, N_RB * NR_SYMBOLS_PER_SLOT * NR_NB_SC_PER_RB * 8 * NR_MAX_NB_LAYERS); + harq->f = NULL; + } for (int r = 0; r < a_segments; r++) { free(harq->c[r]); harq->c[r] = NULL; @@ -177,6 +181,10 @@ NR_gNB_DLSCH_t *new_gNB_dlsch(NR_DL_FRAME_PARMS *frame_parms, bzero(harq->c[r], 8448); } + harq->f = malloc16(N_RB * NR_SYMBOLS_PER_SLOT * NR_NB_SC_PER_RB * 8 * NR_MAX_NB_LAYERS); + AssertFatal(harq->f, "cannot allocate harq->f\n"); + bzero(harq->f, N_RB * NR_SYMBOLS_PER_SLOT * NR_NB_SC_PER_RB * 8 * NR_MAX_NB_LAYERS); + return(dlsch); } diff --git a/openair1/PHY/defs_gNB.h b/openair1/PHY/defs_gNB.h index 9be2d0208d..1f4d2d33b7 100644 --- a/openair1/PHY/defs_gNB.h +++ b/openair1/PHY/defs_gNB.h @@ -96,6 +96,8 @@ typedef struct { uint32_t subframe; /// MIMO mode for this DLSCH MIMO_mode_t mimo_mode; + /// Interleaver outputs + uint8_t *f; /// LDPC lifting size uint32_t Z; } NR_DL_gNB_HARQ_t; diff --git a/openair1/SIMULATION/NR_PHY/dlsim.c b/openair1/SIMULATION/NR_PHY/dlsim.c index 494c4e8e1d..6aeb7a7afc 100644 --- a/openair1/SIMULATION/NR_PHY/dlsim.c +++ b/openair1/SIMULATION/NR_PHY/dlsim.c @@ -354,10 +354,13 @@ int main(int argc, char **argv) int i,aa;//,l; double sigma2, sigma2_dB=10, SNR, snr0=-2.0, snr1=2.0; uint8_t snr1set=0; - double roundStats[500] = {0}; - double blerStats[500] = {0}; - double berStats[500] = {0}; - double snrStats[500] = {0}; + uint32_t errors_scrambling[4][100] = {{0}}; + int n_errors[4][100] = {{0}}; + int round_trials[4][100] = {{0}}; + double roundStats[100] = {0}; + double blerStats[4][100] = {{0}}; + double berStats[4][100] = {{0}}; + double snrStats[100] = {0}; float effRate; //float psnr; float eff_tp_check = 0.7; @@ -375,7 +378,7 @@ int main(int argc, char **argv) //int freq_offset; // int subframe_offset; // char fname[40], vname[40]; - int trial, n_trials = 1, n_errors = 0, n_false_positive = 0; + int trial, n_trials = 1, n_false_positive = 0; //int n_errors2, n_alamouti; uint8_t n_tx=1,n_rx=1; uint8_t round; @@ -703,6 +706,7 @@ int main(int argc, char **argv) get_softmodem_params()->phy_test = 1; get_softmodem_params()->do_ra = 0; + set_softmodem_optmask(SOFTMODEM_DLSIM_BIT); if (snr1set==0) snr1 = snr0+10; @@ -981,7 +985,6 @@ int main(int argc, char **argv) unsigned char *estimated_output_bit; unsigned char *test_input_bit; unsigned int errors_bit = 0; - uint32_t errors_scrambling = 0; initTpool("N", &(nrUE_params.Tpool), false); @@ -1019,6 +1022,7 @@ int main(int argc, char **argv) nr_ue_phy_config_request(&UE_mac->phy_config); //NR_COMMON_channels_t *cc = RC.nrmac[0]->common_channels; snrRun = 0; + int n_errs = 0; gNB->threadPool = (tpool_t*)malloc(sizeof(tpool_t)); initTpool(gNBthreads, gNB->threadPool, true); @@ -1052,11 +1056,9 @@ int main(int argc, char **argv) clear_pdsch_stats(gNB); - n_errors = 0; effRate = 0; //n_errors2 = 0; //n_alamouti = 0; - errors_scrambling=0; n_false_positive = 0; if (n_trials== 1) num_rounds = 1; @@ -1088,6 +1090,7 @@ int main(int argc, char **argv) UE_harq_process->first_rx = 1; while ((roundack==0)) { + round_trials[round][snrRun]++; clear_nr_nfapi_information(RC.nrmac[0], 0, frame, slot); @@ -1259,49 +1262,45 @@ int main(int argc, char **argv) dlsch_threads, NULL); + //---------------------------------------------------------- + //---------------------- count errors ---------------------- + //---------------------------------------------------------- + + if (UE->dlsch[UE_proc.thread_id][0][0]->last_iteration_cnt >= + UE->dlsch[UE_proc.thread_id][0][0]->max_ldpc_iterations+1) + n_errors[round][snrRun]++; + + NR_UE_PDSCH **pdsch_vars = UE->pdsch_vars[UE_proc.thread_id]; + int16_t *UE_llr = pdsch_vars[0]->llr[0]; + + TBS = UE_harq_process->TBS;//rel15->TBSize[0]; + uint16_t length_dmrs = get_num_dmrs(rel15->dlDmrsSymbPos); + uint16_t nb_rb = rel15->rbSize; + uint8_t nb_re_dmrs = rel15->dmrsConfigType == NFAPI_NR_DMRS_TYPE1 ? 6*UE_harq_process->n_dmrs_cdm_groups : 4*UE_harq_process->n_dmrs_cdm_groups; + uint8_t mod_order = rel15->qamModOrder[0]; + uint8_t nb_symb_sch = rel15->NrOfSymbols; + + available_bits = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs, mod_order, rel15->nrOfLayers); + if(pdu_bit_map & 0x1) { + available_bits-= (ptrsSymbPerSlot * ptrsRePerSymb *rel15->nrOfLayers* 2); + printf("[DLSIM][PTRS] Available bits are: %5u, removed PTRS bits are: %5u \n",available_bits, (ptrsSymbPerSlot * ptrsRePerSymb *rel15->nrOfLayers* 2) ); + } + + for (i = 0; i < available_bits; i++) { + if(((gNB_dlsch->harq_process.f[i] == 0) && (UE_llr[i] <= 0)) || + ((gNB_dlsch->harq_process.f[i] == 1) && (UE_llr[i] >= 0))) + { + if(errors_scrambling[round][snrRun] == 0) { + LOG_D(PHY,"First bit in error in unscrambling = %d\n",i); + } + errors_scrambling[round][snrRun]++; + } + } + //printf("dlsim round %d ends\n",round); round++; } // round - //---------------------------------------------------------- - //---------------------- count errors ---------------------- - //---------------------------------------------------------- - - if (UE->dlsch[UE_proc.thread_id][0][0]->last_iteration_cnt >= - UE->dlsch[UE_proc.thread_id][0][0]->max_ldpc_iterations+1) - n_errors++; - - //NR_UE_PDSCH **pdsch_vars = UE->pdsch_vars[UE_proc.thread_id]; - //int16_t *UE_llr = pdsch_vars[0]->llr[0]; - - TBS = UE_harq_process->TBS;//rel15->TBSize[0]; - uint16_t length_dmrs = get_num_dmrs(rel15->dlDmrsSymbPos); - uint16_t nb_rb = rel15->rbSize; - uint8_t nb_re_dmrs = rel15->dmrsConfigType == NFAPI_NR_DMRS_TYPE1 ? 6*UE_harq_process->n_dmrs_cdm_groups : 4*UE_harq_process->n_dmrs_cdm_groups; - uint8_t mod_order = rel15->qamModOrder[0]; - uint8_t nb_symb_sch = rel15->NrOfSymbols; - - available_bits = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs, mod_order, rel15->nrOfLayers); - if(pdu_bit_map & 0x1) { - available_bits-= (ptrsSymbPerSlot * ptrsRePerSymb *rel15->nrOfLayers* 2); - LOG_D(PHY,"[DLSIM][PTRS] Available bits are: %5u, removed PTRS bits are: %5u \n",available_bits, (ptrsSymbPerSlot * ptrsRePerSymb *rel15->nrOfLayers* 2) ); - } - - /* - for (i = 0; i < available_bits; i++) { - - if(((gNB_dlsch->harq_process.f[i] == 0) && (UE_llr[i] <= 0)) || - ((gNB_dlsch->harq_process.f[i] == 1) && (UE_llr[i] >= 0))) - { - if(errors_scrambling == 0) { - LOG_D(PHY,"\n"); - LOG_D(PHY,"First bit in error in unscrambling = %d\n",i); - } - errors_scrambling++; - } - - } - */ for (i = 0; i < TBS; i++) { estimated_output_bit[i] = (UE_harq_process->b[i/8] & (1 << (i & 7))) >> (i & 7); @@ -1309,7 +1308,7 @@ int main(int argc, char **argv) if (estimated_output_bit[i] != test_input_bit[i]) { if(errors_bit == 0) - LOG_D(PHY,"First bit in error in decoding = %d (errors scrambling %d)\n",i,errors_scrambling); + LOG_D(PHY,"First bit in error in decoding = %d\n",i); errors_bit++; } @@ -1317,11 +1316,6 @@ int main(int argc, char **argv) //////////////////////////////////////////////////////////// - if (errors_scrambling > 0) { - if (n_trials == 1) - printf("errors_scrambling = %u/%u (trial %d)\n", errors_scrambling, available_bits,trial); - } - if (errors_bit > 0) { n_false_positive++; if (n_trials == 1) @@ -1331,18 +1325,48 @@ int main(int argc, char **argv) if (UE_harq_process->ack==1) effRate += ((float)TBS)/round; } // noise trials - blerStats[snrRun] = (float) n_errors / (float) n_trials; roundStats[snrRun]/=((float)n_trials); - berStats[snrRun] = (double)errors_scrambling/available_bits/n_trials; + + blerStats[0][snrRun] = (double)n_errors[0][snrRun]/round_trials[0][snrRun]; + blerStats[1][snrRun] = (double)n_errors[1][snrRun]/round_trials[1][snrRun]; + blerStats[2][snrRun] = (double)n_errors[2][snrRun]/round_trials[2][snrRun]; + blerStats[3][snrRun] = (double)n_errors[3][snrRun]/round_trials[3][snrRun]; + + berStats[0][snrRun] = (double)errors_scrambling[0][snrRun]/available_bits/round_trials[0][snrRun]; + berStats[1][snrRun] = (double)errors_scrambling[1][snrRun]/available_bits/round_trials[1][snrRun]; + berStats[2][snrRun] = (double)errors_scrambling[2][snrRun]/available_bits/round_trials[2][snrRun]; + berStats[3][snrRun] = (double)errors_scrambling[3][snrRun]/available_bits/round_trials[3][snrRun]; + effRate /= n_trials; printf("*****************************************\n"); - printf("SNR %f, (false positive %f)\n", SNR, - (float) n_errors / (float) n_trials); - printf("*****************************************\n"); + printf("SNR %f: n_errors (%d/%d,%d/%d,%d/%d,%d/%d) (negative CRC), false_positive %d/%d, errors_scrambling (%u/%u,%u/%u,%u/%u,%u/%u\n", + SNR, + n_errors[0][snrRun], round_trials[0][snrRun], + n_errors[1][snrRun], round_trials[1][snrRun], + n_errors[2][snrRun], round_trials[2][snrRun], + n_errors[3][snrRun], round_trials[3][snrRun], + n_false_positive, n_trials, + errors_scrambling[0][snrRun], available_bits*round_trials[0][snrRun], + errors_scrambling[1][snrRun], available_bits*round_trials[1][snrRun], + errors_scrambling[2][snrRun], available_bits*round_trials[2][snrRun], + errors_scrambling[3][snrRun], available_bits*round_trials[3][snrRun]); printf("\n"); dump_pdsch_stats(stdout,gNB); - printf("SNR %f : n_errors (negative CRC) = %d/%d, Avg round %.2f, Channel BER %e, BLER %.2f, Eff Rate %.4f bits/slot, Eff Throughput %.2f, TBS %u bits/slot\n", - SNR, n_errors, n_trials,roundStats[snrRun],berStats[snrRun],blerStats[snrRun],effRate,effRate/TBS*100,TBS); + printf("SNR %f: Channel BLER (%e,%e,%e,%e), Channel BER (%e,%e,%e,%e) Avg round %.2f, Eff Rate %.4f bits/slot, Eff Throughput %.2f, TBS %u bits/slot\n", + SNR, + blerStats[0][snrRun], + blerStats[1][snrRun], + blerStats[2][snrRun], + blerStats[3][snrRun], + berStats[0][snrRun], + berStats[1][snrRun], + berStats[2][snrRun], + berStats[3][snrRun], + roundStats[snrRun], + effRate, + effRate/TBS*100, + TBS); + printf("*****************************************\n"); printf("\n"); if (print_perf==1) { @@ -1402,6 +1426,7 @@ int main(int argc, char **argv) LOG_M("rxsig0.m","rxs0", UE->common_vars.rxdata[0], frame_length_complex_samples, 1, 1); if (UE->frame_parms.nb_antennas_rx>1) LOG_M("rxsig1.m","rxs1", UE->common_vars.rxdata[1], frame_length_complex_samples, 1, 1); + LOG_M("rxF0.m","rxF0", UE->common_vars.common_vars_rx_data_per_thread[UE_proc.thread_id].rxdataF[0], frame_parms->samples_per_slot_wCP, 1, 1); LOG_M("chestF0.m","chF0",&UE->pdsch_vars[0][0]->dl_ch_estimates_ext[0][0],g_rbSize*12*14,1,1); write_output("rxF_comp.m","rxFc",&UE->pdsch_vars[0][0]->rxdataF_comp0[0][0],N_RB_DL*12*14,1,1); LOG_M("rxF_llr.m","rxFllr",UE->pdsch_vars[UE_proc.thread_id][0]->llr[0],available_bits,1,0); @@ -1417,6 +1442,7 @@ int main(int argc, char **argv) snrStats[snrRun] = SNR; snrRun++; + n_errs = n_errors[0][snrRun]; } // NSR LOG_M("dlsimStats.m","SNR",snrStats,snrRun,1,7); @@ -1460,8 +1486,8 @@ int main(int argc, char **argv) if (scg_fd) fclose(scg_fd); - return(n_errors); - + + return n_errs; } From 23bdf1e32c60e4a5d18e63617bba3ffc60dc3738 Mon Sep 17 00:00:00 2001 From: Thomas Schlichter Date: Fri, 25 Mar 2022 09:18:53 +0100 Subject: [PATCH 04/13] remove unused perfect_ce --- openair1/PHY/defs_nr_UE.h | 2 -- openair1/SIMULATION/NR_PHY/dlsim.c | 2 -- openair1/SIMULATION/NR_PHY/pbchsim.c | 2 -- openair1/SIMULATION/NR_PHY/pucchsim.c | 1 - 4 files changed, 7 deletions(-) diff --git a/openair1/PHY/defs_nr_UE.h b/openair1/PHY/defs_nr_UE.h index 8a533be5eb..2c1fbfdc83 100644 --- a/openair1/PHY/defs_nr_UE.h +++ b/openair1/PHY/defs_nr_UE.h @@ -802,8 +802,6 @@ typedef struct { uint32_t X_u[64][839]; - - uint32_t perfect_ce; // flag to activate PRB based averaging of channel estimates // when off, defaults to frequency domain interpolation int prb_interpolation; diff --git a/openair1/SIMULATION/NR_PHY/dlsim.c b/openair1/SIMULATION/NR_PHY/dlsim.c index 6aeb7a7afc..efab2c6e26 100644 --- a/openair1/SIMULATION/NR_PHY/dlsim.c +++ b/openair1/SIMULATION/NR_PHY/dlsim.c @@ -945,8 +945,6 @@ int main(int argc, char **argv) if (run_initial_sync==1) UE->is_synchronized = 0; else {UE->is_synchronized = 1; UE->UE_mode[0]=PUSCH;} - - UE->perfect_ce = 0; if (init_nr_ue_signal(UE, 1) != 0) { diff --git a/openair1/SIMULATION/NR_PHY/pbchsim.c b/openair1/SIMULATION/NR_PHY/pbchsim.c index 8fc6410538..b407632a40 100644 --- a/openair1/SIMULATION/NR_PHY/pbchsim.c +++ b/openair1/SIMULATION/NR_PHY/pbchsim.c @@ -558,8 +558,6 @@ int main(int argc, char **argv) if (run_initial_sync==1) UE->is_synchronized = 0; else UE->is_synchronized = 1; - UE->perfect_ce = 0; - if(eps!=0.0) UE->UE_fo_compensation = 1; // if a frequency offset is set then perform fo estimation and compensation diff --git a/openair1/SIMULATION/NR_PHY/pucchsim.c b/openair1/SIMULATION/NR_PHY/pucchsim.c index 151d51d726..c61f997cca 100644 --- a/openair1/SIMULATION/NR_PHY/pucchsim.c +++ b/openair1/SIMULATION/NR_PHY/pucchsim.c @@ -475,7 +475,6 @@ int main(int argc, char **argv) UE = calloc(1,sizeof(PHY_VARS_NR_UE)); memcpy(&UE->frame_parms,frame_parms,sizeof(NR_DL_FRAME_PARMS)); UE->frame_parms.nb_antennas_rx=1; - UE->perfect_ce = 0; if(eps!=0.0) UE->UE_fo_compensation = 1; // if a frequency offset is set then perform fo estimation and compensation From c7055b2cf90f8e1a7fd43186f1ee0f9ca86f89ba Mon Sep 17 00:00:00 2001 From: Thomas Schlichter Date: Thu, 7 Apr 2022 12:08:26 +0200 Subject: [PATCH 05/13] nr_ulsim: set PUSCH detection threshold to -2.0 dB SNR --- openair1/SIMULATION/NR_PHY/ulsim.c | 1 + 1 file changed, 1 insertion(+) diff --git a/openair1/SIMULATION/NR_PHY/ulsim.c b/openair1/SIMULATION/NR_PHY/ulsim.c index ddb3d52b9c..621889a36c 100644 --- a/openair1/SIMULATION/NR_PHY/ulsim.c +++ b/openair1/SIMULATION/NR_PHY/ulsim.c @@ -697,6 +697,7 @@ int main(int argc, char **argv) gNB->UL_INFO.rx_ind.number_of_pdus = 0; gNB->UL_INFO.crc_ind.number_crcs = 0; gNB->prb_interpolation = prb_inter; + gNB->pusch_thres = -20; frame_parms = &gNB->frame_parms; //to be initialized I suppose (maybe not necessary for PBCH) frame_parms->N_RB_DL = N_RB_DL; From 298740b06cabf5834d90f966b5a5c8c1184b8300 Mon Sep 17 00:00:00 2001 From: Thomas Schlichter Date: Thu, 7 Apr 2022 12:12:20 +0200 Subject: [PATCH 06/13] add autotest test case for nr_ulsim low SNR performance --- cmake_targets/autotests/test_case_list.xml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/cmake_targets/autotests/test_case_list.xml b/cmake_targets/autotests/test_case_list.xml index ce1b9dcdf4..94756bbe9f 100755 --- a/cmake_targets/autotests/test_case_list.xml +++ b/cmake_targets/autotests/test_case_list.xml @@ -1304,7 +1304,8 @@ (Test12: SC-FDMA, 216 PRBs), (Test13: SC-FDMA, 273 PRBs), (Test14: SC-FDMA, 3 DMRS), - (Test15: MCS 16 50 PRBs 2 RX_Antenna) + (Test15: MCS 16 50 PRBs 2 RX_Antenna), + (Test16: MCS 0, low SNR performance) $OPENAIR_DIR/cmake_targets/build_oai --phy_simulators -c @@ -1325,9 +1326,9 @@ -n50 -s5 -Z -r216 -R217 -n50 -s5 -Z -r270 -R273 -n100 -s5 -Z -U 2 0 2 - -n100 -m16 -s10 -z2 - - nr_ulsim.test1 nr_ulsim.test2 nr_ulsim.test3 nr_ulsim.test4 nr_ulsim.test5 nr_ulsim.test6 nr_ulsim.test7 nr_ulsim.test8 nr_ulsim.test9 nr_ulsim.test10 nr_ulsim.test11 nr_ulsim.test12 nr_ulsim.test13 nr_ulsim.test14 nr_ulsim.test15 + -n100 -m16 -s10 -z2 + -n100 -m0 -S -0.8 -i + nr_ulsim.test1 nr_ulsim.test2 nr_ulsim.test3 nr_ulsim.test4 nr_ulsim.test5 nr_ulsim.test6 nr_ulsim.test7 nr_ulsim.test8 nr_ulsim.test9 nr_ulsim.test10 nr_ulsim.test11 nr_ulsim.test12 nr_ulsim.test13 nr_ulsim.test14 nr_ulsim.test15 nr_ulsim.test16 PUSCH test OK segmentation fault|assertion|exiting|fatal 3 From 4035bdb71d89726bd5c498a2b5d0d1b46c3727ea Mon Sep 17 00:00:00 2001 From: Thomas Schlichter Date: Thu, 7 Apr 2022 12:20:33 +0200 Subject: [PATCH 07/13] add autotest test case for nr_dlsim low SNR performance performance is ~1.0dB worse than nr_ulsim because of unexpected bad PDCCH performance... --- cmake_targets/autotests/test_case_list.xml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/cmake_targets/autotests/test_case_list.xml b/cmake_targets/autotests/test_case_list.xml index 94756bbe9f..b18010917c 100755 --- a/cmake_targets/autotests/test_case_list.xml +++ b/cmake_targets/autotests/test_case_list.xml @@ -1104,7 +1104,8 @@ (Test19: Mapping type A, 3 DMRS Symbols), (Test20: Mapping type B, 4 DMRS Symbols), (Test21: 4x4 MIMO, 1 Layer), - (Test22: 4x4 MIMO, 2 Layers) + (Test22: 4x4 MIMO, 2 Layers), + (Test23: MCS 0, low SNR performance) $OPENAIR_DIR/cmake_targets/build_oai --phy_simulators -c @@ -1132,8 +1133,9 @@ -n100 -s2 -U 2 0 2 -n100 -s2 -U 2 1 3 -n10 -s20 -U 3 0 0 2 -gR -x1 -y4 -z4 - -n10 -s20 -U 3 0 0 2 -gR -x2 -y4 -z4 - nr_dlsim.test1 nr_dlsim.test2 nr_dlsim.test3 nr_dlsim.test4 nr_dlsim.test5 nr_dlsim.test6 nr_dlsim.test7 nr_dlsim.test8 nr_dlsim.test9 nr_dlsim.test10 nr_dlsim.test11 nr_dlsim.test12 nr_dlsim.test13 nr_dlsim.test14 nr_dlsim.test15 nr_dlsim.test16 nr_dlsim.test17 nr_dlsim.test18 nr_dlsim.test19 nr_dlsim.test20 nr_dlsim.test21 nr_dlsim.test22 + -n10 -s20 -U 3 0 0 2 -gR -x2 -y4 -z4 + -n100 -e0 -t99 -S0.2 -i + nr_dlsim.test1 nr_dlsim.test2 nr_dlsim.test3 nr_dlsim.test4 nr_dlsim.test5 nr_dlsim.test6 nr_dlsim.test7 nr_dlsim.test8 nr_dlsim.test9 nr_dlsim.test10 nr_dlsim.test11 nr_dlsim.test12 nr_dlsim.test13 nr_dlsim.test14 nr_dlsim.test15 nr_dlsim.test16 nr_dlsim.test17 nr_dlsim.test18 nr_dlsim.test19 nr_dlsim.test20 nr_dlsim.test21 nr_dlsim.test22 nr_dlsim.test23 PDSCH test OK segmentation fault|assertion|exiting|fatal 3 From 795c057d8cddcbfb0e50a179d57a18ed8429d08b Mon Sep 17 00:00:00 2001 From: Thomas Schlichter Date: Tue, 19 Apr 2022 11:32:47 +0200 Subject: [PATCH 08/13] nr_dlsim: fix low-SNR performance by using DCI aggregation level 8 --- cmake_targets/autotests/test_case_list.xml | 2 +- openair1/PHY/NR_UE_TRANSPORT/dci_nr.c | 2 +- openair1/SIMULATION/NR_PHY/dlsim.c | 15 +++++++++++---- openair2/RRC/NR/rrc_gNB_reconfig.c | 11 +++++++---- 4 files changed, 20 insertions(+), 10 deletions(-) diff --git a/cmake_targets/autotests/test_case_list.xml b/cmake_targets/autotests/test_case_list.xml index b18010917c..1cd0738836 100755 --- a/cmake_targets/autotests/test_case_list.xml +++ b/cmake_targets/autotests/test_case_list.xml @@ -1134,7 +1134,7 @@ -n100 -s2 -U 2 1 3 -n10 -s20 -U 3 0 0 2 -gR -x1 -y4 -z4 -n10 -s20 -U 3 0 0 2 -gR -x2 -y4 -z4 - -n100 -e0 -t99 -S0.2 -i + -n100 -e0 -t99 -S-1.4 -i nr_dlsim.test1 nr_dlsim.test2 nr_dlsim.test3 nr_dlsim.test4 nr_dlsim.test5 nr_dlsim.test6 nr_dlsim.test7 nr_dlsim.test8 nr_dlsim.test9 nr_dlsim.test10 nr_dlsim.test11 nr_dlsim.test12 nr_dlsim.test13 nr_dlsim.test14 nr_dlsim.test15 nr_dlsim.test16 nr_dlsim.test17 nr_dlsim.test18 nr_dlsim.test19 nr_dlsim.test20 nr_dlsim.test21 nr_dlsim.test22 nr_dlsim.test23 PDSCH test OK segmentation fault|assertion|exiting|fatal diff --git a/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c b/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c index b5cc765be4..ca80600c30 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c +++ b/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c @@ -888,7 +888,7 @@ uint8_t nr_dci_decoding_procedure(PHY_VARS_NR_UE *ue, proc->frame_rx, proc->nr_slot_rx,n_rnti,nr_dci_format_string[rel15->dci_format_options[k]],CCEind,dci_length,*(unsigned long long*)dci_estimation); uint16_t mb = nr_dci_false_detection(dci_estimation,tmp_e,L*108,n_rnti, NR_POLAR_DCI_MESSAGE_TYPE, dci_length, L); ue->dci_thres = (ue->dci_thres + mb) / 2; - if (mb > (ue->dci_thres+20)) { + if (mb > (ue->dci_thres+30)) { LOG_W(PHY,"DCI false positive. Dropping DCI index %d. Mismatched bits: %d/%d. Current DCI threshold: %d\n",j,mb,L*108,ue->dci_thres); continue; } diff --git a/openair1/SIMULATION/NR_PHY/dlsim.c b/openair1/SIMULATION/NR_PHY/dlsim.c index d1a907b3f1..23a2a7f926 100644 --- a/openair1/SIMULATION/NR_PHY/dlsim.c +++ b/openair1/SIMULATION/NR_PHY/dlsim.c @@ -275,10 +275,17 @@ void nr_dlsim_preprocessor(module_id_t module_id, /* manually set free CCE to 0 */ const int target_ss = NR_SearchSpace__searchSpaceType_PR_ue_Specific; sched_ctrl->search_space = get_searchspace(NULL, scc, sched_ctrl->active_bwp ? sched_ctrl->active_bwp->bwp_Dedicated : NULL, target_ss); - uint8_t nr_of_candidates; - find_aggregation_candidates(&sched_ctrl->aggregation_level, - &nr_of_candidates, - sched_ctrl->search_space,4); + uint8_t nr_of_candidates = 0; + if (g_mcsIndex < 4) { + find_aggregation_candidates(&sched_ctrl->aggregation_level, + &nr_of_candidates, + sched_ctrl->search_space,8); + } + if (nr_of_candidates == 0) { + find_aggregation_candidates(&sched_ctrl->aggregation_level, + &nr_of_candidates, + sched_ctrl->search_space,4); + } sched_ctrl->coreset = get_coreset(module_id, scc, sched_ctrl->active_bwp->bwp_Dedicated, sched_ctrl->search_space, target_ss); sched_ctrl->cce_index = 0; diff --git a/openair2/RRC/NR/rrc_gNB_reconfig.c b/openair2/RRC/NR/rrc_gNB_reconfig.c index 36113fb7ee..7e3eae41f3 100644 --- a/openair2/RRC/NR/rrc_gNB_reconfig.c +++ b/openair2/RRC/NR/rrc_gNB_reconfig.c @@ -528,13 +528,16 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco ss2->nrofCandidates=calloc(1,sizeof(*ss2->nrofCandidates)); ss2->nrofCandidates->aggregationLevel1 = NR_SearchSpace__nrofCandidates__aggregationLevel1_n0; ss2->nrofCandidates->aggregationLevel2 = NR_SearchSpace__nrofCandidates__aggregationLevel2_n0; - if (curr_bwp < 48) + if (curr_bwp < 48) { ss2->nrofCandidates->aggregationLevel4 = NR_SearchSpace__nrofCandidates__aggregationLevel4_n1; - else if (curr_bwp < 96) + ss2->nrofCandidates->aggregationLevel8 = NR_SearchSpace__nrofCandidates__aggregationLevel8_n0; + } else if (curr_bwp < 96) { ss2->nrofCandidates->aggregationLevel4 = NR_SearchSpace__nrofCandidates__aggregationLevel4_n2; - else + ss2->nrofCandidates->aggregationLevel8 = NR_SearchSpace__nrofCandidates__aggregationLevel8_n1; + } else { ss2->nrofCandidates->aggregationLevel4 = NR_SearchSpace__nrofCandidates__aggregationLevel4_n4; - ss2->nrofCandidates->aggregationLevel8 = NR_SearchSpace__nrofCandidates__aggregationLevel8_n0; + ss2->nrofCandidates->aggregationLevel8 = NR_SearchSpace__nrofCandidates__aggregationLevel8_n2; + } ss2->nrofCandidates->aggregationLevel16 = NR_SearchSpace__nrofCandidates__aggregationLevel16_n0; ss2->searchSpaceType=calloc(1,sizeof(*ss2->searchSpaceType)); ss2->searchSpaceType->present = NR_SearchSpace__searchSpaceType_PR_ue_Specific; From c97d5d04edfc709f26dc5a33de4651a4c95ee9f5 Mon Sep 17 00:00:00 2001 From: Thomas Schlichter Date: Wed, 18 May 2022 09:35:01 +0200 Subject: [PATCH 09/13] fixes from review --- .../NR_TRANSPORT/nr_ulsch_llr_computation.c | 8 +-- .../nr_dl_channel_estimation.c | 51 ++++++++----------- .../nr_dlsch_llr_computation.c | 11 ++-- openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c | 3 +- 4 files changed, 33 insertions(+), 40 deletions(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_llr_computation.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_llr_computation.c index cf9358766d..f6eefe846a 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_llr_computation.c +++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_llr_computation.c @@ -44,16 +44,16 @@ void nr_ulsch_qpsk_llr(int32_t *rxdataF_comp, uint32_t nb_re, uint8_t symbol) { - uint32_t *rxF = (uint32_t*)rxdataF_comp; - uint32_t *llr32 = (uint32_t*)ulsch_llr; + c16_t *rxF = (c16_t *)rxdataF_comp; + c16_t *llr32 = (c16_t *)ulsch_llr; if (!llr32) { LOG_E(PHY,"nr_ulsch_qpsk_llr: llr is null, symbol %d, llr32 = %p\n",symbol, llr32); } for (int i = 0; i < nb_re; i++) { //*llr32 = *rxF; - ((int16_t *)llr32)[0] = ((int16_t *)rxF)[0] / 8; - ((int16_t *)llr32)[1] = ((int16_t *)rxF)[1] / 8; + llr32->r = rxF->r >> 3; + llr32->i = rxF->i >> 3; rxF++; llr32++; } diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c index 7d25c590a4..777d9afa4c 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c @@ -476,7 +476,7 @@ int nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue, unsigned char aarx; unsigned short k; unsigned int pilot_cnt; - int16_t ch[2],*pil,*rxF,*dl_ch,*fl,*fm,*fr; + int16_t ch[2],*pil,*rxF,*dl_ch; int ch_offset,symbol_offset; int **rxdataF=ue->common_vars.common_vars_rx_data_per_thread[proc->thread_id].rxdataF; @@ -491,9 +491,11 @@ int nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue, proc->thread_id, gNB_id,ch_offset,ue->frame_parms.ofdm_symbol_size,ue->frame_parms.Ncp,Ns,symbol); #endif - fl = filt16a_l1; - fm = filt16a_m1; - fr = filt16a_r1; +#if CH_INTERP + int16_t *fl = filt16a_l1; + int16_t *fm = filt16a_m1; + int16_t *fr = filt16a_r1; +#endif // checking if re-initialization of scrambling IDs is needed (should be done here but scrambling ID for PDCCH is not taken from RRC) if (scrambling_id != ue->scramblingID_pdcch){ @@ -652,39 +654,30 @@ int nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue, k += 4; } #else //ELSE CH_INTERP - int ch_sum[2]; + int ch_sum[2] = {0, 0}; - for ( pilot_cnt=0; pilot_cnt<(3*nb_rb_coreset); pilot_cnt += 3 ) { - if (k >= ue->frame_parms.ofdm_symbol_size){ - k-=ue->frame_parms.ofdm_symbol_size; - rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+k+1)]; + for (pilot_cnt = 0; pilot_cnt < 3*nb_rb_coreset; pilot_cnt++) { + if (k >= ue->frame_parms.ofdm_symbol_size) { + k -= ue->frame_parms.ofdm_symbol_size; + rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+k+1)]; } #ifdef DEBUG_PDCCH - printf("pilot[%d] = (%d, %d)\trxF[%d] = (%d, %d)\n", pilot_cnt+0, pil[0], pil[1], k+1, rxF[0], rxF[1]); -#endif - ch_sum[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); - ch_sum[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15); - pil += 2; - rxF += 8; -#ifdef DEBUG_PDCCH - printf("pilot[%d] = (%d, %d)\trxF[%d] = (%d, %d)\n", pilot_cnt+1, pil[0], pil[1], k+5, rxF[0], rxF[1]); + printf("pilot[%d] = (%d, %d)\trxF[%d] = (%d, %d)\n", pilot_cnt, pil[0], pil[1], k+1, rxF[0], rxF[1]); #endif ch_sum[0] += (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); ch_sum[1] += (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15); pil += 2; rxF += 8; -#ifdef DEBUG_PDCCH - printf("pilot[%d] = (%d, %d)\trxF[%d] = (%d, %d)\n", pilot_cnt+2, pil[0], pil[1], k+9, rxF[0], rxF[1]); -#endif - ch_sum[0] += (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); - ch_sum[1] += (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15); - pil += 2; - rxF += 8; - ch[0] = ch_sum[0]/3; - ch[1] = ch_sum[1]/3; - multadd_real_vector_complex_scalar(filt16a_1, ch, dl_ch, 16); - dl_ch += 24; - k += 12; + k += 4; + + if (pilot_cnt % 3 == 2) { + ch[0] = ch_sum[0] / 3; + ch[1] = ch_sum[1] / 3; + multadd_real_vector_complex_scalar(filt16a_1, ch, dl_ch, 16); + dl_ch += 24; + ch_sum[0] = 0; + ch_sum[1] = 0; + } } #endif //END CH_INTERP diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_llr_computation.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_llr_computation.c index de018f334a..ca15a5b5be 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_llr_computation.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_llr_computation.c @@ -638,11 +638,10 @@ int nr_dlsch_qpsk_llr(NR_DL_FRAME_PARMS *frame_parms, uint8_t beamforming_mode) { - uint32_t *rxF = (uint32_t *)&rxdataF_comp[((int32_t)symbol*nb_rb*12)]; - uint32_t *llr32; + c16_t *rxF = (c16_t *)&rxdataF_comp[((int32_t)symbol*nb_rb*12)]; + c16_t *llr32 = (c16_t *)dlsch_llr; int i; - llr32 = (uint32_t*)dlsch_llr; if (!llr32) { LOG_E(PHY,"nr_dlsch_qpsk_llr: llr is null, symbol %d, llr32=%p\n",symbol, llr32); return(-1); @@ -657,9 +656,9 @@ int nr_dlsch_qpsk_llr(NR_DL_FRAME_PARMS *frame_parms, */ for (i=0; ir = rxF->r >> 3; + llr32->i = rxF->i >> 3; + //printf("dlsch_qpsk_llr %d : (%d,%d)\n", i, llr32->r, llr32->i); rxF++; llr32++; } diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c index 1e019a4744..6adf5c4760 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c @@ -840,10 +840,11 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac, mappingtype, add_pos, dmrslength, pusch_config_pdu->start_symbol_index, mac->scc ? mac->scc->dmrs_TypeA_Position : mac->mib->dmrs_TypeA_Position); - if ((mac->ULbwp[ul_bwp_id-1] && pusch_config_pdu->transform_precoding == NR_PUSCH_Config__transformPrecoder_disabled)) + if (mac->ULbwp[ul_bwp_id-1] && pusch_config_pdu->transform_precoding == NR_PUSCH_Config__transformPrecoder_disabled) { if (*dci_format != NR_UL_DCI_FORMAT_0_1) { pusch_config_pdu->num_dmrs_cdm_grps_no_data = 1; } + } else if (*dci_format == NR_UL_DCI_FORMAT_0_0 || (mac->ULbwp[ul_bwp_id-1] && pusch_config_pdu->transform_precoding == NR_PUSCH_Config__transformPrecoder_enabled)) pusch_config_pdu->num_dmrs_cdm_grps_no_data = 2; From 6f8b13c2ad25515c303706bb63e942b6af7d63b6 Mon Sep 17 00:00:00 2001 From: Thomas Schlichter Date: Wed, 18 May 2022 09:50:37 +0200 Subject: [PATCH 10/13] fix nr_ulsim option "-i" has no further parameters --- openair1/SIMULATION/NR_PHY/ulsim.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openair1/SIMULATION/NR_PHY/ulsim.c b/openair1/SIMULATION/NR_PHY/ulsim.c index 32b66c09dc..912b4b577c 100644 --- a/openair1/SIMULATION/NR_PHY/ulsim.c +++ b/openair1/SIMULATION/NR_PHY/ulsim.c @@ -350,7 +350,7 @@ int main(int argc, char **argv) /* initialize the sin-cos table */ InitSinLUT(); - while ((c = getopt(argc, argv, "a:b:c:d:ef:g:h:i:kl:m:n:p:r:s:u:w:y:z:F:G:H:M:N:PR:S:T:U:L:Z:W:")) != -1) { + while ((c = getopt(argc, argv, "a:b:c:d:ef:g:h:ikl:m:n:p:r:s:u:w:y:z:F:G:H:M:N:PR:S:T:U:L:Z:W:")) != -1) { printf("handling optarg %c\n",c); switch (c) { @@ -594,7 +594,7 @@ int main(int argc, char **argv) default: case 'h': - printf("%s -h(elp) -p(extended_prefix) -N cell_id -f output_filename -F input_filename -g channel_model -n n_frames -t Delayspread -s snr0 -S snr1 -x transmission_mode -y TXant -z RXant -i Intefrence0 -j Interference1 -A interpolation_file -C(alibration offset dB) -N CellId -Z Enable SC-FDMA in Uplink \n", argv[0]); + printf("%s -h(elp) -p(extended_prefix) -N cell_id -f output_filename -F input_filename -g channel_model -n n_frames -t Delayspread -s snr0 -S snr1 -x transmission_mode -y TXant -z RXant -A interpolation_file -C(alibration offset dB) -N CellId -Z Enable SC-FDMA in Uplink \n", argv[0]); //printf("-d Use TDD\n"); printf("-d Introduce delay in terms of number of samples\n"); printf("-f Number of frames to simulate\n"); From 3934f2020ec935dbd9861352b12d15c25a0b9d1c Mon Sep 17 00:00:00 2001 From: Thomas Schlichter Date: Wed, 18 May 2022 09:54:59 +0200 Subject: [PATCH 11/13] slightly increase the target SNR for the nr_dlsim low SNR test to make the test more reliable --- cmake_targets/autotests/test_case_list.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake_targets/autotests/test_case_list.xml b/cmake_targets/autotests/test_case_list.xml index 4b586fa2d3..102a816826 100755 --- a/cmake_targets/autotests/test_case_list.xml +++ b/cmake_targets/autotests/test_case_list.xml @@ -1134,7 +1134,7 @@ -n100 -s2 -U 2 1 3 -n10 -s20 -U 3 0 0 2 -gR -x1 -y4 -z4 -n10 -s20 -U 3 0 0 2 -gR -x2 -y4 -z4 - -n100 -e0 -t99 -S-1.4 -i + -n100 -e0 -t99 -S-1.2 -i nr_dlsim.test1 nr_dlsim.test2 nr_dlsim.test3 nr_dlsim.test4 nr_dlsim.test5 nr_dlsim.test6 nr_dlsim.test7 nr_dlsim.test8 nr_dlsim.test9 nr_dlsim.test10 nr_dlsim.test11 nr_dlsim.test12 nr_dlsim.test13 nr_dlsim.test14 nr_dlsim.test15 nr_dlsim.test16 nr_dlsim.test17 nr_dlsim.test18 nr_dlsim.test19 nr_dlsim.test20 nr_dlsim.test21 nr_dlsim.test22 nr_dlsim.test23 PDSCH test OK segmentation fault|assertion|exiting|fatal From 14d3a9c0e5a62fe91945c91c9449c79e8baf04c9 Mon Sep 17 00:00:00 2001 From: Roberto Louro Magueta Date: Wed, 15 Jun 2022 12:53:36 +0100 Subject: [PATCH 12/13] Fixes after merge --- cmake_targets/autotests/test_case_list.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmake_targets/autotests/test_case_list.xml b/cmake_targets/autotests/test_case_list.xml index 0dcbd35933..a8b8a2149a 100755 --- a/cmake_targets/autotests/test_case_list.xml +++ b/cmake_targets/autotests/test_case_list.xml @@ -1136,7 +1136,7 @@ -n10 -s20 -U 3 0 0 2 -gR -x1 -y4 -z4 -n10 -s20 -U 3 0 0 2 -gR -x2 -y4 -z4 -n100 -m0 -e0 -R25 -b25 -i 2 1 0 - -n100 -e0 -t99 -S-1.0 -i + -n100 -e0 -t99 -S-1.0 -i 2 1 0 nr_dlsim.test1 nr_dlsim.test2 nr_dlsim.test3 nr_dlsim.test4 nr_dlsim.test5 nr_dlsim.test6 nr_dlsim.test7 nr_dlsim.test8 nr_dlsim.test9 nr_dlsim.test10 nr_dlsim.test11 nr_dlsim.test12 nr_dlsim.test13 nr_dlsim.test14 nr_dlsim.test15 nr_dlsim.test16 nr_dlsim.test17 nr_dlsim.test18 nr_dlsim.test19 nr_dlsim.test20 nr_dlsim.test21 nr_dlsim.test22 nr_dlsim.test23 nr_dlsim.test24 PDSCH test OK segmentation fault|assertion|exiting|fatal @@ -1345,7 +1345,7 @@ -m16 -r106 -s8.8 -S9.4 -z2 -n200 -U 4 1 1 1 2 -gI -b14 -t70 -I15 -i 2 1 0 -m16 -r106 -s5.4 -S6 -z4 -n200 -U 4 1 1 1 2 -gI -b14 -t70 -I15 -i 2 1 0 -m16 -r106 -s3.4 -S3.8 -z8 -n200 -U 4 1 1 1 2 -gI -b14 -t70 -I15 -i 2 1 0 - -n100 -m0 -S -0.8 -i + -n100 -m0 -S -0.8 -i 2 1 0 nr_ulsim.test1 nr_ulsim.test2 nr_ulsim.test3 nr_ulsim.test4 nr_ulsim.test5 nr_ulsim.test6 nr_ulsim.test7 nr_ulsim.test8 nr_ulsim.test9 nr_ulsim.test10 nr_ulsim.test11 nr_ulsim.test12 nr_ulsim.test13 nr_ulsim.test14 nr_ulsim.test15 nr_ulsim.test16 nr_ulsim.test17 nr_ulsim.test18 nr_ulsim.test19 nr_ulsim.test20 nr_ulsim.test21 nr_ulsim.test22 PUSCH test OK segmentation fault|assertion|exiting|fatal From 4053c0c3b2ed56c2242dc6fcb932d1048d75034a Mon Sep 17 00:00:00 2001 From: Roberto Louro Magueta Date: Wed, 15 Jun 2022 19:54:12 +0100 Subject: [PATCH 13/13] Revert log2_maxh in pusch_vars --- openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c index 0b466f7623..4b8315e1ce 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c +++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c @@ -2049,7 +2049,7 @@ int nr_rx_pusch(PHY_VARS_gNB *gNB, for (aarx=0;aarxnb_antennas_rx;aarx++) avgs = cmax(avgs,avg[aatx*frame_parms->nb_antennas_rx+aarx]); - gNB->pusch_vars[ulsch_id]->log2_maxh = (log2_approx(avgs)/2)+1; + gNB->pusch_vars[ulsch_id]->log2_maxh = (log2_approx(avgs)/2)+2; gNB->pusch_vars[ulsch_id]->cl_done = 1; }