diff --git a/openair1/PHY/NR_TRANSPORT/nr_pbch.c b/openair1/PHY/NR_TRANSPORT/nr_pbch.c index f25873c77f3bc49581d64ae87194ed48d7d03c57..842f35ae524baaf39c299ae9055591072be7a1bc 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_pbch.c +++ b/openair1/PHY/NR_TRANSPORT/nr_pbch.c @@ -32,11 +32,12 @@ #include "PHY/defs_gNB.h" #include "PHY/NR_TRANSPORT/nr_transport.h" -#include "PHY/phy_extern.h" +#include "PHY/LTE_REFSIG/lte_refsig.h" #include "PHY/sse_intrin.h" //#define DEBUG_PBCH //#define DEBUG_PBCH_ENCODING +//#define DEBUG_PBCH_DMRS extern short nr_mod_table[NR_MOD_TABLE_SIZE_SHORT]; @@ -58,7 +59,7 @@ int nr_generate_pbch_dmrs(uint32_t *gold_pbch_dmrs, for (int m=0; m<NR_PBCH_DMRS_LENGTH; m++) { mod_dmrs[m<<1] = nr_mod_table[((NR_MOD_TABLE_BPSK_OFFSET + ((gold_pbch_dmrs[m>>5]&(1<<(m&0x1f)))>>(m&0x1f)))<<1)]; mod_dmrs[(m<<1)+1] = nr_mod_table[((NR_MOD_TABLE_BPSK_OFFSET + ((gold_pbch_dmrs[m>>5]&(1<<(m&0x1f)))>>(m&0x1f)))<<1) + 1]; -#ifdef DEBUG_PBCH +#ifdef DEBUG_PBCH_DMRS printf("m %d mod_dmrs %d %d\n", m, mod_dmrs[2*m], mod_dmrs[2*m+1]); #endif } @@ -75,7 +76,7 @@ int nr_generate_pbch_dmrs(uint32_t *gold_pbch_dmrs, l = ssb_start_symbol + 1; for (int m = 0; m < 60; m++) { -#ifdef DEBUG_PBCH +#ifdef DEBUG_PBCH_DMRS printf("m %d at k %d of l %d\n", m, k, l); #endif ((int16_t*)txdataF[aa])[(l*frame_parms->ofdm_symbol_size + k)<<1] = (a * mod_dmrs[m<<1]) >> 15; @@ -91,7 +92,7 @@ int nr_generate_pbch_dmrs(uint32_t *gold_pbch_dmrs, l++; for (int m = 60; m < 84; m++) { -#ifdef DEBUG_PBCH +#ifdef DEBUG_PBCH_DMRS printf("m %d at k %d of l %d\n", m, k, l); #endif ((int16_t*)txdataF[aa])[(l*frame_parms->ofdm_symbol_size + k)<<1] = (a * mod_dmrs[m<<1]) >> 15; @@ -107,7 +108,7 @@ int nr_generate_pbch_dmrs(uint32_t *gold_pbch_dmrs, l++; for (int m = 84; m < NR_PBCH_DMRS_LENGTH; m++) { -#ifdef DEBUG_PBCH +#ifdef DEBUG_PBCH_DMRS printf("m %d at k %d of l %d\n", m, k, l); #endif ((int16_t*)txdataF[aa])[(l*frame_parms->ofdm_symbol_size + k)<<1] = (a * mod_dmrs[m<<1]) >> 15; @@ -121,13 +122,14 @@ int nr_generate_pbch_dmrs(uint32_t *gold_pbch_dmrs, } -#ifdef DEBUG_PBCH - write_output("txdataF.m", "txdataF", txdataF[0], frame_parms->samples_per_frame_wCP>>1, 1, 1); +#ifdef DEBUG_PBCH_DMRS + write_output("txdataF_pbch_dmrs.m", "txdataF_pbch_dmrs", txdataF[0], frame_parms->samples_per_frame_wCP>>1, 1, 1); #endif return 0; } void nr_pbch_scrambling(uint32_t Nid, + uint8_t nushift, uint8_t *pbch_a, uint32_t length) { @@ -161,7 +163,7 @@ int nr_generate_pbch(NR_gNB_PBCH *pbch, NR_DL_FRAME_PARMS *frame_parms) { - int m,k,l; + int k,l,m; int16_t a; int16_t mod_pbch_e[NR_POLAR_PBCH_E<<1]; uint8_t sfn_4lsb, idx=0; @@ -182,18 +184,27 @@ int nr_generate_pbch(NR_gNB_PBCH *pbch, pbch->pbch_a[NR_PBCH_PDU_BITS+4] = n_hf; // half frame index bit pbch->pbch_a[NR_PBCH_PDU_BITS+5] = (config->sch_config.ssb_subcarrier_offset.value>>5)&1; //MSB of k0 -- Note the case Lssb=64 is not supported (FR2) +#ifdef DEBUG_PBCH_ENCODING + +#endif // Scrambling - nr_pbch_scrambling((uint32_t)config->sch_config.physical_cell_id.value, pbch->pbch_a, NR_POLAR_PBCH_PAYLOAD_BITS); + nr_pbch_scrambling((uint32_t)config->sch_config.physical_cell_id.value, nushift, pbch->pbch_a, NR_POLAR_PBCH_PAYLOAD_BITS); +#ifdef DEBUG_PBCH_ENCODING + +#endif /// CRC, coding and rate matching polar_encoder (pbch->pbch_a, pbch->pbch_e, &frame_parms->pbch_polar_params); +#ifdef DEBUG_PBCH_ENCODING + +#endif /// QPSK modulation - for (int i=0; i<NR_POLAR_PBCH_E>>2; i++){ - idx = (pbch->pbch_e[i<<2]&1) ^ ((pbch->pbch_e[(i<<2)+1]&1)<<1); - mod_pbch_e[i<<2] = nr_mod_table[(NR_MOD_TABLE_QPSK_OFFSET + idx)<<1]; - mod_pbch_e[(i<<2)+1] = nr_mod_table[((NR_MOD_TABLE_QPSK_OFFSET + idx)<<1)+1]; + for (int i=0; i<NR_POLAR_PBCH_E>>1; i++){ + idx = (pbch->pbch_e[i<<1]&1) ^ ((pbch->pbch_e[(i<<1)+1]&1)<<1); + mod_pbch_e[i<<1] = nr_mod_table[(NR_MOD_TABLE_QPSK_OFFSET + idx)<<1]; + mod_pbch_e[(i<<1)+1] = nr_mod_table[((NR_MOD_TABLE_QPSK_OFFSET + idx)<<1)+1]; #ifdef DEBUG_PBCH printf("i %d mod_pbch %d %d\n", i, mod_pbch_e[2*i], mod_pbch_e[2*i+1]); @@ -201,55 +212,108 @@ int nr_generate_pbch(NR_gNB_PBCH *pbch, } /// Resource mapping -/* a = (config->rf_config.tx_antenna_ports.value == 1) ? amp : (amp*ONE_OVER_SQRT2_Q15)>>15; + a = (config->rf_config.tx_antenna_ports.value == 1) ? amp : (amp*ONE_OVER_SQRT2_Q15)>>15; for (int aa = 0; aa < config->rf_config.tx_antenna_ports.value; aa++) { - // PBCH DMRS are mapped within the SSB block on every fourth subcarrier starting from nushift of symbols 1, 2, 3 - ///symbol 1 [0+nushift:4:236+nushift] -- 60 mod symbols - k = frame_parms->first_carrier_offset + frame_parms->ssb_start_subcarrier + nushift; + // PBCH modulated symbols are mapped within the SSB block on symbols 1, 2, 3 excluding the subcarriers used for the PBCH DMRS + ///symbol 1 [0:239] -- 180 mod symbols + k = frame_parms->first_carrier_offset + frame_parms->ssb_start_subcarrier; l = ssb_start_symbol + 1; + m = 0; - for (int m = 0; m < 60; m++) { + for (int ssb_sc_idx = 0; ssb_sc_idx < 240; ssb_sc_idx++) { + + if ((ssb_sc_idx&3) == nushift) { //skip DMRS + k++; + continue; + } + else { #ifdef DEBUG_PBCH - printf("m %d at k %d of l %d\n", m, k, l); + printf("m %d ssb_sc_idx %d at k %d of l %d\n", m, ssb_sc_idx, k, l); #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; - k+=4; + ((int16_t*)txdataF[aa])[(l*frame_parms->ofdm_symbol_size + k)<<1] = (a * mod_pbch_e[m<<1]) >> 15; + ((int16_t*)txdataF[aa])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1] = (a * mod_pbch_e[(m<<1) + 1]) >> 15; + k++; + m++; + } if (k >= frame_parms->ofdm_symbol_size) k-=frame_parms->ofdm_symbol_size; } - ///symbol 2 [0+u:4:44+nushift ; 192+nu:4:236+nushift] -- 24 mod symbols - k = frame_parms->first_carrier_offset + frame_parms->ssb_start_subcarrier + nushift; + ///symbol 2 [0:47 ; 192:239] -- 72 mod symbols + k = frame_parms->first_carrier_offset + frame_parms->ssb_start_subcarrier; l++; + m=180; - for (int m = 60; m < 84; m++) { + for (int ssb_sc_idx = 0; ssb_sc_idx < 48; ssb_sc_idx++) { + + if ((ssb_sc_idx&3) == nushift) { + k++; + continue; + } + else { #ifdef DEBUG_PBCH - printf("m %d at k %d of l %d\n", m, k, l); + printf("m %d ssb_sc_idx %d at k %d of l %d\n", m, ssb_sc_idx, k, l); #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; - k+=(m==71)?148:4; // Jump from 44+nu to 192+nu + ((int16_t*)txdataF[aa])[(l*frame_parms->ofdm_symbol_size + k)<<1] = (a * mod_pbch_e[m<<1]) >> 15; + ((int16_t*)txdataF[aa])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1] = (a * mod_pbch_e[(m<<1) + 1]) >> 15; + k++; + m++; + } if (k >= frame_parms->ofdm_symbol_size) k-=frame_parms->ofdm_symbol_size; } - ///symbol 3 [0+nushift:4:236+nushift] -- 60 mod symbols - k = frame_parms->first_carrier_offset + frame_parms->ssb_start_subcarrier + nushift; + k += 144; + if (k >= frame_parms->ofdm_symbol_size) + k-=frame_parms->ofdm_symbol_size; + + m=216; + + for (int ssb_sc_idx = 192; ssb_sc_idx < 240; ssb_sc_idx++) { + + if ((ssb_sc_idx&3) == nushift) { + k++; + continue; + } + else { +#ifdef DEBUG_PBCH + printf("m %d ssb_sc_idx %d at k %d of l %d\n", m, ssb_sc_idx, k, l); +#endif + ((int16_t*)txdataF[aa])[(l*frame_parms->ofdm_symbol_size + k)<<1] = (a * mod_pbch_e[m<<1]) >> 15; + ((int16_t*)txdataF[aa])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1] = (a * mod_pbch_e[(m<<1) + 1]) >> 15; + k++; + m++; + } + + if (k >= frame_parms->ofdm_symbol_size) + k-=frame_parms->ofdm_symbol_size; + } + + ///symbol 3 [0:239] -- 180 mod symbols + k = frame_parms->first_carrier_offset + frame_parms->ssb_start_subcarrier; l++; + m=252; - for (int m = 84; m < NR_PBCH_DMRS_LENGTH; m++) { + for (int ssb_sc_idx = 0; ssb_sc_idx < 240; ssb_sc_idx++) { + + if ((ssb_sc_idx&3) == nushift) { + k++; + continue; + } + else { #ifdef DEBUG_PBCH - printf("m %d at k %d of l %d\n", m, k, l); + printf("m %d ssb_sc_idx %d at k %d of l %d\n", m, ssb_sc_idx, k, l); #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; - k+=4; + ((int16_t*)txdataF[aa])[(l*frame_parms->ofdm_symbol_size + k)<<1] = (a * mod_pbch_e[m<<1]) >> 15; + ((int16_t*)txdataF[aa])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1] = (a * mod_pbch_e[(m<<1) + 1]) >> 15; + k++; + m++; + } if (k >= frame_parms->ofdm_symbol_size) k-=frame_parms->ofdm_symbol_size; @@ -259,9 +323,9 @@ int nr_generate_pbch(NR_gNB_PBCH *pbch, #ifdef DEBUG_PBCH - write_output("txdataF.m", "txdataF", txdataF[0], frame_parms->samples_per_frame_wCP>>1, 1, 1); + write_output("txdataF_pbch.m", "txdataF_pbch", txdataF[0], frame_parms->samples_per_frame_wCP>>1, 1, 1); #endif -*/ + return 0; } diff --git a/openair1/PHY/NR_TRANSPORT/nr_transport.h b/openair1/PHY/NR_TRANSPORT/nr_transport.h index 736526218a869ebeac9acbbb9a159b86ec351843..58a4344e9dea09b2d1ed44f4629a06cda20d2c75 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_transport.h +++ b/openair1/PHY/NR_TRANSPORT/nr_transport.h @@ -72,6 +72,7 @@ int nr_generate_pbch_dmrs(uint32_t *gold_pbch_dmrs, @param */ void nr_pbch_scrambling(uint32_t Nid, + uint8_t nushift, uint8_t *pbch_a, uint32_t length); diff --git a/targets/RT/USER/nr-gnb.c b/targets/RT/USER/nr-gnb.c index 5b947c1ac46d0f5263061b9e27543b2c97fed2b0..5c29aab949259edfd98966f56a5a8f1929876809 100644 --- a/targets/RT/USER/nr-gnb.c +++ b/targets/RT/USER/nr-gnb.c @@ -20,7 +20,7 @@ */ /*! \file lte-enb.c - * \brief Top-level threads for eNodeB + * \brief Top-level threads for gNodeB * \author R. Knopp, F. Kaltenberger, Navid Nikaein * \date 2012 * \version 0.1