diff --git a/openair1/PHY/NR_TRANSPORT/nr_pss.c b/openair1/PHY/NR_TRANSPORT/nr_pss.c index 0c8984c4eda4bab2ac77ba55ddf3b8afb074e348..f686f32dcdd2c8b537cae8b79a6cf76027450436 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_pss.c +++ b/openair1/PHY/NR_TRANSPORT/nr_pss.c @@ -68,12 +68,10 @@ int nr_generate_pss( int16_t *d_pss, for (m = 0; m < NR_PSS_LENGTH; m++) { ((int16_t*)txdataF[aa])[2*(l*frame_parms->ofdm_symbol_size + k)] = (a * d_pss[m]) >> 15; - k+=1; + k++; - if (k >= frame_parms->ofdm_symbol_size) { - k++; //skip DC + if (k >= frame_parms->ofdm_symbol_size) k-=frame_parms->ofdm_symbol_size; - } } } diff --git a/openair1/PHY/NR_TRANSPORT/nr_sss.c b/openair1/PHY/NR_TRANSPORT/nr_sss.c index ac3d4d27433b267385e9995b4be8aae64c2a12b7..5b82e4e4c9f4e91bcdb88f9ee3a778202a2f50d1 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_sss.c +++ b/openair1/PHY/NR_TRANSPORT/nr_sss.c @@ -78,12 +78,10 @@ int nr_generate_sss( int16_t *d_sss, for (m = 0; m < NR_SSS_LENGTH; m++) { ((int16_t*)txdataF[aa])[2*(l*frame_parms->ofdm_symbol_size + k)] = (a * d_sss[m]) >> 15; - k+=1; + k++; - if (k >= frame_parms->ofdm_symbol_size) { - k++; //skip DC + if (k >= frame_parms->ofdm_symbol_size) k-=frame_parms->ofdm_symbol_size; - } } } #ifdef NR_SSS_DEBUG diff --git a/openair1/PHY/defs.h b/openair1/PHY/defs.h index 7d9ef2962792fc5f38b343dea0d586e216570dc8..113c0a614bbde1dfe08360380addcc58b051cb2c 100644 --- a/openair1/PHY/defs.h +++ b/openair1/PHY/defs.h @@ -169,6 +169,14 @@ static inline void* malloc16_clear( size_t size ) #define nr_subframe_t lte_subframe_t +typedef enum{ + nr_ssb_type_A = 0, + nr_ssb_type_B, + nr_ssb_type_C, + nr_ssb_type_D, + nr_ssb_type_E +} nr_ssb_type_e; + typedef struct { /// EUTRA Band uint8_t eutra_band; @@ -204,8 +212,11 @@ typedef struct { uint32_t samples_per_subframe_wCP; /// Number of samples in a radio frame without CP uint32_t samples_per_frame_wCP; + + //SSB related params /// Start in Subcarrier index of the SSB block uint16_t ssb_start_subcarrier; + nr_ssb_type_e ssb_type; } NR_DL_FRAME_PARMS; struct PHY_VARS_gNB_s; diff --git a/openair1/SCHED_NR/phy_procedures_nr_common.c b/openair1/SCHED_NR/phy_procedures_nr_common.c index 54f04eb9c782d4b982a9e0ccc66b87d71f8944b9..3699b2807c57c7a42bdff349978003d5df576c0b 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_common.c +++ b/openair1/SCHED_NR/phy_procedures_nr_common.c @@ -40,42 +40,3 @@ nr_subframe_t nr_subframe_select(nfapi_config_request_t *cfg,unsigned char subfr return(SF_DL); } -// First possible symbol is used with n=0 -int nr_get_ssb_start_symbol(nfapi_config_request_t *cfg, NR_DL_FRAME_PARMS *fp) -{ - int mu = cfg->subframe_config.numerology_index_mu.value; - int symbol = 0; - - switch(mu) { - - case NR_MU_0: - symbol = 2; - break; - - case NR_MU_1: // case B - symbol = 4; - break; - - case NR_MU_3: - symbol = 4; - break; - - case NR_MU_4: - symbol = 8; - 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_config_request_t *cfg, NR_DL_FRAME_PARMS *fp) -{ - int start_rb = cfg->sch_config.n_ssb_crb.value / pow(2,cfg->subframe_config.numerology_index_mu.value); - fp->ssb_start_subcarrier = 12 * start_rb + cfg->sch_config.ssb_subcarrier_offset.value; -} diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index ece9e7a576f2759a44d8a5a6d17dae37d37a1614..8cbb3417773598cad76639addc0b9f5741021437 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -39,6 +39,79 @@ #endif extern uint8_t nfapi_mode; +/* +int return_ssb_type(nfapi_config_request_t *cfg) +{ + int mu = cfg->subframe_config.numerology_index_mu.value; + nr_numerology_index_e ssb_type; + + switch(mu) { + + case NR_MU_0: + ssb_type = nr_ssb_type_A; + break; + + case NR_MU_1: + ssb_type = nr_ssb_type_B; + break; + + case NR_MU_3: + ssb_type = nr_ssb_type_D; + break; + + case NR_MU_4: + ssb_type = nr_ssb_type_E; + break; + + default: + AssertFatal(0==1, "Invalid numerology index %d for the synchronization block\n", mu); + } + + LOG_D(PHY, "SSB type %d\n", ssb_type); + return ssb_type; + +}*/ + +// First SSB starting symbol candidate is used and type B is chosen for 30kHz SCS +int nr_get_ssb_start_symbol(nfapi_config_request_t *cfg, NR_DL_FRAME_PARMS *fp) +{ + int mu = cfg->subframe_config.numerology_index_mu.value; + int symbol = 0; + + switch(mu) { + + case NR_MU_0: + symbol = 2; + break; + + case NR_MU_1: // case B + symbol = 4; + break; + + case NR_MU_3: + symbol = 4; + break; + + case NR_MU_4: + symbol = 8; + 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_config_request_t *cfg, NR_DL_FRAME_PARMS *fp) +{ + int start_rb = cfg->sch_config.n_ssb_crb.value / pow(2,cfg->subframe_config.numerology_index_mu.value); + fp->ssb_start_subcarrier = 12 * start_rb + cfg->sch_config.ssb_subcarrier_offset.value; + LOG_D(PHY, "SSB first subcarrier %d\n", fp->ssb_start_subcarrier); +} void nr_common_signal_procedures (PHY_VARS_gNB *gNB,int frame, int subframe) {