diff --git a/openair1/PHY/CODING/nr_polar_init.c b/openair1/PHY/CODING/nr_polar_init.c index e238c7b84f..72e487a738 100644 --- a/openair1/PHY/CODING/nr_polar_init.c +++ b/openair1/PHY/CODING/nr_polar_init.c @@ -185,9 +185,9 @@ void nr_polar_print_polarParams(t_nrPolar_paramsPtr polarParams) } t_nrPolar_paramsPtr nr_polar_params (t_nrPolar_paramsPtr polarParams, - int8_t messageType, - uint16_t messageLength, - uint8_t aggregation_level) + int8_t messageType, + uint16_t messageLength, + uint8_t aggregation_level) { t_nrPolar_paramsPtr currentPtr = NULL; diff --git a/openair1/PHY/INIT/nr_init.c b/openair1/PHY/INIT/nr_init.c index 28581b664e..642983d49b 100644 --- a/openair1/PHY/INIT/nr_init.c +++ b/openair1/PHY/INIT/nr_init.c @@ -380,7 +380,7 @@ void nr_phy_config_request_sim(PHY_VARS_gNB *gNB,int N_RB_DL,int N_RB_UL,int mu) gNB_config->rf_config.ul_carrier_bandwidth.value = N_RB_UL; gNB_config->sch_config.half_frame_index.value = 0; gNB_config->sch_config.ssb_subcarrier_offset.value = 0; - gNB_config->sch_config.n_ssb_crb.value = N_RB_DL-20; + gNB_config->sch_config.n_ssb_crb.value = (N_RB_DL-20)>>1; gNB_config->sch_config.ssb_subcarrier_offset.value = 0; diff --git a/openair1/PHY/INIT/nr_init_ue.c b/openair1/PHY/INIT/nr_init_ue.c index 5e3e72d259..64909a2414 100644 --- a/openair1/PHY/INIT/nr_init_ue.c +++ b/openair1/PHY/INIT/nr_init_ue.c @@ -655,7 +655,7 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue, int i,j,k,l; int eNB_id; int th_id; - + int n_ssb_crb=(fp->N_RB_DL-20)>>1; abstraction_flag = 0; fp->nb_antennas_tx = 1; fp->nb_antennas_rx=1; @@ -664,7 +664,7 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue, printf("Initializing UE vars (abstraction %"PRIu8") for eNB TXant %"PRIu8", UE RXant %"PRIu8"\n",abstraction_flag,fp->nb_antennas_tx,fp->nb_antennas_rx); //LOG_D(PHY,"[MSC_NEW][FRAME 00000][PHY_UE][MOD %02u][]\n", ue->Mod_id+NB_eNB_INST); - nr_init_frame_parms_ue(&ue->frame_parms,NR_MU_1,NORMAL); + nr_init_frame_parms_ue(&ue->frame_parms,NR_MU_1,NORMAL,n_ssb_crb,0); phy_init_nr_top(ue); // many memory allocation sizes are hard coded @@ -955,13 +955,12 @@ void phy_init_nr_top(PHY_VARS_NR_UE *ue) generate_ul_reference_signal_sequences(SHRT_MAX); // Polar encoder init for PBCH - //nr_polar_init(&frame_parms->pbch_polar_params, 1); - /*t_nrPolar_paramsPtr nrPolar_params = NULL, currentPtr = NULL; - nr_polar_init(&ue->nrPolar_params, - NR_POLAR_PBCH_MESSAGE_TYPE, - NR_POLAR_PBCH_PAYLOAD_BITS, - NR_POLAR_PBCH_AGGREGATION_LEVEL);*/ + ue->nrPolar_params = NULL; + nr_polar_init(&ue->nrPolar_params, + NR_POLAR_PBCH_MESSAGE_TYPE, + NR_POLAR_PBCH_PAYLOAD_BITS, + NR_POLAR_PBCH_AGGREGATION_LEVEL); //lte_sync_time_init(frame_parms); //generate_ul_ref_sigs(); diff --git a/openair1/PHY/INIT/nr_parms.c b/openair1/PHY/INIT/nr_parms.c index 0c1539835a..16b410f26f 100644 --- a/openair1/PHY/INIT/nr_parms.c +++ b/openair1/PHY/INIT/nr_parms.c @@ -28,7 +28,7 @@ uint16_t nr_slots_per_subframe[MAX_NUM_SUBCARRIER_SPACING] = {1, 2, 4, 16, 32}; int nr_init_frame_parms0( - NR_DL_FRAME_PARMS *frame_parms, + NR_DL_FRAME_PARMS *fp, int mu, int Ncp) @@ -37,9 +37,9 @@ int nr_init_frame_parms0( #if DISABLE_LOG_X - printf("Initializing frame parms for mu %d, N_RB %d, Ncp %d\n",mu, frame_parms->N_RB_DL, Ncp); + printf("Initializing frame parms for mu %d, N_RB %d, Ncp %d\n",mu, fp->N_RB_DL, Ncp); #else - LOG_I(PHY,"Initializing frame parms for mu %d, N_RB %d, Ncp %d\n",mu, frame_parms->N_RB_DL, Ncp); + LOG_I(PHY,"Initializing frame parms for mu %d, N_RB %d, Ncp %d\n",mu, fp->N_RB_DL, Ncp); #endif if (Ncp == NFAPI_CP_EXTENDED) @@ -48,15 +48,15 @@ int nr_init_frame_parms0( switch(mu) { case NR_MU_0: //15kHz scs - frame_parms->subcarrier_spacing = nr_subcarrier_spacing[NR_MU_0]; - frame_parms->slots_per_subframe = nr_slots_per_subframe[NR_MU_0]; + fp->subcarrier_spacing = nr_subcarrier_spacing[NR_MU_0]; + fp->slots_per_subframe = nr_slots_per_subframe[NR_MU_0]; break; case NR_MU_1: //30kHz scs - frame_parms->subcarrier_spacing = nr_subcarrier_spacing[NR_MU_1]; - frame_parms->slots_per_subframe = nr_slots_per_subframe[NR_MU_1]; + fp->subcarrier_spacing = nr_subcarrier_spacing[NR_MU_1]; + fp->slots_per_subframe = nr_slots_per_subframe[NR_MU_1]; - switch(frame_parms->N_RB_DL){ + switch(fp->N_RB_DL){ case 11: case 24: case 38: @@ -65,17 +65,17 @@ int nr_init_frame_parms0( case 65: case 106: //40 MHz - if (frame_parms->threequarter_fs) { - frame_parms->ofdm_symbol_size = 1536; - frame_parms->first_carrier_offset = 900; //1536 - 636 - frame_parms->nb_prefix_samples0 = 132; - frame_parms->nb_prefix_samples = 108; + if (fp->threequarter_fs) { + fp->ofdm_symbol_size = 1536; + fp->first_carrier_offset = 900; //1536 - 636 + fp->nb_prefix_samples0 = 132; + fp->nb_prefix_samples = 108; } else { - frame_parms->ofdm_symbol_size = 2048; - frame_parms->first_carrier_offset = 1412; //2048 - 636 - frame_parms->nb_prefix_samples0 = 176; - frame_parms->nb_prefix_samples = 144; + fp->ofdm_symbol_size = 2048; + fp->first_carrier_offset = 1412; //2048 - 636 + fp->nb_prefix_samples0 = 176; + fp->nb_prefix_samples = 144; } break; @@ -84,44 +84,44 @@ int nr_init_frame_parms0( case 189: case 217: //80 MHz - if (frame_parms->threequarter_fs) { - frame_parms->ofdm_symbol_size = 3072; - frame_parms->first_carrier_offset = 1770; //3072 - 1302 - frame_parms->nb_prefix_samples0 = 264; - frame_parms->nb_prefix_samples = 216; + if (fp->threequarter_fs) { + fp->ofdm_symbol_size = 3072; + fp->first_carrier_offset = 1770; //3072 - 1302 + fp->nb_prefix_samples0 = 264; + fp->nb_prefix_samples = 216; } else { - frame_parms->ofdm_symbol_size = 4096; - frame_parms->first_carrier_offset = 2794; //4096 - 1302 - frame_parms->nb_prefix_samples0 = 352; - frame_parms->nb_prefix_samples = 288; + fp->ofdm_symbol_size = 4096; + fp->first_carrier_offset = 2794; //4096 - 1302 + fp->nb_prefix_samples0 = 352; + fp->nb_prefix_samples = 288; } break; case 245: - AssertFatal(frame_parms->threequarter_fs==0,"3/4 sampling impossible for N_RB %d and MU %d\n",frame_parms->N_RB_DL,mu); - frame_parms->ofdm_symbol_size = 4096; - frame_parms->first_carrier_offset = 2626; //4096 - 1478 - frame_parms->nb_prefix_samples0 = 352; - frame_parms->nb_prefix_samples = 288; + AssertFatal(fp->threequarter_fs==0,"3/4 sampling impossible for N_RB %d and MU %d\n",fp->N_RB_DL,mu); + fp->ofdm_symbol_size = 4096; + fp->first_carrier_offset = 2626; //4096 - 1478 + fp->nb_prefix_samples0 = 352; + fp->nb_prefix_samples = 288; break; case 273: - AssertFatal(frame_parms->threequarter_fs==0,"3/4 sampling impossible for N_RB %d and MU %d\n",frame_parms->N_RB_DL,mu); - frame_parms->ofdm_symbol_size = 4096; - frame_parms->first_carrier_offset = 2458; //4096 - 1638 - frame_parms->nb_prefix_samples0 = 352; - frame_parms->nb_prefix_samples = 288; + AssertFatal(fp->threequarter_fs==0,"3/4 sampling impossible for N_RB %d and MU %d\n",fp->N_RB_DL,mu); + fp->ofdm_symbol_size = 4096; + fp->first_carrier_offset = 2458; //4096 - 1638 + fp->nb_prefix_samples0 = 352; + fp->nb_prefix_samples = 288; break; default: - AssertFatal(1==0,"Number of resource blocks %d undefined for mu %d, frame parms = %p\n", frame_parms->N_RB_DL, mu, frame_parms); + AssertFatal(1==0,"Number of resource blocks %d undefined for mu %d, frame parms = %p\n", fp->N_RB_DL, mu, fp); } break; case NR_MU_2: //60kHz scs - frame_parms->subcarrier_spacing = nr_subcarrier_spacing[NR_MU_2]; - frame_parms->slots_per_subframe = nr_slots_per_subframe[NR_MU_2]; + fp->subcarrier_spacing = nr_subcarrier_spacing[NR_MU_2]; + fp->slots_per_subframe = nr_slots_per_subframe[NR_MU_2]; - switch(frame_parms->N_RB_DL){ //FR1 bands only + switch(fp->N_RB_DL){ //FR1 bands only case 11: case 18: case 38: @@ -135,77 +135,80 @@ int nr_init_frame_parms0( case 121: case 135: default: - AssertFatal(1==0,"Number of resource blocks %d undefined for mu %d, frame parms = %p\n", frame_parms->N_RB_DL, mu, frame_parms); + AssertFatal(1==0,"Number of resource blocks %d undefined for mu %d, frame parms = %p\n", fp->N_RB_DL, mu, fp); } break; case NR_MU_3: - frame_parms->subcarrier_spacing = nr_subcarrier_spacing[NR_MU_3]; - frame_parms->slots_per_subframe = nr_slots_per_subframe[NR_MU_3]; + fp->subcarrier_spacing = nr_subcarrier_spacing[NR_MU_3]; + fp->slots_per_subframe = nr_slots_per_subframe[NR_MU_3]; break; case NR_MU_4: - frame_parms->subcarrier_spacing = nr_subcarrier_spacing[NR_MU_4]; - frame_parms->slots_per_subframe = nr_slots_per_subframe[NR_MU_4]; + fp->subcarrier_spacing = nr_subcarrier_spacing[NR_MU_4]; + fp->slots_per_subframe = nr_slots_per_subframe[NR_MU_4]; break; default: AssertFatal(1==0,"Invalid numerology index %d", mu); } - frame_parms->slots_per_frame = 10* frame_parms->slots_per_subframe; - frame_parms->symbols_per_slot = ((Ncp == NORMAL)? 14 : 12); // to redefine for different slot formats - frame_parms->samples_per_subframe_wCP = frame_parms->ofdm_symbol_size * frame_parms->symbols_per_slot * frame_parms->slots_per_subframe; - frame_parms->samples_per_frame_wCP = 10 * frame_parms->samples_per_subframe_wCP; - frame_parms->samples_per_subframe = (frame_parms->samples_per_subframe_wCP + (frame_parms->nb_prefix_samples0 * frame_parms->slots_per_subframe) + - (frame_parms->nb_prefix_samples * frame_parms->slots_per_subframe * (frame_parms->symbols_per_slot - 1))); - frame_parms->samples_per_frame = 10 * frame_parms->samples_per_subframe; - frame_parms->freq_range = (frame_parms->dl_CarrierFreq < 6e9)? nr_FR1 : nr_FR2; + fp->slots_per_frame = 10* fp->slots_per_subframe; + fp->symbols_per_slot = ((Ncp == NORMAL)? 14 : 12); // to redefine for different slot formats + fp->samples_per_subframe_wCP = fp->ofdm_symbol_size * fp->symbols_per_slot * fp->slots_per_subframe; + fp->samples_per_frame_wCP = 10 * fp->samples_per_subframe_wCP; + fp->samples_per_subframe = (fp->samples_per_subframe_wCP + (fp->nb_prefix_samples0 * fp->slots_per_subframe) + + (fp->nb_prefix_samples * fp->slots_per_subframe * (fp->symbols_per_slot - 1))); + fp->samples_per_frame = 10 * fp->samples_per_subframe; + fp->freq_range = (fp->dl_CarrierFreq < 6e9)? nr_FR1 : nr_FR2; // Initial bandwidth part configuration -- full carrier bandwidth - frame_parms->initial_bwp_dl.bwp_id = 0; - frame_parms->initial_bwp_dl.scs = frame_parms->subcarrier_spacing; - frame_parms->initial_bwp_dl.location = 0; - frame_parms->initial_bwp_dl.N_RB = frame_parms->N_RB_DL; - frame_parms->initial_bwp_dl.cyclic_prefix = Ncp; - frame_parms->initial_bwp_dl.ofdm_symbol_size = frame_parms->ofdm_symbol_size; + fp->initial_bwp_dl.bwp_id = 0; + fp->initial_bwp_dl.scs = fp->subcarrier_spacing; + fp->initial_bwp_dl.location = 0; + fp->initial_bwp_dl.N_RB = fp->N_RB_DL; + fp->initial_bwp_dl.cyclic_prefix = Ncp; + fp->initial_bwp_dl.ofdm_symbol_size = fp->ofdm_symbol_size; return 0; } int nr_init_frame_parms(nfapi_nr_config_request_t* config, - NR_DL_FRAME_PARMS *frame_parms) { + NR_DL_FRAME_PARMS *fp) { - nr_init_frame_parms0(frame_parms, - config->subframe_config.numerology_index_mu.value, - config->subframe_config.dl_cyclic_prefix_type.value); + nr_init_frame_parms0(fp, + config->subframe_config.numerology_index_mu.value, + config->subframe_config.dl_cyclic_prefix_type.value); } -int nr_init_frame_parms_ue(NR_DL_FRAME_PARMS *frame_parms, +int nr_init_frame_parms_ue(NR_DL_FRAME_PARMS *fp, int mu, - int Ncp) + int Ncp, + int n_ssb_crb, + int ssb_subcarrier_offset) { - nr_init_frame_parms0(frame_parms,mu,Ncp); - + nr_init_frame_parms0(fp,mu,Ncp); + int start_rb = n_ssb_crb / (1<ssb_start_subcarrier = 12 * start_rb + ssb_subcarrier_offset; return 0; } -void nr_dump_frame_parms(NR_DL_FRAME_PARMS *frame_parms) +void nr_dump_frame_parms(NR_DL_FRAME_PARMS *fp) { - LOG_I(PHY,"frame_parms->scs=%d\n",frame_parms->subcarrier_spacing); - LOG_I(PHY,"frame_parms->ofdm_symbol_size=%d\n",frame_parms->ofdm_symbol_size); - LOG_I(PHY,"frame_parms->nb_prefix_samples0=%d\n",frame_parms->nb_prefix_samples0); - LOG_I(PHY,"frame_parms->nb_prefix_samples=%d\n",frame_parms->nb_prefix_samples); - LOG_I(PHY,"frame_parms->slots_per_subframe=%d\n",frame_parms->slots_per_subframe); - LOG_I(PHY,"frame_parms->samples_per_subframe_wCP=%d\n",frame_parms->samples_per_subframe_wCP); - LOG_I(PHY,"frame_parms->samples_per_frame_wCP=%d\n",frame_parms->samples_per_frame_wCP); - LOG_I(PHY,"frame_parms->samples_per_subframe=%d\n",frame_parms->samples_per_subframe); - LOG_I(PHY,"frame_parms->samples_per_frame=%d\n",frame_parms->samples_per_frame); - LOG_I(PHY,"frame_parms->initial_bwp_dl.bwp_id=%d\n",frame_parms->initial_bwp_dl.bwp_id); - LOG_I(PHY,"frame_parms->initial_bwp_dl.scs=%d\n",frame_parms->initial_bwp_dl.scs); - LOG_I(PHY,"frame_parms->initial_bwp_dl.N_RB=%d\n",frame_parms->initial_bwp_dl.N_RB); - LOG_I(PHY,"frame_parms->initial_bwp_dl.cyclic_prefix=%d\n",frame_parms->initial_bwp_dl.cyclic_prefix); - LOG_I(PHY,"frame_parms->initial_bwp_dl.location=%d\n",frame_parms->initial_bwp_dl.location); - LOG_I(PHY,"frame_parms->initial_bwp_dl.ofdm_symbol_size=%d\n",frame_parms->initial_bwp_dl.ofdm_symbol_size); + LOG_I(PHY,"fp->scs=%d\n",fp->subcarrier_spacing); + LOG_I(PHY,"fp->ofdm_symbol_size=%d\n",fp->ofdm_symbol_size); + LOG_I(PHY,"fp->nb_prefix_samples0=%d\n",fp->nb_prefix_samples0); + LOG_I(PHY,"fp->nb_prefix_samples=%d\n",fp->nb_prefix_samples); + LOG_I(PHY,"fp->slots_per_subframe=%d\n",fp->slots_per_subframe); + LOG_I(PHY,"fp->samples_per_subframe_wCP=%d\n",fp->samples_per_subframe_wCP); + LOG_I(PHY,"fp->samples_per_frame_wCP=%d\n",fp->samples_per_frame_wCP); + LOG_I(PHY,"fp->samples_per_subframe=%d\n",fp->samples_per_subframe); + LOG_I(PHY,"fp->samples_per_frame=%d\n",fp->samples_per_frame); + LOG_I(PHY,"fp->initial_bwp_dl.bwp_id=%d\n",fp->initial_bwp_dl.bwp_id); + LOG_I(PHY,"fp->initial_bwp_dl.scs=%d\n",fp->initial_bwp_dl.scs); + LOG_I(PHY,"fp->initial_bwp_dl.N_RB=%d\n",fp->initial_bwp_dl.N_RB); + LOG_I(PHY,"fp->initial_bwp_dl.cyclic_prefix=%d\n",fp->initial_bwp_dl.cyclic_prefix); + 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); } diff --git a/openair1/PHY/INIT/phy_init.h b/openair1/PHY/INIT/phy_init.h index bdee72bd2a..1631e09188 100644 --- a/openair1/PHY/INIT/phy_init.h +++ b/openair1/PHY/INIT/phy_init.h @@ -377,7 +377,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_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 nr_init_frame_parms_ue(NR_DL_FRAME_PARMS *frame_parms,int mu,int Ncp,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); 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); diff --git a/openair1/PHY/MODULATION/ofdm_mod.c b/openair1/PHY/MODULATION/ofdm_mod.c index ddbc4af930..b23fd2e2bf 100644 --- a/openair1/PHY/MODULATION/ofdm_mod.c +++ b/openair1/PHY/MODULATION/ofdm_mod.c @@ -36,7 +36,7 @@ This section deals with basic functions for OFDM Modulation. #include "common/utils/LOG/vcd_signal_dumper.h" #include "modulation_common.h" #include "PHY/LTE_TRANSPORT/transport_common_proto.h" -#define DEBUG_OFDM_MOD +//#define DEBUG_OFDM_MOD void normal_prefix_mod(int32_t *txdataF,int32_t *txdata,uint8_t nsymb,LTE_DL_FRAME_PARMS *frame_parms) diff --git a/openair1/PHY/MODULATION/slot_fep_nr.c b/openair1/PHY/MODULATION/slot_fep_nr.c index 84d400a670..6969e4fbe7 100644 --- a/openair1/PHY/MODULATION/slot_fep_nr.c +++ b/openair1/PHY/MODULATION/slot_fep_nr.c @@ -25,7 +25,7 @@ #include "PHY/LTE_ESTIMATION/lte_estimation.h" #include "PHY/NR_UE_ESTIMATION/nr_estimation.h" -#define DEBUG_FEP +//#define DEBUG_FEP #define SOFFSET 0 @@ -198,20 +198,17 @@ int nr_slot_fep(PHY_VARS_NR_UE *ue, switch(channel){ case NR_PBCH_EST: - //if ((l>4) && (l<8)) { - for (aa=0; aanb_antenna_ports_eNB; aa++) { //#ifdef DEBUG_FEP - printf("Channel estimation eNB %d, aatx %d, slot %d, symbol %d\n",eNB_id,aa,Ns,l); + 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); + start_meas(&ue->dlsch_channel_estimation_stats); #endif - nr_pbch_channel_estimation(ue,eNB_id,0, - Ns, - aa, - l, - symbol); + nr_pbch_channel_estimation(ue,eNB_id,0, + Ns, + l, + symbol); //} #if UE_TIMING_TRACE stop_meas(&ue->dlsch_channel_estimation_stats); @@ -239,53 +236,48 @@ int nr_slot_fep(PHY_VARS_NR_UE *ue, #endif } - } + break; case NR_PDCCH_EST: - for (aa=0; aanb_antenna_ports_eNB; aa++) { #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 eNB %d, aatx %d, slot %d, symbol %d start_sc %d\n",eNB_id,aa,Ns,l,coreset_start_subcarrier); #endif #if UE_TIMING_TRACE - start_meas(&ue->dlsch_channel_estimation_stats); + start_meas(&ue->dlsch_channel_estimation_stats); #endif - nr_pdcch_channel_estimation(ue,eNB_id,0, - Ns, - aa, - l, - symbol, - coreset_start_subcarrier, - nb_rb_coreset); + nr_pdcch_channel_estimation(ue,eNB_id,0, + Ns, + l, + symbol, + coreset_start_subcarrier, + nb_rb_coreset); #if UE_TIMING_TRACE - stop_meas(&ue->dlsch_channel_estimation_stats); + stop_meas(&ue->dlsch_channel_estimation_stats); #endif - } + break; - + case NR_PDSCH_EST: - for (aa=0; aanb_antenna_ports_eNB; aa++) { - #ifdef DEBUG_FEP - printf("Channel estimation eNB %d, aatx %d, slot %d, symbol %d\n",eNB_id,aa,Ns,l); + printf("Channel estimation eNB %d, aatx %d, slot %d, symbol %d\n",eNB_id,aa,Ns,l); #endif #if UE_TIMING_TRACE - start_meas(&ue->dlsch_channel_estimation_stats); + start_meas(&ue->dlsch_channel_estimation_stats); #endif - nr_pdsch_channel_estimation(ue,eNB_id,0, - Ns, - aa, - l, - symbol, - bwp_start_subcarrier, - nb_rb_pdsch); + nr_pdsch_channel_estimation(ue,eNB_id,0, + Ns, + l, + symbol, + bwp_start_subcarrier, + nb_rb_pdsch); #if UE_TIMING_TRACE - stop_meas(&ue->dlsch_channel_estimation_stats); + stop_meas(&ue->dlsch_channel_estimation_stats); #endif - } + break; - + case NR_SSS_EST: break; diff --git a/openair1/PHY/NR_REFSIG/nr_dmrs_rx.c b/openair1/PHY/NR_REFSIG/nr_dmrs_rx.c index 4f113e24ee..bf996c1590 100644 --- a/openair1/PHY/NR_REFSIG/nr_dmrs_rx.c +++ b/openair1/PHY/NR_REFSIG/nr_dmrs_rx.c @@ -106,13 +106,13 @@ short nr_rx_mod_table[NR_MOD_TABLE_SIZE_SHORT] = {0,0,23170,-23170,-23170,23170, }*/ int nr_pdsch_dmrs_rx(PHY_VARS_NR_UE *ue, - uint8_t eNB_offset, - unsigned int Ns, - unsigned int nr_gold_pdsch[2][20][2][21], - int32_t *output, - unsigned short p, - int length_dmrs, - unsigned short nb_rb_pdsch) + uint8_t eNB_offset, + unsigned int Ns, + unsigned int nr_gold_pdsch[2][20][2][21], + int32_t *output, + unsigned short p, + int length_dmrs, + unsigned short nb_rb_pdsch) { int32_t qpsk[4],nqpsk[4],*qpsk_p, n; //int w,mprime,ind,l,ind_dword,ind_qpsk_symb,kp,lp, config_type, k; @@ -216,26 +216,38 @@ int nr_pdcch_dmrs_rx(PHY_VARS_NR_UE *ue, return(0); } -int nr_pbch_dmrs_rx(unsigned int *nr_gold_pbch, - int32_t *output ) +int nr_pbch_dmrs_rx(int symbol,unsigned int *nr_gold_pbch,int32_t *output ) { - int m; - uint8_t idx=0; - - /// QPSK modulation - for (m=0; m>1; m++) { - idx = ((((nr_gold_pbch[(m<<1)>>5])>>((m<<1)&0x1f))&1)<<1) ^ (((nr_gold_pbch[((m<<1)+1)>>5])>>(((m<<1)+1)&0x1f))&1); - ((int16_t*)output)[m<<1] = nr_rx_mod_table[(NR_MOD_TABLE_QPSK_OFFSET + idx)<<1]; - ((int16_t*)output)[(m<<1)+1] = nr_rx_mod_table[((NR_MOD_TABLE_QPSK_OFFSET + idx)<<1) + 1]; - + int m,m0,m1; + uint8_t idx=0; + AssertFatal(symbol>=0 && symbol <3,"illegal symbol %d\n",symbol); + if (symbol == 0) { + m0=0; + m1=60; + } + else if (symbol == 1) { + m0=60; + m1=84; + } + else { + m0=84; + m1=144; + } + printf("Generating pilots symbol %d, m0 %d, m1 %d\n",symbol,m0,m1); + /// QPSK modulation + for (m=m0; m>5])>>((m<<1)&0x1f))&1)<<1) ^ (((nr_gold_pbch[((m<<1)+1)>>5])>>(((m<<1)+1)&0x1f))&1); + ((int16_t*)output)[(m-m0)<<1] = nr_rx_mod_table[(NR_MOD_TABLE_QPSK_OFFSET + idx)<<1]; + ((int16_t*)output)[((m-m0)<<1)+1] = nr_rx_mod_table[((NR_MOD_TABLE_QPSK_OFFSET + idx)<<1) + 1]; + #ifdef DEBUG_PBCH - if (m<16) - {printf("nr_gold_pbch[(m<<1)>>5] %x\n",nr_gold_pbch[(m<<1)>>5]); + if (m<16) + {printf("nr_gold_pbch[(m<<1)>>5] %x\n",nr_gold_pbch[(m<<1)>>5]); printf("m %d output %d %d addr %p\n", m, ((int16_t*)output)[m<<1], ((int16_t*)output)[(m<<1)+1],&output[0]); - } + } #endif - } - + } + return(0); } diff --git a/openair1/PHY/NR_REFSIG/refsig_defs_ue.h b/openair1/PHY/NR_REFSIG/refsig_defs_ue.h index 0da7bb154f..a4cb2be7b8 100644 --- a/openair1/PHY/NR_REFSIG/refsig_defs_ue.h +++ b/openair1/PHY/NR_REFSIG/refsig_defs_ue.h @@ -29,7 +29,7 @@ /*!\brief This function generates the NR Gold sequence (38-211, Sec 5.2.1) for the PBCH DMRS. @param PHY_VARS_NR_UE* ue structure provides configuration, frame parameters and the pointers to the 32 bits sequence storage tables */ -int nr_pbch_dmrs_rx(unsigned int *nr_gold_pbch, int32_t *output ); +int nr_pbch_dmrs_rx(int dmrss,unsigned int *nr_gold_pbch, int32_t *output ); /*!\brief This function generates the NR Gold sequence (38-211, Sec 5.2.1) for the PDCCH DMRS. @param PHY_VARS_NR_UE* ue structure provides configuration, frame parameters and the pointers to the 32 bits sequence storage tables diff --git a/openair1/PHY/NR_TRANSPORT/nr_pbch.c b/openair1/PHY/NR_TRANSPORT/nr_pbch.c index cef7a3c42b..10416cf8cc 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_pbch.c +++ b/openair1/PHY/NR_TRANSPORT/nr_pbch.c @@ -37,7 +37,7 @@ //#define DEBUG_PBCH //#define DEBUG_PBCH_ENCODING -//#define DEBUG_PBCH_DMRS +#define DEBUG_PBCH_DMRS //extern short nr_mod_table[NR_MOD_TABLE_SIZE_SHORT]; #include "PHY/NR_REFSIG/nr_mod_table.h" @@ -85,6 +85,11 @@ int nr_generate_pbch_dmrs(uint32_t *gold_pbch_dmrs, #endif ((int16_t*)txdataF[aa])[(l*frame_parms->ofdm_symbol_size + k)<<1] = (a * mod_dmrs[m<<1]) >> 15; ((int16_t*)txdataF[aa])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1] = (a * mod_dmrs[(m<<1) + 1]) >> 15; +#ifdef DEBUG_PBCH_DMRS + printf("(%d,%d)\n", + ((int16_t*)txdataF[aa])[(l*frame_parms->ofdm_symbol_size + k)<<1], + ((int16_t*)txdataF[aa])[((l*frame_parms->ofdm_symbol_size + k)<<1)+1]); +#endif k+=4; if (k >= frame_parms->ofdm_symbol_size) @@ -101,6 +106,11 @@ int nr_generate_pbch_dmrs(uint32_t *gold_pbch_dmrs, #endif ((int16_t*)txdataF[aa])[(l*frame_parms->ofdm_symbol_size + k)<<1] = (a * mod_dmrs[m<<1]) >> 15; ((int16_t*)txdataF[aa])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1] = (a * mod_dmrs[(m<<1) + 1]) >> 15; +#ifdef DEBUG_PBCH_DMRS + printf("(%d,%d)\n", + ((int16_t*)txdataF[aa])[(l*frame_parms->ofdm_symbol_size + k)<<1], + ((int16_t*)txdataF[aa])[((l*frame_parms->ofdm_symbol_size + k)<<1)+1]); +#endif k+=(m==71)?148:4; // Jump from 44+nu to 192+nu if (k >= frame_parms->ofdm_symbol_size) @@ -117,6 +127,11 @@ int nr_generate_pbch_dmrs(uint32_t *gold_pbch_dmrs, #endif ((int16_t*)txdataF[aa])[(l*frame_parms->ofdm_symbol_size + k)<<1] = (a * mod_dmrs[m<<1]) >> 15; ((int16_t*)txdataF[aa])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1] = (a * mod_dmrs[(m<<1) + 1]) >> 15; +#ifdef DEBUG_PBCH_DMRS + printf("(%d,%d)\n", + ((int16_t*)txdataF[aa])[(l*frame_parms->ofdm_symbol_size + k)<<1], + ((int16_t*)txdataF[aa])[((l*frame_parms->ofdm_symbol_size + k)<<1)+1]); +#endif k+=4; if (k >= frame_parms->ofdm_symbol_size) 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 7385267dd1..6206a95faf 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c @@ -19,78 +19,92 @@ * contact@openairinterface.org */ -#ifdef USER_MODE + #include -#endif + //#include "defs.h" //#include "SCHED/defs.h" #include "PHY/defs_nr_UE.h" +#include "PHY/NR_REFSIG/refsig_defs_ue.h" #include "filt16a_32.h" #include "T.h" //#define DEBUG_CH + int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue, - uint8_t eNB_id, - uint8_t eNB_offset, - unsigned char Ns, - unsigned char p, - unsigned char l, - unsigned char symbol) + uint8_t eNB_id, + uint8_t eNB_offset, + unsigned char Ns, + unsigned char l, + unsigned char symbol) { - int pilot[2][200] __attribute__((aligned(16))); + int pilot[200] __attribute__((aligned(16))); unsigned char aarx; unsigned short k; 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]; - uint8_t nushift, ssb_index=0, n_hf=0; + uint8_t nushift,ssb_index=0, n_hf=0; 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; + + 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 > 0 && symbol < 4 && ue->is_synchronized == 0), + "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 Channel Estimation : ThreadId %d, eNB_offset %d cell_id %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,Nid_cell,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, 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); #endif switch (k) { case 0: - fl = filt16a_l0; - fm = filt16a_m0; - fr = filt16a_r0; - break; + fl = filt16a_l0; + fm = filt16a_m0; + fr = filt16a_r0; + break; case 1: - fl = filt16a_l1; - fm = filt16a_m1; - fr = filt16a_r1; - break; + fl = filt16a_l1; + fm = filt16a_m1; + fr = filt16a_r1; + break; case 2: - fl = filt16a_l2; - fm = filt16a_m2; - fr = filt16a_r2; - break; + fl = filt16a_l2; + fm = filt16a_m2; + fr = filt16a_r2; + break; case 3: - fl = filt16a_l3; - fm = filt16a_m3; - fr = filt16a_r3; - break; + fl = filt16a_l3; + fm = filt16a_m3; + fr = filt16a_r3; + break; default: msg("pbch_channel_estimation: k=%d -> ERROR\n",k); @@ -99,119 +113,136 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue, } // generate pilot - nr_pbch_dmrs_rx(ue->nr_gold_pbch[n_hf][ssb_index], &pilot[p][0]); + 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[p][0]; - rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+k+(ue->frame_parms.ofdm_symbol_size-10*12))]; - dl_ch = (int16_t *)&dl_ch_estimates[(p<<1)+aarx][ch_offset]; - + 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), ue->ch_est_alpha,dl_ch-(ue->frame_parms.ofdm_symbol_size<<1), 1,ue->frame_parms.ofdm_symbol_size); #ifdef DEBUG_CH - printf("pbch ch est pilot addr %p RB_DL %d\n",&pilot[p][0], ue->frame_parms.N_RB_DL); + 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); printf("dl_ch addr %p\n",dl_ch); #endif //if ((ue->frame_parms.N_RB_DL&1)==0) { - // Treat first 2 pilots specially (left edge) + // 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]); +#endif + multadd_real_vector_complex_scalar(fl, + ch, + dl_ch, + 16); + 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 (int i= 0; i<8; i++) + //printf("dl_ch addr %p %d\n", dl_ch+i, *(dl_ch+i)); + + 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 + multadd_real_vector_complex_scalar(fm, + ch, + dl_ch, + 16); + 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); + +#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 + + multadd_real_vector_complex_scalar(fr, + ch, + dl_ch, + 16); + pil+=2; + re_offset = (re_offset+4)&(ue->frame_parms.ofdm_symbol_size-1); + rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)]; + dl_ch+=24; + + 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)]; + dl_ch += 288; + } 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]); + 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 multadd_real_vector_complex_scalar(fl, - ch, - dl_ch, - 16); - pil+=2; - rxF+=8; - //for (int i= 0; i<8; i++) - //printf("dl_ch addr %p %d\n", dl_ch+i, *(dl_ch+i)); + ch, + dl_ch, + 16); + //for (int i= 0; i<8; i++) + // printf("pilot_cnt %d dl_ch %d %d\n", pilot_cnt, dl_ch+i, *(dl_ch+i)); + + 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); #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]); + 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 multadd_real_vector_complex_scalar(fm, - ch, - dl_ch, - 16); + ch, + dl_ch, + 16); pil+=2; - rxF+=8; + 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]); + 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 multadd_real_vector_complex_scalar(fr, - ch, - dl_ch, - 16); + ch, + dl_ch, + 16); pil+=2; - rxF+=8; + re_offset = (re_offset+4)&(ue->frame_parms.ofdm_symbol_size-1); + rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)]; dl_ch+=24; - for (pilot_cnt=3; pilot_cnt<(3*20); pilot_cnt+=3) { - - if (pilot_cnt == 30) - rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+k)]; - - 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 - multadd_real_vector_complex_scalar(fl, - ch, - dl_ch, - 16); - - //for (int i= 0; i<8; i++) - // printf("pilot_cnt %d dl_ch %d %d\n", pilot_cnt, dl_ch+i, *(dl_ch+i)); - - pil+=2; - rxF+=8; - - 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 - multadd_real_vector_complex_scalar(fm, - ch, - dl_ch, - 16); - pil+=2; - rxF+=8; - - 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 - - multadd_real_vector_complex_scalar(fr, - ch, - dl_ch, - 16); - pil+=2; - rxF+=8; - dl_ch+=24; - - } + } //} @@ -222,16 +253,15 @@ 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 p, - unsigned char l, - unsigned char symbol, - unsigned short coreset_start_subcarrier, - unsigned short nb_rb_coreset) + uint8_t eNB_id, + uint8_t eNB_offset, + unsigned char Ns, + unsigned char l, + unsigned char symbol, + unsigned short coreset_start_subcarrier, + unsigned short nb_rb_coreset) { - int pilot[2][200] __attribute__((aligned(16))); + int pilot[200] __attribute__((aligned(16))); unsigned char aarx; unsigned short k; unsigned int pilot_cnt; @@ -266,25 +296,25 @@ int nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue, fr = filt16a_r1; // generate pilot - nr_pdcch_dmrs_rx(ue,eNB_offset,Ns,ue->nr_gold_pdcch[eNB_offset][Ns][symbol], &pilot[p][0],2000,nb_rb_coreset); + nr_pdcch_dmrs_rx(ue,eNB_offset,Ns,ue->nr_gold_pdcch[eNB_offset][Ns][symbol], &pilot[0],2000,nb_rb_coreset); for (aarx=0; aarxframe_parms.nb_antennas_rx; aarx++) { - pil = (int16_t *)&pilot[p][0]; + pil = (int16_t *)&pilot[0]; rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+k+nushift)]; - dl_ch = (int16_t *)&dl_ch_estimates[(p<<1)+aarx][ch_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), ue->ch_est_alpha,dl_ch-(ue->frame_parms.ofdm_symbol_size<<1), 1,ue->frame_parms.ofdm_symbol_size); -//#ifdef DEBUG_CH - printf("pdcch ch est pilot addr %p RB_DL %d\n",&pilot[p][0], ue->frame_parms.N_RB_DL); + //#ifdef DEBUG_CH + printf("pdcch 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); printf("dl_ch addr %p\n",dl_ch); -//#endif + //#endif if ((ue->frame_parms.N_RB_DL&1)==0) { // Treat first 2 pilots specially (left edge) @@ -329,7 +359,7 @@ int nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue, #ifdef DEBUG_CH for (int m =0; m<12; m++) - printf("data : dl_ch -> (%d,%d)\n",dl_ch[0+2*m],dl_ch[1+2*m]); + printf("data : dl_ch -> (%d,%d)\n",dl_ch[0+2*m],dl_ch[1+2*m]); #endif pil+=2; rxF+=8; @@ -341,8 +371,8 @@ int nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue, for (pilot_cnt=3; pilot_cnt<(3*nb_rb_coreset); pilot_cnt+=3) { if (k >= ue->frame_parms.ofdm_symbol_size){ - k-=ue->frame_parms.ofdm_symbol_size; - rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+k+nushift)];} + k-=ue->frame_parms.ofdm_symbol_size; + rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+k+nushift)];} 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); @@ -399,30 +429,28 @@ 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 char p, - unsigned char l, - unsigned char symbol, - unsigned short bwp_start_subcarrier, - unsigned short nb_rb_pdsch) + uint8_t eNB_id, + uint8_t eNB_offset, + unsigned char Ns, + unsigned char l, + unsigned char symbol, + unsigned short bwp_start_subcarrier, + unsigned short nb_rb_pdsch) { - int pilot[2][200] __attribute__((aligned(16))); + int pilot[200] __attribute__((aligned(16))); unsigned char aarx; unsigned short k; unsigned int pilot_cnt; int16_t ch[2],*pil,*rxF,*dl_ch,*fl,*fm,*fr,*fml,*fmr; int ch_offset,symbol_offset; + //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 nushift=0; 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 = (p>>1)&1; - ue->frame_parms.nushift = nushift; if (ue->high_speed_flag == 0) // use second channel estimate position for temporary storage ch_offset = ue->frame_parms.ofdm_symbol_size ; @@ -434,42 +462,42 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, k = bwp_start_subcarrier; #ifdef DEBUG_CH - printf("PBCH Channel Estimation : ThreadId %d, eNB_offset %d cell_id %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,Nid_cell,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, 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); #endif switch (nushift) { - case 0: - fl = filt8_l0; - fm = filt8_m0; - fr = filt8_r0; - fml = filt8_m0; - fmr = filt8_mr0; - break; + case 0: + fl = filt8_l0; + fm = filt8_m0; + fr = filt8_r0; + fml = filt8_m0; + fmr = filt8_mr0; + break; - case 1: - fl = filt8_l1; - fm = filt8_m1; - fr = filt8_r1; - fml = filt8_ml1; - fmr = filt8_m1; - break; + case 1: + fl = filt8_l1; + fm = filt8_m1; + fr = filt8_r1; + fml = filt8_ml1; + fmr = filt8_m1; + break; - default: - msg("pdsch_channel_estimation: nushift=%d -> ERROR\n",nushift); - return(-1); - break; - } + default: + msg("pdsch_channel_estimation: nushift=%d -> ERROR\n",nushift); + return(-1); + break; + } // generate pilot - nr_pdsch_dmrs_rx(ue,eNB_offset,Ns,ue->nr_gold_pdsch[eNB_offset][Ns][symbol], &pilot[p][0],1000,1,nb_rb_pdsch); + nr_pdsch_dmrs_rx(ue,eNB_offset,Ns,ue->nr_gold_pdsch[eNB_offset][Ns][symbol], &pilot[0],1000,1,nb_rb_pdsch); for (aarx=0; aarxframe_parms.nb_antennas_rx; aarx++) { - pil = (int16_t *)&pilot[p][0]; + pil = (int16_t *)&pilot[0]; rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+k+nushift)]; - dl_ch = (int16_t *)&dl_ch_estimates[(p<<1)+aarx][ch_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 @@ -477,7 +505,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, ue->ch_est_alpha,dl_ch-(ue->frame_parms.ofdm_symbol_size<<1), 1,ue->frame_parms.ofdm_symbol_size); #ifdef DEBUG_CH - printf("ch est pilot addr %p RB_DL %d\n",&pilot[p][0], ue->frame_parms.N_RB_DL); + printf("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); printf("dl_ch addr %p\n",dl_ch); @@ -516,11 +544,11 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, for (pilot_cnt=2; pilot_cnt<(6*(nb_rb_pdsch-1)+4); pilot_cnt+=2) { if ((pilot_cnt%6)==0) - dl_ch+=4; + dl_ch+=4; if (k >= ue->frame_parms.ofdm_symbol_size){ - k-=ue->frame_parms.ofdm_symbol_size; - rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+k+nushift)];} + k-=ue->frame_parms.ofdm_symbol_size; + rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+k+nushift)];} 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); diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h b/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h index ec761660e4..25d6755723 100644 --- a/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h +++ b/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h @@ -46,7 +46,6 @@ int nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue, uint8_t eNB_id, uint8_t eNB_offset, unsigned char Ns, - unsigned char p, unsigned char l, unsigned char symbol, unsigned short coreset_start_subcarrier, @@ -56,7 +55,6 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue, uint8_t eNB_id, uint8_t eNB_offset, unsigned char Ns, - unsigned char p, unsigned char l, unsigned char symbol); @@ -64,7 +62,6 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue, uint8_t eNB_id, uint8_t eNB_offset, unsigned char Ns, - unsigned char p, unsigned char l, unsigned char symbol, unsigned short bwp_start_subcarrier, diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c b/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c index dde080bba8..2390fa8216 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c @@ -62,53 +62,55 @@ int nr_pbch_detection(PHY_VARS_NR_UE *ue, runmode_t mode) 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 = 0; + frame_parms->nb_prefix_samples0 = frame_parms->nb_prefix_samples; //symbol 1 nr_slot_fep(ue, - 5, - 0, - ue->rx_offset, - 0, - 1, - NR_PBCH_EST); - + 1, + 0, + ue->ssb_offset, + 0, + 1, + NR_PBCH_EST); + //symbol 2 nr_slot_fep(ue, - 6, - 0, - ue->rx_offset, - 0, - 1, - NR_PBCH_EST); + 2, + 0, + ue->ssb_offset, + 0, + 1, + NR_PBCH_EST); //symbol 3 nr_slot_fep(ue, - 7, - 0, - ue->rx_offset, - 0, - 1, - NR_PBCH_EST); + 3, + 0, + ue->ssb_offset, + 0, + 1, + NR_PBCH_EST); + //put back nb_prefix_samples0 frame_parms->nb_prefix_samples0 = nb_prefix_samples0; - + printf("pbch_detection nid_cell %d\n",frame_parms->Nid_cell); - ret = nr_rx_pbch(ue, - &ue->proc.proc_rxtx[0], - ue->pbch_vars[0], - frame_parms, - 0, - SISO, - ue->high_speed_flag); - - + 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; - + // set initial transmission mode to 1 or 2 depending on number of detected TX antennas //frame_parms->mode1_flag = (pbch_tx_ant==1); // openair_daq_vars.dlsch_transmission_mode = (pbch_tx_ant>1) ? 2 : 1; @@ -148,19 +150,19 @@ int nr_initial_sync(PHY_VARS_NR_UE *ue, runmode_t mode) int32_t metric_tdd_ncp=0; uint8_t phase_tdd_ncp; - NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms; + NR_DL_FRAME_PARMS *fp = &ue->frame_parms; int ret=-1; int rx_power=0; //aarx, //nfapi_nr_config_request_t* config; - + int n_ssb_crb=(fp->N_RB_DL-20)>>1; // First try TDD normal prefix, mu 1 - frame_parms->Ncp=NORMAL; - frame_parms->frame_type=TDD; - nr_init_frame_parms_ue(frame_parms,NR_MU_1,NORMAL); - LOG_D(PHY,"nr_initial sync ue RB_DL %d\n", ue->frame_parms.N_RB_DL); + fp->Ncp=NORMAL; + fp->frame_type=TDD; + nr_init_frame_parms_ue(fp,NR_MU_1,NORMAL,n_ssb_crb,0); + LOG_D(PHY,"nr_initial sync ue RB_DL %d\n", fp->N_RB_DL); /* - write_output("rxdata0.m","rxd0",ue->common_vars.rxdata[0],10*frame_parms->samples_per_tti,1,1); + write_output("rxdata0.m","rxd0",ue->common_vars.rxdata[0],10*fp->samples_per_tti,1,1); exit(-1); */ @@ -186,22 +188,22 @@ int nr_initial_sync(PHY_VARS_NR_UE *ue, runmode_t mode) sync_pos = pss_synchro_nr(ue, NO_RATE_CHANGE); - if (sync_pos >= frame_parms->nb_prefix_samples) - ue->ssb_offset = sync_pos - frame_parms->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 + FRAME_LENGTH_COMPLEX_SAMPLES - frame_parms->nb_prefix_samples; + ue->ssb_offset = sync_pos + (fp->samples_per_tti * 10) - fp->nb_prefix_samples; LOG_D(PHY,"sync_pos %d ssb_offset %d\n",sync_pos,ue->ssb_offset); - // write_output("rxdata1.m","rxd1",ue->common_vars.rxdata[0],10*frame_parms->samples_per_tti,1,1); + // write_output("rxdata1.m","rxd1",ue->common_vars.rxdata[0],10*fp->samples_per_tti,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); #endif /* check that SSS/PBCH block is continuous inside the received buffer */ - if (sync_pos < (LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*frame_parms->ttis_per_subframe*frame_parms->samples_per_tti - (NB_SYMBOLS_PBCH * frame_parms->ofdm_symbol_size))) { + if (sync_pos < (10*fp->ttis_per_subframe*fp->samples_per_tti - (NB_SYMBOLS_PBCH * fp->ofdm_symbol_size))) { #ifdef DEBUG_INITIAL_SYNCH LOG_I(PHY,"Calling sss detection (normal CP)\n"); @@ -209,7 +211,7 @@ int nr_initial_sync(PHY_VARS_NR_UE *ue, runmode_t mode) rx_sss_nr(ue,&metric_tdd_ncp,&phase_tdd_ncp); - nr_init_frame_parms_ue(&ue->frame_parms,NR_MU_1,NORMAL); + nr_init_frame_parms_ue(fp,NR_MU_1,NORMAL,n_ssb_crb,0); nr_gold_pbch(ue); ret = nr_pbch_detection(ue,mode); @@ -277,17 +279,6 @@ int nr_initial_sync(PHY_VARS_NR_UE *ue, runmode_t mode) #endif // send sync status to higher layers later when timing offset converge to target timing -#if OAISIM - if (ue->mac_enabled==1) { - LOG_I(PHY,"[UE%d] Sending synch status to higher layers\n",ue->Mod_id); - //mac_resynch(); - mac_xface->dl_phy_sync_success(ue->Mod_id,ue->proc.proc_rxtx[0].frame_rx,0,1);//ue->common_vars.eNb_id); - ue->UE_mode[0] = PRACH; - } - else { - ue->UE_mode[0] = PUSCH; - } -#endif ue->pbch_vars[0]->pdu_errors_conseq=0; @@ -307,13 +298,13 @@ int nr_initial_sync(PHY_VARS_NR_UE *ue, runmode_t mode) printf("[UE %d] Frame %d MIB Information => %s, %s, NidCell %d, N_RB_DL %d, PHICH DURATION %d, PHICH RESOURCE %s, TX_ANT %d\n", ue->Mod_id, ue->proc.proc_rxtx[0].frame_rx, - duplex_string[ue->frame_parms.frame_type], - prefix_string[ue->frame_parms.Ncp], - ue->frame_parms.Nid_cell, - ue->frame_parms.N_RB_DL, - ue->frame_parms.phich_config_common.phich_duration, - phich_string[ue->frame_parms.phich_config_common.phich_resource], - ue->frame_parms.nb_antenna_ports_eNB); + duplex_string[fp->frame_type], + prefix_string[fp->Ncp], + fp->Nid_cell, + fp->N_RB_DL, + fp->phich_config_common.phich_duration, + phich_string[fp->phich_config_common.phich_resource], + fp->nb_antenna_ports_eNB); #else LOG_I(PHY, "[UE %d] Frame %d RRC Measurements => rssi %3.1f dBm (dig %3.1f dB, gain %d), N0 %d dBm, rsrp %3.1f dBm/RE, rsrq %3.1f dB\n",ue->Mod_id, ue->proc.proc_rxtx[0].frame_rx, @@ -327,13 +318,13 @@ int nr_initial_sync(PHY_VARS_NR_UE *ue, runmode_t mode) /* LOG_I(PHY, "[UE %d] Frame %d MIB Information => %s, %s, NidCell %d, N_RB_DL %d, PHICH DURATION %d, PHICH RESOURCE %s, TX_ANT %d\n", ue->Mod_id, ue->proc.proc_rxtx[0].frame_rx, - duplex_string[ue->frame_parms.frame_type], - prefix_string[ue->frame_parms.Ncp], - ue->frame_parms.Nid_cell, - ue->frame_parms.N_RB_DL, - ue->frame_parms.phich_config_common.phich_duration, - phich_string[ue->frame_parms.phich_config_common.phich_resource], - ue->frame_parms.nb_antenna_ports_eNB);*/ + duplex_string[fp->frame_type], + prefix_string[fp->Ncp], + fp->Nid_cell, + fp->N_RB_DL, + fp->phich_config_common.phich_duration, + phich_string[fp->phich_config_common.phich_resource], + fp->nb_antenna_ports_eNB);*/ #endif #if defined(OAI_USRP) || defined(EXMIMO) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) || defined(OAI_ADRV9371_ZC706) @@ -383,7 +374,7 @@ int nr_initial_sync(PHY_VARS_NR_UE *ue, runmode_t mode) */ // we might add a low-pass filter here later - ue->measurements.rx_power_avg[0] = rx_power/frame_parms->nb_antennas_rx; + ue->measurements.rx_power_avg[0] = rx_power/fp->nb_antennas_rx; ue->measurements.rx_power_avg_dB[0] = dB_fixed(ue->measurements.rx_power_avg[0]); diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c b/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c index 827097f756..a6ae4ca100 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c +++ b/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c @@ -35,7 +35,7 @@ #include "PHY/sse_intrin.h" #include "PHY/LTE_REFSIG/lte_refsig.h" -#define DEBUG_PBCH 1 +//#define DEBUG_PBCH 1 //#define DEBUG_PBCH_ENCODING #ifdef OPENAIR2 @@ -44,27 +44,39 @@ #define PBCH_A 24 +#define print_shorts(s,x) printf("%s : %d,%d,%d,%d,%d,%d,%d,%d\n",s,((int16_t*)x)[0],((int16_t*)x)[1],((int16_t*)x)[2],((int16_t*)x)[3],((int16_t*)x)[4],((int16_t*)x)[5],((int16_t*)x)[6],((int16_t*)x)[7]) uint16_t nr_pbch_extract(int **rxdataF, - int **dl_ch_estimates, - int **rxdataF_ext, - int **dl_ch_estimates_ext, - uint32_t symbol, - uint32_t high_speed_flag, - NR_DL_FRAME_PARMS *frame_parms) + int **dl_ch_estimates, + int **rxdataF_ext, + int **dl_ch_estimates_ext, + uint32_t symbol, + uint32_t high_speed_flag, + int is_synchronized, + NR_DL_FRAME_PARMS *frame_parms) { uint16_t rb; - uint8_t i,j,aarx,aatx; + uint8_t i,j,aarx; int32_t *dl_ch0,*dl_ch0_ext,*rxF,*rxF_ext; - int rx_offset = frame_parms->ofdm_symbol_size-10*12; int nushiftmod4 = frame_parms->nushift; + unsigned int rx_offset = frame_parms->first_carrier_offset + frame_parms->ssb_start_subcarrier; //and + if (rx_offset>= frame_parms->ofdm_symbol_size) rx_offset-=frame_parms->ofdm_symbol_size; + int s_offset; + + AssertFatal(((symbol>=1) && (symbol<5) && (is_synchronized==0)) || + ((symbol>=5) && (symbol<8) && (is_synchronized==1)), + "symbol %d illegal for PBCH (is_synchronized %d)\n", + symbol,is_synchronized); + + if (is_synchronized==0) s_offset=4; + for (aarx=0; aarxnb_antennas_rx; aarx++) { - rxF = &rxdataF[aarx][(rx_offset + (symbol*(frame_parms->ofdm_symbol_size)))]; + rxF = &rxdataF[aarx][symbol*frame_parms->ofdm_symbol_size]; rxF_ext = &rxdataF_ext[aarx][symbol*(20*12)]; #ifdef DEBUG_PBCH printf("extract_rbs (nushift %d): rx_offset=%d, symbol %d\n",frame_parms->nushift, @@ -78,89 +90,109 @@ uint16_t nr_pbch_extract(int **rxdataF, #endif for (rb=0; rb<20; rb++) { - if (rb==10) { - rxF = &rxdataF[aarx][((symbol*(frame_parms->ofdm_symbol_size)))]; - } - j=0; - if ((symbol==5) || (symbol==7)) { + + if (((s_offset+symbol)==5) || ((s_offset+symbol)==7)) { for (i=0; i<12; i++) { if ((i!=nushiftmod4) && (i!=(nushiftmod4+4)) && (i!=(nushiftmod4+8))) { - rxF_ext[j]=rxF[i]; - //printf("rxF ext[%d] = %d rxF [%d]= %d\n",j,rxF_ext[j],i,rxF[i]); + rxF_ext[j]=rxF[rx_offset]; +#ifdef DEBUG_PBCH + printf("rxF ext[%d] = (%d,%d) rxF [%d]= (%d,%d)\n",(9*rb) + j, + ((int16_t*)&rxF_ext[j])[0], + ((int16_t*)&rxF_ext[j])[1], + rx_offset, + ((int16_t*)&rxF[rx_offset])[0], + ((int16_t*)&rxF[rx_offset])[1]); +#endif j++; } + rx_offset=(rx_offset+1)&(frame_parms->ofdm_symbol_size-1); } - - rxF+=12; rxF_ext+=9; } else { //symbol 2 if ((rb < 4) || (rb >15)){ for (i=0; i<12; i++) { - if ((i!=nushiftmod4) && - (i!=(nushiftmod4+4)) && - (i!=(nushiftmod4+8))) { - rxF_ext[j]=rxF[i]; - //printf("symbol2 rxF ext[%d] = %d at %p\n",j,rxF_ext[j],&rxF[i]); - j++; - } + if ((i!=nushiftmod4) && + (i!=(nushiftmod4+4)) && + (i!=(nushiftmod4+8))) { + rxF_ext[j]=rxF[rx_offset]; +#ifdef DEBUG_PBCH + printf("rxF ext[%d] = (%d,%d) rxF [%d]= (%d,%d)\n",(rb<4) ? (9*rb) + j : (9*(rb-12))+j, + ((int16_t*)&rxF_ext[j])[0], + ((int16_t*)&rxF_ext[j])[1], + rx_offset, + ((int16_t*)&rxF[rx_offset])[0], + ((int16_t*)&rxF[rx_offset])[1]); +#endif + j++; + } + rx_offset=(rx_offset+1)&(frame_parms->ofdm_symbol_size-1); } + rxF_ext+=9; } - - rxF+=12; - rxF_ext+=9; + else rx_offset = (rx_offset+12)&(frame_parms->ofdm_symbol_size-1); + } } - for (aatx=0; aatxnb_antenna_ports_eNB;aatx++) { - if (high_speed_flag == 1) - dl_ch0 = &dl_ch_estimates[(aatx<<1)+aarx][(symbol*(frame_parms->ofdm_symbol_size))]; - else - dl_ch0 = &dl_ch_estimates[(aatx<<1)+aarx][0]; - - //printf("dl_ch0 addr %p\n",dl_ch0); - - dl_ch0_ext = &dl_ch_estimates_ext[(aatx<<1)+aarx][symbol*(20*12)]; - - for (rb=0; rb<20; rb++) { - j=0; - if ((symbol==5) || (symbol==7)) { - for (i=0; i<12; i++) { - if ((i!=nushiftmod4) && - (i!=(nushiftmod4+4)) && - (i!=(nushiftmod4+8))) { - dl_ch0_ext[j]=dl_ch0[i]; - if ((rb==0) && (i<2)) - printf("dl ch0 ext[%d] = %d dl_ch0 [%d]= %d\n",j,dl_ch0_ext[j],i,dl_ch0[i]); - j++; - } - } - - dl_ch0+=12; - dl_ch0_ext+=9; - } - else { - if ((rb < 4) || (rb >15)){ - for (i=0; i<12; i++) { - if ((i!=nushiftmod4) && - (i!=(nushiftmod4+4)) && - (i!=(nushiftmod4+8))) { - dl_ch0_ext[j]=dl_ch0[i]; - //printf("symbol2 dl ch0 ext[%d] = %d dl_ch0 [%d]= %d\n",j,dl_ch0_ext[j],i,dl_ch0[i]); - j++; - } - } - } - - dl_ch0+=12; - dl_ch0_ext+=9; - - } + if (high_speed_flag == 1) + dl_ch0 = &dl_ch_estimates[aarx][(symbol*(frame_parms->ofdm_symbol_size))]; + else + dl_ch0 = &dl_ch_estimates[aarx][0]; + + //printf("dl_ch0 addr %p\n",dl_ch0); + + dl_ch0_ext = &dl_ch_estimates_ext[aarx][symbol*(20*12)]; + + for (rb=0; rb<20; rb++) { + j=0; + if ((s_offset+symbol==5) || (s_offset+symbol==7)) { + for (i=0; i<12; i++) { + if ((i!=nushiftmod4) && + (i!=(nushiftmod4+4)) && + (i!=(nushiftmod4+8))) { + dl_ch0_ext[j]=dl_ch0[i]; +#ifdef DEBUG_PBCH + if ((rb==0) && (i<2)) + printf("dl ch0 ext[%d] = (%d,%d) dl_ch0 [%d]= (%d,%d)\n",j, + ((int16_t*)&dl_ch0_ext[j])[0], + ((int16_t*)&dl_ch0_ext[j])[1], + i, + ((int16_t*)&dl_ch0[i])[0], + ((int16_t*)&dl_ch0[i])[1]); +#endif + j++; + } + } + + dl_ch0+=12; + dl_ch0_ext+=9; } - } //tx antenna loop - + else { + if ((rb < 4) || (rb >15)){ + for (i=0; i<12; i++) { + if ((i!=nushiftmod4) && + (i!=(nushiftmod4+4)) && + (i!=(nushiftmod4+8))) { + dl_ch0_ext[j]=dl_ch0[i]; +#ifdef DEBUG_PBCH + printf("dl ch0 ext[%d] = (%d,%d) dl_ch0 [%d]= (%d,%d)\n",j, + ((int16_t*)&dl_ch0_ext[j])[0], + ((int16_t*)&dl_ch0_ext[j])[1], + i, + ((int16_t*)&dl_ch0[i])[0], + ((int16_t*)&dl_ch0[i])[1]); +#endif + j++; + } + } + dl_ch0_ext+=9; + } + dl_ch0+=12; + } + } } return(0); @@ -170,12 +202,12 @@ uint16_t nr_pbch_extract(int **rxdataF, //compute average channel_level on each (TX,RX) antenna pair int nr_pbch_channel_level(int **dl_ch_estimates_ext, - NR_DL_FRAME_PARMS *frame_parms, - uint32_t symbol) + NR_DL_FRAME_PARMS *frame_parms, + uint32_t symbol) { int16_t rb, nb_rb=20; - uint8_t aatx,aarx; + uint8_t aarx; #if defined(__x86_64__) || defined(__i386__) __m128i avg128; @@ -186,46 +218,45 @@ int nr_pbch_channel_level(int **dl_ch_estimates_ext, #endif int avg1=0,avg2=0; - for (aatx=0; aatxnb_antenna_ports_eNB;aatx++) - for (aarx=0; aarxnb_antennas_rx; aarx++) { - //clear average level - + for (aarx=0; aarxnb_antennas_rx; aarx++) { + //clear average level + #if defined(__x86_64__) || defined(__i386__) - avg128 = _mm_setzero_si128(); - dl_ch128=(__m128i *)&dl_ch_estimates_ext[(aatx<<1)+aarx][symbol*20*12]; + avg128 = _mm_setzero_si128(); + dl_ch128=(__m128i *)&dl_ch_estimates_ext[aarx][symbol*20*12]; #elif defined(__arm__) - avg128 = vdupq_n_s32(0); - dl_ch128=(int16x8_t *)&dl_ch_estimates_ext[(aatx<<1)+aarx][symbol*20*12]; - + avg128 = vdupq_n_s32(0); + dl_ch128=(int16x8_t *)&dl_ch_estimates_ext[aarx][symbol*20*12]; + #endif - for (rb=0; rbavg2) - avg2 = avg1; - - //msg("Channel level : %d, %d\n",avg1, avg2); + dl_ch128+=3; + /* + if (rb==0) { + print_shorts("dl_ch128",&dl_ch128[0]); + print_shorts("dl_ch128",&dl_ch128[1]); + print_shorts("dl_ch128",&dl_ch128[2]); + }*/ + } + + avg1 = (((int*)&avg128)[0] + + ((int*)&avg128)[1] + + ((int*)&avg128)[2] + + ((int*)&avg128)[3])/(nb_rb*12); + + if (avg1>avg2) + avg2 = avg1; + + //LOG_I(PHY,"Channel level : %d, %d\n",avg1, avg2); + } #if defined(__x86_64__) || defined(__i386__) _mm_empty(); _m_empty(); @@ -234,114 +265,123 @@ int nr_pbch_channel_level(int **dl_ch_estimates_ext, } -#if defined(__x86_64__) || defined(__i386__) -__m128i mmtmpP0,mmtmpP1,mmtmpP2,mmtmpP3; -#elif defined(__arm__) -int16x8_t mmtmpP0,mmtmpP1,mmtmpP2,mmtmpP3; -#endif void nr_pbch_channel_compensation(int **rxdataF_ext, - int **dl_ch_estimates_ext, - int **rxdataF_comp, - NR_DL_FRAME_PARMS *frame_parms, - uint8_t symbol, - uint8_t output_shift) + int **dl_ch_estimates_ext, + int **rxdataF_comp, + NR_DL_FRAME_PARMS *frame_parms, + uint8_t symbol, + int is_synchronized, + uint8_t output_shift) { short conjugate[8]__attribute__((aligned(16))) = {-1,1,-1,1,-1,1,-1,1}; short conjugate2[8]__attribute__((aligned(16))) = {1,-1,1,-1,1,-1,1,-1}; +#if defined(__x86_64__) || defined(__i386__) + __m128i mmtmpP0,mmtmpP1,mmtmpP2,mmtmpP3; +#elif defined(__arm__) + int16x8_t mmtmpP0,mmtmpP1,mmtmpP2,mmtmpP3; +#endif - uint16_t rb,nb_rb=20; - uint8_t aatx,aarx; + uint16_t nb_re=180; + uint8_t aarx; #if defined(__x86_64__) || defined(__i386__) __m128i *dl_ch128,*rxdataF128,*rxdataF_comp128; #elif defined(__arm__) #endif - for (aatx=0; aatxnb_antenna_ports_eNB;aatx++) - for (aarx=0; aarxnb_antennas_rx; aarx++) { + AssertFatal((symbol > 0 && symbol < 4 && is_synchronized == 0) || + (symbol > 0 && symbol < 4 && is_synchronized == 0), + "symbol %d is illegal for PBCH DM-RS (is_synchronized %d)\n", + symbol,is_synchronized); + if (symbol == 2 || symbol == 6) nb_re = 72; + + for (aarx=0; aarxnb_antennas_rx; aarx++) { + #if defined(__x86_64__) || defined(__i386__) - dl_ch128 = (__m128i *)&dl_ch_estimates_ext[(aatx<<1)+aarx][symbol*20*12]; - rxdataF128 = (__m128i *)&rxdataF_ext[aarx][symbol*20*12]; - rxdataF_comp128 = (__m128i *)&rxdataF_comp[(aatx<<1)+aarx][symbol*20*12]; - //printf("ch compensation dl_ch ext addr %p \n", &dl_ch_estimates_ext[(aatx<<1)+aarx][symbol*20*12]); - //printf("rxdataf ext addr %p symbol %d\n", &rxdataF_ext[aarx][symbol*20*12], symbol); - //printf("rxdataf_comp addr %p\n",&rxdataF_comp[(aatx<<1)+aarx][symbol*20*12]); - + dl_ch128 = (__m128i *)&dl_ch_estimates_ext[aarx][symbol*20*12]; + rxdataF128 = (__m128i *)&rxdataF_ext[aarx][symbol*20*12]; + rxdataF_comp128 = (__m128i *)&rxdataF_comp[aarx][symbol*20*12]; + /* + printf("ch compensation dl_ch ext addr %p \n", &dl_ch_estimates_ext[aarx][symbol*20*12]); + printf("rxdataf ext addr %p symbol %d\n", &rxdataF_ext[aarx][symbol*20*12], symbol); + printf("rxdataf_comp addr %p\n",&rxdataF_comp[aarx][symbol*20*12]); + */ #elif defined(__arm__) // to be filled in #endif - for (rb=0; rb=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol; if (frame_parms->nb_antennas_rx>1) { - for (aatx=0; aatx<4; aatx++) { //frame_parms->nb_antenna_ports_eNB;aatx++) { #if defined(__x86_64__) || defined(__i386__) - rxdataF_comp128_0 = (__m128i *)&rxdataF_comp[(aatx<<1)][symbol_mod*6*12]; - rxdataF_comp128_1 = (__m128i *)&rxdataF_comp[(aatx<<1)+1][symbol_mod*6*12]; + rxdataF_comp128_0 = (__m128i *)&rxdataF_comp[0][symbol_mod*6*12]; + rxdataF_comp128_1 = (__m128i *)&rxdataF_comp[1][symbol_mod*6*12]; #elif defined(__arm__) - rxdataF_comp128_0 = (int16x8_t *)&rxdataF_comp[(aatx<<1)][symbol_mod*6*12]; - rxdataF_comp128_1 = (int16x8_t *)&rxdataF_comp[(aatx<<1)+1][symbol_mod*6*12]; + rxdataF_comp128_0 = (int16x8_t *)&rxdataF_comp[0][symbol_mod*6*12]; + rxdataF_comp128_1 = (int16x8_t *)&rxdataF_comp[1][symbol_mod*6*12]; #endif // MRC on each re of rb, both on MF output and magnitude (for 16QAM/64QAM llr computation) @@ -382,7 +421,7 @@ void nr_pbch_detection_mrc(NR_DL_FRAME_PARMS *frame_parms, #endif } } - } + #if defined(__x86_64__) || defined(__i386__) _mm_empty(); _m_empty(); @@ -390,11 +429,11 @@ void nr_pbch_detection_mrc(NR_DL_FRAME_PARMS *frame_parms, } void nr_pbch_unscrambling(NR_UE_PBCH *pbch, - uint16_t Nid, - uint8_t nushift, - uint16_t M, - uint16_t length, - uint8_t bitwise) + uint16_t Nid, + uint8_t nushift, + uint16_t M, + uint16_t length, + uint8_t bitwise) { uint8_t reset, offset; uint32_t x1, x2, s=0; @@ -423,11 +462,11 @@ void nr_pbch_unscrambling(NR_UE_PBCH *pbch, s = lte_gold_generic(&x1, &x2, reset); reset = 0; } - #ifdef DEBUG_PBCH_ENCODING +#ifdef DEBUG_PBCH_ENCODING if (i<8) - printf("s: %04x\t", s); - printf("pbch_a_interleaved 0x%08x\n", pbch->pbch_a_interleaved); - #endif + printf("s: %04x\t", s); + printf("pbch_a_interleaved 0x%08x\n", pbch->pbch_a_interleaved); +#endif if (bitwise) { (pbch->pbch_a_interleaved) ^= ((unscrambling_mask>>i)&1)? ((pbch->pbch_a_prime>>i)&1)<pbch_a_prime>>i)&1) ^ ((s>>((i+offset)&0x1f))&1))<=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol; - jj = (symbol_mod*6*12); - - rxF0 = (int16_t*)&rxdataF_comp[0][jj]; //tx antenna 0 h0*y - rxF1 = (int16_t*)&rxdataF_comp[2][jj]; //tx antenna 1 h1*y - - for (rb=0; rb<6; rb++) { - - for (re=0; re<12; re+=2) { - - // Alamouti RX combining - - rxF0[0] = rxF0[0] + rxF1[2]; - rxF0[1] = rxF0[1] - rxF1[3]; - - rxF0[2] = rxF0[2] - rxF1[0]; - rxF0[3] = rxF0[3] + rxF1[1]; - - rxF0+=4; - rxF1+=4; - } - - } - -} - void nr_pbch_quantize(int16_t *pbch_llr8, int16_t *pbch_llr, uint16_t len) @@ -509,24 +510,23 @@ unsigned char sign(int8_t x) { uint8_t pbch_deinterleaving_pattern[32] = {28,0,31,30,1,29,25,27,22,2,24,3,4,5,6,7,18,21,20,8,9,10,11,19,26,12,13,14,15,16,23,17}; int nr_rx_pbch( PHY_VARS_NR_UE *ue, - UE_nr_rxtx_proc_t *proc, - NR_UE_PBCH *nr_ue_pbch_vars, - NR_DL_FRAME_PARMS *frame_parms, - uint8_t eNB_id, - MIMO_mode_t mimo_mode, - uint32_t high_speed_flag) + UE_nr_rxtx_proc_t *proc, + NR_UE_PBCH *nr_ue_pbch_vars, + NR_DL_FRAME_PARMS *frame_parms, + uint8_t eNB_id, + MIMO_mode_t mimo_mode, + uint32_t high_speed_flag) { NR_UE_COMMON *nr_ue_common_vars = &ue->common_vars; - uint8_t log2_maxh; int max_h=0; int symbol,i; //uint8_t pbch_a[64]; uint8_t *pbch_a = malloc(sizeof(uint8_t) * 32); uint32_t pbch_a_prime; - int8_t *pbch_e_rx; + int16_t *pbch_e_rx; uint8_t *decoded_output = nr_ue_pbch_vars->decoded_output; uint8_t nushift; uint16_t M; @@ -555,45 +555,50 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue, // clear LLR buffer memset(nr_ue_pbch_vars->llr,0,NR_POLAR_PBCH_E); - for (symbol=5; symbol<8; symbol++) { + int first_symbol=1; + if (ue->is_synchronized > 0) first_symbol+=4; #ifdef DEBUG_PBCH //printf("address dataf %p",nr_ue_common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe_rx]].rxdataF); - write_output("rxdataF0_pbch.m","rxF0pbch",nr_ue_common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe_rx]].rxdataF,frame_parms->ofdm_symbol_size*4,1,1); + write_output("rxdataF0_pbch.m","rxF0pbch", + &nr_ue_common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe_rx]].rxdataF[0][first_symbol*frame_parms->ofdm_symbol_size],frame_parms->ofdm_symbol_size*3,1,1); #endif + + for (symbol=first_symbol; symbol<(first_symbol+3); symbol++) { + nr_pbch_extract(nr_ue_common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe_rx]].rxdataF, - nr_ue_common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe_rx]].dl_ch_estimates[eNB_id], - nr_ue_pbch_vars->rxdataF_ext, - nr_ue_pbch_vars->dl_ch_estimates_ext, - symbol, - high_speed_flag, - frame_parms); + nr_ue_common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe_rx]].dl_ch_estimates[eNB_id], + nr_ue_pbch_vars->rxdataF_ext, + nr_ue_pbch_vars->dl_ch_estimates_ext, + symbol, + high_speed_flag, + ue->is_synchronized, + frame_parms); #ifdef DEBUG_PBCH - msg("[PHY] PBCH Symbol %d ofdm size %d\n",symbol, frame_parms->ofdm_symbol_size ); - msg("[PHY] PBCH starting channel_level\n"); + LOG_I(PHY,"[PHY] PBCH Symbol %d ofdm size %d\n",symbol, frame_parms->ofdm_symbol_size ); + LOG_I(PHY,"[PHY] PBCH starting channel_level\n"); #endif - max_h = nr_pbch_channel_level(nr_ue_pbch_vars->dl_ch_estimates_ext, - frame_parms, - symbol); - log2_maxh = 3+(log2_approx(max_h)/2); + if (symbol == 1 || symbol == 5) { + max_h = nr_pbch_channel_level(nr_ue_pbch_vars->dl_ch_estimates_ext, + frame_parms, + symbol); + nr_ue_pbch_vars->log2_maxh = 3+(log2_approx(max_h)/2); + } #ifdef DEBUG_PBCH - msg("[PHY] PBCH log2_maxh = %d (%d)\n",log2_maxh,max_h); + LOG_I(PHY,"[PHY] PBCH log2_maxh = %d (%d)\n",nr_ue_pbch_vars->log2_maxh,max_h); #endif nr_pbch_channel_compensation(nr_ue_pbch_vars->rxdataF_ext, - nr_ue_pbch_vars->dl_ch_estimates_ext, - nr_ue_pbch_vars->rxdataF_comp, - frame_parms, - symbol, - log2_maxh); // log2_maxh+I0_shift + nr_ue_pbch_vars->dl_ch_estimates_ext, + nr_ue_pbch_vars->rxdataF_comp, + frame_parms, + symbol, + ue->is_synchronized, + nr_ue_pbch_vars->log2_maxh); // log2_maxh+I0_shift -#ifdef DEBUG_PBCH - write_output("rxdataF_comp.m","rxFcomp",nr_ue_pbch_vars->rxdataF_comp,180,2,1); -#endif - /*if (frame_parms->nb_antennas_rx > 1) pbch_detection_mrc(frame_parms, nr_ue_pbch_vars->rxdataF_comp, @@ -603,11 +608,11 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue, if (mimo_mode == ALAMOUTI) { nr_pbch_alamouti(frame_parms,nr_ue_pbch_vars->rxdataF_comp,symbol); } else if (mimo_mode != SISO) { - msg("[PBCH][RX] Unsupported MIMO mode\n"); + LOG_I(PHY,"[PBCH][RX] Unsupported MIMO mode\n"); return(-1); } */ - if (symbol==6) { + if (symbol==(first_symbol+1)) { nr_pbch_quantize(pbch_e_rx, (short*)&(nr_ue_pbch_vars->rxdataF_comp[0][symbol*240]), 144); @@ -624,6 +629,11 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue, } +#ifdef DEBUG_PBCH + write_output("rxdataF_comp.m","rxFcomp",&nr_ue_pbch_vars->rxdataF_comp[0][240*first_symbol],240*3,1,1); +#endif + + pbch_e_rx = nr_ue_pbch_vars->llr; //demod_pbch_e = nr_ue_pbch_vars->demod_pbch_e; pbch_a = nr_ue_pbch_vars->pbch_a; @@ -631,9 +641,9 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue, #ifdef DEBUG_PBCH //pbch_e_rx = &nr_ue_pbch_vars->llr[0]; - short *p = (short *)&(nr_ue_pbch_vars->rxdataF_comp[0][5*20*12]); - for (int cnt = 0; cnt < 32 ; cnt++) - printf("pbch rx llr %d rxdata_comp %d addr %p\n",*(pbch_e_rx+cnt), p[cnt], &p[0]); + short *p = (short *)&(nr_ue_pbch_vars->rxdataF_comp[0][first_symbol*20*12]); + for (int cnt = 0; cnt < 864 ; cnt++) + printf("pbch rx llr %d\n",*(pbch_e_rx+cnt)); #endif @@ -648,14 +658,9 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue, //polar decoding de-rate matching -// uint32_t pbch_out; - //polar decoding de-rate matching - t_nrPolar_paramsPtr nrPolar_params = NULL, currentPtr = NULL; - nr_polar_init(&nrPolar_params, - NR_POLAR_PBCH_MESSAGE_TYPE, - NR_POLAR_PBCH_PAYLOAD_BITS, - NR_POLAR_PBCH_AGGREGATION_LEVEL); - currentPtr = nr_polar_params(nrPolar_params, NR_POLAR_PBCH_MESSAGE_TYPE, NR_POLAR_PBCH_PAYLOAD_BITS, NR_POLAR_PBCH_AGGREGATION_LEVEL); + AssertFatal(ue->nrPolar_params != NULL,"ue->nrPolar_params is null\n"); + + t_nrPolar_params *currentPtr = nr_polar_params(ue->nrPolar_params, NR_POLAR_PBCH_MESSAGE_TYPE, NR_POLAR_PBCH_PAYLOAD_BITS, NR_POLAR_PBCH_AGGREGATION_LEVEL); decoderState = polar_decoder_int16(pbch_e_rx,&nr_ue_pbch_vars->pbch_a_prime,currentPtr); diff --git a/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c b/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c index fc0cf87e6c..de9b90f993 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c +++ b/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c @@ -57,7 +57,7 @@ * *********************************************************************/ -#define DBG_PSS_NR +//#define DBG_PSS_NR void *get_idft(int ofdm_symbol_size) { @@ -175,14 +175,14 @@ void *get_dft(int ofdm_symbol_size) * *********************************************************************/ -void generate_pss_nr(int N_ID_2, int ofdm_symbol_size) +void generate_pss_nr(NR_DL_FRAME_PARMS *fp,int N_ID_2) { - AssertFatal(ofdm_symbol_size > 127,"Illegal ofdm_symbol_size %d\n",ofdm_symbol_size); + AssertFatal(fp->ofdm_symbol_size > 127,"Illegal ofdm_symbol_size %d\n",fp->ofdm_symbol_size); AssertFatal(N_ID_2>=0 && N_ID_2 <=2,"Illegal N_ID_2 %d\n",N_ID_2); int16_t d_pss[LENGTH_PSS_NR]; int16_t x[LENGTH_PSS_NR]; int16_t *primary_synchro_time = primary_synchro_time_nr[N_ID_2]; - unsigned int length = ofdm_symbol_size; + unsigned int length = fp->ofdm_symbol_size; unsigned int size = length * IQ_SIZE; /* i & q */ int16_t *primary_synchro = primary_synchro_nr[N_ID_2]; /* pss in complex with alternatively i then q */ int16_t *primary_synchro2 = primary_synchro_nr2[N_ID_2]; /* pss in complex with alternatively i then q */ @@ -260,7 +260,10 @@ void generate_pss_nr(int N_ID_2, int ofdm_symbol_size) * sample 0 is for continuous frequency which is used here */ - unsigned int k = length - (LENGTH_PSS_NR/2+1); + unsigned int k = fp->first_carrier_offset + fp->ssb_start_subcarrier + 56; //and + if (k>= fp->ofdm_symbol_size) k-=fp->ofdm_symbol_size; + + for (int i=0; i < LENGTH_PSS_NR; i++) { synchroF_tmp[2*k] = primary_synchro[2*i]; @@ -409,7 +412,7 @@ void init_context_pss_nr(NR_DL_FRAME_PARMS *frame_parms_ue) assert(0); } - generate_pss_nr(i, ofdm_symbol_size); + generate_pss_nr(frame_parms_ue,i); } } @@ -813,13 +816,9 @@ int pss_search_time_nr(int **rxdata, ///rx data in time domain unsigned int length = (NR_NUMBER_OF_SUBFRAMES_PER_FRAME*frame_parms->samples_per_subframe); /* 1 frame for now, it should be 2 TODO_NR */ AssertFatal(length>0,"illegal length %d\n",length); - for (int i = 0; i < NUMBER_PSS_SEQUENCE; i++) { - if (pss_corr_ue[i] == NULL) { - msg("[SYNC TIME] pss_corr_ue[%d] not yet allocated! Exiting.\n", i); - return(-1); - } - } + for (int i = 0; i < NUMBER_PSS_SEQUENCE; i++) AssertFatal(pss_corr_ue[i] != NULL,"pss_corr_ue[%d] not yet allocated! Exiting.\n", i); + peak_value = 0; peak_position = 0; pss_source = 0; @@ -874,7 +873,9 @@ int pss_search_time_nr(int **rxdata, ///rx data in time domain peak_position = n; pss_source = pss_index; +#ifdef DEBUG_PSS_NR printf("pss_index %d: n %6d peak_value %15llu\n", pss_index, n, (unsigned long long)pss_corr_ue[pss_index][n]); +#endif } } } @@ -888,9 +889,9 @@ int pss_search_time_nr(int **rxdata, ///rx data in time domain //#ifdef DEBUG_PSS_NR #define PSS_DETECTION_FLOOR_NR (31) - if (peak_value > 5*avg[pss_source]) { //PSS_DETECTION_FLOOR_NR) + if (peak_value < 5*avg[pss_source]) { //PSS_DETECTION_FLOOR_NR) - printf("[UE] nr_synchro_time: Sync source = %d, Peak found at pos %d, val = %llu (%d dB) avg %d dB\n", pss_source, peak_position, (unsigned long long)peak_value,dB_fixed64(peak_value),dB_fixed64(avg[pss_source])); + return(-1); } //#endif @@ -899,11 +900,10 @@ int pss_search_time_nr(int **rxdata, ///rx data in time domain static debug_cnt = 0; if (debug_cnt == 0) { - LOG_M("pss_corr_ue0.m","pss_corr_ue0",pss_corr_ue[0],length,1,6); + /* LOG_M("pss_corr_ue0.m","pss_corr_ue0",pss_corr_ue[0],length,1,6); LOG_M("pss_corr_ue1.m","pss_corr_ue1",pss_corr_ue[1],length,1,6); LOG_M("pss_corr_ue2.m","pss_corr_ue2",pss_corr_ue[2],length,1,6); - LOG_M("rxdata0.m","rxd0",rxdata[0],length,1,1); - exit(-1); + LOG_M("rxdata0.m","rxd0",rxdata[0],length,1,1); */ } else { debug_cnt++; } diff --git a/openair1/PHY/NR_UE_TRANSPORT/sss_nr.c b/openair1/PHY/NR_UE_TRANSPORT/sss_nr.c index 9d1fb40a22..26639a5134 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/sss_nr.c +++ b/openair1/PHY/NR_UE_TRANSPORT/sss_nr.c @@ -127,8 +127,8 @@ void init_context_sss_nr(int amp) * *********************************************************************/ -#define DEBUG_SSS_NR -#define DEBUG_PLOT_SSS +//#define DEBUG_SSS_NR +//#define DEBUG_PLOT_SSS void insert_sss_nr(int16_t *sss_time, NR_DL_FRAME_PARMS *frame_parms) { @@ -328,8 +328,8 @@ int do_pss_sss_extract_nr(PHY_VARS_NR_UE *ue, for (aarx=0; aarxnb_antennas_rx; aarx++) { - pss_symbol = PSS_SYMBOL_NB; /* symbol position */ - sss_symbol = SSS_SYMBOL_NB; + pss_symbol = 0; + sss_symbol = SSS_SYMBOL_NB-PSS_SYMBOL_NB; rxdataF = ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[subframe]].rxdataF; @@ -341,7 +341,8 @@ int do_pss_sss_extract_nr(PHY_VARS_NR_UE *ue, pss_rxF_ext = &pss_ext[aarx][0]; sss_rxF_ext = &sss_ext[aarx][0]; - unsigned int k = ofdm_symbol_size - ((LENGTH_PSS_NR/2)+1); + unsigned int k = frame_parms->first_carrier_offset + frame_parms->ssb_start_subcarrier + 56; + if (k>= frame_parms->ofdm_symbol_size) k-=frame_parms->ofdm_symbol_size; for (int i=0; i < LENGTH_PSS_NR; i++) { if (doPss) { @@ -471,13 +472,13 @@ int rx_sss_nr(PHY_VARS_NR_UE *ue, int32_t *tot_metric,uint8_t *phase_max) #ifdef DEBUG_PLOT_SSS - write_output("rxsig0.m","rxs0",&ue->common_vars.rxdata[0][0],ue->frame_parms.samples_per_tti,1,1); - write_output("rxdataF0.m","rxF0",&ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[0]].rxdataF[0][frame_parms->ofdm_symbol_size*PSS_SYMBOL_NB],frame_parms->ofdm_symbol_size,2,1); + write_output("rxsig0.m","rxs0",&ue->common_vars.rxdata[0][0],ue->frame_parms.samples_per_subframe,1,1); + write_output("rxdataF0_pss.m","rxF0_pss",&ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[0]].rxdataF[0][0],frame_parms->ofdm_symbol_size,1,1); + write_output("rxdataF0_sss.m","rxF0_sss",&ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[0]].rxdataF[0][(SSS_SYMBOL_NB-PSS_SYMBOL_NB)*frame_parms->ofdm_symbol_size],frame_parms->ofdm_symbol_size,1,1); write_output("pss_ext.m","pss_ext",pss_ext,LENGTH_PSS_NR,1,1); #endif - #if 0 int16_t *p = (int16_t *)sss_ext[0]; int16_t *p2 = (int16_t *)pss_ext[0]; @@ -585,6 +586,6 @@ int rx_sss_nr(PHY_VARS_NR_UE *ue, int32_t *tot_metric,uint8_t *phase_max) printf("Nid2 %d Nid1 %d tot_metric %d, phase_max %d \n", Nid2, Nid1, *tot_metric, *phase_max); } //#endif - + return(0); } diff --git a/openair1/PHY/defs_nr_UE.h b/openair1/PHY/defs_nr_UE.h index 3b13cf4bc7..30aecac6bd 100644 --- a/openair1/PHY/defs_nr_UE.h +++ b/openair1/PHY/defs_nr_UE.h @@ -920,6 +920,7 @@ typedef struct { /// - first index: ? [0..7] (hard coded) FIXME! accessed via \c nb_antennas_rx /// - second index: ? [0..287] (hard coded) int32_t **dl_ch_estimates_ext; + int log2_maxh; uint8_t pbch_a[NR_POLAR_PBCH_PAYLOAD_BITS>>3]; uint32_t pbch_a_interleaved; uint32_t pbch_a_prime; @@ -1061,7 +1062,7 @@ typedef struct { uint32_t dmrs_pbch_bitmap_nr[DMRS_PBCH_I_SSB][DMRS_PBCH_N_HF][DMRS_BITMAP_SIZE]; #endif - t_nrPolar_paramsPtr nrPolar_params; + t_nrPolar_params *nrPolar_params; /// PBCH DMRS sequence uint32_t nr_gold_pbch[2][64][NR_PBCH_DMRS_LENGTH_DWORD]; diff --git a/openair1/PHY/defs_nr_common.h b/openair1/PHY/defs_nr_common.h index b1f054bb1c..f7846ecc1c 100644 --- a/openair1/PHY/defs_nr_common.h +++ b/openair1/PHY/defs_nr_common.h @@ -137,6 +137,10 @@ typedef struct { typedef struct NR_DL_FRAME_PARMS { /// frequency range nr_frequency_range_e freq_range; + /// Placeholder to replace overlapping fields below + nfapi_nr_rf_config_t rf_config; + /// Placeholder to replace SSB overlapping fields below + nfapi_nr_sch_config_t sch_config; /// Number of resource blocks (RB) in DL int N_RB_DL; /// Number of resource blocks (RB) in UL diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index b1ac7a1b00..890ebb1013 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -111,7 +111,7 @@ int nr_get_ssb_start_symbol(nfapi_nr_config_request_t *cfg, NR_DL_FRAME_PARMS *f void nr_set_ssb_first_subcarrier(nfapi_nr_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); + int start_rb = cfg->sch_config.n_ssb_crb.value / (1<subframe_config.numerology_index_mu.value); fp->ssb_start_subcarrier = 12 * start_rb + cfg->sch_config.ssb_subcarrier_offset.value; LOG_I(PHY, "SSB first subcarrier %d (%d,%d)\n", fp->ssb_start_subcarrier,start_rb,cfg->sch_config.ssb_subcarrier_offset.value); } diff --git a/openair1/SIMULATION/NR_PHY/pbchsim.c b/openair1/SIMULATION/NR_PHY/pbchsim.c index a19f890bc0..387daeabcb 100644 --- a/openair1/SIMULATION/NR_PHY/pbchsim.c +++ b/openair1/SIMULATION/NR_PHY/pbchsim.c @@ -400,6 +400,9 @@ int main(int argc, char **argv) UE = malloc(sizeof(PHY_VARS_NR_UE)); memcpy(&UE->frame_parms,frame_parms,sizeof(NR_DL_FRAME_PARMS)); phy_init_nr_top(UE); + UE->is_synchronized = 0; + UE->perfect_ce = 0; + if (init_nr_ue_signal(UE, 1, 0) != 0) { printf("Error at UE NR initialisation\n"); @@ -410,6 +413,7 @@ int main(int argc, char **argv) // generate signal if (input_fd==NULL) { gNB->pbch_configured = 1; + for (int i=0;i<4;i++) gNB->pbch_pdu[3-i]=i; nr_common_signal_procedures (gNB,frame,subframe); } @@ -439,11 +443,15 @@ int main(int argc, char **argv) if (gNB->frame_parms.nb_antennas_tx>1) LOG_M("txsig1.m","txs1", txdata[1],frame_length_complex_samples,1,1); + int txlev = signal_energy(&txdata[0][5*frame_parms->ofdm_symbol_size + 4*frame_parms->nb_prefix_samples + frame_parms->nb_prefix_samples0], + frame_parms->ofdm_symbol_size + frame_parms->nb_prefix_samples); + + printf("txlev %d\n",txlev); for (i=0; inb_antennas_tx; aa++) { - r_re[aa][i] = ((double)(((short *)txdata[aa]))[(i<<1)]); - r_im[aa][i] = ((double)(((short *)txdata[aa]))[(i<<1)+1]); + r_re[aa][i] = ((double)(((short *)txdata[aa]))[(i<<1)])/sqrt((double)txlev); + r_im[aa][i] = ((double)(((short *)txdata[aa]))[(i<<1)+1])/sqrt((double)txlev); } } @@ -459,13 +467,15 @@ int main(int argc, char **argv) //multipath_channel(gNB2UE,s_re,s_im,r_re,r_im,frame_length_complex_samples,0); //AWGN - sigma2_dB = SNR; + sigma2_dB = -SNR; sigma2 = pow(10,sigma2_dB/10); + printf("sigma2 %f\n",sigma2); + for (i=0; inb_antennas_rx; aa++) { - ((short*) UE->common_vars.rxdata[aa])[2*i] = (short) ((r_re[aa][i] +sqrt(sigma2/2)*gaussdouble(0.0,1.0))); - ((short*) UE->common_vars.rxdata[aa])[2*i+1] = (short) ((r_im[aa][i] + (iqim*r_re[aa][i]) + sqrt(sigma2/2)*gaussdouble(0.0,1.0))); + ((short*) UE->common_vars.rxdata[aa])[2*i] = (short) ((r_re[aa][i] +sqrt(sigma2/2)*gaussdouble(0.0,1.0))*512); + ((short*) UE->common_vars.rxdata[aa])[2*i+1] = (short) ((r_im[aa][i] + (iqim*r_re[aa][i]) + sqrt(sigma2/2)*gaussdouble(0.0,1.0))*512); } }