diff --git a/openair1/PHY/NR_REFSIG/nr_gen_mod_table.m b/openair1/PHY/NR_REFSIG/nr_gen_mod_table.m index ad03bc7d70327b636bc8229b5656b8b727d9497d..a081ad1baa1331cb94dd48b9dd96a3342dda4453 100644 --- a/openair1/PHY/NR_REFSIG/nr_gen_mod_table.m +++ b/openair1/PHY/NR_REFSIG/nr_gen_mod_table.m @@ -6,12 +6,22 @@ % Amplitude for BPSK (\f$ 2^15 \times 1/\sqrt{2}\f$) BPSK = 23170; +% Amplitude for QPSK (\f$ 2^15 \times 1/\sqrt{2}\f$) +QPSK = 23170; + % BPSK for b = 0:1 bpsk_table(b+1) = (1 - 2*b)*BPSK + 1j*(1-2*b)*BPSK; end -table = [ 0; bpsk_table(:) ]; +%% QPSK +for r=0:1 %0 -- 1 LS +for j=0:1 %0 -- 1 MS +qpsk_table(2*r+j+1) = ((1-r*2)*QPSK + 1j*(1-2*j)*QPSK); +end +end + +table = [ 0; bpsk_table(:); qpsk_table(:) ]; save mod_table.mat table @@ -20,10 +30,10 @@ table2(1:2:end) = real(table); table2(2:2:end) = imag(table); fd = fopen("nr_mod_table.h","w"); -fprintf(fd,"#define MOD_TABLE_SIZE_SHORT %d\n", length(table)*2); -fprintf(fd,"#define MOD_TABLE_BPSK_OFFSET %d\n", 1); +fprintf(fd,"#define NR_MOD_TABLE_SIZE_SHORT %d\n", length(table)*2); +fprintf(fd,"#define NR_MOD_TABLE_BPSK_OFFSET %d\n", 1); +fprintf(fd,"#define NR_MOD_TABLE_QPSK_OFFSET %d\n", 3); fprintf(fd,"short nr_mod_table[MOD_TABLE_SIZE_SHORT] = {"); fprintf(fd,"%d,",table2(1:end-1)); fprintf(fd,"%d};\n",table2(end)); fclose(fd); - diff --git a/openair1/PHY/NR_REFSIG/nr_mod_table.h b/openair1/PHY/NR_REFSIG/nr_mod_table.h index 513276e62084b12cd200cb4f11e402d25eebff3e..75d8262147c3bccf9b2cde236061a406610f968d 100644 --- a/openair1/PHY/NR_REFSIG/nr_mod_table.h +++ b/openair1/PHY/NR_REFSIG/nr_mod_table.h @@ -1,3 +1,4 @@ -#define MOD_TABLE_SIZE_SHORT 6 -#define MOD_TABLE_BPSK_OFFSET 1 -short nr_mod_table[MOD_TABLE_SIZE_SHORT] = {0,0,23170,23170,-23170,-23170}; +#define NR_MOD_TABLE_SIZE_SHORT 14 +#define NR_MOD_TABLE_BPSK_OFFSET 1 +#define NR_MOD_TABLE_QPSK_OFFSET 3 +short nr_mod_table[MOD_TABLE_SIZE_SHORT] = {0,0,23170,23170,-23170,-23170,23170,23170,23170,-23170,-23170,23170,-23170,-23170}; diff --git a/openair1/PHY/NR_TRANSPORT/nr_pbch.c b/openair1/PHY/NR_TRANSPORT/nr_pbch.c index fc70b201598bb9fbab138f94d275eda46b10891f..e068e6e644fc558787f8dc66f2f87f22636d7b19 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_pbch.c +++ b/openair1/PHY/NR_TRANSPORT/nr_pbch.c @@ -20,7 +20,7 @@ */ /*! \file PHY/NR_TRANSPORT/nr_pbch.c -* \brief Top-level routines for generating and decoding the PBCH/BCH physical/transport channel V15.1 03/2018 +* \brief Top-level routines for generating the PBCH/BCH physical/transport channel V15.1 03/2018 * \author Guy De Souza * \date 2018 * \version 0.1 @@ -35,7 +35,7 @@ //#define DEBUG_PBCH -short nr_mod_table[MOD_TABLE_SIZE_SHORT] = {0,0,23170,23170,-23170,-23170}; +extern short *nr_mod_table; int nr_generate_pbch_dmrs(uint32_t *gold_pbch_dmrs, int32_t **txdataF, @@ -53,8 +53,8 @@ int nr_generate_pbch_dmrs(uint32_t *gold_pbch_dmrs, /// BPSK modulation for (m=0; m<NR_PBCH_DMRS_LENGTH; m++) { - mod_dmrs[m<<1] = nr_mod_table[((1 + ((gold_pbch_dmrs[m>>5]&(1<<(m&0x1f)))>>(m&0x1f)))<<1)]; - mod_dmrs[(m<<1)+1] = nr_mod_table[((1 + ((gold_pbch_dmrs[m>>5]&(1<<(m&0x1f)))>>(m&0x1f)))<<1) + 1]; + 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 printf("m %d mod_dmrs %d %d\n", m, mod_dmrs[2*m], mod_dmrs[2*m+1]); #endif @@ -121,5 +121,26 @@ 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); #endif - return (0); + return 0; +} + +#define NR_PBCH_LENGTH 1000 + +int nr_generate_pbch(NR_gNB_PBCH *pbch, + uint8_t *pbch_pdu, + int32_t **txdataF, + int16_t amp, + uint8_t ssb_start_symbol, + uint8_t nu, + nfapi_config_request_t* config, + NR_DL_FRAME_PARMS *frame_parms) +{ + + int m,k,l; + int a, aa; + int16_t mod_payload[2 * NR_PBCH_LENGTH]; + + LOG_I(PHY, "PBCH generation started\n"); + + return 0; } diff --git a/openair1/PHY/NR_TRANSPORT/nr_pss.c b/openair1/PHY/NR_TRANSPORT/nr_pss.c index bce2d05b2bbbc86bd7cc6e15f435b706b8340fe7..88ab34b8e6393ed792c6e80c33fca3126080b43f 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_pss.c +++ b/openair1/PHY/NR_TRANSPORT/nr_pss.c @@ -23,8 +23,6 @@ //#define NR_PSS_DEBUG -//short nr_mod_table[MOD_TABLE_SIZE_SHORT] = {0,0,768,768,-768,-768}; - int nr_generate_pss( int16_t *d_pss, int32_t **txdataF, int16_t amp, diff --git a/openair1/PHY/NR_TRANSPORT/nr_sss.c b/openair1/PHY/NR_TRANSPORT/nr_sss.c index 7674fafd4f142588bf3eee88048dfaeded4c5052..5ec7d4e3202499fc4564f7260bb5548447a7e720 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_sss.c +++ b/openair1/PHY/NR_TRANSPORT/nr_sss.c @@ -21,8 +21,6 @@ #include "PHY/defs_gNB.h" -extern short nr_mod_table[MOD_TABLE_SIZE_SHORT]; - //#define NR_SSS_DEBUG int nr_generate_sss( int16_t *d_sss, diff --git a/openair1/PHY/defs_RU.h b/openair1/PHY/defs_RU.h index 02165f14b41ed73713b01160c472a843fd21ea7e..fb91d00e551dad4359c6bd60751ac25f630d6567 100644 --- a/openair1/PHY/defs_RU.h +++ b/openair1/PHY/defs_RU.h @@ -35,6 +35,7 @@ #define MAX_BANDS_PER_RRU 4 +#define MAX_NUM_RU_PER_gNB MAX_NUM_RU_PER_eNB #ifdef OCP_FRAMEWORK diff --git a/openair1/PHY/defs_gNB.h b/openair1/PHY/defs_gNB.h index 7706a6642580a29ed5abd9685268b9729a53114d..0d12dcb1628bd424e2fad8ccd56a2d5c550e7c83 100644 --- a/openair1/PHY/defs_gNB.h +++ b/openair1/PHY/defs_gNB.h @@ -36,6 +36,10 @@ #include "defs_nr_common.h" +typedef struct { + uint8_t pbch_d[100]; +} NR_gNB_PBCH; + typedef struct { /// \brief Pointers (dynamic) to the received data in the time domain. /// - first index: rx antenna [0..nb_antennas_rx[ @@ -169,9 +173,9 @@ typedef struct gNB_proc_t_s { typedef struct { // common measurements //! estimated noise power (linear) - unsigned int n0_power[MAX_NUM_RU_PER_eNB]; + unsigned int n0_power[MAX_NUM_RU_PER_gNB]; //! estimated noise power (dB) - unsigned short n0_power_dB[MAX_NUM_RU_PER_eNB]; + unsigned short n0_power_dB[MAX_NUM_RU_PER_gNB]; //! total estimated noise power (linear) unsigned int n0_power_tot; //! estimated avg noise power (dB) @@ -179,9 +183,9 @@ typedef struct { //! estimated avg noise power (dB) short n0_power_tot_dBm; //! estimated avg noise power per RB per RX ant (lin) - unsigned short n0_subband_power[MAX_NUM_RU_PER_eNB][100]; + unsigned short n0_subband_power[MAX_NUM_RU_PER_gNB][100]; //! estimated avg noise power per RB per RX ant (dB) - unsigned short n0_subband_power_dB[MAX_NUM_RU_PER_eNB][100]; + unsigned short n0_subband_power_dB[MAX_NUM_RU_PER_gNB][100]; //! estimated avg noise power per RB (dB) short n0_subband_power_tot_dB[100]; //! estimated avg noise power per RB (dBm) @@ -199,17 +203,17 @@ typedef struct { int rx_correlation_dB[NUMBER_OF_UE_MAX][2]; /// Wideband CQI (= SINR) - int wideband_cqi[NUMBER_OF_UE_MAX][MAX_NUM_RU_PER_eNB]; + int wideband_cqi[NUMBER_OF_UE_MAX][MAX_NUM_RU_PER_gNB]; /// Wideband CQI in dB (= SINR dB) - int wideband_cqi_dB[NUMBER_OF_UE_MAX][MAX_NUM_RU_PER_eNB]; + int wideband_cqi_dB[NUMBER_OF_UE_MAX][MAX_NUM_RU_PER_gNB]; /// Wideband CQI (sum of all RX antennas, in dB) char wideband_cqi_tot[NUMBER_OF_UE_MAX]; /// Subband CQI per RX antenna and RB (= SINR) - int subband_cqi[NUMBER_OF_UE_MAX][MAX_NUM_RU_PER_eNB][100]; + int subband_cqi[NUMBER_OF_UE_MAX][MAX_NUM_RU_PER_gNB][100]; /// Total Subband CQI and RB (= SINR) int subband_cqi_tot[NUMBER_OF_UE_MAX][100]; /// Subband CQI in dB and RB (= SINR dB) - int subband_cqi_dB[NUMBER_OF_UE_MAX][MAX_NUM_RU_PER_eNB][100]; + int subband_cqi_dB[NUMBER_OF_UE_MAX][MAX_NUM_RU_PER_gNB][100]; /// Total Subband CQI and RB int subband_cqi_tot_dB[NUMBER_OF_UE_MAX][100]; /// PRACH background noise level @@ -226,7 +230,7 @@ typedef struct PHY_VARS_gNB_s { int single_thread_flag; int abstraction_flag; int num_RU; - RU_t *RU_list[MAX_NUM_RU_PER_eNB]; + RU_t *RU_list[MAX_NUM_RU_PER_gNB]; /// Ethernet parameters for northbound midhaul interface eth_params_t eth_params_n; /// Ethernet parameters for fronthaul interface @@ -262,7 +266,7 @@ typedef struct PHY_VARS_gNB_s { NR_gNB_COMMON common_vars; LTE_eNB_UCI uci_vars[NUMBER_OF_UE_MAX]; LTE_eNB_SRS srs_vars[NUMBER_OF_UE_MAX]; - LTE_eNB_PBCH pbch; + NR_gNB_PBCH pbch; LTE_eNB_PUSCH *pusch_vars[NUMBER_OF_UE_MAX]; LTE_eNB_PRACH prach_vars; LTE_eNB_DLSCH_t *dlsch[NUMBER_OF_UE_MAX][2]; // Nusers times two spatial streams diff --git a/openair1/PHY/defs_nr_common.h b/openair1/PHY/defs_nr_common.h index b5b3943509dcbbfd6acbf89551ee85d194f512d7..0be8a2db5aff1575a393d5f2e31911ab2455c4b5 100644 --- a/openair1/PHY/defs_nr_common.h +++ b/openair1/PHY/defs_nr_common.h @@ -51,8 +51,9 @@ #define ONE_OVER_SQRT2_Q15 23170 #define ONE_OVER_TWO_Q15 16384 -#define MOD_TABLE_SIZE_SHORT 6 -#define MOD_TABLE_BPSK_OFFSET 1 +#define NR_MOD_TABLE_SIZE_SHORT 14 +#define NR_MOD_TABLE_BPSK_OFFSET 1 +#define NR_MOD_TABLE_QPSK_OFFSET 3 typedef enum { NR_MU_0=0, diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index 9ecb02e5646f1bee119c78071394e7a839abab76..4c2ea0b76793fcac5334a17a5e08342d9a6999ca 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -138,6 +138,7 @@ void nr_common_signal_procedures (PHY_VARS_gNB *gNB,int frame, int subframe) { nr_generate_pss(gNB->d_pss, txdataF, AMP, ssb_start_symbol, cfg, fp); nr_generate_sss(gNB->d_sss, txdataF, AMP_OVER_2, ssb_start_symbol, cfg, fp); nr_generate_pbch_dmrs(gNB->nr_gold_pbch_dmrs[n_hf][ssb_index],txdataF, AMP_OVER_2, ssb_start_symbol, nu, cfg, fp); + nr_generate_pbch(&gNB->pbch, pbch_pdu, txdataF, AMP_OVER_2, ssb_start_symbol, nu, cfg, fp); } } diff --git a/targets/RT/USER/nr-softmodem.c b/targets/RT/USER/nr-softmodem.c index cca572f108832c5f9874419034e697cabb0b2fc6..506a34d81abfe332582cc21894e88610e129a2f7 100644 --- a/targets/RT/USER/nr-softmodem.c +++ b/targets/RT/USER/nr-softmodem.c @@ -94,6 +94,8 @@ unsigned short config_frames[4] = {2,9,11,13}; // current status is that every UE has a DL scope for a SINGLE eNB (gnb_id=0) // at eNB 0, an UL scope for every UE +short nr_mod_table[NR_MOD_TABLE_SIZE_SHORT] = {0,0,23170,23170,-23170,-23170,23170,23170,23170,-23170,-23170,23170,-23170,-23170}; + FD_lte_phy_scope_ue *form_ue[NUMBER_OF_UE_MAX]; FD_lte_phy_scope_enb *form_enb[MAX_NUM_CCs][NUMBER_OF_UE_MAX]; FD_stats_form *form_stats=NULL,*form_stats_l2=NULL;