From 102ec93096e11186de176636449eebe3a4058369 Mon Sep 17 00:00:00 2001 From: Francesco Mani Date: Mon, 11 Feb 2019 18:45:28 +0100 Subject: [PATCH 01/31] first implementation of multiple ssb at gnb --- openair1/PHY/INIT/nr_parms.c | 3 + openair1/PHY/NR_TRANSPORT/nr_pbch.c | 1 - openair1/PHY/NR_TRANSPORT/nr_pss.c | 1 - openair1/PHY/defs_nr_common.h | 5 +- openair1/SCHED_NR/phy_procedures_nr_gNB.c | 90 ++++++++++++++++------- 5 files changed, 68 insertions(+), 32 deletions(-) diff --git a/openair1/PHY/INIT/nr_parms.c b/openair1/PHY/INIT/nr_parms.c index f37883b388..273bfbfe1a 100644 --- a/openair1/PHY/INIT/nr_parms.c +++ b/openair1/PHY/INIT/nr_parms.c @@ -46,7 +46,10 @@ int nr_init_frame_parms0(NR_DL_FRAME_PARMS *fp, fp->numerology_index = mu; fp->Ncp = Ncp; fp->N_RB_DL = N_RB_DL; + fp->L_ssb = 8; // TODO get the number of SSB value from higher layers (and config file finally) + fp->ssb_type = nr_ssb_type_B; // TODO get the type from higher layers (and config file finally) + switch(mu) { case NR_MU_0: //15kHz scs diff --git a/openair1/PHY/NR_TRANSPORT/nr_pbch.c b/openair1/PHY/NR_TRANSPORT/nr_pbch.c index 2e2c99f106..3b81aae04e 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_pbch.c +++ b/openair1/PHY/NR_TRANSPORT/nr_pbch.c @@ -443,6 +443,5 @@ int nr_generate_pbch(NR_gNB_PBCH *pbch, k-=frame_parms->ofdm_symbol_size; } - return 0; } diff --git a/openair1/PHY/NR_TRANSPORT/nr_pss.c b/openair1/PHY/NR_TRANSPORT/nr_pss.c index 29dbe4ec99..e0d7b6ae33 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_pss.c +++ b/openair1/PHY/NR_TRANSPORT/nr_pss.c @@ -59,7 +59,6 @@ int nr_generate_pss( int16_t *d_pss, /// Resource mapping a = amp; - // PSS occupies a predefined position (subcarriers 56-182, symbol 0) within the SSB block starting from k = frame_parms->first_carrier_offset + frame_parms->ssb_start_subcarrier + 56; //and if (k>= frame_parms->ofdm_symbol_size) k-=frame_parms->ofdm_symbol_size; diff --git a/openair1/PHY/defs_nr_common.h b/openair1/PHY/defs_nr_common.h index 58a8833b18..8f6f22f6a4 100644 --- a/openair1/PHY/defs_nr_common.h +++ b/openair1/PHY/defs_nr_common.h @@ -303,11 +303,13 @@ typedef struct NR_DL_FRAME_PARMS { /// TDD configuration uint16_t tdd_uplink_nr[2*NR_MAX_SLOTS_PER_FRAME]; /* this is a bitmap of symbol of each slot given for 2 frames */ - //SSB related params + //SSB related params /// Start in Subcarrier index of the SSB block uint16_t ssb_start_subcarrier; /// SSB type nr_ssb_type_e ssb_type; + /// Number of SSB + uint8_t L_ssb; /// PBCH polar encoder params t_nrPolar_params pbch_polar_params; @@ -317,5 +319,4 @@ typedef struct NR_DL_FRAME_PARMS { } NR_DL_FRAME_PARMS; - #endif diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index a7f8ef6884..6827b082d1 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -76,28 +76,47 @@ int return_ssb_type(nfapi_config_request_t *cfg) }*/ + // First SSB starting symbol candidate is used and type B is chosen for 30kHz SCS -int nr_get_ssb_start_symbol(nfapi_nr_config_request_t *cfg, NR_DL_FRAME_PARMS *fp) +int nr_get_ssb_start_symbol(nfapi_nr_config_request_t *cfg, NR_DL_FRAME_PARMS *fp, uint8_t i_ssb) { int mu = cfg->subframe_config.numerology_index_mu.value; int symbol = 0; + uint8_t n, n_temp; + nr_ssb_type_e type = fp->ssb_type; + int case_AC[2] = {2,8}; + int case_BD[4] = {4,8,16,20}; + int case_E[8] = {8, 12, 16, 20, 32, 36, 40, 44}; + switch(mu) { - case NR_MU_0: - symbol = 2; + case NR_MU_0: // case A + n = i_ssb >> 1; + symbol = case_AC[i_ssb % 2] + 14*n; break; - case NR_MU_1: // case B - symbol = 4; + case NR_MU_1: + if (type == 1){ // case B + n = i_ssb >> 2; + symbol = case_BD[i_ssb % 4] + 28*n; + } + if (type == 2){ // case C + n = i_ssb >> 1; + symbol = case_AC[i_ssb % 2] + 14*n; + } break; - case NR_MU_3: - symbol = 4; + case NR_MU_3: // case D + n_temp = i_ssb >> 2; + n = n_temp + (n_temp >> 2); + symbol = case_BD[i_ssb % 4] + 28*n; break; - case NR_MU_4: - symbol = 8; + case NR_MU_4: // case E + n_temp = i_ssb >> 3; + n = n_temp + (n_temp >> 2); + symbol = case_E[i_ssb % 8] + 56*n; break; default: @@ -122,33 +141,46 @@ void nr_common_signal_procedures (PHY_VARS_gNB *gNB,int frame, int slot) { nfapi_nr_config_request_t *cfg = &gNB->gNB_config; int **txdataF = gNB->common_vars.txdataF; uint8_t *pbch_pdu=&gNB->pbch_pdu[0]; - int ss_slot = (cfg->sch_config.half_frame_index.value)? 10 : 0; - uint8_t Lmax, ssb_index=0, n_hf=0; + // to set a effective slot number between 0 to 9 in the half frame where the SSB is supposed to be + uint8_t Lmax, ssb_index, n_hf; + int ssb_start_symbol, rel_slot; + + n_hf = cfg->sch_config.half_frame_index.value; + rel_slot = (n_hf)? (slot-10) : slot; + + Lmax = (fp->dl_CarrierFreq < 3e9)? 4:8; // max number of ssb + + if (fp->L_ssb > Lmax) + AssertFatal(0==1, "Invalid number of SSB larger than %d \n", Lmax); LOG_D(PHY,"common_signal_procedures: frame %d, slot %d\n",frame,slot); - int ssb_start_symbol = nr_get_ssb_start_symbol(cfg, fp); - nr_set_ssb_first_subcarrier(cfg, fp); - Lmax = (fp->dl_CarrierFreq < 3e9)? 4:8; - - - if (slot == ss_slot) + if(rel_slot<10 && rel_slot>=0) { - // Current implementation is based on SSB in first half frame, first candidate - LOG_D(PHY,"SS TX: frame %d, slot %d, start_symbol %d\n",frame,slot, ssb_start_symbol); + for (int i=0; i<2; i++) // max two SSB per frame + { + ssb_index = i + 2*rel_slot; // computing the ssb_index + if (ssb_index < (fp->L_ssb)) // generating the ssb only if the current ssb index is lower than number of SSB configured + { + int ssb_start_symbol_abs = nr_get_ssb_start_symbol(cfg, fp, ssb_index); // computing the starting symbol for current ssb + ssb_start_symbol = ssb_start_symbol_abs % 14; // start symbol wrt slot - nr_generate_pss(gNB->d_pss, txdataF[0], AMP, ssb_start_symbol, cfg, fp); - nr_generate_sss(gNB->d_sss, txdataF[0], AMP, ssb_start_symbol, cfg, fp); + nr_set_ssb_first_subcarrier(cfg, fp); + + LOG_D(PHY,"SS TX: frame %d, slot %d, start_symbol %d\n",frame,slot, ssb_start_symbol); - if (!(frame&7)){ - LOG_D(PHY,"%d.%d : pbch_configured %d\n",frame,slot,gNB->pbch_configured); - if (gNB->pbch_configured != 1)return; - gNB->pbch_configured = 0; - } + nr_generate_pss(gNB->d_pss, txdataF[0], AMP, ssb_start_symbol, cfg, fp); + nr_generate_sss(gNB->d_sss, txdataF[0], AMP, ssb_start_symbol, cfg, fp); - nr_generate_pbch_dmrs(gNB->nr_gold_pbch_dmrs[n_hf][ssb_index],txdataF[0], AMP, ssb_start_symbol, cfg, fp); + if (!(frame&7)){ + LOG_D(PHY,"%d.%d : pbch_configured %d\n",frame,slot,gNB->pbch_configured); + if (gNB->pbch_configured != 1)return; + gNB->pbch_configured = 0; + } - nr_generate_pbch(&gNB->pbch, + nr_generate_pbch_dmrs(gNB->nr_gold_pbch_dmrs[n_hf][ssb_index],txdataF[0], AMP, ssb_start_symbol, cfg, fp); + + nr_generate_pbch(&gNB->pbch, gNB->nrPolar_params, pbch_pdu, gNB->nr_pbch_interleaver, @@ -157,6 +189,8 @@ void nr_common_signal_procedures (PHY_VARS_gNB *gNB,int frame, int slot) { ssb_start_symbol, n_hf,Lmax,ssb_index, frame, cfg, fp); + } + } } } From 0a9ea26b9ec9926bb53d6a6c32acc0663eb512d0 Mon Sep 17 00:00:00 2001 From: Francesco Mani Date: Tue, 12 Feb 2019 10:28:57 +0100 Subject: [PATCH 02/31] bit-wise choice of SSB to transmit --- openair1/PHY/INIT/nr_parms.c | 2 +- openair1/PHY/defs_nr_common.h | 2 +- openair1/SCHED_NR/phy_procedures_nr_gNB.c | 9 +++------ 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/openair1/PHY/INIT/nr_parms.c b/openair1/PHY/INIT/nr_parms.c index 273bfbfe1a..b8aa48c10b 100644 --- a/openair1/PHY/INIT/nr_parms.c +++ b/openair1/PHY/INIT/nr_parms.c @@ -46,7 +46,7 @@ int nr_init_frame_parms0(NR_DL_FRAME_PARMS *fp, fp->numerology_index = mu; fp->Ncp = Ncp; fp->N_RB_DL = N_RB_DL; - fp->L_ssb = 8; // TODO get the number of SSB value from higher layers (and config file finally) + fp->L_ssb = 255; // TODO get the number of SSB value from higher layers (and config file finally) fp->ssb_type = nr_ssb_type_B; // TODO get the type from higher layers (and config file finally) diff --git a/openair1/PHY/defs_nr_common.h b/openair1/PHY/defs_nr_common.h index 8f6f22f6a4..0d491b887d 100644 --- a/openair1/PHY/defs_nr_common.h +++ b/openair1/PHY/defs_nr_common.h @@ -309,7 +309,7 @@ typedef struct NR_DL_FRAME_PARMS { /// SSB type nr_ssb_type_e ssb_type; /// Number of SSB - uint8_t L_ssb; + uint64_t L_ssb; /// PBCH polar encoder params t_nrPolar_params pbch_polar_params; diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index 6827b082d1..e89c0480d0 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -150,9 +150,6 @@ void nr_common_signal_procedures (PHY_VARS_gNB *gNB,int frame, int slot) { Lmax = (fp->dl_CarrierFreq < 3e9)? 4:8; // max number of ssb - if (fp->L_ssb > Lmax) - AssertFatal(0==1, "Invalid number of SSB larger than %d \n", Lmax); - LOG_D(PHY,"common_signal_procedures: frame %d, slot %d\n",frame,slot); if(rel_slot<10 && rel_slot>=0) @@ -160,7 +157,7 @@ void nr_common_signal_procedures (PHY_VARS_gNB *gNB,int frame, int slot) { for (int i=0; i<2; i++) // max two SSB per frame { ssb_index = i + 2*rel_slot; // computing the ssb_index - if (ssb_index < (fp->L_ssb)) // generating the ssb only if the current ssb index is lower than number of SSB configured + if ((fp->L_ssb >> ssb_index) & 0x01) // generating the ssb only if the bit of L_ssb at current ssb index is 1 { int ssb_start_symbol_abs = nr_get_ssb_start_symbol(cfg, fp, ssb_index); // computing the starting symbol for current ssb ssb_start_symbol = ssb_start_symbol_abs % 14; // start symbol wrt slot @@ -229,7 +226,7 @@ void phy_procedures_gNB_TX(PHY_VARS_gNB *gNB, num_dci = gNB->pdcch_vars.num_dci; num_pdsch_rnti = gNB->pdcch_vars.num_pdsch_rnti; - if (num_dci) { + /*if (num_dci) { LOG_I(PHY, "[gNB %d] Frame %d slot %d \ Calling nr_generate_dci_top (number of DCI %d)\n", gNB->Mod_id, frame, slot, num_dci); @@ -248,7 +245,7 @@ void phy_procedures_gNB_TX(PHY_VARS_gNB *gNB, AMP, slot, *fp, *cfg); } } - } + }*/ VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_TX+offset,0); } From 0348ce15981309d494fa6167850002691ff93b22 Mon Sep 17 00:00:00 2001 From: Francesco Mani Date: Tue, 12 Feb 2019 11:50:21 +0100 Subject: [PATCH 03/31] bug fix in nr gold for pbch --- openair1/PHY/NR_REFSIG/nr_gold.c | 2 +- openair1/PHY/NR_REFSIG/nr_gold_ue.c | 2 +- openair1/SCHED_NR/phy_procedures_nr_gNB.c | 5 ++--- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/openair1/PHY/NR_REFSIG/nr_gold.c b/openair1/PHY/NR_REFSIG/nr_gold.c index 968f7fa7a4..08e6022764 100644 --- a/openair1/PHY/NR_REFSIG/nr_gold.c +++ b/openair1/PHY/NR_REFSIG/nr_gold.c @@ -38,7 +38,7 @@ void nr_init_pbch_dmrs(PHY_VARS_gNB* gNB) for (n_hf = 0; n_hf < N_hf; n_hf++) { for (l = 0; l < Lmax ; l++) { i_ssb = l & (Lmax-1); - i_ssb2 = (i_ssb<<2) + n_hf; + i_ssb2 = i_ssb + (n_hf<<2); reset = 1; x2 = (1<<11) * (i_ssb2 + 1) * ((Nid>>2) + 1) + (1<<6) * (i_ssb2 + 1) + (Nid&3); diff --git a/openair1/PHY/NR_REFSIG/nr_gold_ue.c b/openair1/PHY/NR_REFSIG/nr_gold_ue.c index 3bb8745875..78b92959e1 100644 --- a/openair1/PHY/NR_REFSIG/nr_gold_ue.c +++ b/openair1/PHY/NR_REFSIG/nr_gold_ue.c @@ -37,7 +37,7 @@ void nr_gold_pbch(PHY_VARS_NR_UE* ue) for (l = 0; l < Lmax ; l++) { i_ssb = l & (Lmax-1); - i_ssb2 = (i_ssb<<2) + n_hf; + i_ssb2 = i_ssb + (n_hf<<2); x1 = 1 + (1<<31); x2 = (1<<11) * (i_ssb2 + 1) * ((Nid>>2) + 1) + (1<<6) * (i_ssb2 + 1) + (Nid&3); diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index e89c0480d0..674021d99f 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -165,7 +165,6 @@ void nr_common_signal_procedures (PHY_VARS_gNB *gNB,int frame, int slot) { nr_set_ssb_first_subcarrier(cfg, fp); LOG_D(PHY,"SS TX: frame %d, slot %d, start_symbol %d\n",frame,slot, ssb_start_symbol); - nr_generate_pss(gNB->d_pss, txdataF[0], AMP, ssb_start_symbol, cfg, fp); nr_generate_sss(gNB->d_sss, txdataF[0], AMP, ssb_start_symbol, cfg, fp); @@ -226,7 +225,7 @@ void phy_procedures_gNB_TX(PHY_VARS_gNB *gNB, num_dci = gNB->pdcch_vars.num_dci; num_pdsch_rnti = gNB->pdcch_vars.num_pdsch_rnti; - /*if (num_dci) { + if (num_dci) { LOG_I(PHY, "[gNB %d] Frame %d slot %d \ Calling nr_generate_dci_top (number of DCI %d)\n", gNB->Mod_id, frame, slot, num_dci); @@ -245,7 +244,7 @@ void phy_procedures_gNB_TX(PHY_VARS_gNB *gNB, AMP, slot, *fp, *cfg); } } - }*/ + } VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_TX+offset,0); } From 186269cd5d690556c7e4dcbac25b4715dec95616 Mon Sep 17 00:00:00 2001 From: Francesco Mani Date: Tue, 12 Feb 2019 15:37:24 +0100 Subject: [PATCH 04/31] removed pbch_configured issue for frames multiple of 8 --- openair1/SCHED_NR/phy_procedures_nr_gNB.c | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index 674021d99f..bfa785095b 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -141,11 +141,11 @@ void nr_common_signal_procedures (PHY_VARS_gNB *gNB,int frame, int slot) { nfapi_nr_config_request_t *cfg = &gNB->gNB_config; int **txdataF = gNB->common_vars.txdataF; uint8_t *pbch_pdu=&gNB->pbch_pdu[0]; - // to set a effective slot number between 0 to 9 in the half frame where the SSB is supposed to be uint8_t Lmax, ssb_index, n_hf; int ssb_start_symbol, rel_slot; n_hf = cfg->sch_config.half_frame_index.value; + // to set a effective slot number between 0 to 9 in the half frame where the SSB is supposed to be rel_slot = (n_hf)? (slot-10) : slot; Lmax = (fp->dl_CarrierFreq < 3e9)? 4:8; // max number of ssb @@ -162,18 +162,12 @@ void nr_common_signal_procedures (PHY_VARS_gNB *gNB,int frame, int slot) { int ssb_start_symbol_abs = nr_get_ssb_start_symbol(cfg, fp, ssb_index); // computing the starting symbol for current ssb ssb_start_symbol = ssb_start_symbol_abs % 14; // start symbol wrt slot - nr_set_ssb_first_subcarrier(cfg, fp); + nr_set_ssb_first_subcarrier(cfg, fp); // setting the first subcarrier LOG_D(PHY,"SS TX: frame %d, slot %d, start_symbol %d\n",frame,slot, ssb_start_symbol); nr_generate_pss(gNB->d_pss, txdataF[0], AMP, ssb_start_symbol, cfg, fp); nr_generate_sss(gNB->d_sss, txdataF[0], AMP, ssb_start_symbol, cfg, fp); - if (!(frame&7)){ - LOG_D(PHY,"%d.%d : pbch_configured %d\n",frame,slot,gNB->pbch_configured); - if (gNB->pbch_configured != 1)return; - gNB->pbch_configured = 0; - } - nr_generate_pbch_dmrs(gNB->nr_gold_pbch_dmrs[n_hf][ssb_index],txdataF[0], AMP, ssb_start_symbol, cfg, fp); nr_generate_pbch(&gNB->pbch, From db1eb5d92118e9f98905669c429e83d37be38820 Mon Sep 17 00:00:00 2001 From: Francesco Mani Date: Wed, 13 Feb 2019 17:49:16 +0100 Subject: [PATCH 05/31] CellID taken from config file --- openair2/LAYER2/NR_MAC_gNB/config.c | 5 +++++ openair2/LAYER2/NR_MAC_gNB/mac_proto.h | 1 + openair2/RRC/NR/rrc_gNB.c | 3 ++- 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/openair2/LAYER2/NR_MAC_gNB/config.c b/openair2/LAYER2/NR_MAC_gNB/config.c index 30917fd543..9b2a61b39e 100644 --- a/openair2/LAYER2/NR_MAC_gNB/config.c +++ b/openair2/LAYER2/NR_MAC_gNB/config.c @@ -184,6 +184,7 @@ void config_nr_mib(int Mod_idP, void config_common(int Mod_idP, int CC_idP, + int cellid, int nr_bandP, uint64_t dl_CarrierFreqP, uint32_t dl_BandwidthP @@ -193,6 +194,8 @@ void config_common(int Mod_idP, int mu = 1; + cfg->sch_config.physical_cell_id.value = cellid; + // FDD cfg->subframe_config.duplex_mode.value = 1; cfg->subframe_config.duplex_mode.tl.tag = NFAPI_SUBFRAME_CONFIG_DUPLEX_MODE_TAG; @@ -232,6 +235,7 @@ void config_common(int Mod_idP, int rrc_mac_config_req_gNB(module_id_t Mod_idP, int CC_idP, + int cellid, int p_gNB, int nr_bandP, uint64_t dl_CarrierFreqP, @@ -261,6 +265,7 @@ int rrc_mac_config_req_gNB(module_id_t Mod_idP, if( servingcellconfigcommon != NULL ){ config_common(Mod_idP, CC_idP, + cellid, nr_bandP, dl_CarrierFreqP, dl_BandwidthP diff --git a/openair2/LAYER2/NR_MAC_gNB/mac_proto.h b/openair2/LAYER2/NR_MAC_gNB/mac_proto.h index 784496ff9e..94226f4f8e 100644 --- a/openair2/LAYER2/NR_MAC_gNB/mac_proto.h +++ b/openair2/LAYER2/NR_MAC_gNB/mac_proto.h @@ -38,6 +38,7 @@ void mac_top_init_gNB(void); int rrc_mac_config_req_gNB(module_id_t Mod_idP, int CC_id, + int cellid, int p_gNB, int nr_bandP, uint64_t dl_CarrierFreqP, diff --git a/openair2/RRC/NR/rrc_gNB.c b/openair2/RRC/NR/rrc_gNB.c index 10fc6b6a4e..bbf6e475e7 100644 --- a/openair2/RRC/NR/rrc_gNB.c +++ b/openair2/RRC/NR/rrc_gNB.c @@ -236,7 +236,7 @@ static void init_NR_SI(const protocol_ctxt_t* const ctxt_pP, RC.nrrrc[ctxt_pP->module_id]->carrier[CC_id].Ncp_UL = configuration->UL_prefix_type[CC_id]; RC.nrrrc[ctxt_pP->module_id]->carrier[CC_id].dl_CarrierFreq = configuration->downlink_frequency[CC_id]; RC.nrrrc[ctxt_pP->module_id]->carrier[CC_id].ul_CarrierFreq = configuration->downlink_frequency[CC_id]+ configuration->uplink_frequency_offset[CC_id]; - + ///MIB RC.nrrrc[ctxt_pP->module_id]->carrier[CC_id].sizeof_MIB = 0; RC.nrrrc[ctxt_pP->module_id]->carrier[CC_id].MIB = (uint8_t*) malloc16(4); @@ -264,6 +264,7 @@ static void init_NR_SI(const protocol_ctxt_t* const ctxt_pP, rrc_mac_config_req_gNB(ctxt_pP->module_id, CC_id, + RC.nrrrc[ctxt_pP->module_id]->carrier[CC_id].physCellId, RC.nrrrc[ctxt_pP->module_id]->carrier[CC_id].p_gNB, configuration->nr_band[CC_id], RC.nrrrc[ctxt_pP->module_id]->carrier[CC_id].dl_CarrierFreq, From 5c2f57369d0032b6c5b5edf7cd77313ea05beafe Mon Sep 17 00:00:00 2001 From: Francesco Mani Date: Thu, 14 Feb 2019 16:29:35 +0100 Subject: [PATCH 06/31] Implementation of SS block pattern choice --- openair1/PHY/INIT/nr_parms.c | 18 +++++++++++++++--- .../CONF/gnb.band78.tm1.106PRB.usrpx300.conf | 4 ++-- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/openair1/PHY/INIT/nr_parms.c b/openair1/PHY/INIT/nr_parms.c index b8aa48c10b..f67170a69d 100644 --- a/openair1/PHY/INIT/nr_parms.c +++ b/openair1/PHY/INIT/nr_parms.c @@ -47,20 +47,29 @@ int nr_init_frame_parms0(NR_DL_FRAME_PARMS *fp, fp->Ncp = Ncp; fp->N_RB_DL = N_RB_DL; fp->L_ssb = 255; // TODO get the number of SSB value from higher layers (and config file finally) - fp->ssb_type = nr_ssb_type_B; // TODO get the type from higher layers (and config file finally) - switch(mu) { case NR_MU_0: //15kHz scs fp->subcarrier_spacing = nr_subcarrier_spacing[NR_MU_0]; fp->slots_per_subframe = nr_slots_per_subframe[NR_MU_0]; + fp->ssb_type = nr_ssb_type_A; break; case NR_MU_1: //30kHz scs fp->subcarrier_spacing = nr_subcarrier_spacing[NR_MU_1]; fp->slots_per_subframe = nr_slots_per_subframe[NR_MU_1]; + // selection of SS block pattern according to TS 38101-1 Table 5.4.3.3-1 for SCS 30kHz + if (fp->eutra_band == 5 || fp->eutra_band == 66) + fp->ssb_type = nr_ssb_type_B; + else{ + if (fp->eutra_band == 41 || ( fp->eutra_band > 76 && fp->eutra_band < 80) ) + fp->ssb_type = nr_ssb_type_C; + else + AssertFatal(1==0,"NR Operating Band n%d not available for SS block SCS with mu=%d\n", fp->eutra_band, mu); + } + switch(N_RB_DL){ case 11: case 24: @@ -147,11 +156,13 @@ int nr_init_frame_parms0(NR_DL_FRAME_PARMS *fp, case NR_MU_3: fp->subcarrier_spacing = nr_subcarrier_spacing[NR_MU_3]; fp->slots_per_subframe = nr_slots_per_subframe[NR_MU_3]; + fp->ssb_type = nr_ssb_type_D; break; case NR_MU_4: fp->subcarrier_spacing = nr_subcarrier_spacing[NR_MU_4]; fp->slots_per_subframe = nr_slots_per_subframe[NR_MU_4]; + fp->ssb_type = nr_ssb_type_E; break; default: @@ -184,7 +195,8 @@ int nr_init_frame_parms(nfapi_nr_config_request_t* config, NR_DL_FRAME_PARMS *fp) { - + fp->eutra_band = config->nfapi_config.rf_bands.rf_band[0]; + fp->frame_type = !(config->subframe_config.duplex_mode.value); return nr_init_frame_parms0(fp, config->subframe_config.numerology_index_mu.value, config->subframe_config.dl_cyclic_prefix_type.value, diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpx300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpx300.conf index d62b06aaa5..f170d7ce87 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpx300.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpx300.conf @@ -26,10 +26,10 @@ gNBs = node_function = "3GPP_gNODEB"; node_timing = "synch_to_ext_device"; node_synch_ref = 0; - frame_type = "FDD"; + frame_type = "TDD"; DL_prefix_type = "NORMAL"; UL_prefix_type = "NORMAL"; - eutra_band = 22; + eutra_band = 78; downlink_frequency = 3510000000L; uplink_frequency_offset = -120000000; Nid_cell = 0; From 688830e83ec60c646ed416666f217d89884c9da3 Mon Sep 17 00:00:00 2001 From: Francesco Mani Date: Fri, 15 Feb 2019 17:01:58 +0100 Subject: [PATCH 07/31] SSB pattern now hardcoded in rrc, to be taken from config file in the next commit --- nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface.h | 8 ++++---- openair1/PHY/INIT/nr_init.c | 1 + openair1/PHY/INIT/nr_parms.c | 2 +- openair1/PHY/defs_nr_common.h | 2 +- openair1/SIMULATION/NR_PHY/dlsim.c | 6 +++++- openair2/LAYER2/NR_MAC_gNB/config.c | 9 ++++++++- openair2/LAYER2/NR_MAC_gNB/mac_proto.h | 3 ++- openair2/RRC/NR/rrc_gNB.c | 3 ++- 8 files changed, 24 insertions(+), 10 deletions(-) diff --git a/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface.h b/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface.h index 4273186dcf..1747e4f71b 100644 --- a/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface.h +++ b/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface.h @@ -28,12 +28,12 @@ typedef struct { /*typedef struct { nfapi_tl_t tl; int64_t value; -} nfapi_int64_tlv_t; +} nfapi_int64_tlv_t;*/ typedef struct { nfapi_tl_t tl; uint64_t value; -} nfapi_uint64_tlv_t;*/ +} nfapi_uint64_tlv_t; // nFAPI enums typedef enum { @@ -175,8 +175,8 @@ typedef struct { nfapi_uint16_tlv_t physical_cell_id; nfapi_uint16_tlv_t half_frame_index; nfapi_uint16_tlv_t ssb_subcarrier_offset; - nfapi_uint16_tlv_t ssb_sib1_position_in_burst; - nfapi_uint16_tlv_t ssb_scg_position_in_burst; + nfapi_uint16_tlv_t ssb_sib1_position_in_burst; // in sib1 + nfapi_uint64_tlv_t ssb_scg_position_in_burst; // in servingcellconfigcommon nfapi_uint16_tlv_t ssb_periodicity; nfapi_uint16_tlv_t ss_pbch_block_power; nfapi_uint16_tlv_t n_ssb_crb; diff --git a/openair1/PHY/INIT/nr_init.c b/openair1/PHY/INIT/nr_init.c index 1866eac96d..7f52c80992 100644 --- a/openair1/PHY/INIT/nr_init.c +++ b/openair1/PHY/INIT/nr_init.c @@ -438,6 +438,7 @@ void nr_phy_config_request(NR_PHY_Config_t *phy_config) gNB_config->sch_config.ssb_subcarrier_offset.value = phy_config->cfg->sch_config.ssb_subcarrier_offset.value;//0; gNB_config->sch_config.n_ssb_crb.value = (phy_config->cfg->rf_config.dl_carrier_bandwidth.value-20); gNB_config->sch_config.physical_cell_id.value = phy_config->cfg->sch_config.physical_cell_id.value; + gNB_config->sch_config.ssb_scg_position_in_burst.value= phy_config->cfg->sch_config.ssb_scg_position_in_burst.value; if (phy_config->cfg->subframe_config.duplex_mode.value == 0) { gNB_config->subframe_config.duplex_mode.value = TDD; diff --git a/openair1/PHY/INIT/nr_parms.c b/openair1/PHY/INIT/nr_parms.c index f67170a69d..a5eb2e659b 100644 --- a/openair1/PHY/INIT/nr_parms.c +++ b/openair1/PHY/INIT/nr_parms.c @@ -46,7 +46,6 @@ int nr_init_frame_parms0(NR_DL_FRAME_PARMS *fp, fp->numerology_index = mu; fp->Ncp = Ncp; fp->N_RB_DL = N_RB_DL; - fp->L_ssb = 255; // TODO get the number of SSB value from higher layers (and config file finally) switch(mu) { @@ -197,6 +196,7 @@ int nr_init_frame_parms(nfapi_nr_config_request_t* config, fp->eutra_band = config->nfapi_config.rf_bands.rf_band[0]; fp->frame_type = !(config->subframe_config.duplex_mode.value); + fp->L_ssb = config->sch_config.ssb_scg_position_in_burst.value; return nr_init_frame_parms0(fp, config->subframe_config.numerology_index_mu.value, config->subframe_config.dl_cyclic_prefix_type.value, diff --git a/openair1/PHY/defs_nr_common.h b/openair1/PHY/defs_nr_common.h index 0d491b887d..4267b79144 100644 --- a/openair1/PHY/defs_nr_common.h +++ b/openair1/PHY/defs_nr_common.h @@ -308,7 +308,7 @@ typedef struct NR_DL_FRAME_PARMS { uint16_t ssb_start_subcarrier; /// SSB type nr_ssb_type_e ssb_type; - /// Number of SSB + /// SS block pattern (max 64 ssb, each bit is on/off ssb) uint64_t L_ssb; /// PBCH polar encoder params t_nrPolar_params pbch_polar_params; diff --git a/openair1/SIMULATION/NR_PHY/dlsim.c b/openair1/SIMULATION/NR_PHY/dlsim.c index 1d440c5d0d..b6125ce7b7 100644 --- a/openair1/SIMULATION/NR_PHY/dlsim.c +++ b/openair1/SIMULATION/NR_PHY/dlsim.c @@ -101,7 +101,9 @@ int rrc_init_nr_global_param(void){return(0);} void config_common(int Mod_idP, int CC_idP, + int Nid_cell, int nr_bandP, + uint64_t ssb_pattern, uint64_t dl_CarrierFreqP, uint32_t dl_BandwidthP ); @@ -151,6 +153,8 @@ int main(int argc, char **argv) int pbch_tx_ant; int N_RB_DL=273,mu=1; + uint64_t ssb_pattern = 0; + unsigned char frame_type = 0; unsigned char pbch_phase = 0; @@ -496,7 +500,7 @@ int main(int argc, char **argv) mac_top_init_gNB(); gNB_mac = RC.nrmac[0]; - config_common(0,0,78,(uint64_t)3640000000L,N_RB_DL); + config_common(0,0,Nid_cell,78,ssb_pattern,(uint64_t)3640000000L,N_RB_DL); config_nr_mib(0,0,1,kHz30,0,0,0,0); nr_l2_init_ue(); diff --git a/openair2/LAYER2/NR_MAC_gNB/config.c b/openair2/LAYER2/NR_MAC_gNB/config.c index 9b2a61b39e..b2ea58d362 100644 --- a/openair2/LAYER2/NR_MAC_gNB/config.c +++ b/openair2/LAYER2/NR_MAC_gNB/config.c @@ -186,7 +186,8 @@ void config_common(int Mod_idP, int CC_idP, int cellid, int nr_bandP, - uint64_t dl_CarrierFreqP, + uint64_t ssb_pattern, + uint64_t dl_CarrierFreqP, uint32_t dl_BandwidthP ){ @@ -195,6 +196,7 @@ void config_common(int Mod_idP, int mu = 1; cfg->sch_config.physical_cell_id.value = cellid; + cfg->sch_config.ssb_scg_position_in_burst.value = ssb_pattern; // FDD cfg->subframe_config.duplex_mode.value = 1; @@ -238,6 +240,7 @@ int rrc_mac_config_req_gNB(module_id_t Mod_idP, int cellid, int p_gNB, int nr_bandP, + uint64_t ssb_pattern, uint64_t dl_CarrierFreqP, int dl_BandwidthP, NR_BCCH_BCH_Message_t *mib, @@ -262,11 +265,15 @@ int rrc_mac_config_req_gNB(module_id_t Mod_idP, ); }// END if( mib != NULL ) + + + if( servingcellconfigcommon != NULL ){ config_common(Mod_idP, CC_idP, cellid, nr_bandP, + ssb_pattern, dl_CarrierFreqP, dl_BandwidthP ); diff --git a/openair2/LAYER2/NR_MAC_gNB/mac_proto.h b/openair2/LAYER2/NR_MAC_gNB/mac_proto.h index 94226f4f8e..6db3b9202b 100644 --- a/openair2/LAYER2/NR_MAC_gNB/mac_proto.h +++ b/openair2/LAYER2/NR_MAC_gNB/mac_proto.h @@ -38,9 +38,10 @@ void mac_top_init_gNB(void); int rrc_mac_config_req_gNB(module_id_t Mod_idP, int CC_id, - int cellid, + int cellid, int p_gNB, int nr_bandP, + uint64_t ssb_pattern, uint64_t dl_CarrierFreqP, int dl_BandwidthP, NR_BCCH_BCH_Message_t *mib, diff --git a/openair2/RRC/NR/rrc_gNB.c b/openair2/RRC/NR/rrc_gNB.c index bbf6e475e7..daf368f50d 100644 --- a/openair2/RRC/NR/rrc_gNB.c +++ b/openair2/RRC/NR/rrc_gNB.c @@ -261,12 +261,13 @@ static void init_NR_SI(const protocol_ctxt_t* const ctxt_pP, LOG_I(NR_RRC,"Done init_NR_SI\n"); - + uint64_t ssb_pattern = 255; rrc_mac_config_req_gNB(ctxt_pP->module_id, CC_id, RC.nrrrc[ctxt_pP->module_id]->carrier[CC_id].physCellId, RC.nrrrc[ctxt_pP->module_id]->carrier[CC_id].p_gNB, configuration->nr_band[CC_id], + ssb_pattern, RC.nrrrc[ctxt_pP->module_id]->carrier[CC_id].dl_CarrierFreq, configuration->N_RB_DL[CC_id], (NR_BCCH_BCH_Message_t *)&RC.nrrrc[ctxt_pP->module_id]->carrier[CC_id].mib, From 15f07d2bb1e77febefcc0be7e7c669f128d6881b Mon Sep 17 00:00:00 2001 From: Francesco Mani Date: Thu, 21 Feb 2019 13:33:19 +0100 Subject: [PATCH 08/31] multiple SSB generation in pbchsim --- openair1/PHY/INIT/nr_init.c | 4 +-- openair1/PHY/INIT/phy_init.h | 2 +- openair1/SIMULATION/NR_PHY/pbchsim.c | 53 ++++++++++++++++------------ 3 files changed, 34 insertions(+), 25 deletions(-) diff --git a/openair1/PHY/INIT/nr_init.c b/openair1/PHY/INIT/nr_init.c index 7f52c80992..84f8888eff 100644 --- a/openair1/PHY/INIT/nr_init.c +++ b/openair1/PHY/INIT/nr_init.c @@ -387,7 +387,7 @@ void install_schedule_handlers(IF_Module_t *if_inst) /// this function is a temporary addition for NR configuration -void nr_phy_config_request_sim(PHY_VARS_gNB *gNB,int N_RB_DL,int N_RB_UL,int mu,int Nid_cell) +void nr_phy_config_request_sim(PHY_VARS_gNB *gNB,int N_RB_DL,int N_RB_UL,int mu,int Nid_cell,uint64_t position_in_burst) { NR_DL_FRAME_PARMS *fp = &gNB->frame_parms; nfapi_nr_config_request_t *gNB_config = &gNB->gNB_config; @@ -404,7 +404,7 @@ void nr_phy_config_request_sim(PHY_VARS_gNB *gNB,int N_RB_DL,int N_RB_UL,int mu, gNB_config->sch_config.n_ssb_crb.value = (N_RB_DL-20); gNB_config->sch_config.ssb_subcarrier_offset.value = 0; gNB_config->sch_config.physical_cell_id.value=Nid_cell; - + gNB_config->sch_config.ssb_scg_position_in_burst.value=position_in_burst; gNB->mac_enabled = 1; diff --git a/openair1/PHY/INIT/phy_init.h b/openair1/PHY/INIT/phy_init.h index 2a7dcf88fd..a454fb8e80 100644 --- a/openair1/PHY/INIT/phy_init.h +++ b/openair1/PHY/INIT/phy_init.h @@ -383,7 +383,7 @@ void init_nr_ue_transport(PHY_VARS_NR_UE *ue,int abstraction_flag); void nr_dump_frame_parms(NR_DL_FRAME_PARMS *frame_parms); int phy_init_nr_gNB(PHY_VARS_gNB *gNB, unsigned char is_secondary_gNB, unsigned char abstraction_flag); void nr_phy_config_request(NR_PHY_Config_t *gNB); -void nr_phy_config_request_sim(PHY_VARS_gNB *gNB,int N_RB_DL,int N_RB_UL,int mu,int Nid_cell); +void nr_phy_config_request_sim(PHY_VARS_gNB *gNB,int N_RB_DL,int N_RB_UL,int mu,int Nid_cell,uint64_t position_in_burst); void phy_free_nr_gNB(PHY_VARS_gNB *gNB); int l1_north_init_gNB(void); void init_nr_transport(PHY_VARS_gNB *gNB); diff --git a/openair1/SIMULATION/NR_PHY/pbchsim.c b/openair1/SIMULATION/NR_PHY/pbchsim.c index 214a33fb73..c023a69671 100644 --- a/openair1/SIMULATION/NR_PHY/pbchsim.c +++ b/openair1/SIMULATION/NR_PHY/pbchsim.c @@ -105,6 +105,7 @@ int main(int argc, char **argv) int trial,n_trials=1,n_errors=0,n_errors_payload=0; uint8_t transmission_mode = 1,n_tx=1,n_rx=1; uint16_t Nid_cell=0; + uint64_t SSB_positions=0x01; channel_desc_t *gNB2UE; @@ -280,6 +281,10 @@ int main(int argc, char **argv) break; + case 'M': + SSB_positions = atoi(optarg); + break; + case 'N': Nid_cell = atoi(optarg); break; @@ -333,6 +338,7 @@ int main(int argc, char **argv) printf("-i Relative strength of first intefering eNB (in dB) - cell_id mod 3 = 1\n"); printf("-j Relative strength of second intefering eNB (in dB) - cell_id mod 3 = 2\n"); printf("-o Carrier frequency offset in Hz\n"); + printf("-M Multiple SSB positions in burst\n"); printf("-N Nid_cell\n"); printf("-R N_RB_DL\n"); printf("-O oversampling factor (1,2,4,8,16)\n"); @@ -366,32 +372,34 @@ int main(int argc, char **argv) frame_parms->N_RB_UL = N_RB_DL; frame_parms->Nid_cell = Nid_cell; - nr_phy_config_request_sim(gNB,N_RB_DL,N_RB_DL,mu,Nid_cell); + nr_phy_config_request_sim(gNB,N_RB_DL,N_RB_DL,mu,Nid_cell,SSB_positions); phy_init_nr_gNB(gNB,0,0); double fs,bw,scs,eps; - - if (mu == 1 && N_RB_DL == 217) { - fs = 122.88e6; - bw = 80e6; - scs = 30000; - } - else if (mu == 1 && N_RB_DL == 245) { - fs = 122.88e6; - bw = 90e6; - scs = 30000; + + switch (mu) { + case 1: + scs = 30000; + if (N_RB_DL == 217) { + fs = 122.88e6; + bw = 80e6; + + } + else if (N_RB_DL == 245) { + fs = 122.88e6; + bw = 90e6; + } + else if (N_RB_DL == 273) { + fs = 122.88e6; + bw = 100e6; + } + else if (N_RB_DL == 106) { + fs = 61.44e6; + bw = 40e6; + } + else AssertFatal(1==0,"Unsupported numerology for mu %d, N_RB %d\n",mu, N_RB_DL); + break; } - else if (mu == 1 && N_RB_DL == 273) { - fs = 122.88e6; - bw = 100e6; - scs = 30000; - } - else if (mu == 1 && N_RB_DL == 106) { - fs = 61.44e6; - bw = 40e6; - scs = 30000; - } - else AssertFatal(1==0,"Unsupported numerology for mu %d, N_RB %d\n",mu, N_RB_DL); // cfo with respect to sub-carrier spacing eps = cfo/scs; @@ -476,6 +484,7 @@ int main(int argc, char **argv) if (input_fd==NULL) { gNB->pbch_configured = 1; for (int i=0;i<4;i++) gNB->pbch_pdu[i]=i+1; + nr_common_signal_procedures (gNB,frame,subframe); LOG_M("txsigF0.m","txsF0", gNB->common_vars.txdataF[0],frame_length_complex_samples_no_prefix,1,1); From a5025d4c4fbb930b923c322361e6e1897b15a638 Mon Sep 17 00:00:00 2001 From: Francesco Mani Date: Thu, 21 Feb 2019 15:30:09 +0100 Subject: [PATCH 09/31] SSB positions in burst from config file --- openair2/COMMON/rrc_messages_types.h | 2 +- openair2/GNB_APP/gnb_config.c | 33 ++++++++++--------- openair2/GNB_APP/gnb_paramdef.h | 2 +- openair2/LAYER2/NR_MAC_gNB/config.c | 2 -- openair2/RRC/NR/MESSAGES/asn1_msg.c | 17 +++++++--- openair2/RRC/NR/rrc_gNB.c | 6 ++-- .../CONF/gnb.band78.tm1.106PRB.usrpx300.conf | 2 +- 7 files changed, 36 insertions(+), 28 deletions(-) diff --git a/openair2/COMMON/rrc_messages_types.h b/openair2/COMMON/rrc_messages_types.h index 922c949307..1c12f41150 100644 --- a/openair2/COMMON/rrc_messages_types.h +++ b/openair2/COMMON/rrc_messages_types.h @@ -361,7 +361,7 @@ typedef struct NRRrcConfigurationReq_s { lte_prefix_type_t UL_BWP_prefix_type[MAX_NUM_CCs]; long UL_timeAlignmentTimerCommon[MAX_NUM_CCs]; long ServingCellConfigCommon_n_TimingAdvanceOffset[MAX_NUM_CCs]; - long ServingCellConfigCommon_ssb_PositionsInBurst_PR[MAX_NUM_CCs]; + uint64_t ServingCellConfigCommon_ssb_PositionsInBurst_PR[MAX_NUM_CCs]; long ServingCellConfigCommon_ssb_periodicityServingCell[MAX_NUM_CCs]; //ServingCellConfigCommon long ServingCellConfigCommon_dmrs_TypeA_Position[MAX_NUM_CCs]; //ServingCellConfigCommon long NIA_SubcarrierSpacing[MAX_NUM_CCs]; //ServingCellConfigCommon Used only for non-initial access diff --git a/openair2/GNB_APP/gnb_config.c b/openair2/GNB_APP/gnb_config.c index 4484cc18a8..99b6286483 100644 --- a/openair2/GNB_APP/gnb_config.c +++ b/openair2/GNB_APP/gnb_config.c @@ -103,7 +103,6 @@ void RCconfig_nr_flexran() *UL_frequencyShift7p5khz, *UL_SCS_SubcarrierSpacing, *UL_BWP_SubcarrierSpacing, *UL_BWP_prefix_type, *UL_timeAlignmentTimerCommon, *ServingCellConfigCommon_n_TimingAdvanceOffset, - *ServingCellConfigCommon_ssb_PositionsInBurst_PR, *NIA_SubcarrierSpacing, *referenceSubcarrierSpacing, *dl_UL_TransmissionPeriodicity, *rach_ssb_perRACH_OccasionAndCB_PreamblesPerSSB_choice, *rach_groupBconfigured, *rach_messagePowerOffsetGroupB, @@ -118,7 +117,7 @@ void RCconfig_nr_flexran() *SearchSpace_searchSpaceType, *ue_Specific__dci_Formats, *RateMatchPatternLTE_CRS_subframeAllocation_choice; - uint64_t downlink_frequency; + uint64_t downlink_frequency, ServingCellConfigCommon_ssb_PositionsInBurst_PR; int32_t nr_band, uplink_frequency_offset, N_RB_DL, nb_antenna_ports, MIB_subCarrierSpacingCommon, MIB_ssb_SubcarrierOffset, MIB_dmrs_TypeA_Position, @@ -484,7 +483,7 @@ void RCconfig_NRRRC(MessageDef *msg_p, uint32_t i, gNB_RRC_INST *rrc) { char* UL_timeAlignmentTimerCommon = 0; char* ServingCellConfigCommon_n_TimingAdvanceOffset = 0; - char* ServingCellConfigCommon_ssb_PositionsInBurst_PR = 0; + uint64_t ServingCellConfigCommon_ssb_PositionsInBurst_PR = 0; int32_t ServingCellConfigCommon_ssb_periodicityServingCell = 0; int32_t ServingCellConfigCommon_dmrs_TypeA_Position = 0; char* NIA_SubcarrierSpacing = 0; @@ -1125,19 +1124,23 @@ void RCconfig_NRRRC(MessageDef *msg_p, uint32_t i, gNB_RRC_INST *rrc) { RC.config_file_name, i, ServingCellConfigCommon_n_TimingAdvanceOffset); } - if (strcmp(ServingCellConfigCommon_ssb_PositionsInBurst_PR,"shortBitmap")==0) { - NRRRC_CONFIGURATION_REQ (msg_p).ServingCellConfigCommon_ssb_PositionsInBurst_PR[j] = NR_ServingCellConfigCommon__ssb_PositionsInBurst_PR_shortBitmap; - }else if (strcmp(ServingCellConfigCommon_ssb_PositionsInBurst_PR,"mediumBitmap")==0) { - NRRRC_CONFIGURATION_REQ (msg_p).ServingCellConfigCommon_ssb_PositionsInBurst_PR[j] = NR_ServingCellConfigCommon__ssb_PositionsInBurst_PR_mediumBitmap; - }else if (strcmp(ServingCellConfigCommon_ssb_PositionsInBurst_PR,"longBitmap")==0) { - NRRRC_CONFIGURATION_REQ (msg_p).ServingCellConfigCommon_ssb_PositionsInBurst_PR[j] = NR_ServingCellConfigCommon__ssb_PositionsInBurst_PR_longBitmap; - }else if (strcmp(ServingCellConfigCommon_ssb_PositionsInBurst_PR,"NOTHING")==0) { - NRRRC_CONFIGURATION_REQ (msg_p).ServingCellConfigCommon_ssb_PositionsInBurst_PR[j] = NR_ServingCellConfigCommon__ssb_PositionsInBurst_PR_NOTHING; - }else { - AssertFatal (0,"Failed to parse gNB configuration file %s, gnb %d unknown value \"%s\" for ServingCellConfigCommon_ssb_PositionsInBurst_PR choice !\n", - RC.config_file_name, i, ServingCellConfigCommon_ssb_PositionsInBurst_PR); - } + uint64_t t_freq; + if(nr_band == 41 || (nr_band > 76 && nr_band < 80)) + t_freq = 2400000000; + else + t_freq = 3000000000; + + if (downlink_frequency 15)) + AssertFatal (0,"Failed to parse gNB configuration file %s, gnb %d unvalid value \"%ld\" for ssb_PositionsInBurst at DL frequency %ld !\n", + RC.config_file_name, i, ServingCellConfigCommon_ssb_PositionsInBurst_PR, downlink_frequency); + else { + if(downlink_frequency<6000000000 && (ServingCellConfigCommon_ssb_PositionsInBurst_PR > 255)) + AssertFatal (0,"Failed to parse gNB configuration file %s, gnb %d unvalid value \"%ld\" for ssb_PositionsInBurst at DL frequency %ld !\n", + RC.config_file_name, i, ServingCellConfigCommon_ssb_PositionsInBurst_PR, downlink_frequency); + else + NRRRC_CONFIGURATION_REQ (msg_p).ServingCellConfigCommon_ssb_PositionsInBurst_PR[j] = ServingCellConfigCommon_ssb_PositionsInBurst_PR; + } switch (ServingCellConfigCommon_ssb_periodicityServingCell) { case 5: diff --git a/openair2/GNB_APP/gnb_paramdef.h b/openair2/GNB_APP/gnb_paramdef.h index 15a2e97239..6ac5bfc42d 100644 --- a/openair2/GNB_APP/gnb_paramdef.h +++ b/openair2/GNB_APP/gnb_paramdef.h @@ -640,7 +640,7 @@ typedef enum { {GNB_CONFIG_STRING_UL_BWP_PREFIX_TYPE, NULL, 0, strptr:&UL_BWP_prefix_type, defstrval:"NORMAL", TYPE_STRING, 0}, \ {GNB_CONFIG_STRING_UL_TIMEALIGNMENTTIMERCOMMON, NULL, 0, strptr:&UL_timeAlignmentTimerCommon, defstrval:"infinity", TYPE_STRING, 0}, \ {GNB_CONFIG_STRING_SERVINGCELLCONFIGCOMMON_N_TIMINGADVANCEOFFSET, NULL, 0, strptr:&ServingCellConfigCommon_n_TimingAdvanceOffset, defstrval:"n0", TYPE_STRING, 0}, \ -{GNB_CONFIG_STRING_SERVINGCELLCONFIGCOMMON_SSB_POSITIONSINBURST_PR, NULL, 0, strptr:&ServingCellConfigCommon_ssb_PositionsInBurst_PR, defstrval:"shortBitmap", TYPE_STRING, 0}, \ +{GNB_CONFIG_STRING_SERVINGCELLCONFIGCOMMON_SSB_POSITIONSINBURST_PR, NULL, 0, i64ptr:(int64_t *)&ServingCellConfigCommon_ssb_PositionsInBurst_PR, defint64val:0, TYPE_UINT64, 0}, \ {GNB_CONFIG_STRING_SERVINGCELLCONFIGCOMMON_SSB_PERIODICITYSERVINGCELL, NULL, 0, iptr:&ServingCellConfigCommon_ssb_periodicityServingCell, defintval:10, TYPE_UINT, 0}, \ {GNB_CONFIG_STRING_SERVINGCELLCONFIGCOMMON_DMRS_TYPEA_POSITION, NULL, 0, iptr:&ServingCellConfigCommon_dmrs_TypeA_Position, defintval:0, TYPE_UINT, 0}, \ {GNB_CONFIG_STRING_NIA_SUBCARRIERSPACING, NULL, 0, strptr:&NIA_SubcarrierSpacing, defstrval:"kHz15", TYPE_STRING, 0}, \ diff --git a/openair2/LAYER2/NR_MAC_gNB/config.c b/openair2/LAYER2/NR_MAC_gNB/config.c index b2ea58d362..12d01981d2 100644 --- a/openair2/LAYER2/NR_MAC_gNB/config.c +++ b/openair2/LAYER2/NR_MAC_gNB/config.c @@ -266,8 +266,6 @@ int rrc_mac_config_req_gNB(module_id_t Mod_idP, }// END if( mib != NULL ) - - if( servingcellconfigcommon != NULL ){ config_common(Mod_idP, CC_idP, diff --git a/openair2/RRC/NR/MESSAGES/asn1_msg.c b/openair2/RRC/NR/MESSAGES/asn1_msg.c index df45ae5e05..1b3e367ec7 100644 --- a/openair2/RRC/NR/MESSAGES/asn1_msg.c +++ b/openair2/RRC/NR/MESSAGES/asn1_msg.c @@ -747,15 +747,21 @@ void do_SERVINGCELLCONFIGCOMMON(uint8_t Mod_id, //ssb_PositionsInBurst (*servingcellconfigcommon)->ssb_PositionsInBurst->present = configuration->ServingCellConfigCommon_ssb_PositionsInBurst_PR[CC_id]; - if((*servingcellconfigcommon)->ssb_PositionsInBurst->present == NR_ServingCellConfigCommon__ssb_PositionsInBurst_PR_shortBitmap){ + uint64_t t_freq; + if(configuration->nr_band[CC_id] == 41 || (configuration->nr_band[CC_id] > 76 && configuration->nr_band[CC_id] < 80)) + t_freq = 2400000000; + else + t_freq = 3000000000; + + if(configuration->downlink_frequency[CC_id]ssb_PositionsInBurst->choice.shortBitmap.size = 1; (*servingcellconfigcommon)->ssb_PositionsInBurst->choice.shortBitmap.bits_unused = 4; - (*servingcellconfigcommon)->ssb_PositionsInBurst->choice.shortBitmap.buf[0] = 0x0f; - }else if((*servingcellconfigcommon)->ssb_PositionsInBurst->present == NR_ServingCellConfigCommon__ssb_PositionsInBurst_PR_mediumBitmap){ + (*servingcellconfigcommon)->ssb_PositionsInBurst->choice.shortBitmap.buf[0] = configuration->ServingCellConfigCommon_ssb_PositionsInBurst_PR[CC_id]; + }else if(configuration->downlink_frequency[CC_id]<6000000000){ (*servingcellconfigcommon)->ssb_PositionsInBurst->choice.mediumBitmap.size = 1; (*servingcellconfigcommon)->ssb_PositionsInBurst->choice.mediumBitmap.bits_unused = 0; - (*servingcellconfigcommon)->ssb_PositionsInBurst->choice.mediumBitmap.buf[0] = 0xff; - }else if((*servingcellconfigcommon)->ssb_PositionsInBurst->present == NR_ServingCellConfigCommon__ssb_PositionsInBurst_PR_longBitmap){ + (*servingcellconfigcommon)->ssb_PositionsInBurst->choice.mediumBitmap.buf[0] = configuration->ServingCellConfigCommon_ssb_PositionsInBurst_PR[CC_id]; + }else { (*servingcellconfigcommon)->ssb_PositionsInBurst->choice.longBitmap.size = 8; (*servingcellconfigcommon)->ssb_PositionsInBurst->choice.longBitmap.bits_unused = 0; (*servingcellconfigcommon)->ssb_PositionsInBurst->choice.longBitmap.buf[0] = 0xff; @@ -768,6 +774,7 @@ void do_SERVINGCELLCONFIGCOMMON(uint8_t Mod_id, (*servingcellconfigcommon)->ssb_PositionsInBurst->choice.longBitmap.buf[7] = 0xff; } + //ssb_periodicityServingCell *(*servingcellconfigcommon)->ssb_periodicityServingCell = configuration->ServingCellConfigCommon_ssb_periodicityServingCell[CC_id]; //dmrs_TypeA_Position diff --git a/openair2/RRC/NR/rrc_gNB.c b/openair2/RRC/NR/rrc_gNB.c index daf368f50d..de9d8fb60d 100644 --- a/openair2/RRC/NR/rrc_gNB.c +++ b/openair2/RRC/NR/rrc_gNB.c @@ -261,13 +261,13 @@ static void init_NR_SI(const protocol_ctxt_t* const ctxt_pP, LOG_I(NR_RRC,"Done init_NR_SI\n"); - uint64_t ssb_pattern = 255; + rrc_mac_config_req_gNB(ctxt_pP->module_id, CC_id, RC.nrrrc[ctxt_pP->module_id]->carrier[CC_id].physCellId, RC.nrrrc[ctxt_pP->module_id]->carrier[CC_id].p_gNB, configuration->nr_band[CC_id], - ssb_pattern, + configuration->ServingCellConfigCommon_ssb_PositionsInBurst_PR[CC_id], RC.nrrrc[ctxt_pP->module_id]->carrier[CC_id].dl_CarrierFreq, configuration->N_RB_DL[CC_id], (NR_BCCH_BCH_Message_t *)&RC.nrrrc[ctxt_pP->module_id]->carrier[CC_id].mib, @@ -332,7 +332,7 @@ char openair_rrc_gNB_configuration(const module_id_t gnb_mod_idP, gNB_RrcConfigu gnb_mod_idP, RC.nrrrc[ctxt.module_id]->carrier[CC_id].cba_rnti[0], RC.nrrrc[ctxt.module_id]->carrier[CC_id].cba_rnti[1], RC.nrrrc[ctxt.module_id]->carrier[CC_id].cba_rnti[2], - RC.nrrrc[ctxt.module_id]->carrier[CC_id].cba_rnti[3], + RC.nrrrc[ctxt.module_id]->caNRRRC_CONFIGURATION_REQrrier[CC_id].cba_rnti[3], RC.nrrrc[ctxt.module_id]->carrier[CC_id].num_active_cba_groups); } diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpx300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpx300.conf index f170d7ce87..385064b667 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpx300.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpx300.conf @@ -70,7 +70,7 @@ gNBs = UL_BWP_prefix_type = "NORMAL"; UL_timeAlignmentTimerCommon = "infinity"; ServingCellConfigCommon_n_TimingAdvanceOffset = "n0" - ServingCellConfigCommon_ssb_PositionsInBurst_PR = "shortBitmap"; + ServingCellConfigCommon_ssb_PositionsInBurst_PR = 0xff; ServingCellConfigCommon_ssb_periodicityServingCell = 10; ServingCellConfigCommon_dmrs_TypeA_Position = 2; NIA_SubcarrierSpacing = "kHz15"; From 5a9fb475f2361ff0d3f8c181728deb1c2f07beae Mon Sep 17 00:00:00 2001 From: Francesco Mani Date: Thu, 21 Feb 2019 17:29:15 +0100 Subject: [PATCH 10/31] Lmax in frame_parms and nr_band number from freq at UE --- openair1/PHY/INIT/nr_parms.c | 10 +++ openair1/PHY/NR_REFSIG/nr_gold.c | 2 +- openair1/PHY/NR_REFSIG/nr_gold_ue.c | 3 +- openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c | 2 +- openair1/PHY/defs_nr_common.h | 2 + openair1/SCHED_NR/phy_procedures_nr_gNB.c | 5 +- targets/RT/USER/nr-ue.c | 75 +++++++++++++---------- targets/RT/USER/nr-uesoftmodem.c | 2 +- 8 files changed, 59 insertions(+), 42 deletions(-) diff --git a/openair1/PHY/INIT/nr_parms.c b/openair1/PHY/INIT/nr_parms.c index a5eb2e659b..14d95ad488 100644 --- a/openair1/PHY/INIT/nr_parms.c +++ b/openair1/PHY/INIT/nr_parms.c @@ -179,6 +179,16 @@ int nr_init_frame_parms0(NR_DL_FRAME_PARMS *fp, fp->samples_per_frame = 10 * fp->samples_per_subframe; fp->freq_range = (fp->dl_CarrierFreq < 6e9)? nr_FR1 : nr_FR2; + // definition of Lmax according to ts 38.213 section 4.1 + if (fp->dl_CarrierFreq < 6e9){ + if(fp->frame_type && (fp->ssb_type==2)) + fp->Lmax = (fp->dl_CarrierFreq < 2.4e9)? 4 : 8; + else + fp->Lmax = (fp->dl_CarrierFreq < 3e9)? 4 : 8; + } + else + fp->Lmax = 64; + // Initial bandwidth part configuration -- full carrier bandwidth fp->initial_bwp_dl.bwp_id = 0; fp->initial_bwp_dl.scs = fp->subcarrier_spacing; diff --git a/openair1/PHY/NR_REFSIG/nr_gold.c b/openair1/PHY/NR_REFSIG/nr_gold.c index 08e6022764..bd60933155 100644 --- a/openair1/PHY/NR_REFSIG/nr_gold.c +++ b/openair1/PHY/NR_REFSIG/nr_gold.c @@ -32,7 +32,7 @@ void nr_init_pbch_dmrs(PHY_VARS_gNB* gNB) Nid = cfg->sch_config.physical_cell_id.value; - Lmax = (fp->dl_CarrierFreq < 3e9)? 4:8; + Lmax = fp->Lmax; N_hf = (Lmax == 4)? 2:1; for (n_hf = 0; n_hf < N_hf; n_hf++) { diff --git a/openair1/PHY/NR_REFSIG/nr_gold_ue.c b/openair1/PHY/NR_REFSIG/nr_gold_ue.c index 78b92959e1..726aab8a37 100644 --- a/openair1/PHY/NR_REFSIG/nr_gold_ue.c +++ b/openair1/PHY/NR_REFSIG/nr_gold_ue.c @@ -29,8 +29,7 @@ void nr_gold_pbch(PHY_VARS_NR_UE* ue) unsigned char Lmax, l, n_hf, N_hf; Nid = ue->frame_parms.Nid_cell; - - Lmax = 8; //(fp->dl_CarrierFreq < 3e9)? 4:8; + Lmax = ue->frame_parms.Lmax; N_hf = (Lmax == 4)? 2:1; for (n_hf = 0; n_hf < N_hf; n_hf++) { diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c b/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c index a0b150eda1..dc8fb09e2a 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c @@ -531,7 +531,7 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue, uint8_t *decoded_output = nr_ue_pbch_vars->decoded_output; uint8_t nushift; uint16_t M; - uint8_t Lmax=8; //to update + uint8_t Lmax=frame_parms->Lmax; uint8_t ssb_index=0; //uint16_t crc; //unsigned short idx_demod =0; diff --git a/openair1/PHY/defs_nr_common.h b/openair1/PHY/defs_nr_common.h index 4267b79144..267c156184 100644 --- a/openair1/PHY/defs_nr_common.h +++ b/openair1/PHY/defs_nr_common.h @@ -308,6 +308,8 @@ typedef struct NR_DL_FRAME_PARMS { uint16_t ssb_start_subcarrier; /// SSB type nr_ssb_type_e ssb_type; + /// Max number of SSB in frame + uint8_t Lmax; /// SS block pattern (max 64 ssb, each bit is on/off ssb) uint64_t L_ssb; /// PBCH polar encoder params diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index bfa785095b..e64d2d8635 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -141,14 +141,13 @@ void nr_common_signal_procedures (PHY_VARS_gNB *gNB,int frame, int slot) { nfapi_nr_config_request_t *cfg = &gNB->gNB_config; int **txdataF = gNB->common_vars.txdataF; uint8_t *pbch_pdu=&gNB->pbch_pdu[0]; - uint8_t Lmax, ssb_index, n_hf; + uint8_t ssb_index, n_hf; int ssb_start_symbol, rel_slot; n_hf = cfg->sch_config.half_frame_index.value; // to set a effective slot number between 0 to 9 in the half frame where the SSB is supposed to be rel_slot = (n_hf)? (slot-10) : slot; - Lmax = (fp->dl_CarrierFreq < 3e9)? 4:8; // max number of ssb LOG_D(PHY,"common_signal_procedures: frame %d, slot %d\n",frame,slot); @@ -177,7 +176,7 @@ void nr_common_signal_procedures (PHY_VARS_gNB *gNB,int frame, int slot) { txdataF[0], AMP, ssb_start_symbol, - n_hf,Lmax,ssb_index, + n_hf,fp->Lmax,ssb_index, frame, cfg, fp); } } diff --git a/targets/RT/USER/nr-ue.c b/targets/RT/USER/nr-ue.c index 3f0545c4cf..5cd4db26d2 100644 --- a/targets/RT/USER/nr-ue.c +++ b/targets/RT/USER/nr-ue.c @@ -175,35 +175,38 @@ typedef struct band_info_s { band_info_t bands_to_scan; static const eutra_band_t eutra_bands[] = { - { 1, 1920 * MHz, 1980 * MHz, 2110 * MHz, 2170 * MHz, FDD}, - { 2, 1850 * MHz, 1910 * MHz, 1930 * MHz, 1990 * MHz, FDD}, - { 3, 1710 * MHz, 1785 * MHz, 1805 * MHz, 1880 * MHz, FDD}, - { 4, 1710 * MHz, 1755 * MHz, 2110 * MHz, 2155 * MHz, FDD}, - { 5, 824 * MHz, 849 * MHz, 869 * MHz, 894 * MHz, FDD}, - { 6, 830 * MHz, 840 * MHz, 875 * MHz, 885 * MHz, FDD}, - { 7, 2500 * MHz, 2570 * MHz, 2620 * MHz, 2690 * MHz, FDD}, - { 8, 880 * MHz, 915 * MHz, 925 * MHz, 960 * MHz, FDD}, - { 9, 1749900 * KHz, 1784900 * KHz, 1844900 * KHz, 1879900 * KHz, FDD}, - {10, 1710 * MHz, 1770 * MHz, 2110 * MHz, 2170 * MHz, FDD}, - {11, 1427900 * KHz, 1452900 * KHz, 1475900 * KHz, 1500900 * KHz, FDD}, - {12, 698 * MHz, 716 * MHz, 728 * MHz, 746 * MHz, FDD}, - {13, 777 * MHz, 787 * MHz, 746 * MHz, 756 * MHz, FDD}, - {14, 788 * MHz, 798 * MHz, 758 * MHz, 768 * MHz, FDD}, - {17, 704 * MHz, 716 * MHz, 734 * MHz, 746 * MHz, FDD}, - {20, 832 * MHz, 862 * MHz, 791 * MHz, 821 * MHz, FDD}, - {22, 3510 * MHz, 3590 * MHz, 3410 * MHz, 3490 * MHz, FDD}, - {33, 1900 * MHz, 1920 * MHz, 1900 * MHz, 1920 * MHz, TDD}, - {34, 2010 * MHz, 2025 * MHz, 2010 * MHz, 2025 * MHz, TDD}, - {35, 1850 * MHz, 1910 * MHz, 1850 * MHz, 1910 * MHz, TDD}, - {36, 1930 * MHz, 1990 * MHz, 1930 * MHz, 1990 * MHz, TDD}, - {37, 1910 * MHz, 1930 * MHz, 1910 * MHz, 1930 * MHz, TDD}, - {38, 2570 * MHz, 2620 * MHz, 2570 * MHz, 2630 * MHz, TDD}, - {39, 1880 * MHz, 1920 * MHz, 1880 * MHz, 1920 * MHz, TDD}, - {40, 2300 * MHz, 2400 * MHz, 2300 * MHz, 2400 * MHz, TDD}, - {41, 2496 * MHz, 2690 * MHz, 2496 * MHz, 2690 * MHz, TDD}, - {42, 3400 * MHz, 3600 * MHz, 3400 * MHz, 3600 * MHz, TDD}, - {43, 3600 * MHz, 3800 * MHz, 3600 * MHz, 3800 * MHz, TDD}, - {44, 703 * MHz, 803 * MHz, 703 * MHz, 803 * MHz, TDD}, + {1, 1920000, 1980000, 2110000, 2170000, FDD}, + {2, 1850000, 1910000, 1930000, 1990000, FDD}, + {3, 1710000, 1785000, 1805000, 1880000, FDD}, + {5, 824000, 849000, 869000, 894000, FDD}, + {7, 2500000, 2570000, 2620000, 2690000, FDD}, + {8, 880000, 915000, 925000, 960000, FDD}, + {12, 698000, 716000, 728000, 746000, FDD}, + {20, 832000, 862000, 791000, 821000, FDD}, + {25, 1850000, 1915000, 1930000, 1995000, FDD}, + {28, 703000, 758000, 758000, 813000, FDD}, + {34, 2010000, 2025000, 2010000, 2025000, TDD}, + {38, 2570000, 2620000, 2570000, 2630000, TDD}, + {39, 1880000, 1920000, 1880000, 1920000, TDD}, + {40, 2300000, 2400000, 2300000, 2400000, TDD}, + {41, 2496000, 2690000, 2496000, 2690000, TDD}, + {50, 1432000, 1517000, 1432000, 1517000, TDD}, + {51, 1427000, 1432000, 1427000, 1432000, TDD}, + {66, 1710000, 1780000, 2110000, 2200000, FDD}, + {70, 1695000, 1710000, 1995000, 2020000, FDD}, + {71, 663000, 698000, 617000, 652000, FDD}, + {74, 1427000, 1470000, 1475000, 1518000, FDD}, + {75, 000, 000, 1432000, 1517000, FDD}, + {76, 000, 000, 1427000, 1432000, FDD}, + {77, 3300000, 4200000, 3300000, 4200000, TDD}, + {78, 3300000, 3800000, 3300000, 3800000, TDD}, + {79, 4400000, 5000000, 4400000, 5000000, TDD}, + {80, 1710000, 1785000, 000, 000, FDD}, + {81, 860000, 915000, 000, 000, FDD}, + {82, 832000, 862000, 000, 000, FDD}, + {83, 703000, 748000, 000, 000, FDD}, + {84, 1920000, 1980000, 000, 000, FDD}, + {86, 1710000, 1785000, 000, 000, FDD} }; PHY_VARS_NR_UE* init_nr_ue_vars(NR_DL_FRAME_PARMS *frame_parms, @@ -333,6 +336,7 @@ static void *UE_thread_synch(void *arg) { int i, hw_slot_offset; PHY_VARS_NR_UE *UE = (PHY_VARS_NR_UE*) arg; int current_band = 0; + lte_frame_type_t current_type; int current_offset = 0; sync_mode_t sync_mode = pbch; int CC_id = UE->CC_id; @@ -351,19 +355,22 @@ static void *UE_thread_synch(void *arg) { if (UE->UE_scan == 0) { int ind; - for ( ind=0; - ind < sizeof(eutra_bands) / sizeof(eutra_bands[0]); - ind++) { + int64_t dl_freq_khz = downlink_frequency[0][0]/1000; + for ( ind=0; ind < sizeof(eutra_bands) / sizeof(eutra_bands[0]); ind++) { current_band = eutra_bands[ind].band; + current_type = eutra_bands[ind].frame_type; LOG_D(PHY, "Scanning band %d, dl_min %"PRIu32", ul_min %"PRIu32"\n", current_band, eutra_bands[ind].dl_min,eutra_bands[ind].ul_min); - if ( eutra_bands[ind].dl_min <= downlink_frequency[0][0] && eutra_bands[ind].dl_max >= downlink_frequency[0][0] ) { + if ( eutra_bands[ind].dl_min <= dl_freq_khz && eutra_bands[ind].dl_max >= dl_freq_khz ) { for (i=0; i<4; i++) - uplink_frequency_offset[CC_id][i] = eutra_bands[ind].ul_min - eutra_bands[ind].dl_min; + uplink_frequency_offset[CC_id][i] = (eutra_bands[ind].ul_min - eutra_bands[ind].dl_min) *1000; break; } } AssertFatal( ind < sizeof(eutra_bands) / sizeof(eutra_bands[0]), "Can't find EUTRA band for frequency"); + UE->frame_parms.eutra_band = current_band; + UE->frame_parms.frame_type = current_type; + LOG_I( PHY, "[SCHED][UE] Check absolute frequency DL %"PRIu32", UL %"PRIu32" (oai_exit %d, rx_num_channels %d)\n", downlink_frequency[0][0], downlink_frequency[0][0]+uplink_frequency_offset[0][0], oai_exit, openair0_cfg[0].rx_num_channels); diff --git a/targets/RT/USER/nr-uesoftmodem.c b/targets/RT/USER/nr-uesoftmodem.c index d3d660e7f5..0321906b77 100644 --- a/targets/RT/USER/nr-uesoftmodem.c +++ b/targets/RT/USER/nr-uesoftmodem.c @@ -661,7 +661,7 @@ void set_default_frame_parms(NR_DL_FRAME_PARMS *frame_parms[MAX_NUM_CCs]) { config[CC_id]->rf_config.dl_carrier_bandwidth.value = 106; config[CC_id]->rf_config.ul_carrier_bandwidth.value = 106; config[CC_id]->sch_config.physical_cell_id.value = 0; - + frame_parms[CC_id]->eutra_band = 78; frame_parms[CC_id]->frame_type = FDD; frame_parms[CC_id]->tdd_config = 3; //frame_parms[CC_id]->tdd_config_S = 0; From 2156ba10d595a5cd935a4fce1ba9f51edcda2021 Mon Sep 17 00:00:00 2001 From: Francesco Mani Date: Mon, 25 Feb 2019 16:51:41 +0100 Subject: [PATCH 11/31] config files changed and pdcch/pdsch enabled --- openair1/SCHED_NR/phy_procedures_nr_gNB.c | 4 ++-- .../CONF/gnb.band22.tm1.106PRB.adrv9371zc706.conf | 6 +++--- .../CONF/gnb.band78.tm1.106PRB.usrpn300.conf | 6 +++--- .../CONF/gnb.band78.tm1.217PRB.usrpn300.conf | 6 +++--- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index f1db75d534..d922a3143d 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -213,7 +213,7 @@ void phy_procedures_gNB_TX(PHY_VARS_gNB *gNB, num_dci = gNB->pdcch_vars.num_dci; num_pdsch_rnti = gNB->pdcch_vars.num_pdsch_rnti; - /*if (num_dci) { + if (num_dci) { LOG_I(PHY, "[gNB %d] Frame %d slot %d \ Calling nr_generate_dci_top (number of DCI %d)\n", gNB->Mod_id, frame, slot, num_dci); @@ -232,7 +232,7 @@ void phy_procedures_gNB_TX(PHY_VARS_gNB *gNB, AMP, slot, *fp, *cfg); } } - }*/ + } VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_TX+offset,0); } diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band22.tm1.106PRB.adrv9371zc706.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band22.tm1.106PRB.adrv9371zc706.conf index 258d6c5f03..5fd4b465b3 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band22.tm1.106PRB.adrv9371zc706.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band22.tm1.106PRB.adrv9371zc706.conf @@ -26,10 +26,10 @@ gNBs = node_function = "3GPP_gNODEB"; node_timing = "synch_to_ext_device"; node_synch_ref = 0; - frame_type = "FDD"; + frame_type = "TDD"; DL_prefix_type = "NORMAL"; UL_prefix_type = "NORMAL"; - eutra_band = 22; + eutra_band = 78; downlink_frequency = 3510000000L; uplink_frequency_offset = -120000000; Nid_cell = 0; @@ -70,7 +70,7 @@ gNBs = UL_BWP_prefix_type = "NORMAL"; UL_timeAlignmentTimerCommon = "infinity"; ServingCellConfigCommon_n_TimingAdvanceOffset = "n0" - ServingCellConfigCommon_ssb_PositionsInBurst_PR = "shortBitmap"; + ServingCellConfigCommon_ssb_PositionsInBurst_PR = 0x01; ServingCellConfigCommon_ssb_periodicityServingCell = 10; ServingCellConfigCommon_dmrs_TypeA_Position = 2; NIA_SubcarrierSpacing = "kHz15"; diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpn300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpn300.conf index 3aaf0c5506..077d1e5bd3 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpn300.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpn300.conf @@ -26,10 +26,10 @@ gNBs = node_function = "3GPP_gNODEB"; node_timing = "synch_to_ext_device"; node_synch_ref = 0; - frame_type = "FDD"; + frame_type = "TDD"; DL_prefix_type = "NORMAL"; UL_prefix_type = "NORMAL"; - eutra_band = 22; + eutra_band = 78; downlink_frequency = 3510000000L; uplink_frequency_offset = -120000000; Nid_cell = 0; @@ -70,7 +70,7 @@ gNBs = UL_BWP_prefix_type = "NORMAL"; UL_timeAlignmentTimerCommon = "infinity"; ServingCellConfigCommon_n_TimingAdvanceOffset = "n0" - ServingCellConfigCommon_ssb_PositionsInBurst_PR = "shortBitmap"; + ServingCellConfigCommon_ssb_PositionsInBurst_PR = 0x01; ServingCellConfigCommon_ssb_periodicityServingCell = 10; ServingCellConfigCommon_dmrs_TypeA_Position = 2; NIA_SubcarrierSpacing = "kHz15"; diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.217PRB.usrpn300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.217PRB.usrpn300.conf index a604feabec..dbd937d61a 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.217PRB.usrpn300.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.217PRB.usrpn300.conf @@ -26,10 +26,10 @@ gNBs = node_function = "3GPP_gNODEB"; node_timing = "synch_to_ext_device"; node_synch_ref = 0; - frame_type = "FDD"; + frame_type = "TDD"; DL_prefix_type = "NORMAL"; UL_prefix_type = "NORMAL"; - eutra_band = 22; + eutra_band = 78; downlink_frequency = 3510000000L; uplink_frequency_offset = -120000000; Nid_cell = 0; @@ -70,7 +70,7 @@ gNBs = UL_BWP_prefix_type = "NORMAL"; UL_timeAlignmentTimerCommon = "infinity"; ServingCellConfigCommon_n_TimingAdvanceOffset = "n0" - ServingCellConfigCommon_ssb_PositionsInBurst_PR = "shortBitmap"; + ServingCellConfigCommon_ssb_PositionsInBurst_PR = 0x01; ServingCellConfigCommon_ssb_periodicityServingCell = 10; ServingCellConfigCommon_dmrs_TypeA_Position = 2; NIA_SubcarrierSpacing = "kHz15"; From 353f153353863b97fad69d3a0c59494ffac0f448 Mon Sep 17 00:00:00 2001 From: Francesco Mani Date: Tue, 26 Feb 2019 18:06:43 +0100 Subject: [PATCH 12/31] slot_fep for ssb done once before sss and pbch channel estimation moved out of slot_fep --- openair1/PHY/INIT/nr_init.c | 2 +- openair1/PHY/MODULATION/modulation_UE.h | 3 +- openair1/PHY/MODULATION/slot_fep_nr.c | 49 ++--------------- .../nr_dl_channel_estimation.c | 8 +-- openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h | 4 -- .../PHY/NR_UE_TRANSPORT/nr_initial_sync.c | 52 +++++++++---------- openair1/PHY/NR_UE_TRANSPORT/pss_nr.c | 3 +- openair1/PHY/NR_UE_TRANSPORT/sss_nr.c | 18 ------- openair1/SCHED_NR_UE/phy_procedures_nr_ue.c | 3 -- openair1/SIMULATION/NR_PHY/pbchsim.c | 40 +++++--------- targets/RT/USER/nr-ue.c | 2 +- 11 files changed, 48 insertions(+), 136 deletions(-) diff --git a/openair1/PHY/INIT/nr_init.c b/openair1/PHY/INIT/nr_init.c index 568070df93..2f613152dd 100644 --- a/openair1/PHY/INIT/nr_init.c +++ b/openair1/PHY/INIT/nr_init.c @@ -363,7 +363,7 @@ void nr_phy_config_request_sim(PHY_VARS_gNB *gNB,int N_RB_DL,int N_RB_UL,int mu, NR_DL_FRAME_PARMS *fp = &gNB->frame_parms; nfapi_nr_config_request_t *gNB_config = &gNB->gNB_config; //overwrite for new NR parameters - gNB_config->nfapi_config.rf_bands.rf_band[0] = 78; + gNB_config->nfapi_config.rf_bands.rf_band[0] = 5; gNB_config->nfapi_config.nrarfcn.value = 620000; gNB_config->subframe_config.numerology_index_mu.value = mu; gNB_config->subframe_config.duplex_mode.value = TDD; diff --git a/openair1/PHY/MODULATION/modulation_UE.h b/openair1/PHY/MODULATION/modulation_UE.h index 9734c02907..63c3637886 100644 --- a/openair1/PHY/MODULATION/modulation_UE.h +++ b/openair1/PHY/MODULATION/modulation_UE.h @@ -53,8 +53,7 @@ int nr_slot_fep(PHY_VARS_NR_UE *phy_vars_ue, unsigned char Ns, int sample_offset, int no_prefix, - int reset_freq_est, - NR_CHANNEL_EST_t channel); + NR_CHANNEL_EST_t channel); int slot_fep_mbsfn(PHY_VARS_UE *phy_vars_ue, unsigned char l, diff --git a/openair1/PHY/MODULATION/slot_fep_nr.c b/openair1/PHY/MODULATION/slot_fep_nr.c index 1e1751fe24..f41212e543 100644 --- a/openair1/PHY/MODULATION/slot_fep_nr.c +++ b/openair1/PHY/MODULATION/slot_fep_nr.c @@ -39,12 +39,10 @@ int nr_slot_fep(PHY_VARS_NR_UE *ue, unsigned char Ns, int sample_offset, int no_prefix, - int reset_freq_est, NR_CHANNEL_EST_t channel) { NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms; NR_UE_COMMON *common_vars = &ue->common_vars; - uint8_t eNB_id = 0;//ue_common_vars->eNb_id; unsigned char aa; unsigned char symbol = l;//+((7-frame_parms->Ncp)*(Ns&1)); ///symbol within sub-frame unsigned int nb_prefix_samples = (no_prefix ? 0 : frame_parms->nb_prefix_samples); @@ -204,56 +202,17 @@ int nr_slot_fep(PHY_VARS_NR_UE *ue, switch(channel){ case NR_PBCH_EST: - -#ifdef DEBUG_FEP - printf("Channel estimation eNB %d, slot %d, symbol %d\n",eNB_id,Ns,l); -#endif -#if UE_TIMING_TRACE - start_meas(&ue->dlsch_channel_estimation_stats); -#endif - nr_pbch_channel_estimation(ue,eNB_id,0, - Ns, - l, - symbol); - //} -#if UE_TIMING_TRACE - stop_meas(&ue->dlsch_channel_estimation_stats); -#endif - - // do frequency offset estimation here! - // use channel estimates from current symbol (=ch_t) and last symbol (ch_{t-1}) -#ifdef DEBUG_FEP - printf("Frequency offset estimation\n"); -#endif - - if (l==(4-frame_parms->Ncp)) { - -#if UE_TIMING_TRACE - start_meas(&ue->dlsch_freq_offset_estimation_stats); -#endif - - /*lte_est_freq_offset(common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].dl_ch_estimates[0], - frame_parms, - l, - &common_vars->freq_offset, - reset_freq_est);*/ -#if UE_TIMING_TRACE - stop_meas(&ue->dlsch_freq_offset_estimation_stats); -#endif - - } - break; case NR_PDCCH_EST: #ifdef DEBUG_FEP - printf("PDCCH Channel estimation eNB %d, aatx %d, slot %d, symbol %d start_sc %d\n",eNB_id,aa,Ns,l,coreset_start_subcarrier); + printf("PDCCH Channel estimation aatx %d, slot %d, symbol %d start_sc %d\n",aa,Ns,l,coreset_start_subcarrier); #endif #if UE_TIMING_TRACE start_meas(&ue->dlsch_channel_estimation_stats); #endif - nr_pdcch_channel_estimation(ue,eNB_id,0, + nr_pdcch_channel_estimation(ue,0, Ns, l, symbol, @@ -267,7 +226,7 @@ int nr_slot_fep(PHY_VARS_NR_UE *ue, case NR_PDSCH_EST: #ifdef DEBUG_FEP - printf("Channel estimation eNB %d, aatx %d, slot %d, symbol %d\n",eNB_id,aa,Ns,l); + printf("Channel estimation aatx %d, slot %d, symbol %d\n",aa,Ns,l); #endif #if UE_TIMING_TRACE start_meas(&ue->dlsch_channel_estimation_stats); @@ -276,7 +235,7 @@ int nr_slot_fep(PHY_VARS_NR_UE *ue, ue->frame_parms.nushift = (p>>1)&1;; if (symbol ==l0) - nr_pdsch_channel_estimation(ue,eNB_id,0, + nr_pdsch_channel_estimation(ue,0, Ns, p, 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 a90450b0a5..05ee82ae29 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c @@ -33,10 +33,8 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue, - uint8_t eNB_id, uint8_t eNB_offset, unsigned char Ns, - unsigned char l, unsigned char symbol) { int pilot[200] __attribute__((aligned(16))); @@ -78,8 +76,8 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue, k = nushift; #ifdef DEBUG_CH - printf("PBCH Channel Estimation : ThreadId %d, eNB_offset %d ch_offset %d, OFDM size %d, Ncp=%d, l=%d, Ns=%d, k=%d symbol %d\n",ue->current_thread_id[Ns>>1], eNB_offset,ch_offset,ue->frame_parms.ofdm_symbol_size, - ue->frame_parms.Ncp,l,Ns,k, symbol); + printf("PBCH Channel Estimation : ThreadId %d, eNB_offset %d ch_offset %d, OFDM size %d, Ncp=%d, Ns=%d, k=%d symbol %d\n",ue->current_thread_id[Ns>>1], eNB_offset,ch_offset,ue->frame_parms.ofdm_symbol_size, + ue->frame_parms.Ncp,Ns,k, symbol); #endif switch (k) { @@ -254,7 +252,6 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue, } int nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue, - uint8_t eNB_id, uint8_t eNB_offset, unsigned char Ns, unsigned char l, @@ -478,7 +475,6 @@ int nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue, } int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, - uint8_t eNB_id, uint8_t eNB_offset, unsigned char Ns, unsigned short p, diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h b/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h index ae4295a99b..a6ede43504 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h @@ -43,7 +43,6 @@ \param symbol symbol within frame */ int nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue, - uint8_t eNB_id, uint8_t eNB_offset, unsigned char Ns, unsigned char l, @@ -52,14 +51,11 @@ int nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue, unsigned short nb_rb_coreset); int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue, - uint8_t eNB_id, uint8_t eNB_offset, unsigned char Ns, - unsigned char l, unsigned char symbol); int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, - uint8_t eNB_id, uint8_t eNB_offset, unsigned char Ns, unsigned short p, diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c b/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c index e5f079ebc3..ea4745fe23 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c @@ -35,6 +35,7 @@ #include "PHY/INIT/phy_init.h" #include "PHY/MODULATION/modulation_UE.h" #include "nr_transport_proto_ue.h" +#include "PHY/NR_UE_ESTIMATION/nr_estimation.h" //#include "SCHED/defs.h" //#include "SCHED/extern.h" @@ -68,32 +69,18 @@ int nr_pbch_detection(PHY_VARS_NR_UE *ue, runmode_t mode) frame_parms->nb_prefix_samples0 = frame_parms->nb_prefix_samples; - //symbol 1 - nr_slot_fep(ue, - 1, - 0, - ue->ssb_offset, - 0, - 1, - NR_PBCH_EST); - - //symbol 2 - nr_slot_fep(ue, - 2, - 0, - ue->ssb_offset, - 0, - 1, - NR_PBCH_EST); - - //symbol 3 - nr_slot_fep(ue, - 3, - 0, - ue->ssb_offset, - 0, - 1, - NR_PBCH_EST); + for(int i=1; i<4;i++) { + +#if UE_TIMING_TRACE + start_meas(&ue->dlsch_channel_estimation_stats); +#endif + nr_pbch_channel_estimation(ue,0, + 0, + i); +#if UE_TIMING_TRACE + stop_meas(&ue->dlsch_channel_estimation_stats); +#endif + } //put back nb_prefix_samples0 frame_parms->nb_prefix_samples0 = nb_prefix_samples0; @@ -224,6 +211,15 @@ int nr_initial_sync(PHY_VARS_NR_UE *ue, runmode_t mode) /* check that SSS/PBCH block is continuous inside the received buffer */ if (sync_pos < (NR_NUMBER_OF_SUBFRAMES_PER_FRAME*fp->samples_per_subframe - (NB_SYMBOLS_PBCH * fp->ofdm_symbol_size))) { + + for(int i=0; i<4;i++) + nr_slot_fep(ue, + i, + 0, + ue->ssb_offset, + 0, + NR_PBCH_EST); + #ifdef DEBUG_INITIAL_SYNCH LOG_I(PHY,"Calling sss detection (normal CP)\n"); #endif @@ -241,8 +237,8 @@ int nr_initial_sync(PHY_VARS_NR_UE *ue, runmode_t mode) int nb_prefix_samples0 = fp->nb_prefix_samples0; fp->nb_prefix_samples0 = fp->nb_prefix_samples; - nr_slot_fep(ue,0, 0, ue->ssb_offset, 0, 1, NR_PDCCH_EST); - nr_slot_fep(ue,1, 0, ue->ssb_offset, 0, 1, NR_PDCCH_EST); + nr_slot_fep(ue,0, 0, ue->ssb_offset, 0, NR_PDCCH_EST); + nr_slot_fep(ue,1, 0, ue->ssb_offset, 0, NR_PDCCH_EST); fp->nb_prefix_samples0 = nb_prefix_samples0; LOG_I(PHY,"[UE %d] AUTOTEST Cell Sync : frame = %d, rx_offset %d, freq_offset %d \n", diff --git a/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c b/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c index 9b09a846bb..e4495a5526 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c +++ b/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c @@ -898,6 +898,7 @@ int pss_search_time_nr(int **rxdata, ///rx data in time domain } if (fo_flag){ + // fractional frequency offser computation according to Cross-correlation Synchronization Algorithm Using PSS // Shoujun Huang, Yongtao Su, Ying He and Shan Tang, "Joint time and frequency offset estimation in LTE downlink," 7th International Conference on Communications and Networking in China, 2012. @@ -922,7 +923,7 @@ int pss_search_time_nr(int **rxdata, ///rx data in time domain // estimation of fractional frequency offset: angle[(result1)'*(result2)]/pi ffo_est=atan2(re1*im2-re2*im1,re1*re2+im1*im2)/M_PI; - + #ifdef DBG_PSS_NR printf("ffo %lf\n",ffo_est); #endif diff --git a/openair1/PHY/NR_UE_TRANSPORT/sss_nr.c b/openair1/PHY/NR_UE_TRANSPORT/sss_nr.c index 26639a5134..493672f890 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/sss_nr.c +++ b/openair1/PHY/NR_UE_TRANSPORT/sss_nr.c @@ -443,24 +443,6 @@ int rx_sss_nr(PHY_VARS_NR_UE *ue, int32_t *tot_metric,uint8_t *phase_max) // For now, symbol 0 = PSS/PBCH and it is never in symbol 0 or 7*2^mu (i.e. always shorter prefix) frame_parms->nb_prefix_samples0 = frame_parms->nb_prefix_samples; - // Do FFTs for SSS/PSS - // SSS - nr_slot_fep(ue, - SSS_SYMBOL_NB-PSS_SYMBOL_NB, // symbol number w.r.t. PSS - 0, // Ns slot number - ue->ssb_offset, // sample_offset of int16_t - 0, // no_prefix - 1, // reset frequency estimation - NR_SSS_EST); - - // PSS - nr_slot_fep(ue, - 0, - 0, - ue->ssb_offset, - 0, - 1, - NR_SSS_EST); frame_parms->nb_prefix_samples0 = nb_prefix_samples0; diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c index 1a631000f5..a2388def23 100644 --- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c +++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c @@ -4991,7 +4991,6 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN nr_tti_rx, 0, 0, - 1, NR_PDCCH_EST); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP, VCD_FUNCTION_OUT); #if UE_TIMING_TRACE @@ -5022,7 +5021,6 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN nr_tti_rx, 0, 0, - 1, NR_PDSCH_EST); //printf("phy procedure pdsch start measurement\n"); @@ -5106,7 +5104,6 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN nr_tti_rx, 0, 0, - 1, NR_PBCH_EST); nr_ue_pbch_procedures(eNB_id,ue,proc,0); diff --git a/openair1/SIMULATION/NR_PHY/pbchsim.c b/openair1/SIMULATION/NR_PHY/pbchsim.c index a52c6ecf0d..74850d2509 100644 --- a/openair1/SIMULATION/NR_PHY/pbchsim.c +++ b/openair1/SIMULATION/NR_PHY/pbchsim.c @@ -43,6 +43,7 @@ #include "PHY/INIT/phy_init.h" #include "PHY/NR_TRANSPORT/nr_transport.h" #include "PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h" +#include "PHY/NR_UE_ESTIMATION/nr_estimation.h" #include "SCHED_NR/sched_nr.h" @@ -371,6 +372,7 @@ int main(int argc, char **argv) frame_parms->N_RB_DL = N_RB_DL; frame_parms->N_RB_UL = N_RB_DL; frame_parms->Nid_cell = Nid_cell; + frame_parms->ssb_type = nr_ssb_type_B; nr_phy_config_request_sim(gNB,N_RB_DL,N_RB_DL,mu,Nid_cell,SSB_positions); phy_init_nr_gNB(gNB,0,0); @@ -545,7 +547,6 @@ int main(int argc, char **argv) n_errors_payload = 0; for (trial=0; trialrx_offset=0; - //symbol 1 - nr_slot_fep(UE, - 5, - 0, - 0, - 0, - 1, - NR_PBCH_EST); - - //symbol 2 - nr_slot_fep(UE, - 6, - 0, - 0, - 0, - 1, - NR_PBCH_EST); - - //symbol 3 - nr_slot_fep(UE, - 7, - 0, - 0, - 0, - 1, - NR_PBCH_EST); + + for (int i=5; i<8; i++) { + nr_slot_fep(UE, + i, + 0, + 0, + 0, + NR_PBCH_EST); + + nr_pbch_channel_estimation(UE,0,0,i); + } ret = nr_rx_pbch(UE, &UE->proc.proc_rxtx[0], diff --git a/targets/RT/USER/nr-ue.c b/targets/RT/USER/nr-ue.c index 1dc3085edf..020dd9adbf 100644 --- a/targets/RT/USER/nr-ue.c +++ b/targets/RT/USER/nr-ue.c @@ -965,7 +965,7 @@ void *UE_thread(void *arg) { UE->frame_parms.ofdm_symbol_size+UE->frame_parms.nb_prefix_samples0, UE->frame_parms.nb_antennas_rx),""); //write_output("txdata_sym.m", "txdata_sym", UE->common_vars.rxdata[0], (UE->frame_parms.ofdm_symbol_size+UE->frame_parms.nb_prefix_samples0), 1, 1); - //nr_slot_fep(UE,0, 0, 0, 1, 1, NR_PDCCH_EST); + //nr_slot_fep(UE,0, 0, 0, 1, NR_PDCCH_EST); } //UE->mode != loop_through_memory else rt_sleep_ns(1000*1000); From 49e9baee5b3605e0e0dde4963ccb5db4619b44d6 Mon Sep 17 00:00:00 2001 From: Francesco Mani Date: Fri, 1 Mar 2019 13:04:23 +0100 Subject: [PATCH 13/31] brute force ssb detection --- .../nfapi/public_inc/nfapi_nr_interface.h | 2 +- openair1/PHY/INIT/nr_init.c | 7 ++- openair1/PHY/MODULATION/slot_fep_nr.c | 12 +++- .../nr_dl_channel_estimation.c | 17 +++--- openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h | 11 ++-- .../PHY/NR_UE_TRANSPORT/nr_initial_sync.c | 60 +++++++++++-------- openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c | 2 +- .../NR_UE_TRANSPORT/nr_transport_proto_ue.h | 4 ++ openair1/PHY/NR_UE_TRANSPORT/sss_nr.c | 15 ----- openair1/PHY/defs_nr_UE.h | 3 + openair1/SCHED_NR_UE/phy_procedures_nr_ue.c | 11 +++- openair1/SIMULATION/NR_PHY/pbchsim.c | 15 ++--- 12 files changed, 87 insertions(+), 72 deletions(-) diff --git a/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface.h b/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface.h index 69b1c5c3ac..7c78d817a6 100644 --- a/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface.h +++ b/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface.h @@ -75,7 +75,7 @@ typedef struct // These TLVs are used by the VNF to configure the RF in the PNF // nfapi_uint16_tlv_t max_transmit_power; - nfapi_uint16_tlv_t nrarfcn; + nfapi_uint32_tlv_t nrarfcn; // nfapi_nmm_frequency_bands_t nmm_gsm_frequency_bands; // nfapi_nmm_frequency_bands_t nmm_umts_frequency_bands; diff --git a/openair1/PHY/INIT/nr_init.c b/openair1/PHY/INIT/nr_init.c index 2f613152dd..3a116de25f 100644 --- a/openair1/PHY/INIT/nr_init.c +++ b/openair1/PHY/INIT/nr_init.c @@ -363,7 +363,7 @@ void nr_phy_config_request_sim(PHY_VARS_gNB *gNB,int N_RB_DL,int N_RB_UL,int mu, NR_DL_FRAME_PARMS *fp = &gNB->frame_parms; nfapi_nr_config_request_t *gNB_config = &gNB->gNB_config; //overwrite for new NR parameters - gNB_config->nfapi_config.rf_bands.rf_band[0] = 5; + gNB_config->nfapi_config.rf_bands.rf_band[0] = 78; gNB_config->nfapi_config.nrarfcn.value = 620000; gNB_config->subframe_config.numerology_index_mu.value = mu; gNB_config->subframe_config.duplex_mode.value = TDD; @@ -377,12 +377,13 @@ void nr_phy_config_request_sim(PHY_VARS_gNB *gNB,int N_RB_DL,int N_RB_UL,int mu, gNB_config->sch_config.ssb_scg_position_in_burst.value=position_in_burst; gNB->mac_enabled = 1; - fp->dl_CarrierFreq = from_nrarfcn(gNB_config->nfapi_config.rf_bands.rf_band[0],gNB_config->nfapi_config.nrarfcn.value); - fp->ul_CarrierFreq = fp->dl_CarrierFreq - (get_uldl_offset(gNB_config->nfapi_config.rf_bands.rf_band[0])*100000); + fp->dl_CarrierFreq = 3500000000;//from_nrarfcn(gNB_config->nfapi_config.rf_bands.rf_band[0],gNB_config->nfapi_config.nrarfcn.value); + fp->ul_CarrierFreq = 3500000000;//fp->dl_CarrierFreq - (get_uldl_offset(gNB_config->nfapi_config.rf_bands.rf_band[0])*100000); fp->threequarter_fs = 0; nr_init_frame_parms(gNB_config, fp); gNB->configured = 1; LOG_I(PHY,"gNB configured\n"); + } diff --git a/openair1/PHY/MODULATION/slot_fep_nr.c b/openair1/PHY/MODULATION/slot_fep_nr.c index f41212e543..6ce486e3a0 100644 --- a/openair1/PHY/MODULATION/slot_fep_nr.c +++ b/openair1/PHY/MODULATION/slot_fep_nr.c @@ -45,8 +45,16 @@ int nr_slot_fep(PHY_VARS_NR_UE *ue, NR_UE_COMMON *common_vars = &ue->common_vars; unsigned char aa; unsigned char symbol = l;//+((7-frame_parms->Ncp)*(Ns&1)); ///symbol within sub-frame - unsigned int nb_prefix_samples = (no_prefix ? 0 : frame_parms->nb_prefix_samples); - unsigned int nb_prefix_samples0 = (no_prefix ? 0 : frame_parms->nb_prefix_samples0); + unsigned int nb_prefix_samples; + unsigned int nb_prefix_samples0; + if (ue->is_synchronized) { + nb_prefix_samples = (no_prefix ? 0 : frame_parms->nb_prefix_samples); + nb_prefix_samples0 = (no_prefix ? 0 : frame_parms->nb_prefix_samples0); + } + else { + nb_prefix_samples = (no_prefix ? 0 : frame_parms->nb_prefix_samples); + nb_prefix_samples0 = (no_prefix ? 0 : frame_parms->nb_prefix_samples); + } //unsigned int subframe_offset;//,subframe_offset_F; unsigned int slot_offset; //int i; 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 05ee82ae29..20227b827b 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c @@ -32,6 +32,7 @@ //#define DEBUG_PDCCH + int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue, uint8_t eNB_offset, unsigned char Ns, @@ -47,13 +48,14 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue, //uint16_t Nid_cell = (eNB_offset == 0) ? ue->frame_parms.Nid_cell : ue->measurements.adj_cell_id[eNB_offset-1]; - uint8_t nushift, ssb_index=0, n_hf=0; + uint8_t nushift; + uint8_t ssb_index=ue->i_ssb; + uint8_t n_hf=ue->n_hf; int **dl_ch_estimates =ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].dl_ch_estimates[eNB_offset]; int **rxdataF=ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].rxdataF; nushift = ue->frame_parms.Nid_cell%4; ue->frame_parms.nushift = nushift; - unsigned int ssb_offset = ue->frame_parms.first_carrier_offset + ue->frame_parms.ssb_start_subcarrier; if (ssb_offset>= ue->frame_parms.ofdm_symbol_size) ssb_offset-=ue->frame_parms.ofdm_symbol_size; @@ -120,7 +122,7 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue, pil = (int16_t *)&pilot[0]; rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)]; dl_ch = (int16_t *)&dl_ch_estimates[aarx][ch_offset]; - + memset(dl_ch,0,4*(ue->frame_parms.ofdm_symbol_size)); if (ue->high_speed_flag==0) // multiply previous channel estimate by ch_est_alpha multadd_complex_vector_real_scalar(dl_ch-(ue->frame_parms.ofdm_symbol_size<<1), @@ -137,6 +139,7 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue, // Treat first 2 pilots specially (left edge) ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15); + #ifdef DEBUG_CH printf("ch 0 %d\n",((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])); printf("pilot 0 : rxF - > (%d,%d) addr %p ch -> (%d,%d), pil -> (%d,%d) \n",rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); @@ -154,6 +157,8 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue, ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15); + + #ifdef DEBUG_CH printf("pilot 1 : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]); #endif @@ -165,9 +170,6 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue, re_offset = (re_offset+4)&(ue->frame_parms.ofdm_symbol_size-1); rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)]; - ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); - ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15); - #ifdef DEBUG_CH printf("pilot 2 : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]); #endif @@ -195,6 +197,7 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue, } ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15); + #ifdef DEBUG_CH printf("pilot %d : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",pilot_cnt,rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]); #endif @@ -213,6 +216,7 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue, ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15); + #ifdef DEBUG_CH printf("pilot %d : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",pilot_cnt+1,rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]); #endif @@ -247,7 +251,6 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue, //} } - return(0); } diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h b/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h index a6ede43504..ed24edaf56 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h @@ -51,9 +51,9 @@ int nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue, unsigned short nb_rb_coreset); int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue, - uint8_t eNB_offset, - unsigned char Ns, - unsigned char symbol); + uint8_t eNB_offset, + unsigned char Ns, + unsigned char symbol); int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, uint8_t eNB_offset, @@ -61,8 +61,9 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, unsigned short p, unsigned char l, unsigned char symbol, - unsigned short bwp_start_subcarrier, - unsigned short nb_rb_pdsch); + unsigned short bwp_start_subcarrier, + unsigned short nb_rb_pdsch); + void nr_adjust_synch_ue(NR_DL_FRAME_PARMS *frame_parms, PHY_VARS_NR_UE *ue, diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c b/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c index ea4745fe23..dce3bb51f1 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c @@ -53,48 +53,48 @@ int cnt=0; #define DEBUG_INITIAL_SYNCH -int nr_pbch_detection(PHY_VARS_NR_UE *ue, runmode_t mode) + +int nr_pbch_detection(PHY_VARS_NR_UE *ue, int pbch_initial_symbol, runmode_t mode) { NR_DL_FRAME_PARMS *frame_parms=&ue->frame_parms; int ret =-1; - #ifdef DEBUG_INITIAL_SYNCH LOG_I(PHY,"[UE%d] Initial sync: starting PBCH detection (rx_offset %d)\n",ue->Mod_id, ue->rx_offset); #endif - // save the nb_prefix_samples0 since we are not synchronized to subframes yet and the SSB has all symbols with nb_prefix_samples - int nb_prefix_samples0 = frame_parms->nb_prefix_samples0; - frame_parms->nb_prefix_samples0 = frame_parms->nb_prefix_samples; + uint8_t N_L = (frame_parms->Lmax == 4)? 4:8; + uint8_t N_hf = (frame_parms->Lmax == 4)? 2:1; + // loops over possible pbch dmrs cases to retrive best estimated i_ssb (and n_hf for Lmax=4) for multiple ssb detection + for (int hf = 0; hf < N_hf; hf++) { + for (int l = 0; l < N_L ; l++) { + if (ret !=0) { + ue->i_ssb = l; + ue->n_hf = hf; - for(int i=1; i<4;i++) { - #if UE_TIMING_TRACE - start_meas(&ue->dlsch_channel_estimation_stats); + start_meas(&ue->dlsch_channel_estimation_stats); #endif - nr_pbch_channel_estimation(ue,0, - 0, - i); + for(int i=pbch_initial_symbol; idlsch_channel_estimation_stats); + stop_meas(&ue->dlsch_channel_estimation_stats); #endif + + ret = nr_rx_pbch(ue, + &ue->proc.proc_rxtx[0], + ue->pbch_vars[0], + frame_parms, + 0, + SISO, + ue->high_speed_flag); + + } + } } - //put back nb_prefix_samples0 - frame_parms->nb_prefix_samples0 = nb_prefix_samples0; - - - ret = nr_rx_pbch(ue, - &ue->proc.proc_rxtx[0], - ue->pbch_vars[0], - frame_parms, - 0, - SISO, - ue->high_speed_flag); - - if (ret==0) { frame_parms->nb_antenna_ports_eNB = 1; //pbch_tx_ant; @@ -211,6 +211,14 @@ int nr_initial_sync(PHY_VARS_NR_UE *ue, runmode_t mode) /* check that SSS/PBCH block is continuous inside the received buffer */ if (sync_pos < (NR_NUMBER_OF_SUBFRAMES_PER_FRAME*fp->samples_per_subframe - (NB_SYMBOLS_PBCH * fp->ofdm_symbol_size))) { + /* slop_fep function works for lte and takes into account begining of frame with prefix for subframe 0 */ + /* for NR this is not the case but slot_fep is still used for computing FFT of samples */ + /* in order to achieve correct processing for NR prefix samples is forced to 0 and then restored after function call */ + /* symbol number are from beginning of SS/PBCH blocks as below: */ + /* Signal PSS PBCH SSS PBCH */ + /* symbol number 0 1 2 3 */ + /* time samples in buffer rxdata are used as input of FFT -> FFT results are stored in the frequency buffer rxdataF */ + /* rxdataF stores SS/PBCH from beginning of buffers in the same symbol order as in time domain */ for(int i=0; i<4;i++) nr_slot_fep(ue, @@ -230,7 +238,7 @@ int nr_initial_sync(PHY_VARS_NR_UE *ue, runmode_t mode) //nr_init_frame_parms_ue(fp,NR_MU_1,NORMAL,n_ssb_crb,0); nr_gold_pbch(ue); - ret = nr_pbch_detection(ue,mode); + ret = nr_pbch_detection(ue,1,mode); // start pbch detection at first symbol after pss nr_gold_pdcch(ue,0, 2); /* diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c b/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c index a88b51e37a..49d8d80b04 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c @@ -426,7 +426,7 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue, uint8_t nushift; uint16_t M; uint8_t Lmax=frame_parms->Lmax; - uint8_t ssb_index=0; + uint8_t ssb_index=ue->i_ssb; //uint16_t crc; //unsigned short idx_demod =0; uint32_t decoderState=0; diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h index 3c272b9c17..36158fa259 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h @@ -1125,6 +1125,10 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue, MIMO_mode_t mimo_mode, uint32_t high_speed_flag); +int nr_pbch_detection(PHY_VARS_NR_UE *ue, + int pbch_initial_symbol, + runmode_t mode); + uint16_t rx_pbch_emul(PHY_VARS_NR_UE *phy_vars_ue, uint8_t eNB_id, uint8_t pbch_phase); diff --git a/openair1/PHY/NR_UE_TRANSPORT/sss_nr.c b/openair1/PHY/NR_UE_TRANSPORT/sss_nr.c index 493672f890..3d36822956 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/sss_nr.c +++ b/openair1/PHY/NR_UE_TRANSPORT/sss_nr.c @@ -430,21 +430,6 @@ int rx_sss_nr(PHY_VARS_NR_UE *ue, int32_t *tot_metric,uint8_t *phase_max) int32_t metric, metric_re; int16_t *d; - /* slop_fep function works for lte and takes into account begining of frame with prefix for subframe 0 */ - /* for NR this is not the case but slot_fep is still used for computing FFT of samples */ - /* in order to achieve correct processing for NR prefix samples is forced to 0 and then restored after function call */ - /* symbol number are from beginning of SS/PBCH blocks as below: */ - /* Signal PSS PBCH SSS PBCH */ - /* symbol number 0 1 2 3 */ - /* time samples in buffer rxdata are used as input of FFT -> FFT results are stored in the frequency buffer rxdataF */ - /* rxdataF stores SS/PBCH from beginning of buffers in the same symbol order as in time domain */ - - int nb_prefix_samples0 = frame_parms->nb_prefix_samples0; - // For now, symbol 0 = PSS/PBCH and it is never in symbol 0 or 7*2^mu (i.e. always shorter prefix) - frame_parms->nb_prefix_samples0 = frame_parms->nb_prefix_samples; - - - frame_parms->nb_prefix_samples0 = nb_prefix_samples0; // pss sss extraction pss_sss_extract_nr(ue, diff --git a/openair1/PHY/defs_nr_UE.h b/openair1/PHY/defs_nr_UE.h index a3c404ba61..f384bcaccf 100644 --- a/openair1/PHY/defs_nr_UE.h +++ b/openair1/PHY/defs_nr_UE.h @@ -1143,6 +1143,8 @@ typedef struct { uint8_t decode_MIB; /// temporary offset during cell search prior to MIB decoding int ssb_offset; + uint8_t i_ssb; + uint8_t n_hf; int rx_offset; /// Timing offset int rx_offset_diff; /// Timing adjustment for ofdm symbol0 on HW USRP int time_sync_cell; @@ -1307,6 +1309,7 @@ typedef struct { } PHY_VARS_NR_UE; + /* this structure is used to pass both UE phy vars and * proc to the function UE_thread_rxn_txnp4 */ diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c index a2388def23..3b04a79321 100644 --- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c +++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c @@ -5098,14 +5098,23 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN if ( (nr_tti_rx == 0) && (ue->decode_MIB == 1)) { LOG_D(PHY," ------ PBCH ChannelComp/LLR: frame.slot %d.%d ------ \n", frame_rx%1024, nr_tti_rx); - for (int i=0; i<3; i++) + for (int i=0; i<3; i++) { nr_slot_fep(ue, (5+i), //mu=1 case B nr_tti_rx, 0, 0, NR_PBCH_EST); + +#if UE_TIMING_TRACE + start_meas(&ue->dlsch_channel_estimation_stats); +#endif + nr_pbch_channel_estimation(ue,0,0,5+i); +#if UE_TIMING_TRACE + stop_meas(&ue->dlsch_channel_estimation_stats); +#endif + } nr_ue_pbch_procedures(eNB_id,ue,proc,0); } diff --git a/openair1/SIMULATION/NR_PHY/pbchsim.c b/openair1/SIMULATION/NR_PHY/pbchsim.c index 74850d2509..f424dc9f29 100644 --- a/openair1/SIMULATION/NR_PHY/pbchsim.c +++ b/openair1/SIMULATION/NR_PHY/pbchsim.c @@ -372,7 +372,8 @@ int main(int argc, char **argv) frame_parms->N_RB_DL = N_RB_DL; frame_parms->N_RB_UL = N_RB_DL; frame_parms->Nid_cell = Nid_cell; - frame_parms->ssb_type = nr_ssb_type_B; + frame_parms->nushift = Nid_cell%4; + frame_parms->ssb_type = nr_ssb_type_C; nr_phy_config_request_sim(gNB,N_RB_DL,N_RB_DL,mu,Nid_cell,SSB_positions); phy_init_nr_gNB(gNB,0,0); @@ -605,17 +606,9 @@ int main(int argc, char **argv) 0, 0, NR_PBCH_EST); - - nr_pbch_channel_estimation(UE,0,0,i); } - - ret = nr_rx_pbch(UE, - &UE->proc.proc_rxtx[0], - UE->pbch_vars[0], - frame_parms, - 0, - SISO, - UE->high_speed_flag); + + ret = nr_pbch_detection(UE,5,0); // start pbch detection from symbol 5 and mode 0 if (ret==0) { //UE->rx_ind.rx_indication_body->mib_pdu.ssb_index; //not yet detected automatically From 568fa2375ca0df2a4f323751109e66f81a5698fb Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Fri, 1 Mar 2019 15:41:17 +0100 Subject: [PATCH 14/31] adding loop over slots in nr_pbchsim --- openair1/SIMULATION/NR_PHY/pbchsim.c | 47 ++++++++++++++++------------ 1 file changed, 27 insertions(+), 20 deletions(-) diff --git a/openair1/SIMULATION/NR_PHY/pbchsim.c b/openair1/SIMULATION/NR_PHY/pbchsim.c index f424dc9f29..8811ae97f7 100644 --- a/openair1/SIMULATION/NR_PHY/pbchsim.c +++ b/openair1/SIMULATION/NR_PHY/pbchsim.c @@ -488,28 +488,35 @@ int main(int argc, char **argv) gNB->pbch_configured = 1; for (int i=0;i<4;i++) gNB->pbch_pdu[i]=i+1; - nr_common_signal_procedures (gNB,frame,subframe); - - LOG_M("txsigF0.m","txsF0", gNB->common_vars.txdataF[0],frame_length_complex_samples_no_prefix,1,1); - if (gNB->frame_parms.nb_antennas_tx>1) - LOG_M("txsigF1.m","txsF1", gNB->common_vars.txdataF[1],frame_length_complex_samples_no_prefix,1,1); - - //TODO: loop over slots - for (aa=0; aaframe_parms.nb_antennas_tx; aa++) { - if (gNB_config->subframe_config.dl_cyclic_prefix_type.value == 1) { - PHY_ofdm_mod(gNB->common_vars.txdataF[aa], - txdata[aa], - frame_parms->ofdm_symbol_size, - 12, - frame_parms->nb_prefix_samples, - CYCLIC_PREFIX); - } else { - nr_normal_prefix_mod(gNB->common_vars.txdataF[aa], - txdata[aa], - 14, - frame_parms); + for (int slot=0;slotslots_per_frame;slot++) { + for (aa=0; aaframe_parms.nb_antennas_tx; aa++) + memset(gNB->common_vars.txdataF[aa],0,frame_parms->samples_per_slot_wCP*sizeof(int32_t)); + + nr_common_signal_procedures (gNB,frame,slot); + + //TODO: loop over slots + for (aa=0; aaframe_parms.nb_antennas_tx; aa++) { + if (gNB_config->subframe_config.dl_cyclic_prefix_type.value == 1) { + PHY_ofdm_mod(gNB->common_vars.txdataF[aa], + &txdata[aa][slot*frame_parms->samples_per_slot], + frame_parms->ofdm_symbol_size, + 12, + frame_parms->nb_prefix_samples, + CYCLIC_PREFIX); + } else { + nr_normal_prefix_mod(gNB->common_vars.txdataF[aa], + &txdata[aa][slot*frame_parms->samples_per_slot], + 14, + frame_parms); + } } } + + LOG_M("txsigF0.m","txsF0", gNB->common_vars.txdataF[0],frame_length_complex_samples_no_prefix,1,1); + if (gNB->frame_parms.nb_antennas_tx>1) + LOG_M("txsigF1.m","txsF1", gNB->common_vars.txdataF[1],frame_length_complex_samples_no_prefix,1,1); + + } else { printf("Reading %d samples from file to antenna buffer %d\n",frame_length_complex_samples,0); From 62e56f212e9f6594a6e4a9386584f230b4b2ea79 Mon Sep 17 00:00:00 2001 From: Francesco Mani Date: Fri, 1 Mar 2019 17:57:53 +0100 Subject: [PATCH 15/31] some hardcoding removed in pbch detection still some left --- openair1/PHY/INIT/nr_parms.c | 53 +++++++++++++++++ openair1/PHY/INIT/phy_init.h | 1 + .../nr_dl_channel_estimation.c | 14 ++--- openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h | 3 +- .../PHY/NR_UE_TRANSPORT/nr_initial_sync.c | 2 +- openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c | 3 +- openair1/SCHED_NR/phy_procedures_nr_gNB.c | 57 +------------------ openair1/SCHED_NR_UE/phy_procedures_nr_ue.c | 2 +- openair1/SIMULATION/NR_PHY/pbchsim.c | 11 +++- 9 files changed, 75 insertions(+), 71 deletions(-) diff --git a/openair1/PHY/INIT/nr_parms.c b/openair1/PHY/INIT/nr_parms.c index 14d95ad488..a2471d6d55 100644 --- a/openair1/PHY/INIT/nr_parms.c +++ b/openair1/PHY/INIT/nr_parms.c @@ -27,6 +27,59 @@ uint32_t nr_subcarrier_spacing[MAX_NUM_SUBCARRIER_SPACING] = {15e3, 30e3, 60e3, uint16_t nr_slots_per_subframe[MAX_NUM_SUBCARRIER_SPACING] = {1, 2, 4, 16, 32}; +int nr_get_ssb_start_symbol(NR_DL_FRAME_PARMS *fp, uint8_t i_ssb, uint8_t half_frame_index) +{ + + int mu = fp->numerology_index; + int symbol = 0; + uint8_t n, n_temp; + nr_ssb_type_e type = fp->ssb_type; + int case_AC[2] = {2,8}; + int case_BD[4] = {4,8,16,20}; + int case_E[8] = {8, 12, 16, 20, 32, 36, 40, 44}; + + switch(mu) { + + case NR_MU_0: // case A + n = i_ssb >> 1; + symbol = case_AC[i_ssb % 2] + 14*n; + break; + + case NR_MU_1: + if (type == 1){ // case B + n = i_ssb >> 2; + symbol = case_BD[i_ssb % 4] + 28*n; + } + if (type == 2){ // case C + n = i_ssb >> 1; + symbol = case_AC[i_ssb % 2] + 14*n; + } + break; + + case NR_MU_3: // case D + n_temp = i_ssb >> 2; + n = n_temp + (n_temp >> 2); + symbol = case_BD[i_ssb % 4] + 28*n; + break; + + case NR_MU_4: // case E + n_temp = i_ssb >> 3; + n = n_temp + (n_temp >> 2); + symbol = case_E[i_ssb % 8] + 56*n; + break; + + + default: + AssertFatal(0==1, "Invalid numerology index %d for the synchronization block\n", mu); + } + + if (half_frame_index) + symbol += (5 * fp->symbols_per_slot * fp->slots_per_subframe); + + return symbol; +} + + int nr_init_frame_parms0(NR_DL_FRAME_PARMS *fp, int mu, int Ncp, diff --git a/openair1/PHY/INIT/phy_init.h b/openair1/PHY/INIT/phy_init.h index a454fb8e80..ddda39a4c8 100644 --- a/openair1/PHY/INIT/phy_init.h +++ b/openair1/PHY/INIT/phy_init.h @@ -376,6 +376,7 @@ void phy_config_request(PHY_Config_t *phy_config); int init_frame_parms(LTE_DL_FRAME_PARMS *frame_parms,uint8_t osf); void dump_frame_parms(LTE_DL_FRAME_PARMS *frame_parms); +int nr_get_ssb_start_symbol(NR_DL_FRAME_PARMS *fp, uint8_t i_ssb, uint8_t half_frame_index); int nr_init_frame_parms(nfapi_nr_config_request_t* config, NR_DL_FRAME_PARMS *frame_parms); int nr_init_frame_parms_ue(NR_DL_FRAME_PARMS *frame_parms,int mu,int Ncp,int N_RB_DL,int n_ssb_crb,int ssb_subcarrier_offset); int init_nr_ue_signal(PHY_VARS_NR_UE *ue,int nb_connected_eNB,uint8_t abstraction_flag); 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 20227b827b..15e83b51d0 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c @@ -36,7 +36,8 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue, uint8_t eNB_offset, unsigned char Ns, - unsigned char symbol) + unsigned char symbol, + int dmrss) { int pilot[200] __attribute__((aligned(16))); unsigned char aarx; @@ -44,7 +45,6 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue, unsigned int pilot_cnt; int16_t ch[2],*pil,*rxF,*dl_ch,*fl,*fm,*fr; int ch_offset,symbol_offset; - int dmrss; //uint16_t Nid_cell = (eNB_offset == 0) ? ue->frame_parms.Nid_cell : ue->measurements.adj_cell_id[eNB_offset-1]; @@ -59,18 +59,14 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue, unsigned int ssb_offset = ue->frame_parms.first_carrier_offset + ue->frame_parms.ssb_start_subcarrier; if (ssb_offset>= ue->frame_parms.ofdm_symbol_size) ssb_offset-=ue->frame_parms.ofdm_symbol_size; - if (ue->is_synchronized ==0 ) dmrss = symbol-1; - else dmrss = symbol-5; - if (ue->high_speed_flag == 0) // use second channel estimate position for temporary storage ch_offset = ue->frame_parms.ofdm_symbol_size ; else ch_offset = ue->frame_parms.ofdm_symbol_size*symbol; - AssertFatal((symbol > 0 && symbol < 4 && ue->is_synchronized == 0) || - (symbol > 4 && symbol < 8 && ue->is_synchronized == 1), - "symbol %d is illegal for PBCH DM-RS (is_synchronized %d)\n", - symbol,ue->is_synchronized); + AssertFatal(dmrss >= 0 && dmrss < 3, + "symbol %d is illegal for PBCH DM-RS \n", + dmrss); symbol_offset = ue->frame_parms.ofdm_symbol_size*symbol; diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h b/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h index ed24edaf56..5418b16d1b 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h @@ -53,7 +53,8 @@ int nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue, int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue, uint8_t eNB_offset, unsigned char Ns, - unsigned char symbol); + unsigned char symbol, + int dmrss); int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, uint8_t eNB_offset, diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c b/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c index dce3bb51f1..4f0f905e9f 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c @@ -78,7 +78,7 @@ int nr_pbch_detection(PHY_VARS_NR_UE *ue, int pbch_initial_symbol, runmode_t mod start_meas(&ue->dlsch_channel_estimation_stats); #endif for(int i=pbch_initial_symbol; idlsch_channel_estimation_stats); #endif diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c b/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c index 49d8d80b04..4d8ce3dec9 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c @@ -34,6 +34,7 @@ #include "PHY/phy_extern_nr_ue.h" #include "PHY/sse_intrin.h" #include "PHY/LTE_REFSIG/lte_refsig.h" +#include "PHY/INIT/phy_init.h" //#define DEBUG_PBCH 1 //#define DEBUG_PBCH_ENCODING @@ -442,7 +443,7 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue, int symbol_offset=1; if (ue->is_synchronized > 0) - symbol_offset=4; + symbol_offset=2; else symbol_offset=0; diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index d922a3143d..aeda4b3549 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -30,6 +30,7 @@ #include "SCHED/fapi_l1.h" #include "common/utils/LOG/log.h" #include "common/utils/LOG/vcd_signal_dumper.h" +#include "PHY/INIT/phy_init.h" #include "T.h" @@ -77,60 +78,6 @@ int return_ssb_type(nfapi_config_request_t *cfg) }*/ -// First SSB starting symbol candidate is used and type B is chosen for 30kHz SCS - -int nr_get_ssb_start_symbol(nfapi_nr_config_request_t *cfg, NR_DL_FRAME_PARMS *fp, uint8_t i_ssb) -{ - - int mu = cfg->subframe_config.numerology_index_mu.value; - int symbol = 0; - uint8_t n, n_temp; - nr_ssb_type_e type = fp->ssb_type; - int case_AC[2] = {2,8}; - int case_BD[4] = {4,8,16,20}; - int case_E[8] = {8, 12, 16, 20, 32, 36, 40, 44}; - - - switch(mu) { - - case NR_MU_0: // case A - n = i_ssb >> 1; - symbol = case_AC[i_ssb % 2] + 14*n; - break; - - case NR_MU_1: - if (type == 1){ // case B - n = i_ssb >> 2; - symbol = case_BD[i_ssb % 4] + 28*n; - } - if (type == 2){ // case C - n = i_ssb >> 1; - symbol = case_AC[i_ssb % 2] + 14*n; - } - break; - - case NR_MU_3: // case D - n_temp = i_ssb >> 2; - n = n_temp + (n_temp >> 2); - symbol = case_BD[i_ssb % 4] + 28*n; - break; - - case NR_MU_4: // case E - n_temp = i_ssb >> 3; - n = n_temp + (n_temp >> 2); - symbol = case_E[i_ssb % 8] + 56*n; - break; - - - default: - AssertFatal(0==1, "Invalid numerology index %d for the synchronization block\n", mu); - } - - if (cfg->sch_config.half_frame_index.value) - symbol += (5 * fp->symbols_per_slot * fp->slots_per_subframe); - - return symbol; -} void nr_set_ssb_first_subcarrier(nfapi_nr_config_request_t *cfg, NR_DL_FRAME_PARMS *fp) { fp->ssb_start_subcarrier = (12 * cfg->sch_config.n_ssb_crb.value + cfg->sch_config.ssb_subcarrier_offset.value)/(1<subframe_config.numerology_index_mu.value); @@ -158,7 +105,7 @@ void nr_common_signal_procedures (PHY_VARS_gNB *gNB,int frame, int slot) { ssb_index = i + 2*rel_slot; // computing the ssb_index if ((fp->L_ssb >> ssb_index) & 0x01) { // generating the ssb only if the bit of L_ssb at current ssb index is 1 - int ssb_start_symbol_abs = nr_get_ssb_start_symbol(cfg, fp, ssb_index); // computing the starting symbol for current ssb + int ssb_start_symbol_abs = nr_get_ssb_start_symbol(fp, ssb_index, n_hf); // computing the starting symbol for current ssb ssb_start_symbol = ssb_start_symbol_abs % 14; // start symbol wrt slot nr_set_ssb_first_subcarrier(cfg, fp); // setting the first subcarrier diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c index 3b04a79321..33b42749e0 100644 --- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c +++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c @@ -5109,7 +5109,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN #if UE_TIMING_TRACE start_meas(&ue->dlsch_channel_estimation_stats); #endif - nr_pbch_channel_estimation(ue,0,0,5+i); + nr_pbch_channel_estimation(ue,0,0,5+i,i); #if UE_TIMING_TRACE stop_meas(&ue->dlsch_channel_estimation_stats); #endif diff --git a/openair1/SIMULATION/NR_PHY/pbchsim.c b/openair1/SIMULATION/NR_PHY/pbchsim.c index 8811ae97f7..4b281184b8 100644 --- a/openair1/SIMULATION/NR_PHY/pbchsim.c +++ b/openair1/SIMULATION/NR_PHY/pbchsim.c @@ -378,6 +378,8 @@ int main(int argc, char **argv) nr_phy_config_request_sim(gNB,N_RB_DL,N_RB_DL,mu,Nid_cell,SSB_positions); phy_init_nr_gNB(gNB,0,0); + uint8_t n_hf = gNB_config->sch_config.half_frame_index.value; + double fs,bw,scs,eps; switch (mu) { @@ -494,7 +496,6 @@ int main(int argc, char **argv) nr_common_signal_procedures (gNB,frame,slot); - //TODO: loop over slots for (aa=0; aaframe_parms.nb_antennas_tx; aa++) { if (gNB_config->subframe_config.dl_cyclic_prefix_type.value == 1) { PHY_ofdm_mod(gNB->common_vars.txdataF[aa], @@ -605,8 +606,12 @@ int main(int argc, char **argv) } else { UE->rx_offset=0; + + uint8_t ssb_index = 0; + while (!((SSB_positions >> ssb_index) & 0x01)) ssb_index++; // to select the first transmitted ssb - for (int i=5; i<8; i++) { + int start_symbol = nr_get_ssb_start_symbol(frame_parms, ssb_index, n_hf); + for (int i=start_symbol+1; irx_ind.rx_indication_body->mib_pdu.ssb_index; //not yet detected automatically From 2aa32eff67f8edcc863fef749ceb56be6d4af1db Mon Sep 17 00:00:00 2001 From: Francesco Mani Date: Mon, 4 Mar 2019 15:32:43 +0100 Subject: [PATCH 16/31] brute force multiple ssb detection works in pbchsim --- .../nr_dl_channel_estimation.c | 6 ++-- openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h | 4 ++- .../PHY/NR_UE_TRANSPORT/nr_initial_sync.c | 31 ++++++++++--------- openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c | 22 +++++++++---- .../NR_UE_TRANSPORT/nr_transport_proto_ue.h | 1 + openair1/PHY/defs_nr_UE.h | 3 +- openair1/SCHED_NR_UE/phy_procedures_nr_ue.c | 11 +++++-- openair1/SIMULATION/NR_PHY/pbchsim.c | 8 ++--- 8 files changed, 53 insertions(+), 33 deletions(-) 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 15e83b51d0..d39677d232 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c @@ -37,7 +37,9 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue, uint8_t eNB_offset, unsigned char Ns, unsigned char symbol, - int dmrss) + int dmrss, + uint8_t ssb_index, + uint8_t n_hf) { int pilot[200] __attribute__((aligned(16))); unsigned char aarx; @@ -49,8 +51,6 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue, //uint16_t Nid_cell = (eNB_offset == 0) ? ue->frame_parms.Nid_cell : ue->measurements.adj_cell_id[eNB_offset-1]; uint8_t nushift; - uint8_t ssb_index=ue->i_ssb; - uint8_t n_hf=ue->n_hf; int **dl_ch_estimates =ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].dl_ch_estimates[eNB_offset]; int **rxdataF=ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].rxdataF; diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h b/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h index 5418b16d1b..591b4733ce 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h @@ -54,7 +54,9 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue, uint8_t eNB_offset, unsigned char Ns, unsigned char symbol, - int dmrss); + int dmrss, + uint8_t ssb_index, + uint8_t n_hf); int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, uint8_t eNB_offset, diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c b/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c index 4f0f905e9f..0b9795b6bc 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c @@ -71,14 +71,12 @@ int nr_pbch_detection(PHY_VARS_NR_UE *ue, int pbch_initial_symbol, runmode_t mod for (int hf = 0; hf < N_hf; hf++) { for (int l = 0; l < N_L ; l++) { if (ret !=0) { - ue->i_ssb = l; - ue->n_hf = hf; #if UE_TIMING_TRACE start_meas(&ue->dlsch_channel_estimation_stats); #endif for(int i=pbch_initial_symbol; idlsch_channel_estimation_stats); #endif @@ -88,6 +86,7 @@ int nr_pbch_detection(PHY_VARS_NR_UE *ue, int pbch_initial_symbol, runmode_t mod ue->pbch_vars[0], frame_parms, 0, + l, SISO, ue->high_speed_flag); @@ -130,7 +129,7 @@ char prefix_string[2][9] = {"NORMAL","EXTENDED"}; int nr_initial_sync(PHY_VARS_NR_UE *ue, runmode_t mode) { - int32_t sync_pos, sync_pos_slot; // k_ssb, N_ssb_crb, sync_pos2, + int32_t sync_pos, sync_pos_frame; // k_ssb, N_ssb_crb, sync_pos2, int32_t metric_tdd_ncp=0; uint8_t phase_tdd_ncp; double im, re; @@ -173,20 +172,17 @@ int nr_initial_sync(PHY_VARS_NR_UE *ue, runmode_t mode) /* process pss search on received buffer */ sync_pos = pss_synchro_nr(ue, NO_RATE_CHANGE); - sync_pos_slot = (fp->samples_per_subframe/fp->slots_per_subframe) - 10*(fp->ofdm_symbol_size + fp->nb_prefix_samples); + if (sync_pos >= fp->nb_prefix_samples) + ue->ssb_offset = sync_pos - fp->nb_prefix_samples; + else + ue->ssb_offset = sync_pos + (fp->samples_per_subframe * 10) - fp->nb_prefix_samples; - if (sync_pos >= fp->nb_prefix_samples){ - ue->ssb_offset = sync_pos - fp->nb_prefix_samples;} - else{ - ue->ssb_offset = sync_pos + (fp->samples_per_subframe * 10) - fp->nb_prefix_samples;} - - ue->rx_offset = ue->ssb_offset - sync_pos_slot; //write_output("rxdata1.m","rxd1",ue->common_vars.rxdata[0],10*fp->samples_per_subframe,1,1); #ifdef DEBUG_INITIAL_SYNCH LOG_I(PHY,"[UE%d] Initial sync : Estimated PSS position %d, Nid2 %d\n", ue->Mod_id, sync_pos,ue->common_vars.eNb_id); - LOG_I(PHY,"sync_pos %d ssb_offset %d sync_pos_slot %d \n",sync_pos,ue->ssb_offset,sync_pos_slot); + LOG_I(PHY,"sync_pos %d ssb_offset %d \n",sync_pos,ue->ssb_offset); #endif // digital compensation of FFO for SSB symbols @@ -239,7 +235,14 @@ int nr_initial_sync(PHY_VARS_NR_UE *ue, runmode_t mode) nr_gold_pbch(ue); ret = nr_pbch_detection(ue,1,mode); // start pbch detection at first symbol after pss - + + if (ret == 0) { + // sync at symbol ue->symbol_offset + // computing the offset wrt the beginning of the frame + sync_pos_frame = (fp->ofdm_symbol_size + fp->nb_prefix_samples0)+((ue->symbol_offset)-1)*(fp->ofdm_symbol_size + fp->nb_prefix_samples); + ue->rx_offset = ue->ssb_offset - sync_pos_frame; + } + nr_gold_pdcch(ue,0, 2); /* int nb_prefix_samples0 = fp->nb_prefix_samples0; @@ -263,7 +266,7 @@ int nr_initial_sync(PHY_VARS_NR_UE *ue, runmode_t mode) } else { #ifdef DEBUG_INITIAL_SYNCH - LOG_I(PHY,"TDD Normal prefix: SSS error condition: sync_pos %d, sync_pos_slot %d\n", sync_pos, sync_pos_slot); + LOG_I(PHY,"TDD Normal prefix: SSS error condition: sync_pos %d\n", sync_pos); #endif } } diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c b/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c index 4d8ce3dec9..11e3c5cfdf 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c @@ -414,6 +414,7 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue, NR_UE_PBCH *nr_ue_pbch_vars, NR_DL_FRAME_PARMS *frame_parms, uint8_t eNB_id, + uint8_t i_ssb, MIMO_mode_t mimo_mode, uint32_t high_speed_flag) { NR_UE_COMMON *nr_ue_common_vars = &ue->common_vars; @@ -424,10 +425,9 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue, //uint32_t pbch_a_prime; int16_t *pbch_e_rx; uint8_t *decoded_output = nr_ue_pbch_vars->decoded_output; - uint8_t nushift; + uint8_t nushift,n_hf,ssb_index; uint16_t M; uint8_t Lmax=frame_parms->Lmax; - uint8_t ssb_index=ue->i_ssb; //uint16_t crc; //unsigned short idx_demod =0; uint32_t decoderState=0; @@ -443,7 +443,7 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue, int symbol_offset=1; if (ue->is_synchronized > 0) - symbol_offset=2; + symbol_offset=ue->symbol_offset; else symbol_offset=0; @@ -527,7 +527,7 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue, #endif //un-scrambling M = NR_POLAR_PBCH_E; - nushift = (Lmax==4)? ssb_index&3 : ssb_index&7; + nushift = (Lmax==4)? i_ssb&3 : i_ssb&7; uint32_t unscrambling_mask = (Lmax==64)?0x100006D:0x1000041; nr_pbch_unscrambling(nr_ue_pbch_vars,frame_parms->Nid_cell,nushift,M,NR_POLAR_PBCH_E,0,0); //polar decoding de-rate matching @@ -571,6 +571,16 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue, for (int i=0; i<3; i++) decoded_output[i] = (uint8_t)((payload>>((3-i)<<3))&0xff); + n_hf = ((xtra_byte>>4)&0x01); // computing the half frame index from the extra byte + + ssb_index = i_ssb; // ssb index corresponds to i_ssb for Lmax = 4,8 + if (Lmax == 64) { // for Lmax = 64 ssb index 4th,5th and 6th bits are in extra byte + for (int i=0; i<3; i++) + ssb_index += (((xtra_byte>>(7-i))&0x01)<<(3+i)); + } + + ue->symbol_offset = nr_get_ssb_start_symbol(frame_parms, ssb_index, n_hf); + #ifdef DEBUG_PBCH printf("xtra_byte %x payload %x\n", xtra_byte, payload); @@ -578,14 +588,14 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue, // printf("unscrambling pbch_a[%d] = %x \n", i,pbch_a[i]); printf("[PBCH] decoder payload[%d] = %x\n",i,decoded_output[i]); } - #endif + ue->dl_indication.rx_ind = &ue->rx_ind; // hang on rx_ind instance //ue->rx_ind.sfn_slot = 0; //should be set by higher-1-layer, i.e. clean_and_set_if_instance() ue->rx_ind.rx_indication_body[0].pdu_type = FAPI_NR_RX_PDU_TYPE_MIB; ue->rx_ind.rx_indication_body[0].mib_pdu.pdu = &decoded_output[0]; ue->rx_ind.rx_indication_body[0].mib_pdu.additional_bits = xtra_byte; - ue->rx_ind.rx_indication_body[0].mib_pdu.ssb_index = ssb_index; // confirm with TCL + ue->rx_ind.rx_indication_body[0].mib_pdu.ssb_index = i_ssb; // confirm with TCL ue->rx_ind.rx_indication_body[0].mib_pdu.ssb_length = Lmax; // confirm with TCL ue->rx_ind.rx_indication_body[0].mib_pdu.cell_id = frame_parms->Nid_cell; // confirm with TCL ue->rx_ind.number_pdus = 1; diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h index 36158fa259..e9ccedd04b 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h @@ -1122,6 +1122,7 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue, NR_UE_PBCH *nr_ue_pbch_vars, NR_DL_FRAME_PARMS *frame_parms, uint8_t eNB_id, + uint8_t i_ssb, MIMO_mode_t mimo_mode, uint32_t high_speed_flag); diff --git a/openair1/PHY/defs_nr_UE.h b/openair1/PHY/defs_nr_UE.h index f384bcaccf..a482a48207 100644 --- a/openair1/PHY/defs_nr_UE.h +++ b/openair1/PHY/defs_nr_UE.h @@ -1143,8 +1143,7 @@ typedef struct { uint8_t decode_MIB; /// temporary offset during cell search prior to MIB decoding int ssb_offset; - uint8_t i_ssb; - uint8_t n_hf; + uint16_t symbol_offset; // offset in terms of symbols for detected ssb in sync int rx_offset; /// Timing offset int rx_offset_diff; /// Timing adjustment for ofdm symbol0 on HW USRP int time_sync_cell; diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c index 33b42749e0..89ae3c0696 100644 --- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c +++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c @@ -2973,6 +2973,7 @@ void nr_ue_pbch_procedures(uint8_t eNB_id,PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t * ue->pbch_vars[eNB_id], &ue->frame_parms, eNB_id, + ue->rx_ind.rx_indication_body[0].mib_pdu.ssb_index, SISO, ue->high_speed_flag); @@ -5098,9 +5099,13 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN if ( (nr_tti_rx == 0) && (ue->decode_MIB == 1)) { LOG_D(PHY," ------ PBCH ChannelComp/LLR: frame.slot %d.%d ------ \n", frame_rx%1024, nr_tti_rx); - for (int i=0; i<3; i++) { + + uint8_t i_ssb = ue->rx_ind.rx_indication_body[0].mib_pdu.ssb_index; + uint8_t n_hf = (((ue->rx_ind.rx_indication_body[0].mib_pdu.additional_bits)>>4)&0x01); + + for (int i=1; i<4; i++) { nr_slot_fep(ue, - (5+i), //mu=1 case B + (ue->symbol_offset+i), //mu=1 case B nr_tti_rx, 0, 0, @@ -5109,7 +5114,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN #if UE_TIMING_TRACE start_meas(&ue->dlsch_channel_estimation_stats); #endif - nr_pbch_channel_estimation(ue,0,0,5+i,i); + nr_pbch_channel_estimation(ue,0,0,ue->symbol_offset+i,i-1,i_ssb,n_hf); #if UE_TIMING_TRACE stop_meas(&ue->dlsch_channel_estimation_stats); #endif diff --git a/openair1/SIMULATION/NR_PHY/pbchsim.c b/openair1/SIMULATION/NR_PHY/pbchsim.c index 4b281184b8..6891e5b875 100644 --- a/openair1/SIMULATION/NR_PHY/pbchsim.c +++ b/openair1/SIMULATION/NR_PHY/pbchsim.c @@ -129,7 +129,7 @@ int main(int argc, char **argv) unsigned char frame_type = 0; unsigned char pbch_phase = 0; - int frame=0,subframe=0; + int frame=0; int frame_length_complex_samples; int frame_length_complex_samples_no_prefix; NR_DL_FRAME_PARMS *frame_parms; @@ -610,8 +610,8 @@ int main(int argc, char **argv) uint8_t ssb_index = 0; while (!((SSB_positions >> ssb_index) & 0x01)) ssb_index++; // to select the first transmitted ssb - int start_symbol = nr_get_ssb_start_symbol(frame_parms, ssb_index, n_hf); - for (int i=start_symbol+1; isymbol_offset = nr_get_ssb_start_symbol(frame_parms, ssb_index, n_hf); + for (int i=UE->symbol_offset+1; isymbol_offset+4; i++) { nr_slot_fep(UE, i, 0, @@ -620,7 +620,7 @@ int main(int argc, char **argv) NR_PBCH_EST); } - ret = nr_pbch_detection(UE,start_symbol+1,0); + ret = nr_pbch_detection(UE,UE->symbol_offset+1,0); if (ret==0) { //UE->rx_ind.rx_indication_body->mib_pdu.ssb_index; //not yet detected automatically From ab825dd68abdbea30ad3896e883a68cac0292076 Mon Sep 17 00:00:00 2001 From: Francesco Mani Date: Wed, 6 Mar 2019 08:50:30 +0100 Subject: [PATCH 17/31] bugfix in pbch channel estimation and dci debug comment mode restored --- openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c | 4 ++-- openair1/PHY/NR_UE_TRANSPORT/dci_nr.c | 8 ++++---- openair1/PHY/NR_UE_TRANSPORT/dci_tools_nr.c | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) 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 d39677d232..e6dab8e922 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c @@ -51,8 +51,8 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue, //uint16_t Nid_cell = (eNB_offset == 0) ? ue->frame_parms.Nid_cell : ue->measurements.adj_cell_id[eNB_offset-1]; uint8_t nushift; - int **dl_ch_estimates =ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].dl_ch_estimates[eNB_offset]; - int **rxdataF=ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].rxdataF; + int **dl_ch_estimates =ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].dl_ch_estimates[eNB_offset]; + int **rxdataF=ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF; nushift = ue->frame_parms.Nid_cell%4; ue->frame_parms.nushift = nushift; diff --git a/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c b/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c index 6f2f5bcf2d..e3e2331ac4 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c +++ b/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c @@ -1418,11 +1418,11 @@ void nr_dci_decoding_procedure0(int s, *format_found=_format_2_3_found; } - //#ifdef NR_PDCCH_DCI_DEBUG + #ifdef NR_PDCCH_DCI_DEBUG printf ("\t\t<-NR_PDCCH_DCI_DEBUG (nr_dci_decoding_procedure0)-> format_found=%d\n",*format_found); printf ("\t\t<-NR_PDCCH_DCI_DEBUG (nr_dci_decoding_procedure0)-> crc_scrambled=%d\n",*crc_scrambled); + #endif - //#endif if (*format_found!=255) { dci_alloc[*dci_cnt].dci_length = sizeof_bits; dci_alloc[*dci_cnt].rnti = crc; @@ -1432,13 +1432,13 @@ void nr_dci_decoding_procedure0(int s, dci_alloc[*dci_cnt].dci_pdu[1] = dci_estimation[1]; dci_alloc[*dci_cnt].dci_pdu[2] = dci_estimation[2]; dci_alloc[*dci_cnt].dci_pdu[3] = dci_estimation[3]; - //#ifdef NR_PDCCH_DCI_DEBUG + #ifdef NR_PDCCH_DCI_DEBUG printf ("\t\t<-NR_PDCCH_DCI_DEBUG (nr_dci_decoding_procedure0)-> rnti matches -> DCI FOUND !!! crc =>0x%x, sizeof_bits %d, sizeof_bytes %d \n", dci_alloc[*dci_cnt].rnti, dci_alloc[*dci_cnt].dci_length, sizeof_bytes); printf ("\t\t<-NR_PDCCH_DCI_DEBUG (nr_dci_decoding_procedure0)-> dci_cnt %d (format_css %d crc_scrambled %d) L %d, firstCCE %d pdu[0] 0x%lx pdu[1] 0x%lx \n", *dci_cnt, format_css,*crc_scrambled,dci_alloc[*dci_cnt].L, dci_alloc[*dci_cnt].firstCCE,dci_alloc[*dci_cnt].dci_pdu[0],dci_alloc[*dci_cnt].dci_pdu[1]); - //#endif + #endif if ((format_css == cformat0_0_and_1_0) || (format_uss == uformat0_0_and_1_0)) { if ((*crc_scrambled == _p_rnti) || (*crc_scrambled == _si_rnti) || (*crc_scrambled == _ra_rnti)) { dci_alloc[*dci_cnt].format = format1_0; diff --git a/openair1/PHY/NR_UE_TRANSPORT/dci_tools_nr.c b/openair1/PHY/NR_UE_TRANSPORT/dci_tools_nr.c index e821e9696a..c067142897 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/dci_tools_nr.c +++ b/openair1/PHY/NR_UE_TRANSPORT/dci_tools_nr.c @@ -52,7 +52,7 @@ //#define DEBUG_DCI #define NR_PDCCH_DCI_TOOLS -#define NR_PDCCH_DCI_TOOLS_DEBUG +//#define NR_PDCCH_DCI_TOOLS_DEBUG typedef unsigned __int128 uint128_t; From 6ce8c3742af1efd3e72678e66dfc688096c57147 Mon Sep 17 00:00:00 2001 From: Francesco Mani Date: Thu, 7 Mar 2019 10:10:06 +0100 Subject: [PATCH 18/31] minor fixes in pbchsim --- openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c | 2 +- openair1/PHY/NR_UE_TRANSPORT/pss_nr.c | 2 +- openair1/SIMULATION/NR_PHY/pbchsim.c | 7 ++++--- 3 files changed, 6 insertions(+), 5 deletions(-) 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 e6dab8e922..f17f6eb9b8 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c @@ -74,7 +74,7 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue, k = nushift; #ifdef DEBUG_CH - printf("PBCH Channel Estimation : ThreadId %d, eNB_offset %d ch_offset %d, OFDM size %d, Ncp=%d, Ns=%d, k=%d symbol %d\n",ue->current_thread_id[Ns>>1], eNB_offset,ch_offset,ue->frame_parms.ofdm_symbol_size, + printf("PBCH Channel Estimation : ThreadId %d, eNB_offset %d ch_offset %d, OFDM size %d, Ncp=%d, Ns=%d, k=%d symbol %d\n",ue->current_thread_id[Ns], eNB_offset,ch_offset,ue->frame_parms.ofdm_symbol_size, ue->frame_parms.Ncp,Ns,k, symbol); #endif diff --git a/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c b/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c index e4495a5526..40945bebef 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c +++ b/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c @@ -899,7 +899,7 @@ int pss_search_time_nr(int **rxdata, ///rx data in time domain if (fo_flag){ - // fractional frequency offser computation according to Cross-correlation Synchronization Algorithm Using PSS + // fractional frequency offset computation according to Cross-correlation Synchronization Algorithm Using PSS // Shoujun Huang, Yongtao Su, Ying He and Shan Tang, "Joint time and frequency offset estimation in LTE downlink," 7th International Conference on Communications and Networking in China, 2012. int64_t result1,result2; diff --git a/openair1/SIMULATION/NR_PHY/pbchsim.c b/openair1/SIMULATION/NR_PHY/pbchsim.c index 6891e5b875..cc01357868 100644 --- a/openair1/SIMULATION/NR_PHY/pbchsim.c +++ b/openair1/SIMULATION/NR_PHY/pbchsim.c @@ -412,6 +412,7 @@ int main(int argc, char **argv) // computation of integer and fractional FO to compare with estimation results int IFO; if(eps!=0.0){ + UE->UE_fo_compensation = 1; printf("Introducing a CFO of %lf relative to SCS of %d kHz\n",eps,(int)(scs/1000)); if (eps>0) IFO=(int)(eps+0.5); @@ -520,7 +521,7 @@ int main(int argc, char **argv) } else { printf("Reading %d samples from file to antenna buffer %d\n",frame_length_complex_samples,0); - + UE->UE_fo_compensation = 1; // perform fo compensation when samples from file are used if (fread(txdata[0], sizeof(int32_t), frame_length_complex_samples, @@ -594,9 +595,9 @@ int main(int argc, char **argv) } if (n_trials==1) { - LOG_M("rxsig0.m","rxs0", UE->common_vars.rxdata[0],frame_parms->samples_per_subframe,1,1); + LOG_M("rxsig0.m","rxs0", UE->common_vars.rxdata[0],frame_parms->samples_per_frame,1,1); if (gNB->frame_parms.nb_antennas_tx>1) - LOG_M("rxsig1.m","rxs1", UE->common_vars.rxdata[1],frame_parms->samples_per_subframe,1,1); + LOG_M("rxsig1.m","rxs1", UE->common_vars.rxdata[1],frame_parms->samples_per_frame,1,1); } if (UE->is_synchronized == 0) { From 980d20c8b8cbcd3560f2688cbfa7c828acb73dc3 Mon Sep 17 00:00:00 2001 From: Francesco Mani Date: Thu, 7 Mar 2019 15:45:52 +0100 Subject: [PATCH 19/31] i_ssb detection message added in pbchsim --- openair1/SIMULATION/NR_PHY/pbchsim.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/openair1/SIMULATION/NR_PHY/pbchsim.c b/openair1/SIMULATION/NR_PHY/pbchsim.c index cc01357868..548a4f3dc3 100644 --- a/openair1/SIMULATION/NR_PHY/pbchsim.c +++ b/openair1/SIMULATION/NR_PHY/pbchsim.c @@ -412,7 +412,6 @@ int main(int argc, char **argv) // computation of integer and fractional FO to compare with estimation results int IFO; if(eps!=0.0){ - UE->UE_fo_compensation = 1; printf("Introducing a CFO of %lf relative to SCS of %d kHz\n",eps,(int)(scs/1000)); if (eps>0) IFO=(int)(eps+0.5); @@ -644,11 +643,11 @@ int main(int argc, char **argv) if (ret!=0) n_errors++; } } //noise trials - printf("SNR %f: trials %d, n_errors_crc = %d, n_errors_payload %d\n", SNR,n_trials,n_errors,n_errors_payload); if (((float)n_errors/(float)n_trials <= target_error_rate) && (n_errors_payload==0)) { printf("PBCH test OK\n"); + printf("Synchronization obtained for i_ssb = %d\n",UE->rx_ind.rx_indication_body[0].mib_pdu.ssb_index); break; } From 3fc4c6a4647ab10a2c4e17cf2143c70368188b9c Mon Sep 17 00:00:00 2001 From: Francesco Mani Date: Tue, 12 Mar 2019 12:51:01 +0100 Subject: [PATCH 20/31] multiple ssb detection via pbch dmrs (selection of best ssb only, working in pbchsim for SNR>=0) --- .../nr_dl_channel_estimation.c | 163 ++++++++++++++++++ openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h | 6 + .../PHY/NR_UE_TRANSPORT/nr_initial_sync.c | 59 +++++-- openair1/PHY/defs_nr_UE.h | 9 + 4 files changed, 222 insertions(+), 15 deletions(-) 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 f17f6eb9b8..99267152b0 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c @@ -32,6 +32,169 @@ //#define DEBUG_PDCCH +int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue, + uint8_t eNB_offset, + unsigned char Ns, + unsigned char symbol, + NR_UE_SSB *current_ssb) +{ + int pilot[200] __attribute__((aligned(16))); + unsigned char aarx; + unsigned short k; + unsigned int pilot_cnt; + int16_t ch[2],*pil,*rxF; + int symbol_offset; + int dmrss; + + uint8_t nushift; + uint8_t ssb_index=current_ssb->i_ssb; + uint8_t n_hf=current_ssb->n_hf; + int **rxdataF=ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].rxdataF; + + nushift = ue->frame_parms.Nid_cell%4; + ue->frame_parms.nushift = nushift; + unsigned int ssb_offset = ue->frame_parms.first_carrier_offset + ue->frame_parms.ssb_start_subcarrier; + if (ssb_offset>= ue->frame_parms.ofdm_symbol_size) ssb_offset-=ue->frame_parms.ofdm_symbol_size; + + if (ue->is_synchronized ==0 ) dmrss = symbol-1; + else dmrss = symbol-5; + + AssertFatal((symbol > 0 && symbol < 4 && ue->is_synchronized == 0) || + (symbol > 4 && symbol < 8 && ue->is_synchronized == 1), + "symbol %d is illegal for PBCH DM-RS (is_synchronized %d)\n", + symbol,ue->is_synchronized); + + symbol_offset = ue->frame_parms.ofdm_symbol_size*symbol; + + + k = nushift; + +#ifdef DEBUG_CH + printf("PBCH DMRS Correlation : ThreadId %d, eNB_offset %d , OFDM size %d, Ncp=%d, Ns=%d, k=%d symbol %d\n",ue->current_thread_id[Ns>>1], eNB_offset,ue->frame_parms.ofdm_symbol_size, + ue->frame_parms.Ncp,Ns,k, symbol); +#endif + + // generate pilot + nr_pbch_dmrs_rx(dmrss,ue->nr_gold_pbch[n_hf][ssb_index], &pilot[0]); + + int re_offset = ssb_offset; + for (aarx=0; aarxframe_parms.nb_antennas_rx; aarx++) { + + pil = (int16_t *)&pilot[0]; + rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)]; + +#ifdef DEBUG_CH + printf("pbch ch est pilot addr %p RB_DL %d\n",&pilot[0], ue->frame_parms.N_RB_DL); + printf("k %d, first_carrier %d\n",k,ue->frame_parms.first_carrier_offset); + printf("rxF addr %p\n", rxF); +#endif + //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); + ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15); + + current_ssb->c_re +=ch[0]; + current_ssb->c_im +=ch[1]; + +#ifdef DEBUG_CH + printf("ch 0 %d\n",((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])); + printf("pilot 0 : rxF - > (%d,%d) addr %p ch -> (%d,%d), pil -> (%d,%d) \n",rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]); +#endif + + pil+=2; + re_offset = (re_offset+4)&(ue->frame_parms.ofdm_symbol_size-1); + rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)]; + + + ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); + ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15); + + current_ssb->c_re +=ch[0]; + current_ssb->c_im +=ch[1]; + +#ifdef DEBUG_CH + printf("pilot 1 : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]); +#endif + + pil+=2; + re_offset = (re_offset+4)&(ue->frame_parms.ofdm_symbol_size-1); + rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)]; + + current_ssb->c_re +=ch[0]; + current_ssb->c_im +=ch[1]; + +#ifdef DEBUG_CH + printf("pilot 2 : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]); +#endif + + pil+=2; + re_offset = (re_offset+4)&(ue->frame_parms.ofdm_symbol_size-1); + rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)]; + + for (pilot_cnt=3; pilot_cnt<(3*20); pilot_cnt+=3) { + + // if (pilot_cnt == 30) + // rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+k)]; + + // in 2nd symbol, skip middle REs (48 with DMRS, 144 for SSS, and another 48 with DMRS) + if (dmrss == 1 && pilot_cnt == 12) { + pilot_cnt=48; + re_offset = (re_offset+144)&(ue->frame_parms.ofdm_symbol_size-1); + rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)]; + } + ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); + ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15); + + current_ssb->c_re +=ch[0]; + current_ssb->c_im +=ch[1]; + +#ifdef DEBUG_CH + printf("pilot %d : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",pilot_cnt,rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]); +#endif + + pil+=2; + re_offset = (re_offset+4)&(ue->frame_parms.ofdm_symbol_size-1); + rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)]; + + + ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); + ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15); + + current_ssb->c_re +=ch[0]; + current_ssb->c_im +=ch[1]; + +#ifdef DEBUG_CH + printf("pilot %d : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",pilot_cnt+1,rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]); +#endif + pil+=2; + re_offset = (re_offset+4)&(ue->frame_parms.ofdm_symbol_size-1); + rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)]; + + + ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15); + ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15); + + current_ssb->c_re +=ch[0]; + current_ssb->c_im +=ch[1]; + +#ifdef DEBUG_CH + printf("pilot %d : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",pilot_cnt+2,rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]); +#endif + + pil+=2; + re_offset = (re_offset+4)&(ue->frame_parms.ofdm_symbol_size-1); + rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)]; + + } + + + //} + + } + return(0); +} + int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue, uint8_t eNB_offset, diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h b/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h index 591b4733ce..1ec9cec96f 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h @@ -50,6 +50,12 @@ int nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue, unsigned short coreset_start_subcarrier, unsigned short nb_rb_coreset); +int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue, + uint8_t eNB_offset, + unsigned char Ns, + unsigned char symbol, + NR_UE_SSB *current_ssb); + int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue, uint8_t eNB_offset, unsigned char Ns, diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c b/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c index 0b9795b6bc..a147d10457 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c @@ -58,6 +58,11 @@ int nr_pbch_detection(PHY_VARS_NR_UE *ue, int pbch_initial_symbol, runmode_t mod { NR_DL_FRAME_PARMS *frame_parms=&ue->frame_parms; int ret =-1; + uint8_t best_ssb =0; + uint8_t n_hf =0; + uint32_t best_metric =0; + + NR_UE_SSB *current_ssb = malloc(sizeof(NR_UE_SSB)); #ifdef DEBUG_INITIAL_SYNCH LOG_I(PHY,"[UE%d] Initial sync: starting PBCH detection (rx_offset %d)\n",ue->Mod_id, @@ -70,30 +75,53 @@ int nr_pbch_detection(PHY_VARS_NR_UE *ue, int pbch_initial_symbol, runmode_t mod // loops over possible pbch dmrs cases to retrive best estimated i_ssb (and n_hf for Lmax=4) for multiple ssb detection for (int hf = 0; hf < N_hf; hf++) { for (int l = 0; l < N_L ; l++) { - if (ret !=0) { + + // initialization of structure parameters + current_ssb->n_hf = hf; + current_ssb->i_ssb = l; + current_ssb->c_re = 0; + current_ssb->c_im = 0; #if UE_TIMING_TRACE - start_meas(&ue->dlsch_channel_estimation_stats); + start_meas(&ue->dlsch_channel_estimation_stats); #endif - for(int i=pbch_initial_symbol; idlsch_channel_estimation_stats); + stop_meas(&ue->dlsch_channel_estimation_stats); #endif - - ret = nr_rx_pbch(ue, - &ue->proc.proc_rxtx[0], - ue->pbch_vars[0], - frame_parms, - 0, - l, - SISO, - ue->high_speed_flag); - + + current_ssb->metric = current_ssb->c_re*current_ssb->c_re + current_ssb->c_im+current_ssb->c_re; + + if(current_ssb->metric > best_metric) { // if metric of current structure is higher than the best one + best_metric = current_ssb->metric; + best_ssb = l; + n_hf = hf; } + } } +#if UE_TIMING_TRACE + start_meas(&ue->dlsch_channel_estimation_stats); +#endif + // computing channel estimation for selected best ssb + for(int i=pbch_initial_symbol; idlsch_channel_estimation_stats); +#endif + + ret = nr_rx_pbch(ue, + &ue->proc.proc_rxtx[0], + ue->pbch_vars[0], + frame_parms, + 0, + best_ssb, + SISO, + ue->high_speed_flag); + if (ret==0) { frame_parms->nb_antenna_ports_eNB = 1; //pbch_tx_ant; @@ -116,6 +144,7 @@ int nr_pbch_detection(PHY_VARS_NR_UE *ue, int pbch_initial_symbol, runmode_t mod #ifdef DEBUG_INITIAL_SYNCH LOG_I(PHY,"[UE%d] Initial sync: pbch decoded sucessfully\n",ue->Mod_id); #endif + return(0); } else { return(-1); diff --git a/openair1/PHY/defs_nr_UE.h b/openair1/PHY/defs_nr_UE.h index a482a48207..a846f46e0f 100644 --- a/openair1/PHY/defs_nr_UE.h +++ b/openair1/PHY/defs_nr_UE.h @@ -950,6 +950,15 @@ typedef struct { int16_t *prach; } NR_UE_PRACH; +// structure used for multiple SSB detection +typedef struct NR_UE_SSB { + uint8_t i_ssb; // i_ssb between 0 and 7 (it corresponds to ssb_index only for Lmax=4,8) + uint8_t n_hf; // n_hf = 0,1 for Lmax =4 or n_hf = 0 for Lmax =8,64 + uint32_t metric; // metric to order SSB hypothesis + uint32_t c_re; + uint32_t c_im; +} NR_UE_SSB; + /*typedef enum { /// do not detect any DCIs in the current subframe NO_DCI = 0x0, From 2c75720d798bae449649841e84fc33fbb42f6558 Mon Sep 17 00:00:00 2001 From: Francesco Mani Date: Wed, 13 Mar 2019 17:48:23 +0100 Subject: [PATCH 21/31] multiple ssb detection via pbch dmrs (ordered list) --- .../PHY/NR_UE_TRANSPORT/nr_initial_sync.c | 104 +++++++++++++----- openair1/PHY/defs_nr_UE.h | 3 +- 2 files changed, 79 insertions(+), 28 deletions(-) diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c b/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c index a147d10457..e75f5a647a 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c @@ -54,15 +54,61 @@ int cnt=0; #define DEBUG_INITIAL_SYNCH +// create a new node of SSB structure +NR_UE_SSB* create_ssb_node(uint8_t i, uint8_t h) { + + NR_UE_SSB *new_node = (NR_UE_SSB*)malloc(sizeof(NR_UE_SSB)); + new_node->i_ssb = i; + new_node->n_hf = h; + new_node->c_re = 0; + new_node->c_im = 0; + new_node->metric = 0; + new_node->next_ssb = NULL; + + return new_node; +} + + +// insertion of the structure in the ordered list (highest metric first) +NR_UE_SSB* insert_into_list(NR_UE_SSB *head, NR_UE_SSB *node) { + + if (node->metric > head->metric) { + node->next_ssb = head; + head = node; + return head; + } + + NR_UE_SSB *current = head; + while (current->next_ssb !=NULL) { + NR_UE_SSB *temp=current->next_ssb; + if(node->metric > current->metric) { + node->next_ssb = temp; + current->next_ssb = node; + return head; + } + else + current = temp; + } + current->next_ssb = node; + + return head; +} + + +void free_list(NR_UE_SSB *node) { + if (node->next_ssb != NULL) + free_list(node->next_ssb); + free(node); +} + + int nr_pbch_detection(PHY_VARS_NR_UE *ue, int pbch_initial_symbol, runmode_t mode) { NR_DL_FRAME_PARMS *frame_parms=&ue->frame_parms; int ret =-1; - uint8_t best_ssb =0; - uint8_t n_hf =0; - uint32_t best_metric =0; - NR_UE_SSB *current_ssb = malloc(sizeof(NR_UE_SSB)); + NR_UE_SSB *best_ssb = NULL; + NR_UE_SSB *current_ssb; #ifdef DEBUG_INITIAL_SYNCH LOG_I(PHY,"[UE%d] Initial sync: starting PBCH detection (rx_offset %d)\n",ue->Mod_id, @@ -76,11 +122,8 @@ int nr_pbch_detection(PHY_VARS_NR_UE *ue, int pbch_initial_symbol, runmode_t mod for (int hf = 0; hf < N_hf; hf++) { for (int l = 0; l < N_L ; l++) { - // initialization of structure parameters - current_ssb->n_hf = hf; - current_ssb->i_ssb = l; - current_ssb->c_re = 0; - current_ssb->c_im = 0; + // initialization of structure + current_ssb = create_ssb_node(l,hf); #if UE_TIMING_TRACE start_meas(&ue->dlsch_channel_estimation_stats); @@ -94,34 +137,42 @@ int nr_pbch_detection(PHY_VARS_NR_UE *ue, int pbch_initial_symbol, runmode_t mod current_ssb->metric = current_ssb->c_re*current_ssb->c_re + current_ssb->c_im+current_ssb->c_re; - if(current_ssb->metric > best_metric) { // if metric of current structure is higher than the best one - best_metric = current_ssb->metric; - best_ssb = l; - n_hf = hf; - } + // generate a list of SSB structures + if (best_ssb == NULL) + best_ssb = current_ssb; + else + best_ssb = insert_into_list(best_ssb,current_ssb); } } + NR_UE_SSB *temp_ptr=best_ssb; + while (ret!=0 && temp_ptr != NULL) { + #if UE_TIMING_TRACE - start_meas(&ue->dlsch_channel_estimation_stats); + start_meas(&ue->dlsch_channel_estimation_stats); #endif // computing channel estimation for selected best ssb - for(int i=pbch_initial_symbol; ii_ssb,best_ssb->n_hf); #if UE_TIMING_TRACE - stop_meas(&ue->dlsch_channel_estimation_stats); + stop_meas(&ue->dlsch_channel_estimation_stats); #endif - ret = nr_rx_pbch(ue, - &ue->proc.proc_rxtx[0], - ue->pbch_vars[0], - frame_parms, - 0, - best_ssb, - SISO, - ue->high_speed_flag); + ret = nr_rx_pbch(ue, + &ue->proc.proc_rxtx[0], + ue->pbch_vars[0], + frame_parms, + 0, + temp_ptr->i_ssb, + SISO, + ue->high_speed_flag); + temp_ptr=temp_ptr->next_ssb; + } + + free_list(best_ssb); + if (ret==0) { frame_parms->nb_antenna_ports_eNB = 1; //pbch_tx_ant; @@ -144,7 +195,6 @@ int nr_pbch_detection(PHY_VARS_NR_UE *ue, int pbch_initial_symbol, runmode_t mod #ifdef DEBUG_INITIAL_SYNCH LOG_I(PHY,"[UE%d] Initial sync: pbch decoded sucessfully\n",ue->Mod_id); #endif - return(0); } else { return(-1); diff --git a/openair1/PHY/defs_nr_UE.h b/openair1/PHY/defs_nr_UE.h index a846f46e0f..2a17bbbbe5 100644 --- a/openair1/PHY/defs_nr_UE.h +++ b/openair1/PHY/defs_nr_UE.h @@ -957,6 +957,7 @@ typedef struct NR_UE_SSB { uint32_t metric; // metric to order SSB hypothesis uint32_t c_re; uint32_t c_im; + struct NR_UE_SSB *next_ssb; } NR_UE_SSB; /*typedef enum { @@ -1088,7 +1089,7 @@ typedef struct { uint32_t nr_gold_pbch[2][64][NR_PBCH_DMRS_LENGTH_DWORD]; /// PDSCH DMRS - uint32_t nr_gold_pdsch[2][20][2][21]; + uint32_t nr_gold_pdsch[2][20][2][52]; /// PDCCH DMRS uint32_t nr_gold_pdcch[7][20][3][52]; From cc847e9c5c9a4d4c618ff668c3a3cb77fbcceeb2 Mon Sep 17 00:00:00 2001 From: Francesco Mani Date: Thu, 14 Mar 2019 17:29:17 +0100 Subject: [PATCH 22/31] bugfix in nr_initial_sync --- openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c b/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c index e75f5a647a..26c01d3bb6 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c @@ -154,7 +154,7 @@ int nr_pbch_detection(PHY_VARS_NR_UE *ue, int pbch_initial_symbol, runmode_t mod #endif // computing channel estimation for selected best ssb for(int i=pbch_initial_symbol; ii_ssb,best_ssb->n_hf); + nr_pbch_channel_estimation(ue,0,0,i,i-pbch_initial_symbol,temp_ptr->i_ssb,temp_ptr->n_hf); #if UE_TIMING_TRACE stop_meas(&ue->dlsch_channel_estimation_stats); #endif From 02d3decd6d74f50adaac09986c8d9bfe1440a28a Mon Sep 17 00:00:00 2001 From: Francesco Mani Date: Fri, 15 Mar 2019 12:43:47 +0100 Subject: [PATCH 23/31] another bugfix nr_initial_sync --- openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c b/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c index 26c01d3bb6..23baadda8a 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c @@ -81,7 +81,7 @@ NR_UE_SSB* insert_into_list(NR_UE_SSB *head, NR_UE_SSB *node) { NR_UE_SSB *current = head; while (current->next_ssb !=NULL) { NR_UE_SSB *temp=current->next_ssb; - if(node->metric > current->metric) { + if(node->metric > temp->metric) { node->next_ssb = temp; current->next_ssb = node; return head; From 0f04910f2f6d5349d976ae6d75bdaee561599417 Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Fri, 22 Mar 2019 15:22:19 +0100 Subject: [PATCH 24/31] moving get_band to separate function --- openair1/PHY/INIT/nr_parms.c | 63 ++++++++++++++++++++++++++++++++ openair1/PHY/INIT/phy_init.h | 3 ++ openair1/PHY/defs_nr_common.h | 17 +++++++++ targets/RT/USER/nr-ue.c | 39 ++------------------ targets/RT/USER/nr-uesoftmodem.c | 14 +++---- 5 files changed, 93 insertions(+), 43 deletions(-) diff --git a/openair1/PHY/INIT/nr_parms.c b/openair1/PHY/INIT/nr_parms.c index 021d0b10bb..7fee692f08 100644 --- a/openair1/PHY/INIT/nr_parms.c +++ b/openair1/PHY/INIT/nr_parms.c @@ -300,3 +300,66 @@ void nr_dump_frame_parms(NR_DL_FRAME_PARMS *fp) LOG_I(PHY,"fp->initial_bwp_dl.location=%d\n",fp->initial_bwp_dl.location); LOG_I(PHY,"fp->initial_bwp_dl.ofdm_symbol_size=%d\n",fp->initial_bwp_dl.ofdm_symbol_size); } + + +static const eutra_band_t eutra_bands[] = { + {1, 1920000, 1980000, 2110000, 2170000, FDD}, + {2, 1850000, 1910000, 1930000, 1990000, FDD}, + {3, 1710000, 1785000, 1805000, 1880000, FDD}, + {5, 824000, 849000, 869000, 894000, FDD}, + {7, 2500000, 2570000, 2620000, 2690000, FDD}, + {8, 880000, 915000, 925000, 960000, FDD}, + {12, 698000, 716000, 728000, 746000, FDD}, + {20, 832000, 862000, 791000, 821000, FDD}, + {25, 1850000, 1915000, 1930000, 1995000, FDD}, + {28, 703000, 758000, 758000, 813000, FDD}, + {34, 2010000, 2025000, 2010000, 2025000, TDD}, + {38, 2570000, 2620000, 2570000, 2630000, TDD}, + {39, 1880000, 1920000, 1880000, 1920000, TDD}, + {40, 2300000, 2400000, 2300000, 2400000, TDD}, + {41, 2496000, 2690000, 2496000, 2690000, TDD}, + {50, 1432000, 1517000, 1432000, 1517000, TDD}, + {51, 1427000, 1432000, 1427000, 1432000, TDD}, + {66, 1710000, 1780000, 2110000, 2200000, FDD}, + {70, 1695000, 1710000, 1995000, 2020000, FDD}, + {71, 663000, 698000, 617000, 652000, FDD}, + {74, 1427000, 1470000, 1475000, 1518000, FDD}, + {75, 000, 000, 1432000, 1517000, FDD}, + {76, 000, 000, 1427000, 1432000, FDD}, + {77, 3300000, 4200000, 3300000, 4200000, TDD}, + {78, 3300000, 3800000, 3300000, 3800000, TDD}, + {79, 4400000, 5000000, 4400000, 5000000, TDD}, + {80, 1710000, 1785000, 000, 000, FDD}, + {81, 860000, 915000, 000, 000, FDD}, + {82, 832000, 862000, 000, 000, FDD}, + {83, 703000, 748000, 000, 000, FDD}, + {84, 1920000, 1980000, 000, 000, FDD}, + {86, 1710000, 1785000, 000, 000, FDD} +}; + +int get_band(uint32_t downlink_frequency, uint8_t *current_band, int32_t *current_offset, lte_frame_type_t *current_type) { + + int ind; + int64_t dl_freq_khz = downlink_frequency/1000; + for ( ind=0; + ind < sizeof(eutra_bands) / sizeof(eutra_bands[0]); + ind++) { + *current_band = eutra_bands[ind].band; + *current_type = eutra_bands[ind].frame_type; + LOG_I(PHY, "Scanning band %d, dl_min %"PRIu32", ul_min %"PRIu32"\n", ind, eutra_bands[ind].dl_min,eutra_bands[ind].ul_min); + + if ( eutra_bands[ind].dl_min <= dl_freq_khz && eutra_bands[ind].dl_max >= dl_freq_khz ) { + *current_offset = (eutra_bands[ind].ul_min - eutra_bands[ind].dl_min)*1000; + + LOG_I( PHY, "DL frequency %"PRIu32": band %d, frame_type %d, UL frequency %"PRIu32"\n", + downlink_frequency, *current_band, *current_type, downlink_frequency+*current_offset); + break; + } + } + + if( ind == sizeof(eutra_bands) / sizeof(eutra_bands[0])) { + LOG_E(PHY,"Can't find EUTRA band for frequency %d\n", downlink_frequency); + return(-1); + } +} + diff --git a/openair1/PHY/INIT/phy_init.h b/openair1/PHY/INIT/phy_init.h index ddda39a4c8..f500375e4b 100644 --- a/openair1/PHY/INIT/phy_init.h +++ b/openair1/PHY/INIT/phy_init.h @@ -391,6 +391,9 @@ void init_nr_transport(PHY_VARS_gNB *gNB); void init_dfts(void); +int get_band(uint32_t downlink_frequency, uint8_t *current_band, int32_t *current_offset, lte_frame_type_t *current_type); + + /** @} */ #endif diff --git a/openair1/PHY/defs_nr_common.h b/openair1/PHY/defs_nr_common.h index 267c156184..c09566c67e 100644 --- a/openair1/PHY/defs_nr_common.h +++ b/openair1/PHY/defs_nr_common.h @@ -321,4 +321,21 @@ typedef struct NR_DL_FRAME_PARMS { } NR_DL_FRAME_PARMS; +#define KHz (1000UL) +#define MHz (1000*KHz) + +typedef struct eutra_band_s { + int16_t band; + uint32_t ul_min; + uint32_t ul_max; + uint32_t dl_min; + uint32_t dl_max; + lte_frame_type_t frame_type; +} eutra_band_t; + +typedef struct band_info_s { + int nbands; + eutra_band_t band_info[100]; +} band_info_t; + #endif diff --git a/targets/RT/USER/nr-ue.c b/targets/RT/USER/nr-ue.c index afab7be1ad..a4afdcd6b6 100644 --- a/targets/RT/USER/nr-ue.c +++ b/targets/RT/USER/nr-ue.c @@ -150,27 +150,12 @@ void init_UE(int nb_inst); int32_t **rxdata; int32_t **txdata; -#define KHz (1000UL) -#define MHz (1000*KHz) #define SAIF_ENABLED #ifdef SAIF_ENABLED uint64_t g_ue_rx_thread_busy = 0; #endif -typedef struct eutra_band_s { - int16_t band; - uint32_t ul_min; - uint32_t ul_max; - uint32_t dl_min; - uint32_t dl_max; - lte_frame_type_t frame_type; -} eutra_band_t; - -typedef struct band_info_s { - int nbands; - eutra_band_t band_info[100]; -} band_info_t; band_info_t bands_to_scan; @@ -354,29 +339,11 @@ static void *UE_thread_synch(void *arg) { init_thread(100000, 500000, FIFO_PRIORITY-1, &cpuset, threadname); UE->is_synchronized = 0; + printf("UE_scan %d\n",UE->UE_scan); + if (UE->UE_scan == 0) { - int ind; - int64_t dl_freq_khz = downlink_frequency[0][0]/1000; - for ( ind=0; - ind < sizeof(eutra_bands) / sizeof(eutra_bands[0]); - ind++) { - current_band = eutra_bands[ind].band; - current_type = eutra_bands[ind].frame_type; - LOG_D(PHY, "Scanning band %d, dl_min %"PRIu32", ul_min %"PRIu32"\n", current_band, eutra_bands[ind].dl_min,eutra_bands[ind].ul_min); - if ( eutra_bands[ind].dl_min <= dl_freq_khz && eutra_bands[ind].dl_max >= dl_freq_khz ) { - for (i=0; i<4; i++) - uplink_frequency_offset[CC_id][i] = (eutra_bands[ind].ul_min - eutra_bands[ind].dl_min)*1000; - - break; - } - } - - - AssertFatal( ind < sizeof(eutra_bands) / sizeof(eutra_bands[0]), "Can't find EUTRA band for frequency"); - - UE->frame_parms.eutra_band = current_band; - UE->frame_parms.frame_type = current_type; + get_band(downlink_frequency[CC_id][0], &UE->frame_parms.eutra_band, &uplink_frequency_offset[CC_id][0], &UE->frame_parms.frame_type); LOG_I( PHY, "[SCHED][UE] Check absolute frequency DL %"PRIu32", UL %"PRIu32" (oai_exit %d, rx_num_channels %d)\n", downlink_frequency[0][0], downlink_frequency[0][0]+uplink_frequency_offset[0][0], diff --git a/targets/RT/USER/nr-uesoftmodem.c b/targets/RT/USER/nr-uesoftmodem.c index bb3dfe8282..226010a1db 100644 --- a/targets/RT/USER/nr-uesoftmodem.c +++ b/targets/RT/USER/nr-uesoftmodem.c @@ -932,14 +932,14 @@ int main( int argc, char **argv ) { LOG_I(PHY,"Set nb_rx_antenna %d , nb_tx_antenna %d \n",frame_parms[CC_id]->nb_antennas_rx, frame_parms[CC_id]->nb_antennas_tx); - //init_ul_hopping(frame_parms[CC_id]); - //phy_init_nr_top(frame_parms[CC_id]); - } + get_band(downlink_frequency[CC_id][0], &frame_parms[CC_id]->eutra_band, &uplink_frequency_offset[CC_id][0], &frame_parms[CC_id]->frame_type); - for (CC_id=0; CC_idprach_config_common.prach_ConfigInfo.prach_ConfigIndex, frame_parms->frame_type); - // N_ZC = (prach_fmt <4)?839:139; + //init_ul_hopping(frame_parms[CC_id]); + //phy_init_nr_top(frame_parms[CC_id]); + + //init prach for openair1 test + // prach_fmt = get_prach_fmt(frame_parms->prach_config_common.prach_ConfigInfo.prach_ConfigIndex, frame_parms->frame_type); + // N_ZC = (prach_fmt <4)?839:139; } NB_UE_INST=1; From 0d91083eadc4a35e4a7370db03ab4a9f32468270 Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Fri, 22 Mar 2019 17:40:47 +0100 Subject: [PATCH 25/31] trying to harmonize the nr_bandtable --- openair1/PHY/INIT/nr_parms.c | 83 +++++++++++++++-------------- openair1/PHY/defs_nr_common.h | 20 +++---- openair2/LAYER2/NR_MAC_gNB/config.c | 56 ++----------------- targets/RT/USER/nr-ue.c | 44 ++------------- 4 files changed, 62 insertions(+), 141 deletions(-) diff --git a/openair1/PHY/INIT/nr_parms.c b/openair1/PHY/INIT/nr_parms.c index 7fee692f08..095101fb89 100644 --- a/openair1/PHY/INIT/nr_parms.c +++ b/openair1/PHY/INIT/nr_parms.c @@ -302,39 +302,39 @@ void nr_dump_frame_parms(NR_DL_FRAME_PARMS *fp) } -static const eutra_band_t eutra_bands[] = { - {1, 1920000, 1980000, 2110000, 2170000, FDD}, - {2, 1850000, 1910000, 1930000, 1990000, FDD}, - {3, 1710000, 1785000, 1805000, 1880000, FDD}, - {5, 824000, 849000, 869000, 894000, FDD}, - {7, 2500000, 2570000, 2620000, 2690000, FDD}, - {8, 880000, 915000, 925000, 960000, FDD}, - {12, 698000, 716000, 728000, 746000, FDD}, - {20, 832000, 862000, 791000, 821000, FDD}, - {25, 1850000, 1915000, 1930000, 1995000, FDD}, - {28, 703000, 758000, 758000, 813000, FDD}, - {34, 2010000, 2025000, 2010000, 2025000, TDD}, - {38, 2570000, 2620000, 2570000, 2630000, TDD}, - {39, 1880000, 1920000, 1880000, 1920000, TDD}, - {40, 2300000, 2400000, 2300000, 2400000, TDD}, - {41, 2496000, 2690000, 2496000, 2690000, TDD}, - {50, 1432000, 1517000, 1432000, 1517000, TDD}, - {51, 1427000, 1432000, 1427000, 1432000, TDD}, - {66, 1710000, 1780000, 2110000, 2200000, FDD}, - {70, 1695000, 1710000, 1995000, 2020000, FDD}, - {71, 663000, 698000, 617000, 652000, FDD}, - {74, 1427000, 1470000, 1475000, 1518000, FDD}, - {75, 000, 000, 1432000, 1517000, FDD}, - {76, 000, 000, 1427000, 1432000, FDD}, - {77, 3300000, 4200000, 3300000, 4200000, TDD}, - {78, 3300000, 3800000, 3300000, 3800000, TDD}, - {79, 4400000, 5000000, 4400000, 5000000, TDD}, - {80, 1710000, 1785000, 000, 000, FDD}, - {81, 860000, 915000, 000, 000, FDD}, - {82, 832000, 862000, 000, 000, FDD}, - {83, 703000, 748000, 000, 000, FDD}, - {84, 1920000, 1980000, 000, 000, FDD}, - {86, 1710000, 1785000, 000, 000, FDD} +nr_bandentry_t nr_bandtable[] = { + {1, 1920000, 1980000, 2110000, 2170000, 20, 422000}, + {2, 1850000, 1910000, 1930000, 1990000, 20, 386000}, + {3, 1710000, 1785000, 1805000, 1880000, 20, 361000}, + {5, 824000, 849000, 869000, 894000, 20, 173800}, + {7, 2500000, 2570000, 2620000, 2690000, 20, 524000}, + {8, 880000, 915000, 925000, 960000, 20, 185000}, + {12, 698000, 716000, 728000, 746000, 20, 145800}, + {20, 832000, 862000, 791000, 821000, 20, 158200}, + {25, 1850000, 1915000, 1930000, 1995000, 20, 386000}, + {28, 703000, 758000, 758000, 813000, 20, 151600}, + {34, 2010000, 2025000, 2010000, 2025000, 20, 402000}, + {38, 2570000, 2620000, 2570000, 2630000, 20, 514000}, + {39, 1880000, 1920000, 1880000, 1920000, 20, 376000}, + {40, 2300000, 2400000, 2300000, 2400000, 20, 460000}, + {41, 2496000, 2690000, 2496000, 2690000, 3, 499200}, + {50, 1432000, 1517000, 1432000, 1517000, 20, 286400}, + {51, 1427000, 1432000, 1427000, 1432000, 20, 285400}, + {66, 1710000, 1780000, 2110000, 2200000, 20, 422000}, + {70, 1695000, 1710000, 1995000, 2020000, 20, 399000}, + {71, 663000, 698000, 617000, 652000, 20, 123400}, + {74, 1427000, 1470000, 1475000, 1518000, 20, 295000}, + {75, 000, 000, 1432000, 1517000, 20, 286400}, + {76, 000, 000, 1427000, 1432000, 20, 285400}, + {77, 3300000, 4200000, 3300000, 4200000, 1, 620000}, + {78, 3300000, 3800000, 3300000, 3800000, 1, 620000}, + {79, 4400000, 5000000, 4400000, 5000000, 2, 693334}, + {80, 1710000, 1785000, 000, 000, 20, 342000}, + {81, 860000, 915000, 000, 000, 20, 176000}, + {82, 832000, 862000, 000, 000, 20, 166400}, + {83, 703000, 748000, 000, 000, 20, 140600}, + {84, 1920000, 1980000, 000, 000, 20, 384000}, + {86, 1710000, 1785000, 000, 000, 20, 342000} }; int get_band(uint32_t downlink_frequency, uint8_t *current_band, int32_t *current_offset, lte_frame_type_t *current_type) { @@ -342,14 +342,17 @@ int get_band(uint32_t downlink_frequency, uint8_t *current_band, int32_t *cu int ind; int64_t dl_freq_khz = downlink_frequency/1000; for ( ind=0; - ind < sizeof(eutra_bands) / sizeof(eutra_bands[0]); + ind < sizeof(nr_bandtable) / sizeof(nr_bandtable[0]); ind++) { - *current_band = eutra_bands[ind].band; - *current_type = eutra_bands[ind].frame_type; - LOG_I(PHY, "Scanning band %d, dl_min %"PRIu32", ul_min %"PRIu32"\n", ind, eutra_bands[ind].dl_min,eutra_bands[ind].ul_min); + *current_band = nr_bandtable[ind].band; + LOG_I(PHY, "Scanning band %d, dl_min %"PRIu32", ul_min %"PRIu32"\n", ind, nr_bandtable[ind].dl_min,nr_bandtable[ind].ul_min); - if ( eutra_bands[ind].dl_min <= dl_freq_khz && eutra_bands[ind].dl_max >= dl_freq_khz ) { - *current_offset = (eutra_bands[ind].ul_min - eutra_bands[ind].dl_min)*1000; + if ( nr_bandtable[ind].dl_min <= dl_freq_khz && nr_bandtable[ind].dl_max >= dl_freq_khz ) { + *current_offset = (nr_bandtable[ind].ul_min - nr_bandtable[ind].dl_min)*1000; + if (*current_offset == 0) + *current_type = TDD; + else + *current_type = FDD; LOG_I( PHY, "DL frequency %"PRIu32": band %d, frame_type %d, UL frequency %"PRIu32"\n", downlink_frequency, *current_band, *current_type, downlink_frequency+*current_offset); @@ -357,7 +360,7 @@ int get_band(uint32_t downlink_frequency, uint8_t *current_band, int32_t *cu } } - if( ind == sizeof(eutra_bands) / sizeof(eutra_bands[0])) { + if( ind == sizeof(nr_bandtable) / sizeof(nr_bandtable[0])) { LOG_E(PHY,"Can't find EUTRA band for frequency %d\n", downlink_frequency); return(-1); } diff --git a/openair1/PHY/defs_nr_common.h b/openair1/PHY/defs_nr_common.h index c09566c67e..605ce8c4c8 100644 --- a/openair1/PHY/defs_nr_common.h +++ b/openair1/PHY/defs_nr_common.h @@ -324,18 +324,20 @@ typedef struct NR_DL_FRAME_PARMS { #define KHz (1000UL) #define MHz (1000*KHz) -typedef struct eutra_band_s { +typedef struct nr_bandentry_s { int16_t band; - uint32_t ul_min; - uint32_t ul_max; - uint32_t dl_min; - uint32_t dl_max; - lte_frame_type_t frame_type; -} eutra_band_t; + uint64_t ul_min; + uint64_t ul_max; + uint64_t dl_min; + uint64_t dl_max; + uint64_t N_OFFs_DL; + uint64_t step_size; +} nr_bandentry_t; typedef struct band_info_s { int nbands; - eutra_band_t band_info[100]; -} band_info_t; + nr_bandentry_t band_info[100]; +} nr_band_info_t; + #endif diff --git a/openair2/LAYER2/NR_MAC_gNB/config.c b/openair2/LAYER2/NR_MAC_gNB/config.c index 12d01981d2..1e1258e089 100644 --- a/openair2/LAYER2/NR_MAC_gNB/config.c +++ b/openair2/LAYER2/NR_MAC_gNB/config.c @@ -49,59 +49,9 @@ extern RAN_CONTEXT_t RC; extern void mac_top_init_gNB(void); extern uint8_t nfapi_mode; -int32_t **rxdata; -int32_t **txdata; - -typedef struct nr_bandentry_s { - int16_t band; - uint64_t ul_min; - uint64_t ul_max; - uint64_t dl_min; - uint64_t dl_max; - uint64_t N_OFFs_DL; - uint64_t step_size; -} nr_bandentry_t; - -typedef struct band_info_s { - int nbands; - nr_bandentry_t band_info[100]; -} nr_band_info_t; - -static const nr_bandentry_t nr_bandtable[] = { - {1, 1920000, 1980000, 2110000, 2170000, 20, 422000}, - {2, 1850000, 1910000, 1930000, 1990000, 20, 386000}, - {3, 1710000, 1785000, 1805000, 1880000, 20, 361000}, - {5, 824000, 849000, 869000, 894000, 20, 173800}, - {7, 2500000, 2570000, 2620000, 2690000, 20, 524000}, - {8, 880000, 915000, 925000, 960000, 20, 185000}, - {12, 698000, 716000, 728000, 746000, 20, 145800}, - {20, 832000, 862000, 791000, 821000, 20, 158200}, - {25, 1850000, 1915000, 1930000, 1995000, 20, 386000}, - {28, 703000, 758000, 758000, 813000, 20, 151600}, - {34, 2010000, 2025000, 2010000, 2025000, 20, 402000}, - {38, 2570000, 2620000, 2570000, 2630000, 20, 514000}, - {39, 1880000, 1920000, 1880000, 1920000, 20, 376000}, - {40, 2300000, 2400000, 2300000, 2400000, 20, 460000}, - {41, 2496000, 2690000, 2496000, 2690000, 3, 499200}, - {50, 1432000, 1517000, 1432000, 1517000, 20, 286400}, - {51, 1427000, 1432000, 1427000, 1432000, 20, 285400}, - {66, 1710000, 1780000, 2110000, 2200000, 20, 422000}, - {70, 1695000, 1710000, 1995000, 2020000, 20, 399000}, - {71, 663000, 698000, 617000, 652000, 20, 123400}, - {74, 1427000, 1470000, 1475000, 1518000, 20, 295000}, - {75, 000, 000, 1432000, 1517000, 20, 286400}, - {76, 000, 000, 1427000, 1432000, 20, 285400}, - {77, 3300000, 4200000, 3300000, 4200000, 1, 620000}, - {78, 3300000, 3800000, 3300000, 3800000, 1, 620000}, - {79, 4400000, 5000000, 4400000, 5000000, 2, 693334}, - {80, 1710000, 1785000, 000, 000, 20, 342000}, - {81, 860000, 915000, 000, 000, 20, 176000}, - {82, 832000, 862000, 000, 000, 20, 166400}, - {83, 703000, 748000, 000, 000, 20, 140600}, - {84, 1920000, 1980000, 000, 000, 20, 384000}, - {86, 1710000, 1785000, 000, 000, 20, 342000} -}; - +//int32_t **rxdata; +//int32_t **txdata; +extern nr_bandentry_t *nr_bandtable; uint32_t to_nrarfcn(int nr_bandP, uint64_t dl_CarrierFreq, uint32_t bw) { diff --git a/targets/RT/USER/nr-ue.c b/targets/RT/USER/nr-ue.c index a4afdcd6b6..362300d4d7 100644 --- a/targets/RT/USER/nr-ue.c +++ b/targets/RT/USER/nr-ue.c @@ -157,43 +157,6 @@ int32_t **txdata; #endif -band_info_t bands_to_scan; - -static const eutra_band_t eutra_bands[] = { - {1, 1920000, 1980000, 2110000, 2170000, FDD}, - {2, 1850000, 1910000, 1930000, 1990000, FDD}, - {3, 1710000, 1785000, 1805000, 1880000, FDD}, - {5, 824000, 849000, 869000, 894000, FDD}, - {7, 2500000, 2570000, 2620000, 2690000, FDD}, - {8, 880000, 915000, 925000, 960000, FDD}, - {12, 698000, 716000, 728000, 746000, FDD}, - {20, 832000, 862000, 791000, 821000, FDD}, - {25, 1850000, 1915000, 1930000, 1995000, FDD}, - {28, 703000, 758000, 758000, 813000, FDD}, - {34, 2010000, 2025000, 2010000, 2025000, TDD}, - {38, 2570000, 2620000, 2570000, 2630000, TDD}, - {39, 1880000, 1920000, 1880000, 1920000, TDD}, - {40, 2300000, 2400000, 2300000, 2400000, TDD}, - {41, 2496000, 2690000, 2496000, 2690000, TDD}, - {50, 1432000, 1517000, 1432000, 1517000, TDD}, - {51, 1427000, 1432000, 1427000, 1432000, TDD}, - {66, 1710000, 1780000, 2110000, 2200000, FDD}, - {70, 1695000, 1710000, 1995000, 2020000, FDD}, - {71, 663000, 698000, 617000, 652000, FDD}, - {74, 1427000, 1470000, 1475000, 1518000, FDD}, - {75, 000, 000, 1432000, 1517000, FDD}, - {76, 000, 000, 1427000, 1432000, FDD}, - {77, 3300000, 4200000, 3300000, 4200000, TDD}, - {78, 3300000, 3800000, 3300000, 3800000, TDD}, - {79, 4400000, 5000000, 4400000, 5000000, TDD}, - {80, 1710000, 1785000, 000, 000, FDD}, - {81, 860000, 915000, 000, 000, FDD}, - {82, 832000, 862000, 000, 000, FDD}, - {83, 703000, 748000, 000, 000, FDD}, - {84, 1920000, 1980000, 000, 000, FDD}, - {86, 1710000, 1785000, 000, 000, FDD} -}; - PHY_VARS_NR_UE *init_nr_ue_vars(NR_DL_FRAME_PARMS *frame_parms, uint8_t UE_id, uint8_t abstraction_flag) @@ -364,7 +327,8 @@ static void *UE_thread_synch(void *arg) { sync_mode = pbch; } else { current_band=0; - + LOG_E(PHY,"Fixme!\n"); + /* for (i=0; irf_map.card].rx_num_channels; i++) { downlink_frequency[UE->rf_map.card][UE->rf_map.chain+i] = bands_to_scan.band_info[CC_id].dl_min; uplink_frequency_offset[UE->rf_map.card][UE->rf_map.chain+i] = @@ -374,6 +338,7 @@ static void *UE_thread_synch(void *arg) { downlink_frequency[CC_id][i]+uplink_frequency_offset[CC_id][i]; openair0_cfg[UE->rf_map.card].rx_gain[UE->rf_map.chain+i] = UE->rx_total_gain_dB; } + */ } // AssertFatal(UE->rfdevice.trx_start_func(&UE->rfdevice) == 0, "Could not start the device\n"); @@ -388,6 +353,7 @@ static void *UE_thread_synch(void *arg) { AssertFatal ( 0== pthread_mutex_unlock(&UE->proc.mutex_synch), ""); switch (sync_mode) { + /* case pss: LOG_I(PHY,"[SCHED][UE] Scanning band %d (%d), freq %u\n",bands_to_scan.band_info[current_band].band, current_band,bands_to_scan.band_info[current_band].dl_min+current_offset); //lte_sync_timefreq(UE,current_band,bands_to_scan.band_info[current_band].dl_min+current_offset); @@ -416,7 +382,7 @@ static void *UE_thread_synch(void *arg) { } break; - + */ case pbch: #if DISABLE_LOG_X printf("[UE thread Synch] Running Initial Synch (mode %d)\n",UE->mode); From 14ae2b54bd1aa8e0ba2b53d6f7f50c8f6a73a65a Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Mon, 25 Mar 2019 09:50:03 +0100 Subject: [PATCH 26/31] renaming band_info_s ton nr_band_info_s to avoid confusion with LTE --- openair1/PHY/defs_nr_common.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openair1/PHY/defs_nr_common.h b/openair1/PHY/defs_nr_common.h index 605ce8c4c8..0c2f8771ec 100644 --- a/openair1/PHY/defs_nr_common.h +++ b/openair1/PHY/defs_nr_common.h @@ -334,7 +334,7 @@ typedef struct nr_bandentry_s { uint64_t step_size; } nr_bandentry_t; -typedef struct band_info_s { +typedef struct nr_band_info_s { int nbands; nr_bandentry_t band_info[100]; } nr_band_info_t; From 52a142d0df66c46abdedcca9c75f2e011ba8a282 Mon Sep 17 00:00:00 2001 From: Francesco Mani Date: Tue, 26 Mar 2019 09:39:11 +0100 Subject: [PATCH 27/31] bugfix in pbch correlation --- .../PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c | 13 +++++-------- openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h | 1 + openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c | 2 +- 3 files changed, 7 insertions(+), 9 deletions(-) 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 f6fd1f28f2..917734f8ec 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c @@ -36,6 +36,7 @@ int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue, uint8_t eNB_offset, unsigned char Ns, unsigned char symbol, + int dmrss, NR_UE_SSB *current_ssb) { int pilot[200] __attribute__((aligned(16))); @@ -44,7 +45,7 @@ int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue, unsigned int pilot_cnt; int16_t ch[2],*pil,*rxF; int symbol_offset; - int dmrss; + uint8_t nushift; uint8_t ssb_index=current_ssb->i_ssb; @@ -56,13 +57,9 @@ int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue, unsigned int ssb_offset = ue->frame_parms.first_carrier_offset + ue->frame_parms.ssb_start_subcarrier; if (ssb_offset>= ue->frame_parms.ofdm_symbol_size) ssb_offset-=ue->frame_parms.ofdm_symbol_size; - if (ue->is_synchronized ==0 ) dmrss = symbol-1; - else dmrss = symbol-5; - - AssertFatal((symbol > 0 && symbol < 4 && ue->is_synchronized == 0) || - (symbol > 4 && symbol < 8 && ue->is_synchronized == 1), - "symbol %d is illegal for PBCH DM-RS (is_synchronized %d)\n", - symbol,ue->is_synchronized); + AssertFatal(dmrss >= 0 && dmrss < 3, + "symbol %d is illegal for PBCH DM-RS \n", + dmrss); symbol_offset = ue->frame_parms.ofdm_symbol_size*symbol; diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h b/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h index 1ec9cec96f..29400bbdc7 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h @@ -54,6 +54,7 @@ int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue, uint8_t eNB_offset, unsigned char Ns, unsigned char symbol, + int dmrss, NR_UE_SSB *current_ssb); int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue, diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c b/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c index 62dad0c027..0e0676b972 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c @@ -130,7 +130,7 @@ int nr_pbch_detection(PHY_VARS_NR_UE *ue, int pbch_initial_symbol, runmode_t mod #endif // computing correlation between received DMRS symbols and transmitted sequence for current i_ssb and n_hf for(int i=pbch_initial_symbol; idlsch_channel_estimation_stats); #endif From a3049674c6494fd3c9cd35623d960d6a91b672f4 Mon Sep 17 00:00:00 2001 From: Francesco Mani Date: Tue, 26 Mar 2019 10:27:12 +0100 Subject: [PATCH 28/31] warning fixed in get_band --- openair1/PHY/INIT/nr_parms.c | 10 +++++----- openair1/PHY/INIT/phy_init.h | 2 +- openair1/SIMULATION/NR_PHY/dlsim.c | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/openair1/PHY/INIT/nr_parms.c b/openair1/PHY/INIT/nr_parms.c index 095101fb89..bdcf562e6a 100644 --- a/openair1/PHY/INIT/nr_parms.c +++ b/openair1/PHY/INIT/nr_parms.c @@ -337,13 +337,14 @@ nr_bandentry_t nr_bandtable[] = { {86, 1710000, 1785000, 000, 000, 20, 342000} }; -int get_band(uint32_t downlink_frequency, uint8_t *current_band, int32_t *current_offset, lte_frame_type_t *current_type) { +void get_band(uint32_t downlink_frequency, uint8_t *current_band, int32_t *current_offset, lte_frame_type_t *current_type) { int ind; int64_t dl_freq_khz = downlink_frequency/1000; for ( ind=0; ind < sizeof(nr_bandtable) / sizeof(nr_bandtable[0]); ind++) { + *current_band = nr_bandtable[ind].band; LOG_I(PHY, "Scanning band %d, dl_min %"PRIu32", ul_min %"PRIu32"\n", ind, nr_bandtable[ind].dl_min,nr_bandtable[ind].ul_min); @@ -360,9 +361,8 @@ int get_band(uint32_t downlink_frequency, uint8_t *current_band, int32_t *cu } } - if( ind == sizeof(nr_bandtable) / sizeof(nr_bandtable[0])) { - LOG_E(PHY,"Can't find EUTRA band for frequency %d\n", downlink_frequency); - return(-1); - } + AssertFatal(ind != (sizeof(nr_bandtable) / sizeof(nr_bandtable[0])), + "Can't find EUTRA band for frequency %d\n", downlink_frequency); + } diff --git a/openair1/PHY/INIT/phy_init.h b/openair1/PHY/INIT/phy_init.h index f500375e4b..bc92d0939e 100644 --- a/openair1/PHY/INIT/phy_init.h +++ b/openair1/PHY/INIT/phy_init.h @@ -391,7 +391,7 @@ void init_nr_transport(PHY_VARS_gNB *gNB); void init_dfts(void); -int get_band(uint32_t downlink_frequency, uint8_t *current_band, int32_t *current_offset, lte_frame_type_t *current_type); +void get_band(uint32_t downlink_frequency, uint8_t *current_band, int32_t *current_offset, lte_frame_type_t *current_type); /** @} */ diff --git a/openair1/SIMULATION/NR_PHY/dlsim.c b/openair1/SIMULATION/NR_PHY/dlsim.c index 652158605b..1416905696 100644 --- a/openair1/SIMULATION/NR_PHY/dlsim.c +++ b/openair1/SIMULATION/NR_PHY/dlsim.c @@ -154,7 +154,7 @@ int main(int argc, char **argv) int pbch_tx_ant; int N_RB_DL=273,mu=1; - uint64_t ssb_pattern = 0; + uint64_t ssb_pattern = 0x01; unsigned char frame_type = 0; unsigned char pbch_phase = 0; From dea3125734a40c8263cf6b6a1ea82f4e7152da34 Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Tue, 26 Mar 2019 14:48:30 +0100 Subject: [PATCH 29/31] moving nr_bandtable back to MAC --- openair1/PHY/INIT/nr_parms.c | 63 ------------------------- openair1/PHY/INIT/phy_init.h | 2 - openair2/LAYER2/NR_MAC_gNB/config.c | 65 +++++++++++++++++++++++++- openair2/LAYER2/NR_MAC_gNB/mac_proto.h | 2 + 4 files changed, 66 insertions(+), 66 deletions(-) diff --git a/openair1/PHY/INIT/nr_parms.c b/openair1/PHY/INIT/nr_parms.c index bdcf562e6a..a828804002 100644 --- a/openair1/PHY/INIT/nr_parms.c +++ b/openair1/PHY/INIT/nr_parms.c @@ -302,67 +302,4 @@ void nr_dump_frame_parms(NR_DL_FRAME_PARMS *fp) } -nr_bandentry_t nr_bandtable[] = { - {1, 1920000, 1980000, 2110000, 2170000, 20, 422000}, - {2, 1850000, 1910000, 1930000, 1990000, 20, 386000}, - {3, 1710000, 1785000, 1805000, 1880000, 20, 361000}, - {5, 824000, 849000, 869000, 894000, 20, 173800}, - {7, 2500000, 2570000, 2620000, 2690000, 20, 524000}, - {8, 880000, 915000, 925000, 960000, 20, 185000}, - {12, 698000, 716000, 728000, 746000, 20, 145800}, - {20, 832000, 862000, 791000, 821000, 20, 158200}, - {25, 1850000, 1915000, 1930000, 1995000, 20, 386000}, - {28, 703000, 758000, 758000, 813000, 20, 151600}, - {34, 2010000, 2025000, 2010000, 2025000, 20, 402000}, - {38, 2570000, 2620000, 2570000, 2630000, 20, 514000}, - {39, 1880000, 1920000, 1880000, 1920000, 20, 376000}, - {40, 2300000, 2400000, 2300000, 2400000, 20, 460000}, - {41, 2496000, 2690000, 2496000, 2690000, 3, 499200}, - {50, 1432000, 1517000, 1432000, 1517000, 20, 286400}, - {51, 1427000, 1432000, 1427000, 1432000, 20, 285400}, - {66, 1710000, 1780000, 2110000, 2200000, 20, 422000}, - {70, 1695000, 1710000, 1995000, 2020000, 20, 399000}, - {71, 663000, 698000, 617000, 652000, 20, 123400}, - {74, 1427000, 1470000, 1475000, 1518000, 20, 295000}, - {75, 000, 000, 1432000, 1517000, 20, 286400}, - {76, 000, 000, 1427000, 1432000, 20, 285400}, - {77, 3300000, 4200000, 3300000, 4200000, 1, 620000}, - {78, 3300000, 3800000, 3300000, 3800000, 1, 620000}, - {79, 4400000, 5000000, 4400000, 5000000, 2, 693334}, - {80, 1710000, 1785000, 000, 000, 20, 342000}, - {81, 860000, 915000, 000, 000, 20, 176000}, - {82, 832000, 862000, 000, 000, 20, 166400}, - {83, 703000, 748000, 000, 000, 20, 140600}, - {84, 1920000, 1980000, 000, 000, 20, 384000}, - {86, 1710000, 1785000, 000, 000, 20, 342000} -}; - -void get_band(uint32_t downlink_frequency, uint8_t *current_band, int32_t *current_offset, lte_frame_type_t *current_type) { - - int ind; - int64_t dl_freq_khz = downlink_frequency/1000; - for ( ind=0; - ind < sizeof(nr_bandtable) / sizeof(nr_bandtable[0]); - ind++) { - - *current_band = nr_bandtable[ind].band; - LOG_I(PHY, "Scanning band %d, dl_min %"PRIu32", ul_min %"PRIu32"\n", ind, nr_bandtable[ind].dl_min,nr_bandtable[ind].ul_min); - - if ( nr_bandtable[ind].dl_min <= dl_freq_khz && nr_bandtable[ind].dl_max >= dl_freq_khz ) { - *current_offset = (nr_bandtable[ind].ul_min - nr_bandtable[ind].dl_min)*1000; - if (*current_offset == 0) - *current_type = TDD; - else - *current_type = FDD; - - LOG_I( PHY, "DL frequency %"PRIu32": band %d, frame_type %d, UL frequency %"PRIu32"\n", - downlink_frequency, *current_band, *current_type, downlink_frequency+*current_offset); - break; - } - } - - AssertFatal(ind != (sizeof(nr_bandtable) / sizeof(nr_bandtable[0])), - "Can't find EUTRA band for frequency %d\n", downlink_frequency); - -} diff --git a/openair1/PHY/INIT/phy_init.h b/openair1/PHY/INIT/phy_init.h index bc92d0939e..6f9cff07bf 100644 --- a/openair1/PHY/INIT/phy_init.h +++ b/openair1/PHY/INIT/phy_init.h @@ -391,8 +391,6 @@ void init_nr_transport(PHY_VARS_gNB *gNB); void init_dfts(void); -void get_band(uint32_t downlink_frequency, uint8_t *current_band, int32_t *current_offset, lte_frame_type_t *current_type); - /** @} */ #endif diff --git a/openair2/LAYER2/NR_MAC_gNB/config.c b/openair2/LAYER2/NR_MAC_gNB/config.c index 1e1258e089..d41ff93e9b 100644 --- a/openair2/LAYER2/NR_MAC_gNB/config.c +++ b/openair2/LAYER2/NR_MAC_gNB/config.c @@ -51,7 +51,70 @@ extern uint8_t nfapi_mode; //int32_t **rxdata; //int32_t **txdata; -extern nr_bandentry_t *nr_bandtable; + +nr_bandentry_t nr_bandtable[] = { + {1, 1920000, 1980000, 2110000, 2170000, 20, 422000}, + {2, 1850000, 1910000, 1930000, 1990000, 20, 386000}, + {3, 1710000, 1785000, 1805000, 1880000, 20, 361000}, + {5, 824000, 849000, 869000, 894000, 20, 173800}, + {7, 2500000, 2570000, 2620000, 2690000, 20, 524000}, + {8, 880000, 915000, 925000, 960000, 20, 185000}, + {12, 698000, 716000, 728000, 746000, 20, 145800}, + {20, 832000, 862000, 791000, 821000, 20, 158200}, + {25, 1850000, 1915000, 1930000, 1995000, 20, 386000}, + {28, 703000, 758000, 758000, 813000, 20, 151600}, + {34, 2010000, 2025000, 2010000, 2025000, 20, 402000}, + {38, 2570000, 2620000, 2570000, 2630000, 20, 514000}, + {39, 1880000, 1920000, 1880000, 1920000, 20, 376000}, + {40, 2300000, 2400000, 2300000, 2400000, 20, 460000}, + {41, 2496000, 2690000, 2496000, 2690000, 3, 499200}, + {50, 1432000, 1517000, 1432000, 1517000, 20, 286400}, + {51, 1427000, 1432000, 1427000, 1432000, 20, 285400}, + {66, 1710000, 1780000, 2110000, 2200000, 20, 422000}, + {70, 1695000, 1710000, 1995000, 2020000, 20, 399000}, + {71, 663000, 698000, 617000, 652000, 20, 123400}, + {74, 1427000, 1470000, 1475000, 1518000, 20, 295000}, + {75, 000, 000, 1432000, 1517000, 20, 286400}, + {76, 000, 000, 1427000, 1432000, 20, 285400}, + {77, 3300000, 4200000, 3300000, 4200000, 1, 620000}, + {78, 3300000, 3800000, 3300000, 3800000, 1, 620000}, + {79, 4400000, 5000000, 4400000, 5000000, 2, 693334}, + {80, 1710000, 1785000, 000, 000, 20, 342000}, + {81, 860000, 915000, 000, 000, 20, 176000}, + {82, 832000, 862000, 000, 000, 20, 166400}, + {83, 703000, 748000, 000, 000, 20, 140600}, + {84, 1920000, 1980000, 000, 000, 20, 384000}, + {86, 1710000, 1785000, 000, 000, 20, 342000} +}; + +void get_band(uint32_t downlink_frequency, uint8_t *current_band, int32_t *current_offset, lte_frame_type_t *current_type) { + + int ind; + int64_t dl_freq_khz = downlink_frequency/1000; + for ( ind=0; + ind < sizeof(nr_bandtable) / sizeof(nr_bandtable[0]); + ind++) { + + *current_band = nr_bandtable[ind].band; + LOG_I(PHY, "Scanning band %d, dl_min %"PRIu64", ul_min %"PRIu64"\n", ind, nr_bandtable[ind].dl_min,nr_bandtable[ind].ul_min); + + if ( nr_bandtable[ind].dl_min <= dl_freq_khz && nr_bandtable[ind].dl_max >= dl_freq_khz ) { + *current_offset = (nr_bandtable[ind].ul_min - nr_bandtable[ind].dl_min)*1000; + if (*current_offset == 0) + *current_type = TDD; + else + *current_type = FDD; + + LOG_I( PHY, "DL frequency %"PRIu32": band %d, frame_type %d, UL frequency %"PRIu32"\n", + downlink_frequency, *current_band, *current_type, downlink_frequency+*current_offset); + break; + } + } + + AssertFatal(ind != (sizeof(nr_bandtable) / sizeof(nr_bandtable[0])), + "Can't find EUTRA band for frequency %d\n", downlink_frequency); + +} uint32_t to_nrarfcn(int nr_bandP, uint64_t dl_CarrierFreq, uint32_t bw) { diff --git a/openair2/LAYER2/NR_MAC_gNB/mac_proto.h b/openair2/LAYER2/NR_MAC_gNB/mac_proto.h index a214b160a2..9c14b84a23 100644 --- a/openair2/LAYER2/NR_MAC_gNB/mac_proto.h +++ b/openair2/LAYER2/NR_MAC_gNB/mac_proto.h @@ -102,4 +102,6 @@ int to_absslot(nfapi_nr_config_request_t *cfg,int frame,int slot); int get_symbolsperslot(nfapi_nr_config_request_t *cfg); +void get_band(uint32_t downlink_frequency, uint8_t *current_band, int32_t *current_offset, lte_frame_type_t *current_type); + #endif /*__LAYER2_NR_MAC_PROTO_H__*/ From 97f4ec965ec28cacb9fcbb8526ea86a3817a37e9 Mon Sep 17 00:00:00 2001 From: Florian Kaltenberger Date: Tue, 26 Mar 2019 18:19:36 +0100 Subject: [PATCH 30/31] desparate to get the get_band function to work for all targets --- cmake_targets/CMakeLists.txt | 59 +++----- openair2/LAYER2/NR_MAC_gNB/config.c | 117 ---------------- openair2/LAYER2/NR_MAC_gNB/mac_proto.h | 4 + openair2/LAYER2/NR_MAC_gNB/nr_mac_common.c | 148 +++++++++++++++++++++ 4 files changed, 167 insertions(+), 161 deletions(-) create mode 100644 openair2/LAYER2/NR_MAC_gNB/nr_mac_common.c diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index af9c3edf68..8f11e99a75 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -167,7 +167,7 @@ endif() # set(CMAKE_C_FLAGS - "${CMAKE_C_FLAGS} ${C_FLAGS_PROCESSOR} -std=gnu99 -Wall -Wstrict-prototypes -fno-strict-aliasing -rdynamic -funroll-loops -Wno-packed-bitfield-compat -fPIC ") + "${CMAKE_C_FLAGS} ${C_FLAGS_PROCESSOR} -std=gnu99 -Wall -Wstrict-prototypes -fno-strict-aliasing -rdynamic -funroll-loops -Wno-packed-bitfield-compat -fPIC") # add autotools definitions that were maybe used! set(MKVER "'MAKE_VERSION(a,b,c)=((a)*256+(b)*16+c)'") set(CMAKE_C_FLAGS @@ -1575,6 +1575,7 @@ add_library(L2 ${ENB_APP_SRC} ) add_dependencies(L2 rrc_flag s1ap_flag x2_flag) + add_library(MAC_NR ${MAC_NR_SRC} ) @@ -1593,7 +1594,6 @@ add_dependencies(S1AP_LIB nr_rrc_flag s1ap_flag) add_library(L2_UE ${L2_SRC_UE} ${MAC_SRC_UE} - #${MAC_NR_SRC_UE} ) if (NOT ${NOS1}) target_compile_definitions(L2_UE PUBLIC -DPDCP_USE_NETLINK) @@ -1602,44 +1602,13 @@ endif() add_dependencies(L2_UE rrc_flag s1ap_flag x2_flag) add_library( NR_L2_UE - #${L2_SRC_UE} ${NR_L2_SRC_UE} ${MAC_NR_SRC_UE} - #${MAC_SRC_UE} -) - -set ( NR_LTE_UE_REUSE_SRC - ${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_sync_timefreq.c - ${OPENAIR1_DIR}/SCHED/phy_procedures_lte_common.c - #${OPENAIR1_DIR}/SCHED_UE/phy_procedures_lte_ue.c - ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/lte_mcs.c - #${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pmch_common.c - - #${OPENAIR1_DIR}/PHY/LTE_REFSIG/lte_dl_cell_spec.c - #${OPENAIR1_DIR}/PHY/CODING/lte_segmentation.c - #${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/prach_common.c -# ${OPENAIR1_DIR}/PHY/INIT/lte_init_ue.c - ${OPENAIR1_DIR}/PHY/CODING/crc_byte.c - ${OPENAIR1_DIR}/PHY/CODING/viterbi_lte.c - ${OPENAIR1_DIR}/PHY/CODING/viterbi.c - #${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/phich_common.c - ${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/dlsch_llr_computation.c - -# ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/dci_tools_common.c -# ${OPENAIR1_DIR}/PHY/CODING/lte_rate_matching.c - ${OPENAIR1_DIR}/PHY/CODING/ccoding_byte_lte.c - ${OPENAIR1_DIR}/PHY/CODING/ccoding_byte.c - ${OPENAIR1_DIR}/PHY/LTE_REFSIG/lte_gold.c - ${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_est_freq_offset.c - ${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.c - ${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_ue_measurements.c - #${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c - #${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/dlsch_llr_computation_avx2.c -) - -add_library( NR_LTE_UE_REUSE_LIB - ${NR_LTE_UE_REUSE_SRC} -) + ) + +add_library( MAC_NR_COMMON + ${OPENAIR2_DIR}/LAYER2/NR_MAC_gNB/nr_mac_common.c + ) include_directories("${OPENAIR2_DIR}/NR_UE_PHY_INTERFACE") include_directories("${OPENAIR2_DIR}/LAYER2/NR_MAC_UE") @@ -2368,7 +2337,7 @@ target_link_libraries (nr-softmodem -Wl,--start-group UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB SCHED_RU_LIB SCHED_NR_LIB PHY_NR PHY PHY_COMMON PHY_RU LFDS GTPV1U SECU_CN SECU_OSA ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${FLEXRAN_AGENT_LIB} LFDS7 ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} - RRC_LIB NR_RRC_LIB S1AP_LIB S1AP_ENB L2 L2_NR + RRC_LIB NR_RRC_LIB S1AP_LIB S1AP_ENB L2 L2_NR MAC_NR_COMMON NFAPI_COMMON_LIB NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB -Wl,--end-group z dl) @@ -2409,7 +2378,7 @@ target_link_libraries (nr-softmodem-nos1 -Wl,--start-group UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB SCHED_RU_LIB SCHED_NR_LIB PHY_NR PHY PHY_COMMON PHY_RU LFDS GTPV1U SECU_CN SECU_OSA ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${FLEXRAN_AGENT_LIB} LFDS7 ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${MIH_LIB} - RRC_LIB NR_RRC_LIB S1AP_LIB S1AP_ENB L2 L2_NR + RRC_LIB NR_RRC_LIB S1AP_LIB S1AP_ENB L2 L2_NR MAC_NR_COMMON NFAPI_COMMON_LIB NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB -Wl,--end-group z dl) @@ -2444,7 +2413,7 @@ add_executable(nr-uesoftmodem target_link_libraries (nr-uesoftmodem -Wl,--start-group - RRC_LIB NR_RRC_LIB SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT UDP SCHED_RU_LIB SCHED_UE_LIB SCHED_NR_UE_LIB PHY_COMMON PHY_NR_UE PHY_RU LFDS NR_L2_UE #NR_LTE_UE_REUSE_LIB + RRC_LIB NR_RRC_LIB SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT UDP SCHED_RU_LIB SCHED_UE_LIB SCHED_NR_UE_LIB PHY_COMMON PHY_NR_UE PHY_RU LFDS NR_L2_UE MAC_NR_COMMON ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} LFDS7 ${ATLAS_LIBRARIES} -Wl,--end-group z dl) @@ -2478,7 +2447,7 @@ add_executable(nr-uesoftmodem-nos1 target_link_libraries (nr-uesoftmodem-nos1 -Wl,--start-group - RRC_LIB NR_RRC_LIB S1AP_LIB S1AP_ENB GTPV1U SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT UDP SCHED_RU_LIB SCHED_UE_LIB SCHED_NR_UE_LIB PHY_COMMON PHY_NR_UE PHY_UE PHY_RU LFDS NR_L2_UE + RRC_LIB NR_RRC_LIB S1AP_LIB S1AP_ENB GTPV1U SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT UDP SCHED_RU_LIB SCHED_UE_LIB SCHED_NR_UE_LIB PHY_COMMON PHY_NR_UE PHY_UE PHY_RU LFDS NR_L2_UE MAC_NR_COMMON ${MSC_LIB} ${RAL_LIB} ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} LFDS7 ${ATLAS_LIBRARIES} -Wl,--end-group z dl) @@ -2555,7 +2524,7 @@ add_executable(nr_dlsim ${OPENAIR1_DIR}/SIMULATION/NR_PHY/dlsim.c ${OPENAIR_DIR}/common/utils/backtrace.c ${T_SOURCE}) -target_link_libraries(nr_dlsim -Wl,--start-group UTIL SIMU PHY_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB SCHED_NR_UE_LIB MAC_NR MAC_UE_NR RRC_LIB NR_RRC_LIB CONFIG_LIB L2_NR -Wl,--end-group m pthread ${ATLAS_LIBRARIES} ${T_LIB} dl) +target_link_libraries(nr_dlsim -Wl,--start-group UTIL SIMU PHY_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB SCHED_NR_UE_LIB MAC_NR MAC_UE_NR MAC_NR_COMMON RRC_LIB NR_RRC_LIB CONFIG_LIB L2_NR -Wl,--end-group m pthread ${ATLAS_LIBRARIES} ${T_LIB} dl) foreach(myExe dlsim dlsim_tm7 ulsim pbchsim scansim mbmssim pdcchsim pucchsim prachsim syncsim) @@ -2688,7 +2657,9 @@ L2 L2_NR L2_UE NR_L2_UE -NR_LTE_UE_REUSE_LIB +MAC_NR_COMMON +MAC_NR +MAC_UE_NR CN_UTILS GTPV1U SCTP_CLIENT diff --git a/openair2/LAYER2/NR_MAC_gNB/config.c b/openair2/LAYER2/NR_MAC_gNB/config.c index d41ff93e9b..6954b9507d 100644 --- a/openair2/LAYER2/NR_MAC_gNB/config.c +++ b/openair2/LAYER2/NR_MAC_gNB/config.c @@ -49,123 +49,6 @@ extern RAN_CONTEXT_t RC; extern void mac_top_init_gNB(void); extern uint8_t nfapi_mode; -//int32_t **rxdata; -//int32_t **txdata; - -nr_bandentry_t nr_bandtable[] = { - {1, 1920000, 1980000, 2110000, 2170000, 20, 422000}, - {2, 1850000, 1910000, 1930000, 1990000, 20, 386000}, - {3, 1710000, 1785000, 1805000, 1880000, 20, 361000}, - {5, 824000, 849000, 869000, 894000, 20, 173800}, - {7, 2500000, 2570000, 2620000, 2690000, 20, 524000}, - {8, 880000, 915000, 925000, 960000, 20, 185000}, - {12, 698000, 716000, 728000, 746000, 20, 145800}, - {20, 832000, 862000, 791000, 821000, 20, 158200}, - {25, 1850000, 1915000, 1930000, 1995000, 20, 386000}, - {28, 703000, 758000, 758000, 813000, 20, 151600}, - {34, 2010000, 2025000, 2010000, 2025000, 20, 402000}, - {38, 2570000, 2620000, 2570000, 2630000, 20, 514000}, - {39, 1880000, 1920000, 1880000, 1920000, 20, 376000}, - {40, 2300000, 2400000, 2300000, 2400000, 20, 460000}, - {41, 2496000, 2690000, 2496000, 2690000, 3, 499200}, - {50, 1432000, 1517000, 1432000, 1517000, 20, 286400}, - {51, 1427000, 1432000, 1427000, 1432000, 20, 285400}, - {66, 1710000, 1780000, 2110000, 2200000, 20, 422000}, - {70, 1695000, 1710000, 1995000, 2020000, 20, 399000}, - {71, 663000, 698000, 617000, 652000, 20, 123400}, - {74, 1427000, 1470000, 1475000, 1518000, 20, 295000}, - {75, 000, 000, 1432000, 1517000, 20, 286400}, - {76, 000, 000, 1427000, 1432000, 20, 285400}, - {77, 3300000, 4200000, 3300000, 4200000, 1, 620000}, - {78, 3300000, 3800000, 3300000, 3800000, 1, 620000}, - {79, 4400000, 5000000, 4400000, 5000000, 2, 693334}, - {80, 1710000, 1785000, 000, 000, 20, 342000}, - {81, 860000, 915000, 000, 000, 20, 176000}, - {82, 832000, 862000, 000, 000, 20, 166400}, - {83, 703000, 748000, 000, 000, 20, 140600}, - {84, 1920000, 1980000, 000, 000, 20, 384000}, - {86, 1710000, 1785000, 000, 000, 20, 342000} -}; - -void get_band(uint32_t downlink_frequency, uint8_t *current_band, int32_t *current_offset, lte_frame_type_t *current_type) { - - int ind; - int64_t dl_freq_khz = downlink_frequency/1000; - for ( ind=0; - ind < sizeof(nr_bandtable) / sizeof(nr_bandtable[0]); - ind++) { - - *current_band = nr_bandtable[ind].band; - LOG_I(PHY, "Scanning band %d, dl_min %"PRIu64", ul_min %"PRIu64"\n", ind, nr_bandtable[ind].dl_min,nr_bandtable[ind].ul_min); - - if ( nr_bandtable[ind].dl_min <= dl_freq_khz && nr_bandtable[ind].dl_max >= dl_freq_khz ) { - *current_offset = (nr_bandtable[ind].ul_min - nr_bandtable[ind].dl_min)*1000; - if (*current_offset == 0) - *current_type = TDD; - else - *current_type = FDD; - - LOG_I( PHY, "DL frequency %"PRIu32": band %d, frame_type %d, UL frequency %"PRIu32"\n", - downlink_frequency, *current_band, *current_type, downlink_frequency+*current_offset); - break; - } - } - - AssertFatal(ind != (sizeof(nr_bandtable) / sizeof(nr_bandtable[0])), - "Can't find EUTRA band for frequency %d\n", downlink_frequency); - -} - -uint32_t to_nrarfcn(int nr_bandP, uint64_t dl_CarrierFreq, uint32_t bw) -{ - - uint64_t dl_CarrierFreq_by_1k = dl_CarrierFreq / 1000; - int bw_kHz = bw / 1000; - - int i; - - LOG_I(MAC,"Searching for nr band %d DL Carrier frequency %llu bw %u\n",nr_bandP,(long long unsigned int)dl_CarrierFreq,bw); - AssertFatal(nr_bandP < 86, "nr_band %d > 86\n", nr_bandP); - for (i = 0; i < 30 && nr_bandtable[i].band != nr_bandP; i++); - - AssertFatal(dl_CarrierFreq_by_1k >= nr_bandtable[i].dl_min, - "Band %d, bw %u : DL carrier frequency %llu kHz < %llu\n", - nr_bandP, bw, (long long unsigned int)dl_CarrierFreq_by_1k, - (long long unsigned int)nr_bandtable[i].dl_min); - AssertFatal(dl_CarrierFreq_by_1k <= - (nr_bandtable[i].dl_max - bw_kHz), - "Band %d, dl_CarrierFreq %llu bw %u: DL carrier frequency %llu kHz > %llu\n", - nr_bandP, (long long unsigned int)dl_CarrierFreq,bw, (long long unsigned int)dl_CarrierFreq_by_1k, - (long long unsigned int)(nr_bandtable[i].dl_max - bw_kHz)); - - int deltaFglobal; - - if (dl_CarrierFreq < 3e9) deltaFglobal = 5; - else deltaFglobal = 15; - - // This is equation before Table 5.4.2.1-1 in 38101-1-f30 - // F_REF=F_REF_Offs + deltaF_Global(N_REF-NREF_REF_Offs) - return (((dl_CarrierFreq_by_1k - nr_bandtable[i].dl_min)/deltaFglobal) + - nr_bandtable[i].N_OFFs_DL); -} - - -uint64_t from_nrarfcn(int nr_bandP, uint32_t dl_nrarfcn) -{ - - int i; - int deltaFglobal; - - if (nr_bandP < 77 || nr_bandP > 79) deltaFglobal = 5; - else deltaFglobal = 15; - - AssertFatal(nr_bandP < 87, "nr_band %d > 86\n", nr_bandP); - for (i = 0; i < 31 && nr_bandtable[i].band != nr_bandP; i++); - AssertFatal(dl_nrarfcn>=nr_bandtable[i].N_OFFs_DL,"dl_nrarfcn %u < N_OFFs_DL %llu\n",dl_nrarfcn, (long long unsigned int)nr_bandtable[i].N_OFFs_DL); - - return 1000*(nr_bandtable[i].dl_min + (dl_nrarfcn - nr_bandtable[i].N_OFFs_DL) * deltaFglobal); - -} void config_nr_mib(int Mod_idP, int CC_idP, diff --git a/openair2/LAYER2/NR_MAC_gNB/mac_proto.h b/openair2/LAYER2/NR_MAC_gNB/mac_proto.h index 9c14b84a23..6f0bd9d595 100644 --- a/openair2/LAYER2/NR_MAC_gNB/mac_proto.h +++ b/openair2/LAYER2/NR_MAC_gNB/mac_proto.h @@ -104,4 +104,8 @@ int get_symbolsperslot(nfapi_nr_config_request_t *cfg); void get_band(uint32_t downlink_frequency, uint8_t *current_band, int32_t *current_offset, lte_frame_type_t *current_type); +uint64_t from_nrarfcn(int nr_bandP, uint32_t dl_nrarfcn); + +uint32_t to_nrarfcn(int nr_bandP, uint64_t dl_CarrierFreq, uint32_t bw); + #endif /*__LAYER2_NR_MAC_PROTO_H__*/ diff --git a/openair2/LAYER2/NR_MAC_gNB/nr_mac_common.c b/openair2/LAYER2/NR_MAC_gNB/nr_mac_common.c new file mode 100644 index 0000000000..f2c2e437cc --- /dev/null +++ b/openair2/LAYER2/NR_MAC_gNB/nr_mac_common.c @@ -0,0 +1,148 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +/*! \file nr_mac_common.c + * \brief Common MAC functions for NR UE and gNB + * \author Florian Kaltenberger and Raymond Knopp + * \date 2019 + * \version 0.1 + * \company Eurecom, NTUST + * \email: florian.kalteberger@eurecom.fr, raymond.knopp@eurecom.fr + * @ingroup _mac + + */ + +#include "LAYER2/NR_MAC_gNB/mac_proto.h" + +nr_bandentry_t nr_bandtable[] = { + {1, 1920000, 1980000, 2110000, 2170000, 20, 422000}, + {2, 1850000, 1910000, 1930000, 1990000, 20, 386000}, + {3, 1710000, 1785000, 1805000, 1880000, 20, 361000}, + {5, 824000, 849000, 869000, 894000, 20, 173800}, + {7, 2500000, 2570000, 2620000, 2690000, 20, 524000}, + {8, 880000, 915000, 925000, 960000, 20, 185000}, + {12, 698000, 716000, 728000, 746000, 20, 145800}, + {20, 832000, 862000, 791000, 821000, 20, 158200}, + {25, 1850000, 1915000, 1930000, 1995000, 20, 386000}, + {28, 703000, 758000, 758000, 813000, 20, 151600}, + {34, 2010000, 2025000, 2010000, 2025000, 20, 402000}, + {38, 2570000, 2620000, 2570000, 2630000, 20, 514000}, + {39, 1880000, 1920000, 1880000, 1920000, 20, 376000}, + {40, 2300000, 2400000, 2300000, 2400000, 20, 460000}, + {41, 2496000, 2690000, 2496000, 2690000, 3, 499200}, + {50, 1432000, 1517000, 1432000, 1517000, 20, 286400}, + {51, 1427000, 1432000, 1427000, 1432000, 20, 285400}, + {66, 1710000, 1780000, 2110000, 2200000, 20, 422000}, + {70, 1695000, 1710000, 1995000, 2020000, 20, 399000}, + {71, 663000, 698000, 617000, 652000, 20, 123400}, + {74, 1427000, 1470000, 1475000, 1518000, 20, 295000}, + {75, 000, 000, 1432000, 1517000, 20, 286400}, + {76, 000, 000, 1427000, 1432000, 20, 285400}, + {77, 3300000, 4200000, 3300000, 4200000, 1, 620000}, + {78, 3300000, 3800000, 3300000, 3800000, 1, 620000}, + {79, 4400000, 5000000, 4400000, 5000000, 2, 693334}, + {80, 1710000, 1785000, 000, 000, 20, 342000}, + {81, 860000, 915000, 000, 000, 20, 176000}, + {82, 832000, 862000, 000, 000, 20, 166400}, + {83, 703000, 748000, 000, 000, 20, 140600}, + {84, 1920000, 1980000, 000, 000, 20, 384000}, + {86, 1710000, 1785000, 000, 000, 20, 342000} +}; + +void get_band(uint32_t downlink_frequency, uint8_t *current_band, int32_t *current_offset, lte_frame_type_t *current_type) { + + int ind; + int64_t dl_freq_khz = downlink_frequency/1000; + for ( ind=0; + ind < sizeof(nr_bandtable) / sizeof(nr_bandtable[0]); + ind++) { + + *current_band = nr_bandtable[ind].band; + LOG_I(PHY, "Scanning band %d, dl_min %"PRIu64", ul_min %"PRIu64"\n", ind, nr_bandtable[ind].dl_min,nr_bandtable[ind].ul_min); + + if ( nr_bandtable[ind].dl_min <= dl_freq_khz && nr_bandtable[ind].dl_max >= dl_freq_khz ) { + *current_offset = (nr_bandtable[ind].ul_min - nr_bandtable[ind].dl_min)*1000; + if (*current_offset == 0) + *current_type = TDD; + else + *current_type = FDD; + + LOG_I( PHY, "DL frequency %"PRIu32": band %d, frame_type %d, UL frequency %"PRIu32"\n", + downlink_frequency, *current_band, *current_type, downlink_frequency+*current_offset); + break; + } + } + + AssertFatal(ind != (sizeof(nr_bandtable) / sizeof(nr_bandtable[0])), + "Can't find EUTRA band for frequency %d\n", downlink_frequency); + +} + +uint32_t to_nrarfcn(int nr_bandP, uint64_t dl_CarrierFreq, uint32_t bw) +{ + + uint64_t dl_CarrierFreq_by_1k = dl_CarrierFreq / 1000; + int bw_kHz = bw / 1000; + + int i; + + LOG_I(MAC,"Searching for nr band %d DL Carrier frequency %llu bw %u\n",nr_bandP,(long long unsigned int)dl_CarrierFreq,bw); + AssertFatal(nr_bandP < 86, "nr_band %d > 86\n", nr_bandP); + for (i = 0; i < 30 && nr_bandtable[i].band != nr_bandP; i++); + + AssertFatal(dl_CarrierFreq_by_1k >= nr_bandtable[i].dl_min, + "Band %d, bw %u : DL carrier frequency %llu kHz < %llu\n", + nr_bandP, bw, (long long unsigned int)dl_CarrierFreq_by_1k, + (long long unsigned int)nr_bandtable[i].dl_min); + AssertFatal(dl_CarrierFreq_by_1k <= + (nr_bandtable[i].dl_max - bw_kHz), + "Band %d, dl_CarrierFreq %llu bw %u: DL carrier frequency %llu kHz > %llu\n", + nr_bandP, (long long unsigned int)dl_CarrierFreq,bw, (long long unsigned int)dl_CarrierFreq_by_1k, + (long long unsigned int)(nr_bandtable[i].dl_max - bw_kHz)); + + int deltaFglobal; + + if (dl_CarrierFreq < 3e9) deltaFglobal = 5; + else deltaFglobal = 15; + + // This is equation before Table 5.4.2.1-1 in 38101-1-f30 + // F_REF=F_REF_Offs + deltaF_Global(N_REF-NREF_REF_Offs) + return (((dl_CarrierFreq_by_1k - nr_bandtable[i].dl_min)/deltaFglobal) + + nr_bandtable[i].N_OFFs_DL); +} + + +uint64_t from_nrarfcn(int nr_bandP, uint32_t dl_nrarfcn) +{ + + int i; + int deltaFglobal; + + if (nr_bandP < 77 || nr_bandP > 79) deltaFglobal = 5; + else deltaFglobal = 15; + + AssertFatal(nr_bandP < 87, "nr_band %d > 86\n", nr_bandP); + for (i = 0; i < 31 && nr_bandtable[i].band != nr_bandP; i++); + AssertFatal(dl_nrarfcn>=nr_bandtable[i].N_OFFs_DL,"dl_nrarfcn %u < N_OFFs_DL %llu\n",dl_nrarfcn, (long long unsigned int)nr_bandtable[i].N_OFFs_DL); + + return 1000*(nr_bandtable[i].dl_min + (dl_nrarfcn - nr_bandtable[i].N_OFFs_DL) * deltaFglobal); + +} From ab299dd2e289a1296f501a8dcc8aac415b85a68e Mon Sep 17 00:00:00 2001 From: Francesco Mani Date: Wed, 27 Mar 2019 09:43:09 +0100 Subject: [PATCH 31/31] modification to pbchsim without initial sync --- openair1/SIMULATION/NR_PHY/pbchsim.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/openair1/SIMULATION/NR_PHY/pbchsim.c b/openair1/SIMULATION/NR_PHY/pbchsim.c index 548a4f3dc3..e4ff2f48d7 100644 --- a/openair1/SIMULATION/NR_PHY/pbchsim.c +++ b/openair1/SIMULATION/NR_PHY/pbchsim.c @@ -618,9 +618,18 @@ int main(int argc, char **argv) 0, 0, NR_PBCH_EST); + + nr_pbch_channel_estimation(UE,0,0,i,i-(UE->symbol_offset+1),ssb_index%8,n_hf); } - ret = nr_pbch_detection(UE,UE->symbol_offset+1,0); + ret = nr_rx_pbch(UE, + 0, + UE->pbch_vars[0], + frame_parms, + 0, + ssb_index%8, + SISO, + UE->high_speed_flag); if (ret==0) { //UE->rx_ind.rx_indication_body->mib_pdu.ssb_index; //not yet detected automatically