From a5eda343edef7a22b9105097592fba7e1d1f4fe3 Mon Sep 17 00:00:00 2001 From: Sagar Parsawar Date: Fri, 5 Aug 2022 17:29:51 +0200 Subject: [PATCH] 1. Fixed pbchsim build failure due to prs source file dependacy 2. Fixed GPS time assert in gNB_scheduler_uci.c --- executables/nr-ue.c | 161 ++++++++++++++++++ executables/nr-uesoftmodem.h | 3 +- openair1/PHY/INIT/nr_init_ue.c | 50 ------ openair1/PHY/NR_TRANSPORT/nr_prs.c | 11 +- .../nr_dl_channel_estimation.c | 6 +- openair1/PHY/defs_nr_common.h | 8 + openair1/SIMULATION/NR_PHY/pbchsim.c | 78 +-------- .../LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c | 16 +- openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c | 101 ----------- openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h | 1 - 10 files changed, 190 insertions(+), 245 deletions(-) diff --git a/executables/nr-ue.c b/executables/nr-ue.c index 85ec4e5e0c..795541f888 100644 --- a/executables/nr-ue.c +++ b/executables/nr-ue.c @@ -34,6 +34,8 @@ #include "LAYER2/nr_pdcp/nr_pdcp_entity.h" #include "SCHED_NR_UE/pucch_uci_ue_nr.h" #include "openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h" +#include "openair2/GNB_APP/prs_nr_paramdef.h" +#include "PHY/NR_REFSIG/refsig_defs_ue.h" /* * NR SLOT PROCESSING SEQUENCE @@ -150,6 +152,162 @@ static void *nrL1_UE_stats_thread(void *param) return NULL; } +void RCconfig_nrUE_prs(void *cfg) +{ + int j = 0, k = 0, gNB_id = 0; + char aprefix[MAX_OPTNAME_SIZE*2 + 8]; + PHY_VARS_NR_UE *ue = (PHY_VARS_NR_UE *)cfg; + + paramlist_def_t gParamList = {CONFIG_STRING_PRS_LIST,NULL,0}; + paramdef_t gParams[] = PRS_GLOBAL_PARAMS_DESC; + config_getlist( &gParamList,gParams,sizeof(gParams)/sizeof(paramdef_t), NULL); + ue->prs_active_gNBs = *(gParamList.paramarray[j][PRS_ACTIVE_GNBS_IDX].uptr); + + paramlist_def_t PRS_ParamList = {{0},NULL,0}; + for(int i = 0; i < ue->prs_active_gNBs; i++) + { + paramdef_t PRS_Params[] = PRS_PARAMS_DESC; + sprintf(PRS_ParamList.listname, "%s%i", CONFIG_STRING_PRS_CONFIG, i); + + sprintf(aprefix, "%s.[%i]", CONFIG_STRING_PRS_LIST, 0); + config_getlist( &PRS_ParamList,PRS_Params,sizeof(PRS_Params)/sizeof(paramdef_t), aprefix); + + if (PRS_ParamList.numelt > 0) { + for (j = 0; j < PRS_ParamList.numelt; j++) { + gNB_id = *(PRS_ParamList.paramarray[j][PRS_GNB_ID].uptr); + if(gNB_id != i) gNB_id = i; // force gNB_id to avoid mismatch + + ue->prs_vars[gNB_id]->NumPRSResources = *(PRS_ParamList.paramarray[j][NUM_PRS_RESOURCES].uptr); + for (k = 0; k < ue->prs_vars[gNB_id]->NumPRSResources; k++) + { + ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.PRSResourceSetPeriod[0] = PRS_ParamList.paramarray[j][PRS_RESOURCE_SET_PERIOD_LIST].uptr[0]; + ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.PRSResourceSetPeriod[1] = PRS_ParamList.paramarray[j][PRS_RESOURCE_SET_PERIOD_LIST].uptr[1]; + // per PRS resources parameters + ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.SymbolStart = PRS_ParamList.paramarray[j][PRS_SYMBOL_START_LIST].uptr[k]; + ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.NumPRSSymbols = PRS_ParamList.paramarray[j][PRS_NUM_SYMBOLS_LIST].uptr[k]; + ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.REOffset = PRS_ParamList.paramarray[j][PRS_RE_OFFSET_LIST].uptr[k]; + ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.NPRSID = PRS_ParamList.paramarray[j][PRS_ID_LIST].uptr[k]; + ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.PRSResourceOffset = PRS_ParamList.paramarray[j][PRS_RESOURCE_OFFSET_LIST].uptr[k]; + // Common parameters to all PRS resources + ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.NumRB = *(PRS_ParamList.paramarray[j][PRS_NUM_RB].uptr); + ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.RBOffset = *(PRS_ParamList.paramarray[j][PRS_RB_OFFSET].uptr); + ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.CombSize = *(PRS_ParamList.paramarray[j][PRS_COMB_SIZE].uptr); + ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.PRSResourceRepetition = *(PRS_ParamList.paramarray[j][PRS_RESOURCE_REPETITION].uptr); + ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.PRSResourceTimeGap = *(PRS_ParamList.paramarray[j][PRS_RESOURCE_TIME_GAP].uptr); + + ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.MutingBitRepetition = *(PRS_ParamList.paramarray[j][PRS_MUTING_BIT_REPETITION].uptr); + for (int l = 0; l < PRS_ParamList.paramarray[j][PRS_MUTING_PATTERN1_LIST].numelt; l++) + ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.MutingPattern1[l] = PRS_ParamList.paramarray[j][PRS_MUTING_PATTERN1_LIST].uptr[l]; + for (int l = 0; l < PRS_ParamList.paramarray[j][PRS_MUTING_PATTERN2_LIST].numelt; l++) + ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.MutingPattern2[l] = PRS_ParamList.paramarray[j][PRS_MUTING_PATTERN2_LIST].uptr[l]; + } // for k + + k = 0; + LOG_I(PHY, "-----------------------------------------\n"); + LOG_I(PHY, "PRS Config for gNB_id %d @ %p\n", gNB_id, &ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg); + LOG_I(PHY, "-----------------------------------------\n"); + LOG_I(PHY, "NumPRSResources \t%d\n", ue->prs_vars[gNB_id]->NumPRSResources); + LOG_I(PHY, "PRSResourceSetPeriod \t[%d, %d]\n", ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.PRSResourceSetPeriod[0], ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.PRSResourceSetPeriod[1]); + LOG_I(PHY, "NumRB \t\t\t%d\n", ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.NumRB); + LOG_I(PHY, "RBOffset \t\t%d\n", ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.RBOffset); + LOG_I(PHY, "CombSize \t\t%d\n", ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.CombSize); + LOG_I(PHY, "PRSResourceRepetition \t%d\n", ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.PRSResourceRepetition); + LOG_I(PHY, "PRSResourceTimeGap \t%d\n", ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.PRSResourceTimeGap); + LOG_I(PHY, "MutingBitRepetition \t%d\n", ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.MutingBitRepetition); + LOG_I(PHY, "SymbolStart \t\t["); + for (k = 0; k < ue->prs_vars[gNB_id]->NumPRSResources; k++) + printf("%d, ", ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.SymbolStart); + printf("\b\b]\n"); + LOG_I(PHY, "NumPRSSymbols \t\t["); + for (k = 0; k < ue->prs_vars[gNB_id]->NumPRSResources; k++) + printf("%d, ", ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.NumPRSSymbols); + printf("\b\b]\n"); + LOG_I(PHY, "REOffset \t\t["); + for (k = 0; k < ue->prs_vars[gNB_id]->NumPRSResources; k++) + printf("%d, ", ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.REOffset); + printf("\b\b]\n"); + LOG_I(PHY, "PRSResourceOffset \t["); + for (k = 0; k < ue->prs_vars[gNB_id]->NumPRSResources; k++) + printf("%d, ", ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.PRSResourceOffset); + printf("\b\b]\n"); + LOG_I(PHY, "NPRS_ID \t\t["); + for (k = 0; k < ue->prs_vars[gNB_id]->NumPRSResources; k++) + printf("%d, ", ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.NPRSID); + printf("\b\b]\n"); + LOG_I(PHY, "MutingPattern1 \t\t["); + for (int l = 0, k = 0; l < PRS_ParamList.paramarray[j][PRS_MUTING_PATTERN1_LIST].numelt; l++) + printf("%d, ", ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.MutingPattern1[l]); + printf("\b\b]\n"); + LOG_I(PHY, "MutingPattern2 \t\t["); + for (int l = 0, k = 0; l < PRS_ParamList.paramarray[j][PRS_MUTING_PATTERN2_LIST].numelt; l++) + printf("%d, ", ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.MutingPattern2[l]); + printf("\b\b]\n"); + LOG_I(PHY, "-----------------------------------------\n"); + } + } + else + { + LOG_I(NR_PHY,"No %s configuration found\n", PRS_ParamList.listname); + } + } +} + +void init_nr_prs_ue_vars(PHY_VARS_NR_UE *ue) +{ + NR_UE_PRS **const prs_vars = ue->prs_vars; + NR_DL_FRAME_PARMS *const fp = &ue->frame_parms; + + // PRS vars init + for(int idx = 0; idx < NR_MAX_PRS_COMB_SIZE; idx++) + { + prs_vars[idx] = (NR_UE_PRS *)malloc16_clear(sizeof(NR_UE_PRS)); + for(int k = 0; k < NR_MAX_PRS_RESOURCES_PER_SET; k++) + { + // PRS channel estimates + prs_vars[idx]->prs_resource[k].prs_ch_estimates = (int32_t **)malloc16_clear( fp->nb_antennas_rx*sizeof(int32_t *) ); + prs_vars[idx]->prs_resource[k].prs_ch_estimates_time = (int32_t **)malloc16_clear( fp->nb_antennas_rx*sizeof(int32_t *) ); + AssertFatal(((prs_vars[idx]->prs_resource[k].prs_ch_estimates!=NULL) || (prs_vars[idx]->prs_resource[k].prs_ch_estimates_time!=NULL)), "NR UE init: PRS channel estimates malloc failed for gNB_id %d\n", idx); + prs_vars[idx]->prs_resource[k].prs_meas = (prs_meas_t **)malloc16_clear( fp->nb_antennas_rx*sizeof(prs_meas_t *) ); + AssertFatal((prs_vars[idx]->prs_resource[k].prs_meas!=NULL), "NR UE init: PRS measurements malloc failed for gNB_id %d\n", idx); + + for (int i=0; inb_antennas_rx; i++) { + prs_vars[idx]->prs_resource[k].prs_ch_estimates[i] = (int32_t *)malloc16_clear(fp->ofdm_symbol_size*sizeof(int32_t)); + prs_vars[idx]->prs_resource[k].prs_ch_estimates_time[i] = (int32_t *)malloc16_clear(fp->ofdm_symbol_size*sizeof(int32_t)); + AssertFatal(((prs_vars[idx]->prs_resource[k].prs_ch_estimates[i]!=NULL) || (prs_vars[idx]->prs_resource[k].prs_ch_estimates_time[i]!=NULL)), "NR UE init: PRS channel estimates malloc failed for rx_ant %d\n", i); + prs_vars[idx]->prs_resource[k].prs_meas[i] = (prs_meas_t *)malloc16_clear(sizeof(prs_meas_t) ); + AssertFatal((prs_vars[idx]->prs_resource[k].prs_meas[i]!=NULL), "NR UE init: PRS measurements malloc failed for rx_ant %d\n", i); + } + } + } + // load the config file params + RCconfig_nrUE_prs(ue); + + //PRS sequence init + ue->nr_gold_prs = (uint32_t *****)malloc16(ue->prs_active_gNBs*sizeof(uint32_t ****)); + uint32_t *****prs = ue->nr_gold_prs; + AssertFatal(prs!=NULL, "NR UE init: positioning reference signal malloc failed\n"); + for (int gnb = 0; gnb < ue->prs_active_gNBs; gnb++) { + prs[gnb] = (uint32_t ****)malloc16(ue->prs_vars[gnb]->NumPRSResources*sizeof(uint32_t ***)); + AssertFatal(prs[gnb]!=NULL, "NR UE init: positioning reference signal for gnb %d - malloc failed\n", gnb); + + for (int rsc = 0; rsc < ue->prs_vars[gnb]->NumPRSResources; rsc++) { + prs[gnb][rsc] = (uint32_t ***)malloc16(fp->slots_per_frame*sizeof(uint32_t **)); + AssertFatal(prs[gnb][rsc]!=NULL, "NR UE init: positioning reference signal for gnb %d rsc %d- malloc failed\n", gnb, rsc); + + for (int slot=0; slotslots_per_frame; slot++) { + prs[gnb][rsc][slot] = (uint32_t **)malloc16(fp->symbols_per_slot*sizeof(uint32_t *)); + AssertFatal(prs[gnb][rsc][slot]!=NULL, "NR UE init: positioning reference signal for gnb %d rsc %d slot %d - malloc failed\n", gnb, rsc, slot); + + for (int symb=0; symbsymbols_per_slot; symb++) { + prs[gnb][rsc][slot][symb] = (uint32_t *)malloc16(NR_MAX_PRS_INIT_LENGTH_DWORD*sizeof(uint32_t)); + AssertFatal(prs[gnb][rsc][slot][symb]!=NULL, "NR UE init: positioning reference signal for gnb %d rsc %d slot %d symbol %d - malloc failed\n", gnb, rsc, slot, symb); + } // for symb + } // for slot + } // for rsc + } // for gnb + init_nr_gold_prs(ue); +} + void init_nr_ue_vars(PHY_VARS_NR_UE *ue, uint8_t UE_id, uint8_t abstraction_flag) @@ -168,6 +326,9 @@ void init_nr_ue_vars(PHY_VARS_NR_UE *ue, ue->prach_resources[gNB_id] = (NR_PRACH_RESOURCES_t *)malloc16_clear(sizeof(NR_PRACH_RESOURCES_t)); } + // initialize nr prs vars + init_nr_prs_ue_vars(ue); + // initialize all signal buffers init_nr_ue_signal(ue, nb_connected_gNB); diff --git a/executables/nr-uesoftmodem.h b/executables/nr-uesoftmodem.h index a25d9cf5cf..0aa5df5931 100644 --- a/executables/nr-uesoftmodem.h +++ b/executables/nr-uesoftmodem.h @@ -100,5 +100,6 @@ extern void start_oai_nrue_threads(void); void *UE_thread(void *arg); void init_nr_ue_vars(PHY_VARS_NR_UE *ue, uint8_t UE_id, uint8_t abstraction_flag); void init_nrUE_standalone_thread(int ue_idx); - +void RCconfig_nrUE_prs(void *cfg); +void init_nr_prs_ue_vars(PHY_VARS_NR_UE *ue); #endif diff --git a/openair1/PHY/INIT/nr_init_ue.c b/openair1/PHY/INIT/nr_init_ue.c index 73cdaf0fae..dcc433d218 100644 --- a/openair1/PHY/INIT/nr_init_ue.c +++ b/openair1/PHY/INIT/nr_init_ue.c @@ -141,7 +141,6 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB) NR_DL_FRAME_PARMS *const fp = &ue->frame_parms; NR_UE_COMMON *const common_vars = &ue->common_vars; NR_UE_PBCH **const pbch_vars = ue->pbch_vars; - NR_UE_PRS **const prs_vars = ue->prs_vars; NR_UE_PRACH **const prach_vars = ue->prach_vars; NR_UE_CSI_IM **const csiim_vars = ue->csiim_vars; NR_UE_CSI_RS **const csirs_vars = ue->csirs_vars; @@ -191,55 +190,6 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB) /////////// //////////////////////////////////////////////////////////////////////////////////////////// - // PRS vars - for(int idx = 0; idx < NR_MAX_PRS_COMB_SIZE; idx++) - { - prs_vars[idx] = (NR_UE_PRS *)malloc16_clear(sizeof(NR_UE_PRS)); - for(int k = 0; k < NR_MAX_PRS_RESOURCES_PER_SET; k++) - { - // PRS channel estimates - prs_vars[idx]->prs_resource[k].prs_ch_estimates = (int32_t **)malloc16_clear( fp->nb_antennas_rx*sizeof(int32_t *) ); - prs_vars[idx]->prs_resource[k].prs_ch_estimates_time = (int32_t **)malloc16_clear( fp->nb_antennas_rx*sizeof(int32_t *) ); - AssertFatal(((prs_vars[idx]->prs_resource[k].prs_ch_estimates!=NULL) || (prs_vars[idx]->prs_resource[k].prs_ch_estimates_time!=NULL)), "NR UE init: PRS channel estimates malloc failed for gNB_id %d\n", idx); - prs_vars[idx]->prs_resource[k].prs_meas = (prs_meas_t **)malloc16_clear( fp->nb_antennas_rx*sizeof(prs_meas_t *) ); - AssertFatal((prs_vars[idx]->prs_resource[k].prs_meas!=NULL), "NR UE init: PRS measurements malloc failed for gNB_id %d\n", idx); - - for (i=0; inb_antennas_rx; i++) { - prs_vars[idx]->prs_resource[k].prs_ch_estimates[i] = (int32_t *)malloc16_clear(fp->ofdm_symbol_size*sizeof(int32_t)); - prs_vars[idx]->prs_resource[k].prs_ch_estimates_time[i] = (int32_t *)malloc16_clear(fp->ofdm_symbol_size*sizeof(int32_t)); - AssertFatal(((prs_vars[idx]->prs_resource[k].prs_ch_estimates[i]!=NULL) || (prs_vars[idx]->prs_resource[k].prs_ch_estimates_time[i]!=NULL)), "NR UE init: PRS channel estimates malloc failed for rx_ant %d\n", i); - prs_vars[idx]->prs_resource[k].prs_meas[i] = (prs_meas_t *)malloc16_clear(sizeof(prs_meas_t) ); - AssertFatal((prs_vars[idx]->prs_resource[k].prs_meas[i]!=NULL), "NR UE init: PRS measurements malloc failed for rx_ant %d\n", i); - } - } - } - // load the config file params - RCconfig_nrUE_prs(ue); - - //PRS sequence init - ue->nr_gold_prs = (uint32_t *****)malloc16(ue->prs_active_gNBs*sizeof(uint32_t ****)); - uint32_t *****prs = ue->nr_gold_prs; - AssertFatal(prs!=NULL, "NR UE init: positioning reference signal malloc failed\n"); - for (int gnb = 0; gnb < ue->prs_active_gNBs; gnb++) { - prs[gnb] = (uint32_t ****)malloc16(ue->prs_vars[gnb]->NumPRSResources*sizeof(uint32_t ***)); - AssertFatal(prs[gnb]!=NULL, "NR UE init: positioning reference signal for gnb %d - malloc failed\n", gnb); - - for (int rsc = 0; rsc < ue->prs_vars[gnb]->NumPRSResources; rsc++) { - prs[gnb][rsc] = (uint32_t ***)malloc16(fp->slots_per_frame*sizeof(uint32_t **)); - AssertFatal(prs[gnb][rsc]!=NULL, "NR UE init: positioning reference signal for gnb %d rsc %d- malloc failed\n", gnb, rsc); - - for (int slot=0; slotslots_per_frame; slot++) { - prs[gnb][rsc][slot] = (uint32_t **)malloc16(fp->symbols_per_slot*sizeof(uint32_t *)); - AssertFatal(prs[gnb][rsc][slot]!=NULL, "NR UE init: positioning reference signal for gnb %d rsc %d slot %d - malloc failed\n", gnb, rsc, slot); - - for (int symb=0; symbsymbols_per_slot; symb++) { - prs[gnb][rsc][slot][symb] = (uint32_t *)malloc16(NR_MAX_PRS_INIT_LENGTH_DWORD*sizeof(uint32_t)); - AssertFatal(prs[gnb][rsc][slot][symb]!=NULL, "NR UE init: positioning reference signal for gnb %d rsc %d slot %d symbol %d - malloc failed\n", gnb, rsc, slot, symb); - } // for symb - } // for slot - } // for rsc - } // for gnb - init_nr_gold_prs(ue); /////////////////////////PUSCH DMRS init///////////////////////// /////////// diff --git a/openair1/PHY/NR_TRANSPORT/nr_prs.c b/openair1/PHY/NR_TRANSPORT/nr_prs.c index bc9aa92ab3..513fadab85 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_prs.c +++ b/openair1/PHY/NR_TRANSPORT/nr_prs.c @@ -8,11 +8,6 @@ //#define DEBUG_PRS_MAP extern short nr_qpsk_mod_table[8]; -int k_prime_table[4][12] = { - {0,1,0,1,0,1,0,1,0,1,0,1}, - {0,2,1,3,0,2,1,3,0,2,1,3}, - {0,3,1,4,2,5,0,3,1,4,2,5}, - {0,6,3,9,1,7,4,10,2,8,5,11}}; int nr_generate_prs(uint32_t **nr_gold_prs, int32_t *txdataF, @@ -22,10 +17,10 @@ int nr_generate_prs(uint32_t **nr_gold_prs, NR_DL_FRAME_PARMS *frame_parms) { - int k_prime = 0, k = 0; + int k_prime = 0, k = 0, idx; int16_t mod_prs[NR_MAX_PRS_LENGTH<<1]; - uint8_t idx; - + int16_t k_prime_table[K_PRIME_TABLE_ROW_SIZE][K_PRIME_TABLE_COL_SIZE] = PRS_K_PRIME_TABLE; + // PRS resource mapping with combsize=k which means PRS symbols exist in every k-th subcarrier in frequency domain // According to ts138.211 sec.7.4.1.7.2 for (int l = prs_data->SymbolStart; l < prs_data->SymbolStart + prs_data->NumPRSSymbols; l++) { 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 f0b28165da..105d245018 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c @@ -40,11 +40,6 @@ //#define DEBUG_PRS_PRINTS #define IDFT_INTERPOL_FACTOR 1 extern short nr_qpsk_mod_table[8]; -int k_prime_table[4][12] = { - {0,1,0,1,0,1,0,1,0,1,0,1}, - {0,2,1,3,0,2,1,3,0,2,1,3}, - {0,3,1,4,2,5,0,3,1,4,2,5}, - {0,6,3,9,1,7,4,10,2,8,5,11}}; static inline int abs32(int x) { @@ -85,6 +80,7 @@ int nr_prs_channel_estimation(uint8_t gNB_id, int16_t num_pilots = (12/prs_cfg->CombSize)*prs_cfg->NumRB; int16_t start_offset = (IDFT_INTERPOL_FACTOR-1)*frame_params->ofdm_symbol_size>>1; + int16_t k_prime_table[K_PRIME_TABLE_ROW_SIZE][K_PRIME_TABLE_COL_SIZE] = PRS_K_PRIME_TABLE; for(int l = prs_cfg->SymbolStart; l < prs_cfg->SymbolStart+prs_cfg->NumPRSSymbols; l++) { int symInd = l-prs_cfg->SymbolStart; diff --git a/openair1/PHY/defs_nr_common.h b/openair1/PHY/defs_nr_common.h index d102858a57..44067881e9 100644 --- a/openair1/PHY/defs_nr_common.h +++ b/openair1/PHY/defs_nr_common.h @@ -418,6 +418,14 @@ typedef struct { int32_t reserved; } prs_meas_t; +// rel16 prs k_prime table as per ts138.211 sec.7.4.1.7.2 +#define K_PRIME_TABLE_ROW_SIZE 4 +#define K_PRIME_TABLE_COL_SIZE 12 +#define PRS_K_PRIME_TABLE { {0,1,0,1,0,1,0,1,0,1,0,1}, \ + {0,2,1,3,0,2,1,3,0,2,1,3}, \ + {0,3,1,4,2,5,0,3,1,4,2,5}, \ + {0,6,3,9,1,7,4,10,2,8,5,11} }; + #define KHz (1000UL) #define MHz (1000*KHz) diff --git a/openair1/SIMULATION/NR_PHY/pbchsim.c b/openair1/SIMULATION/NR_PHY/pbchsim.c index 2670b78917..0e648c945f 100644 --- a/openair1/SIMULATION/NR_PHY/pbchsim.c +++ b/openair1/SIMULATION/NR_PHY/pbchsim.c @@ -160,7 +160,6 @@ int main(int argc, char **argv) int **txdata; double **s_re,**s_im,**r_re,**r_im; //double iqim = 0.0; - double DS_TDL = .03; double ip =0.0; //unsigned char pbch_pdu[6]; // int sync_pos, sync_pos_slot; @@ -274,21 +273,6 @@ int main(int argc, char **argv) case 'G': channel_model=ETU; break; - - case 'H': - channel_model = TDL_C; - DS_TDL = .030; // 30 ns - break; - - case 'I': - channel_model = TDL_C; - DS_TDL = .3; // 300ns - break; - - case 'J': - channel_model=TDL_D; - DS_TDL = .03; - break; default: printf("Unsupported channel model! Exiting.\n"); @@ -545,8 +529,10 @@ int main(int argc, char **argv) channel_model, fs, bw, - DS_TDL, - 0, 0, 0, 0); + 300e-9, + 0, + 0, + 0, 0); if (gNB2UE==NULL) { printf("Problem generating channel model. Exiting.\n"); @@ -689,16 +675,6 @@ int main(int argc, char **argv) frame_parms->ofdm_symbol_size + frame_parms->nb_prefix_samples); printf("txlev %d (%f)\n",txlev,10*log10(txlev));*/ -<<<<<<< HEAD - - for (i=0; inb_antennas_tx; aa++) { - s_re[aa][i] = ((double)(((short *)txdata[aa]))[(i<<1)]); - s_im[aa][i] = ((double)(((short *)txdata[aa]))[(i<<1)+1]); - } - } -======= ->>>>>>> origin/develop for (SNR=snr0; SNRnb_antennas_tx; aa++) { - memcpy(r_re[aa],s_re[aa],frame_length_complex_samples*sizeof(double)); - memcpy(r_im[aa],s_im[aa],frame_length_complex_samples*sizeof(double)); - } - } - -======= for (i=0; inb_antennas_tx; aa++) { r_re[aa][i] = ((double)(((short *)txdata[aa]))[(i<<1)]); @@ -730,7 +693,6 @@ int main(int argc, char **argv) // multipath channel //multipath_channel(gNB2UE,s_re,s_im,r_re,r_im,frame_length_complex_samples,0); ->>>>>>> origin/develop //AWGN sigma2_dB = 20*log10((double)AMP/4)-SNR; sigma2 = pow(10,sigma2_dB/10); @@ -786,44 +748,18 @@ int main(int argc, char **argv) while (!((SSB_positions >> ssb_index) & 0x01)) ssb_index++; // to select the first transmitted ssb UE->symbol_offset = nr_get_ssb_start_symbol(frame_parms,ssb_index); - int ssb_slot = (UE->symbol_offset/14)+(n_hf*(frame_parms->slots_per_frame>>1)); - - for(int j = 0; j < frame_parms->symbols_per_slot; j++) - { + int ssb_slot = (UE->symbol_offset/14)+(n_hf*(frame_parms->slots_per_frame>>1)); + for (int i=UE->symbol_offset+1; isymbol_offset+4; i++) { nr_slot_fep(UE, &proc, - j%frame_parms->symbols_per_slot, + i%frame_parms->symbols_per_slot, ssb_slot); - } -<<<<<<< HEAD - for (int i=UE->symbol_offset+1; isymbol_offset+4; i++) { - nr_pbch_channel_estimation(UE,&proc,0,ssb_slot,i%frame_parms->symbols_per_slot,i-(UE->symbol_offset+1),ssb_index%8,n_hf); - } - - UE->prs_cfg.PRSResourceSetPeriod[0]=40; // PRS resource slot period - UE->prs_cfg.PRSResourceSetPeriod[1]=0; // resource slot offset - UE->prs_cfg.SymbolStart=7; - UE->prs_cfg.NumPRSSymbols=4; - UE->prs_cfg.NumRB=frame_parms->N_RB_DL; - UE->prs_cfg.RBOffset=0; - UE->prs_cfg.CombSize=2; - UE->prs_cfg.REOffset=0; - UE->prs_cfg.PRSResourceOffset=0; - UE->prs_cfg.PRSResourceRepetition=1; - UE->prs_cfg.PRSResourceTimeGap=1; - UE->prs_cfg.NPRSID=0; - - //PRS channel estimation - nr_prs_channel_estimation(UE,&proc,frame_parms); - -======= nr_pbch_channel_estimation(UE,estimateSz, dl_ch_estimates, dl_ch_estimates_time, &proc, 0,ssb_slot,i%frame_parms->symbols_per_slot,i-(UE->symbol_offset+1),ssb_index%8,n_hf); } fapiPbch_t result; ->>>>>>> origin/develop ret = nr_rx_pbch(UE, &proc, estimateSz, dl_ch_estimates, diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c index b5e90a4dcc..5e87949522 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c @@ -47,14 +47,14 @@ static void nr_fill_nfapi_pucch(gNB_MAC_INST *nrmac, { nfapi_nr_ul_tti_request_t *future_ul_tti_req = &nrmac->UL_tti_req_ahead[0][pucch->ul_slot]; - AssertFatal(future_ul_tti_req->SFN == pucch->frame - && future_ul_tti_req->Slot == pucch->ul_slot, - "Current %4d.%2d : future UL_tti_req's frame.slot %4d.%2d does not match PUCCH %4d.%2d\n", - frame,slot, - future_ul_tti_req->SFN, - future_ul_tti_req->Slot, - pucch->frame, - pucch->ul_slot); + if (future_ul_tti_req->SFN != pucch->frame || future_ul_tti_req->Slot != pucch->ul_slot) + LOG_W(MAC, + "Current %d.%d : future UL_tti_req's frame.slot %4d.%2d does not match PUCCH %4d.%2d\n", + frame,slot, + future_ul_tti_req->SFN, + future_ul_tti_req->Slot, + pucch->frame, + pucch->ul_slot); // n_pdus is number of pdus, so, in the array, it is the index of the next free element if (future_ul_tti_req->n_pdus >= sizeofArray(future_ul_tti_req->pdus_list) ) { LOG_E(NR_MAC,"future_ul_tti_req->n_pdus %d is full, slot: %d, sr flag %d dropping request\n", diff --git a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c index 5c51c4a1cd..cefafcba80 100644 --- a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c +++ b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c @@ -44,7 +44,6 @@ #include "openair2/RRC/NR_UE/rrc_proto.h" #include "openair2/RRC/NR_UE/rrc_vars.h" #include "openair2/GNB_APP/L1_nr_paramdef.h" -#include "openair2/GNB_APP/prs_nr_paramdef.h" #include "openair2/GNB_APP/gnb_paramdef.h" #include "targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h" #include @@ -1343,103 +1342,3 @@ void RCconfig_nr_ue_L1(void) { } } } - -void RCconfig_nrUE_prs(void *cfg) -{ - int j = 0, k = 0, gNB_id = 0; - char aprefix[MAX_OPTNAME_SIZE*2 + 8]; - PHY_VARS_NR_UE *ue = (PHY_VARS_NR_UE *)cfg; - - paramlist_def_t gParamList = {CONFIG_STRING_PRS_LIST,NULL,0}; - paramdef_t gParams[] = PRS_GLOBAL_PARAMS_DESC; - config_getlist( &gParamList,gParams,sizeof(gParams)/sizeof(paramdef_t), NULL); - ue->prs_active_gNBs = *(gParamList.paramarray[j][PRS_ACTIVE_GNBS_IDX].uptr); - - paramlist_def_t PRS_ParamList = {{0},NULL,0}; - for(int i = 0; i < ue->prs_active_gNBs; i++) - { - paramdef_t PRS_Params[] = PRS_PARAMS_DESC; - sprintf(PRS_ParamList.listname, "%s%i", CONFIG_STRING_PRS_CONFIG, i); - - sprintf(aprefix, "%s.[%i]", CONFIG_STRING_PRS_LIST, 0); - config_getlist( &PRS_ParamList,PRS_Params,sizeof(PRS_Params)/sizeof(paramdef_t), aprefix); - - if (PRS_ParamList.numelt > 0) { - for (j = 0; j < PRS_ParamList.numelt; j++) { - gNB_id = *(PRS_ParamList.paramarray[j][PRS_GNB_ID].uptr); - if(gNB_id != i) gNB_id = i; // force gNB_id to avoid mismatch - - ue->prs_vars[gNB_id]->NumPRSResources = *(PRS_ParamList.paramarray[j][NUM_PRS_RESOURCES].uptr); - for (k = 0; k < ue->prs_vars[gNB_id]->NumPRSResources; k++) - { - ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.PRSResourceSetPeriod[0] = PRS_ParamList.paramarray[j][PRS_RESOURCE_SET_PERIOD_LIST].uptr[0]; - ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.PRSResourceSetPeriod[1] = PRS_ParamList.paramarray[j][PRS_RESOURCE_SET_PERIOD_LIST].uptr[1]; - // per PRS resources parameters - ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.SymbolStart = PRS_ParamList.paramarray[j][PRS_SYMBOL_START_LIST].uptr[k]; - ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.NumPRSSymbols = PRS_ParamList.paramarray[j][PRS_NUM_SYMBOLS_LIST].uptr[k]; - ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.REOffset = PRS_ParamList.paramarray[j][PRS_RE_OFFSET_LIST].uptr[k]; - ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.NPRSID = PRS_ParamList.paramarray[j][PRS_ID_LIST].uptr[k]; - ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.PRSResourceOffset = PRS_ParamList.paramarray[j][PRS_RESOURCE_OFFSET_LIST].uptr[k]; - // Common parameters to all PRS resources - ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.NumRB = *(PRS_ParamList.paramarray[j][PRS_NUM_RB].uptr); - ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.RBOffset = *(PRS_ParamList.paramarray[j][PRS_RB_OFFSET].uptr); - ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.CombSize = *(PRS_ParamList.paramarray[j][PRS_COMB_SIZE].uptr); - ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.PRSResourceRepetition = *(PRS_ParamList.paramarray[j][PRS_RESOURCE_REPETITION].uptr); - ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.PRSResourceTimeGap = *(PRS_ParamList.paramarray[j][PRS_RESOURCE_TIME_GAP].uptr); - - ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.MutingBitRepetition = *(PRS_ParamList.paramarray[j][PRS_MUTING_BIT_REPETITION].uptr); - for (int l = 0; l < PRS_ParamList.paramarray[j][PRS_MUTING_PATTERN1_LIST].numelt; l++) - ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.MutingPattern1[l] = PRS_ParamList.paramarray[j][PRS_MUTING_PATTERN1_LIST].uptr[l]; - for (int l = 0; l < PRS_ParamList.paramarray[j][PRS_MUTING_PATTERN2_LIST].numelt; l++) - ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.MutingPattern2[l] = PRS_ParamList.paramarray[j][PRS_MUTING_PATTERN2_LIST].uptr[l]; - } // for k - - k = 0; - LOG_I(PHY, "-----------------------------------------\n"); - LOG_I(PHY, "PRS Config for gNB_id %d @ %p\n", gNB_id, &ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg); - LOG_I(PHY, "-----------------------------------------\n"); - LOG_I(PHY, "NumPRSResources \t%d\n", ue->prs_vars[gNB_id]->NumPRSResources); - LOG_I(PHY, "PRSResourceSetPeriod \t[%d, %d]\n", ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.PRSResourceSetPeriod[0], ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.PRSResourceSetPeriod[1]); - LOG_I(PHY, "NumRB \t\t\t%d\n", ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.NumRB); - LOG_I(PHY, "RBOffset \t\t%d\n", ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.RBOffset); - LOG_I(PHY, "CombSize \t\t%d\n", ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.CombSize); - LOG_I(PHY, "PRSResourceRepetition \t%d\n", ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.PRSResourceRepetition); - LOG_I(PHY, "PRSResourceTimeGap \t%d\n", ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.PRSResourceTimeGap); - LOG_I(PHY, "MutingBitRepetition \t%d\n", ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.MutingBitRepetition); - LOG_I(PHY, "SymbolStart \t\t["); - for (k = 0; k < ue->prs_vars[gNB_id]->NumPRSResources; k++) - printf("%d, ", ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.SymbolStart); - printf("\b\b]\n"); - LOG_I(PHY, "NumPRSSymbols \t\t["); - for (k = 0; k < ue->prs_vars[gNB_id]->NumPRSResources; k++) - printf("%d, ", ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.NumPRSSymbols); - printf("\b\b]\n"); - LOG_I(PHY, "REOffset \t\t["); - for (k = 0; k < ue->prs_vars[gNB_id]->NumPRSResources; k++) - printf("%d, ", ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.REOffset); - printf("\b\b]\n"); - LOG_I(PHY, "PRSResourceOffset \t["); - for (k = 0; k < ue->prs_vars[gNB_id]->NumPRSResources; k++) - printf("%d, ", ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.PRSResourceOffset); - printf("\b\b]\n"); - LOG_I(PHY, "NPRS_ID \t\t["); - for (k = 0; k < ue->prs_vars[gNB_id]->NumPRSResources; k++) - printf("%d, ", ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.NPRSID); - printf("\b\b]\n"); - LOG_I(PHY, "MutingPattern1 \t\t["); - for (int l = 0, k = 0; l < PRS_ParamList.paramarray[j][PRS_MUTING_PATTERN1_LIST].numelt; l++) - printf("%d, ", ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.MutingPattern1[l]); - printf("\b\b]\n"); - LOG_I(PHY, "MutingPattern2 \t\t["); - for (int l = 0, k = 0; l < PRS_ParamList.paramarray[j][PRS_MUTING_PATTERN2_LIST].numelt; l++) - printf("%d, ", ue->prs_vars[gNB_id]->prs_resource[k].prs_cfg.MutingPattern2[l]); - printf("\b\b]\n"); - LOG_I(PHY, "-----------------------------------------\n"); - } - } - else - { - LOG_I(NR_PHY,"No %s configuration found\n", PRS_ParamList.listname); - } - } -} diff --git a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h index 45ac8e2a7d..65bbf9a5a0 100755 --- a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h +++ b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h @@ -284,7 +284,6 @@ int handle_bcch_dlsch(module_id_t module_id, int cc_id, unsigned int gNB_index, int handle_dci(module_id_t module_id, int cc_id, unsigned int gNB_index, frame_t frame, int slot, fapi_nr_dci_indication_pdu_t *dci); -void RCconfig_nrUE_prs(void *cfg); #endif