tested with slot-based processing for 40 and 80 MHz channels
This commit is contained in:
@@ -165,20 +165,16 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB,
|
||||
|
||||
|
||||
common_vars->rxdata = (int32_t **)NULL;
|
||||
common_vars->txdataF = (int32_t **)malloc16(NB_ANTENNA_PORTS_ENB*sizeof(int32_t*));
|
||||
common_vars->txdataF = (int32_t **)malloc16(15*sizeof(int32_t*));
|
||||
common_vars->rxdataF = (int32_t **)malloc16(64*sizeof(int32_t*));
|
||||
|
||||
LOG_D(PHY,"[INIT] NB_ANTENNA_PORTS_ENB:%d fp->nb_antenna_ports_gNB:%d\n", NB_ANTENNA_PORTS_ENB, cfg->rf_config.tx_antenna_ports.value);
|
||||
|
||||
for (i=0; i<NB_ANTENNA_PORTS_ENB; i++) {
|
||||
if (i<cfg->rf_config.tx_antenna_ports.value || i==5) {
|
||||
for (i=0;i<15;i++){
|
||||
common_vars->txdataF[i] = (int32_t*)malloc16_clear(fp->samples_per_frame_wCP*sizeof(int32_t) );
|
||||
|
||||
LOG_D(PHY,"[INIT] common_vars->txdataF[%d] = %p (%lu bytes)\n",
|
||||
i,common_vars->txdataF[i],
|
||||
fp->samples_per_frame_wCP*sizeof(int32_t));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Channel estimates for SRS
|
||||
@@ -306,11 +302,9 @@ void phy_free_nr_gNB(PHY_VARS_gNB *gNB)
|
||||
|
||||
int i, UE_id;
|
||||
|
||||
for (i = 0; i < NB_ANTENNA_PORTS_ENB; i++) {
|
||||
if (i < cfg->rf_config.tx_antenna_ports.value || i == 5) {
|
||||
free_and_zero(common_vars->txdataF[i]);
|
||||
for (i = 0; i < 15; i++) {
|
||||
free_and_zero(common_vars->txdataF[i]);
|
||||
/* rxdataF[i] is not allocated -> don't free */
|
||||
}
|
||||
}
|
||||
free_and_zero(common_vars->txdataF);
|
||||
free_and_zero(common_vars->rxdataF);
|
||||
@@ -381,7 +375,6 @@ void nr_phy_config_request_sim(PHY_VARS_gNB *gNB,int N_RB_DL,int N_RB_UL,int mu)
|
||||
gNB_config->nfapi_config.nrarfcn.value = 620000;
|
||||
gNB_config->subframe_config.numerology_index_mu.value = mu;
|
||||
gNB_config->subframe_config.duplex_mode.value = TDD;
|
||||
gNB_config->rf_config.tx_antenna_ports.value = 1;
|
||||
gNB_config->rf_config.dl_carrier_bandwidth.value = N_RB_DL;
|
||||
gNB_config->rf_config.ul_carrier_bandwidth.value = N_RB_UL;
|
||||
gNB_config->sch_config.half_frame_index.value = 0;
|
||||
@@ -416,7 +409,6 @@ void nr_phy_config_request(NR_PHY_Config_t *phy_config)
|
||||
gNB_config->nfapi_config.rf_bands.rf_band[0] = phy_config->cfg->nfapi_config.rf_bands.rf_band[0]; //22
|
||||
gNB_config->nfapi_config.nrarfcn.value = phy_config->cfg->nfapi_config.nrarfcn.value; //6600
|
||||
gNB_config->subframe_config.numerology_index_mu.value = phy_config->cfg->subframe_config.numerology_index_mu.value;//1
|
||||
gNB_config->rf_config.tx_antenna_ports.value = phy_config->cfg->rf_config.tx_antenna_ports.value; //1
|
||||
gNB_config->rf_config.dl_carrier_bandwidth.value = phy_config->cfg->rf_config.dl_carrier_bandwidth.value;//106;
|
||||
gNB_config->rf_config.ul_carrier_bandwidth.value = phy_config->cfg->rf_config.ul_carrier_bandwidth.value;//106;
|
||||
gNB_config->sch_config.half_frame_index.value = 0;
|
||||
@@ -437,14 +429,13 @@ void nr_phy_config_request(NR_PHY_Config_t *phy_config)
|
||||
fp->ul_CarrierFreq = fp->dl_CarrierFreq - (get_uldl_offset(gNB_config->nfapi_config.rf_bands.rf_band[0])*100000);
|
||||
fp->threequarter_fs = 0;
|
||||
|
||||
LOG_I(PHY,"Configuring MIB for instance %d, CCid %d : (band %d,N_RB_DL %d, N_RB_UL %d, Nid_cell %d,gNB_tx_antenna_ports %d,DL freq %u)\n",
|
||||
LOG_I(PHY,"Configuring MIB for instance %d, CCid %d : (band %d,N_RB_DL %d, N_RB_UL %d, Nid_cell %d,DL freq %u)\n",
|
||||
Mod_id,
|
||||
CC_id,
|
||||
gNB_config->nfapi_config.rf_bands.rf_band[0],
|
||||
gNB_config->rf_config.dl_carrier_bandwidth.value,
|
||||
gNB_config->rf_config.ul_carrier_bandwidth.value,
|
||||
gNB_config->sch_config.physical_cell_id.value,
|
||||
gNB_config->rf_config.tx_antenna_ports.value,
|
||||
fp->dl_CarrierFreq );
|
||||
|
||||
nr_init_frame_parms(gNB_config, fp);
|
||||
|
||||
@@ -107,9 +107,7 @@ int nr_phy_init_RU(RU_t *ru) {
|
||||
|
||||
for (i=0; i<RC.nb_nr_L1_inst; i++) {
|
||||
for (p=0;p<15;p++) {
|
||||
LOG_D(PHY,"[INIT] %s() nb_antenna_ports_eNB:%d \n", __FUNCTION__, ru->gNB_list[i]->gNB_config.rf_config.tx_antenna_ports.value);
|
||||
if (p<ru->gNB_list[i]->gNB_config.rf_config.tx_antenna_ports.value || p==5) {
|
||||
LOG_D(PHY,"[INIT] %s() DO BEAM WEIGHTS nb_antenna_ports_eNB:%d nb_tx:%d\n", __FUNCTION__, ru->gNB_list[i]->gNB_config.rf_config.tx_antenna_ports.value, ru->nb_tx);
|
||||
if (p == 0|| p==5) {
|
||||
ru->beam_weights[i][p] = (int32_t **)malloc16_clear(ru->nb_tx*sizeof(int32_t*));
|
||||
for (j=0; j<ru->nb_tx; j++) {
|
||||
ru->beam_weights[i][p][j] = (int32_t *)malloc16_clear(fp->ofdm_symbol_size*sizeof(int32_t));
|
||||
@@ -180,7 +178,7 @@ void nr_phy_free_RU(RU_t *ru)
|
||||
|
||||
for (i = 0; i < RC.nb_nr_L1_inst; i++) {
|
||||
for (p = 0; p < 15; p++) {
|
||||
if (p < ru->gNB_list[i]->gNB_config.rf_config.tx_antenna_ports.value || p == 5) {
|
||||
if (p == 0 || p == 5) {
|
||||
for (j=0; j<ru->nb_tx; j++) free_and_zero(ru->beam_weights[i][p][j]);
|
||||
free_and_zero(ru->beam_weights[i][p]);
|
||||
}
|
||||
|
||||
@@ -162,7 +162,7 @@ void nr_pdcch_scrambling(uint32_t *in,
|
||||
uint8_t nr_generate_dci_top(NR_gNB_PDCCH pdcch_vars,
|
||||
t_nrPolar_paramsPtr *nrPolar_params,
|
||||
uint32_t **gold_pdcch_dmrs,
|
||||
int32_t** txdataF,
|
||||
int32_t* txdataF,
|
||||
int16_t amp,
|
||||
NR_DL_FRAME_PARMS frame_parms,
|
||||
nfapi_nr_config_request_t config)
|
||||
@@ -216,14 +216,13 @@ uint8_t nr_generate_dci_top(NR_gNB_PDCCH pdcch_vars,
|
||||
uint32_t encoder_output[NR_MAX_DCI_SIZE_DWORD];
|
||||
uint16_t n_RNTI = (pdcch_params.search_space_type == NFAPI_NR_SEARCH_SPACE_TYPE_UE_SPECIFIC)? ((pdcch_params.scrambling_id)?pdcch_params.rnti:0) : 0;
|
||||
uint16_t Nid = (pdcch_params.search_space_type == NFAPI_NR_SEARCH_SPACE_TYPE_UE_SPECIFIC)? pdcch_params.scrambling_id : config.sch_config.physical_cell_id.value;
|
||||
#ifdef PDCCH_TEST_POLAR_TEMP_FIX
|
||||
t_nrPolar_paramsPtr currentPtr = NULL;//, polarParams = NULL;
|
||||
nr_polar_init(¤tPtr, NR_POLAR_DCI_MESSAGE_TYPE, dci_alloc.size, dci_alloc.L);
|
||||
//#ifdef PDCCH_TEST_POLAR_TEMP_FIX
|
||||
// nr_polar_init(¤tPtr, NR_POLAR_DCI_MESSAGE_TYPE, dci_alloc.size, dci_alloc.L);
|
||||
// t_nrPolar_paramsPtr currentPtr = nr_polar_params(*nrPolar_params, NR_POLAR_DCI_MESSAGE_TYPE, dci_alloc.size, dci_alloc.L);
|
||||
#else
|
||||
//#else
|
||||
nr_polar_init(nrPolar_params, NR_POLAR_DCI_MESSAGE_TYPE, dci_alloc.size, dci_alloc.L);
|
||||
t_nrPolar_paramsPtr currentPtr = nr_polar_params(*nrPolar_params, NR_POLAR_DCI_MESSAGE_TYPE, dci_alloc.size, dci_alloc.L);
|
||||
#endif
|
||||
//#endif
|
||||
|
||||
//polar_encoder_dci(dci_alloc.dci_pdu, encoder_output, currentPtr, pdcch_params.rnti);
|
||||
polar_encoder_fast(dci_alloc.dci_pdu, encoder_output, pdcch_params.rnti,currentPtr);
|
||||
@@ -261,10 +260,7 @@ printf("scrambled output: [0]->0x%08x \t [1]->0x%08x \t [2]->0x%08x \t [3]->0x%0
|
||||
}
|
||||
|
||||
/// Resource mapping
|
||||
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++)
|
||||
{
|
||||
if (cset_start_sc >= frame_parms.ofdm_symbol_size)
|
||||
cset_start_sc -= frame_parms.ofdm_symbol_size;
|
||||
|
||||
@@ -293,8 +289,8 @@ printf("scrambled output: [0]->0x%08x \t [1]->0x%08x \t [2]->0x%08x \t [3]->0x%0
|
||||
dmrs_idx = 0;
|
||||
k = cset_start_sc + 1;
|
||||
while (dmrs_idx<3*pdcch_params.n_rb) {
|
||||
((int16_t*)txdataF[aa])[(l*frame_parms.ofdm_symbol_size + k)<<1] = (a * mod_dmrs[l][dmrs_idx<<1]) >> 15;
|
||||
((int16_t*)txdataF[aa])[((l*frame_parms.ofdm_symbol_size + k)<<1) + 1] = (a * mod_dmrs[l][(dmrs_idx<<1) + 1]) >> 15;
|
||||
((int16_t*)txdataF)[(l*frame_parms.ofdm_symbol_size + k)<<1] = (amp * mod_dmrs[l][dmrs_idx<<1]) >> 15;
|
||||
((int16_t*)txdataF)[((l*frame_parms.ofdm_symbol_size + k)<<1) + 1] = (amp * mod_dmrs[l][(dmrs_idx<<1) + 1]) >> 15;
|
||||
#ifdef DEBUG_PDCCH_DMRS
|
||||
printf("symbol %d position %d => (%d,%d)\n",l,k,((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
|
||||
@@ -319,8 +315,8 @@ printf("scrambled output: [0]->0x%08x \t [1]->0x%08x \t [2]->0x%08x \t [3]->0x%0
|
||||
for (int m=0; m<NR_NB_SC_PER_RB; m++) {
|
||||
if ( m == (k_prime<<2)+1) { // DMRS if not already mapped
|
||||
if (pdcch_params.precoder_granularity == NFAPI_NR_CSET_SAME_AS_REG_BUNDLE) {
|
||||
((int16_t*)txdataF[aa])[(l*frame_parms.ofdm_symbol_size + k)<<1] = (a * mod_dmrs[l][dmrs_idx<<1]) >> 15;
|
||||
((int16_t*)txdataF[aa])[((l*frame_parms.ofdm_symbol_size + k)<<1) + 1] = (a * mod_dmrs[l][(dmrs_idx<<1) + 1]) >> 15;
|
||||
((int16_t*)txdataF)[(l*frame_parms.ofdm_symbol_size + k)<<1] = (amp * mod_dmrs[l][dmrs_idx<<1]) >> 15;
|
||||
((int16_t*)txdataF)[((l*frame_parms.ofdm_symbol_size + k)<<1) + 1] = (amp * mod_dmrs[l][(dmrs_idx<<1) + 1]) >> 15;
|
||||
#ifdef DEBUG_PDCCH_DMRS
|
||||
printf("l %d position %d => (%d,%d)\n",l,k,((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
|
||||
@@ -329,8 +325,8 @@ printf("scrambled output: [0]->0x%08x \t [1]->0x%08x \t [2]->0x%08x \t [3]->0x%0
|
||||
}
|
||||
}
|
||||
else { // DCI payload
|
||||
((int16_t*)txdataF[aa])[(l*frame_parms.ofdm_symbol_size + k)<<1] = (a * mod_dci[dci_idx<<1]) >> 15;
|
||||
((int16_t*)txdataF[aa])[((l*frame_parms.ofdm_symbol_size + k)<<1) + 1] = (a * mod_dci[(dci_idx<<1) + 1]) >> 15;
|
||||
((int16_t*)txdataF)[(l*frame_parms.ofdm_symbol_size + k)<<1] = (amp * mod_dci[dci_idx<<1]) >> 15;
|
||||
((int16_t*)txdataF)[((l*frame_parms.ofdm_symbol_size + k)<<1) + 1] = (amp * mod_dci[(dci_idx<<1) + 1]) >> 15;
|
||||
//printf("dci output %d %d\n",(a * mod_dci[dci_idx<<1]) >> 15, (a * mod_dci[(dci_idx<<1) + 1]) >> 15);
|
||||
dci_idx++;
|
||||
}
|
||||
@@ -339,7 +335,6 @@ printf("scrambled output: [0]->0x%08x \t [1]->0x%08x \t [2]->0x%08x \t [3]->0x%0
|
||||
k -= frame_parms.ofdm_symbol_size;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef DEBUG_DCI
|
||||
write_output("txdataF_dci.m", "txdataF_dci", txdataF[0], frame_parms.samples_per_frame_wCP>>1, 1, 1);
|
||||
|
||||
@@ -35,7 +35,7 @@ uint16_t nr_get_dci_size(nfapi_nr_dci_format_e format,
|
||||
uint8_t nr_generate_dci_top(NR_gNB_PDCCH pdcch_vars,
|
||||
t_nrPolar_paramsPtr *nrPolar_params,
|
||||
uint32_t **gold_pdcch_dmrs,
|
||||
int32_t** txdataF,
|
||||
int32_t* txdataF,
|
||||
int16_t amp,
|
||||
NR_DL_FRAME_PARMS frame_parms,
|
||||
nfapi_nr_config_request_t config);
|
||||
|
||||
@@ -46,7 +46,7 @@ uint8_t nr_pbch_payload_interleaving_pattern[32] = {16, 23, 18, 17, 8, 30, 10, 6
|
||||
9, 11, 12, 13, 14, 15, 19, 20, 21, 22, 25, 26, 27, 28, 29, 31};
|
||||
|
||||
int nr_generate_pbch_dmrs(uint32_t *gold_pbch_dmrs,
|
||||
int32_t **txdataF,
|
||||
int32_t *txdataF,
|
||||
int16_t amp,
|
||||
uint8_t ssb_start_symbol,
|
||||
nfapi_nr_config_request_t* config,
|
||||
@@ -72,10 +72,7 @@ int nr_generate_pbch_dmrs(uint32_t *gold_pbch_dmrs,
|
||||
}
|
||||
|
||||
/// Resource mapping
|
||||
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
|
||||
@@ -86,12 +83,12 @@ int nr_generate_pbch_dmrs(uint32_t *gold_pbch_dmrs,
|
||||
#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;
|
||||
((int16_t*)txdataF[aa])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1] = (a * mod_dmrs[(m<<1) + 1]) >> 15;
|
||||
((int16_t*)txdataF)[(l*frame_parms->ofdm_symbol_size + k)<<1] = (amp * mod_dmrs[m<<1]) >> 15;
|
||||
((int16_t*)txdataF)[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1] = (amp * 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]);
|
||||
((int16_t*)txdataF)[(l*frame_parms->ofdm_symbol_size + k)<<1],
|
||||
((int16_t*)txdataF)[((l*frame_parms->ofdm_symbol_size + k)<<1)+1]);
|
||||
#endif
|
||||
k+=4;
|
||||
|
||||
@@ -107,12 +104,12 @@ int nr_generate_pbch_dmrs(uint32_t *gold_pbch_dmrs,
|
||||
#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;
|
||||
((int16_t*)txdataF[aa])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1] = (a * mod_dmrs[(m<<1) + 1]) >> 15;
|
||||
((int16_t*)txdataF)[(l*frame_parms->ofdm_symbol_size + k)<<1] = (amp * mod_dmrs[m<<1]) >> 15;
|
||||
((int16_t*)txdataF)[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1] = (amp * 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]);
|
||||
((int16_t*)txdataF)[(l*frame_parms->ofdm_symbol_size + k)<<1],
|
||||
((int16_t*)txdataF)[((l*frame_parms->ofdm_symbol_size + k)<<1)+1]);
|
||||
#endif
|
||||
k+=(m==71)?148:4; // Jump from 44+nu to 192+nu
|
||||
|
||||
@@ -128,12 +125,12 @@ int nr_generate_pbch_dmrs(uint32_t *gold_pbch_dmrs,
|
||||
#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;
|
||||
((int16_t*)txdataF[aa])[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1] = (a * mod_dmrs[(m<<1) + 1]) >> 15;
|
||||
((int16_t*)txdataF)[(l*frame_parms->ofdm_symbol_size + k)<<1] = (amp * mod_dmrs[m<<1]) >> 15;
|
||||
((int16_t*)txdataF)[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1] = (amp * 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]);
|
||||
((int16_t*)txdataF)[(l*frame_parms->ofdm_symbol_size + k)<<1],
|
||||
((int16_t*)txdataF)[((l*frame_parms->ofdm_symbol_size + k)<<1)+1]);
|
||||
#endif
|
||||
k+=4;
|
||||
|
||||
@@ -141,7 +138,6 @@ int nr_generate_pbch_dmrs(uint32_t *gold_pbch_dmrs,
|
||||
k-=frame_parms->ofdm_symbol_size;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
#ifdef DEBUG_PBCH_DMRS
|
||||
@@ -232,7 +228,7 @@ int nr_generate_pbch(NR_gNB_PBCH *pbch,
|
||||
t_nrPolar_paramsPtr polar_params,
|
||||
uint8_t *pbch_pdu,
|
||||
uint8_t *interleaver,
|
||||
int32_t **txdataF,
|
||||
int32_t *txdataF,
|
||||
int16_t amp,
|
||||
uint8_t ssb_start_symbol,
|
||||
uint8_t n_hf,
|
||||
@@ -337,10 +333,7 @@ int nr_generate_pbch(NR_gNB_PBCH *pbch,
|
||||
|
||||
/// Resource mapping
|
||||
nushift = config->sch_config.physical_cell_id.value &3;
|
||||
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 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
|
||||
@@ -358,8 +351,8 @@ int nr_generate_pbch(NR_gNB_PBCH *pbch,
|
||||
#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;
|
||||
((int16_t*)txdataF)[(l*frame_parms->ofdm_symbol_size + k)<<1] = (amp * mod_pbch_e[m<<1]) >> 15;
|
||||
((int16_t*)txdataF)[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1] = (amp * mod_pbch_e[(m<<1) + 1]) >> 15;
|
||||
k++;
|
||||
m++;
|
||||
}
|
||||
@@ -383,8 +376,8 @@ int nr_generate_pbch(NR_gNB_PBCH *pbch,
|
||||
#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;
|
||||
((int16_t*)txdataF)[(l*frame_parms->ofdm_symbol_size + k)<<1] = (amp * mod_pbch_e[m<<1]) >> 15;
|
||||
((int16_t*)txdataF)[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1] = (amp * mod_pbch_e[(m<<1) + 1]) >> 15;
|
||||
k++;
|
||||
m++;
|
||||
}
|
||||
@@ -409,8 +402,8 @@ int nr_generate_pbch(NR_gNB_PBCH *pbch,
|
||||
#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;
|
||||
((int16_t*)txdataF)[(l*frame_parms->ofdm_symbol_size + k)<<1] = (amp * mod_pbch_e[m<<1]) >> 15;
|
||||
((int16_t*)txdataF)[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1] = (amp * mod_pbch_e[(m<<1) + 1]) >> 15;
|
||||
k++;
|
||||
m++;
|
||||
}
|
||||
@@ -434,8 +427,8 @@ int nr_generate_pbch(NR_gNB_PBCH *pbch,
|
||||
#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;
|
||||
((int16_t*)txdataF)[(l*frame_parms->ofdm_symbol_size + k)<<1] = (amp * mod_pbch_e[m<<1]) >> 15;
|
||||
((int16_t*)txdataF)[((l*frame_parms->ofdm_symbol_size + k)<<1) + 1] = (amp * mod_pbch_e[(m<<1) + 1]) >> 15;
|
||||
k++;
|
||||
m++;
|
||||
}
|
||||
@@ -444,7 +437,6 @@ int nr_generate_pbch(NR_gNB_PBCH *pbch,
|
||||
k-=frame_parms->ofdm_symbol_size;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
#ifdef DEBUG_PBCH
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
//#define NR_PSS_DEBUG
|
||||
|
||||
int nr_generate_pss( int16_t *d_pss,
|
||||
int32_t **txdataF,
|
||||
int32_t *txdataF,
|
||||
int16_t amp,
|
||||
uint8_t ssb_start_symbol,
|
||||
nfapi_nr_config_request_t* config,
|
||||
@@ -57,10 +57,8 @@ int nr_generate_pss( int16_t *d_pss,
|
||||
#endif
|
||||
|
||||
/// Resource mapping
|
||||
a = (config->rf_config.tx_antenna_ports.value == 1) ? amp : (amp*ONE_OVER_SQRT2_Q15)>>15;
|
||||
a = amp;
|
||||
|
||||
for (int aa = 0; aa < config->rf_config.tx_antenna_ports.value; aa++)
|
||||
{
|
||||
|
||||
// PSS occupies a predefined position (subcarriers 56-182, symbol 0) within the SSB block starting from
|
||||
k = frame_parms->first_carrier_offset + frame_parms->ssb_start_subcarrier + 56; //and
|
||||
@@ -70,13 +68,12 @@ int nr_generate_pss( int16_t *d_pss,
|
||||
|
||||
for (m = 0; m < NR_PSS_LENGTH; m++) {
|
||||
// printf("pss: writing position k %d / %d\n",k,frame_parms->ofdm_symbol_size);
|
||||
((int16_t*)txdataF[aa])[2*(l*frame_parms->ofdm_symbol_size + k)] = (a * d_pss[m]) >> 15;
|
||||
((int16_t*)txdataF)[2*(l*frame_parms->ofdm_symbol_size + k)] = (a * d_pss[m]) >> 15;
|
||||
k++;
|
||||
|
||||
if (k >= frame_parms->ofdm_symbol_size)
|
||||
k-=frame_parms->ofdm_symbol_size;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef NR_PSS_DEBUG
|
||||
LOG_M("pss_0.m", "pss_0",
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
//#define NR_SSS_DEBUG
|
||||
|
||||
int nr_generate_sss( int16_t *d_sss,
|
||||
int32_t **txdataF,
|
||||
int32_t *txdataF,
|
||||
int16_t amp,
|
||||
uint8_t ssb_start_symbol,
|
||||
nfapi_nr_config_request_t* config,
|
||||
@@ -65,23 +65,18 @@ int nr_generate_sss( int16_t *d_sss,
|
||||
#endif
|
||||
|
||||
/// Resource mapping
|
||||
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++)
|
||||
{
|
||||
|
||||
// SSS occupies a predefined position (subcarriers 56-182, symbol 2) within the SSB block starting from
|
||||
k = frame_parms->first_carrier_offset + frame_parms->ssb_start_subcarrier + 56; //and
|
||||
l = ssb_start_symbol + 2;
|
||||
|
||||
for (int m = 0; m < NR_SSS_LENGTH; m++) {
|
||||
((int16_t*)txdataF[aa])[2*(l*frame_parms->ofdm_symbol_size + k)] = (a * d_sss[m]) >> 15;
|
||||
((int16_t*)txdataF)[2*(l*frame_parms->ofdm_symbol_size + k)] = (amp * d_sss[m]) >> 15;
|
||||
k++;
|
||||
|
||||
if (k >= frame_parms->ofdm_symbol_size)
|
||||
k-=frame_parms->ofdm_symbol_size;
|
||||
}
|
||||
}
|
||||
#ifdef NR_SSS_DEBUG
|
||||
// write_output("sss_0.m", "sss_0", (void*)txdataF[0][l*frame_parms->ofdm_symbol_size], frame_parms->ofdm_symbol_size, 1, 1);
|
||||
#endif
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
@returns 0 on success
|
||||
*/
|
||||
int nr_generate_pss( int16_t *d_pss,
|
||||
int32_t **txdataF,
|
||||
int32_t *txdataF,
|
||||
int16_t amp,
|
||||
uint8_t ssb_start_symbol,
|
||||
nfapi_nr_config_request_t* config,
|
||||
@@ -46,7 +46,7 @@ int nr_generate_pss( int16_t *d_pss,
|
||||
@returns 0 on success
|
||||
*/
|
||||
int nr_generate_sss( int16_t *d_sss,
|
||||
int32_t **txdataF,
|
||||
int32_t *txdataF,
|
||||
int16_t amp,
|
||||
uint8_t ssb_start_symbol,
|
||||
nfapi_nr_config_request_t* config,
|
||||
@@ -59,7 +59,7 @@ int nr_generate_sss( int16_t *d_sss,
|
||||
@returns 0 on success
|
||||
*/
|
||||
int nr_generate_pbch_dmrs(uint32_t *gold_pbch_dmrs,
|
||||
int32_t **txdataF,
|
||||
int32_t *txdataF,
|
||||
int16_t amp,
|
||||
uint8_t ssb_start_symbol,
|
||||
nfapi_nr_config_request_t* config,
|
||||
@@ -88,7 +88,7 @@ int nr_generate_pbch(NR_gNB_PBCH *pbch,
|
||||
t_nrPolar_paramsPtr polar_params,
|
||||
uint8_t *pbch_pdu,
|
||||
uint8_t *interleaver,
|
||||
int32_t **txdataF,
|
||||
int32_t *txdataF,
|
||||
int16_t amp,
|
||||
uint8_t ssb_start_symbol,
|
||||
uint8_t n_hf,
|
||||
|
||||
@@ -222,7 +222,7 @@ typedef struct NR_DL_FRAME_PARMS {
|
||||
uint32_t samples_per_slot_wCP;
|
||||
/// Number of samples in a radio frame without CP
|
||||
uint32_t samples_per_frame_wCP;
|
||||
/// Number of samples in a tti (same as subrame in LTE, depending on numerology in NR)
|
||||
/// Number of samples in a tti (same as subrame in LTE, slot in NR)
|
||||
uint32_t samples_per_tti;
|
||||
/// NR numerology index [0..5] as specified in 38.211 Section 4 (mu). 0=15khZ SCS, 1=30khZ, 2=60kHz, etc
|
||||
uint8_t numerology_index;
|
||||
|
||||
@@ -62,12 +62,12 @@ void handle_nfapi_nr_dci_dl_pdu(PHY_VARS_gNB *gNB,
|
||||
int idx = slot&1;
|
||||
NR_gNB_PDCCH *pdcch_vars = &gNB->pdcch_vars;
|
||||
|
||||
LOG_D(PHY,"Frame %d, Slot %d: DCI processing - populating pdcch_vars->dci_alloc[%d] proc:slot_tx:%d idx:%d pdcch_vars->num_dci:%d\n",frame,slot, pdcch_vars->num_dci, proc->slot_tx, idx, pdcch_vars->num_dci);
|
||||
LOG_I(PHY,"Frame %d, Slot %d: DCI processing - populating pdcch_vars->dci_alloc[%d] proc:slot_tx:%d idx:%d pdcch_vars->num_dci:%d\n",frame,slot, pdcch_vars->num_dci, proc->slot_tx, idx, pdcch_vars->num_dci);
|
||||
|
||||
// copy dci configuration into gNB structure
|
||||
nr_fill_dci_and_dlsch(gNB,frame,slot,proc,&pdcch_vars->dci_alloc[pdcch_vars->num_dci],dl_config_pdu);
|
||||
|
||||
LOG_D(PHY,"Frame %d, Slot %d: DCI processing - populated pdcch_vars->dci_alloc[%d] proc:slot_tx:%d idx:%d pdcch_vars->num_dci:%d\n",proc->frame_tx,proc->slot_tx, pdcch_vars->num_dci, proc->slot_tx, idx, pdcch_vars->num_dci);
|
||||
LOG_I(PHY,"Frame %d, Slot %d: DCI processing - populated pdcch_vars->dci_alloc[%d] proc:slot_tx:%d idx:%d pdcch_vars->num_dci:%d\n",proc->frame_tx,proc->slot_tx, pdcch_vars->num_dci, proc->slot_tx, idx, pdcch_vars->num_dci);
|
||||
}
|
||||
|
||||
|
||||
@@ -80,7 +80,7 @@ void nr_schedule_response(NR_Sched_Rsp_t *Sched_INFO){
|
||||
nfapi_nr_dl_config_request_t *DL_req = Sched_INFO->DL_req;
|
||||
nfapi_tx_request_t *TX_req = Sched_INFO->TX_req;
|
||||
frame_t frame = Sched_INFO->frame;
|
||||
sub_frame_t slot = Sched_INFO->slot;
|
||||
sub_frame_t slot = Sched_INFO->slot;
|
||||
|
||||
AssertFatal(RC.gNB!=NULL,"RC.gNB is null\n");
|
||||
AssertFatal(RC.gNB[Mod_id]!=NULL,"RC.gNB[%d] is null\n",Mod_id);
|
||||
@@ -103,6 +103,8 @@ void nr_schedule_response(NR_Sched_Rsp_t *Sched_INFO){
|
||||
int do_oai =0;
|
||||
int dont_send =0;
|
||||
|
||||
gNB->pdcch_vars.num_dci=0;
|
||||
|
||||
for (i=0;i<number_dl_pdu;i++) {
|
||||
dl_config_pdu = &DL_req->dl_config_request_body.dl_config_pdu_list[i];
|
||||
LOG_D(PHY,"NFAPI: dl_pdu %d : type %d\n",i,dl_config_pdu->pdu_type);
|
||||
|
||||
@@ -66,7 +66,7 @@ void nr_feptx0(RU_t *ru,int first_symbol, int num_symbols) {
|
||||
int slot = ru->proc.tti_tx;
|
||||
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPTX_OFDM, 1 );
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPTX_OFDM+(first_symbol!=0?1:0) , 1 );
|
||||
|
||||
slot_offset = slot*fp->samples_per_slot;
|
||||
slot_offsetF = first_symbol*fp->ofdm_symbol_size;
|
||||
@@ -109,7 +109,7 @@ void nr_feptx0(RU_t *ru,int first_symbol, int num_symbols) {
|
||||
}
|
||||
}
|
||||
}
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPTX_OFDM, 0);
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPTX_OFDM+(first_symbol!=0?1:0), 0);
|
||||
}
|
||||
|
||||
void nr_feptx_ofdm_2thread(RU_t *ru) {
|
||||
|
||||
@@ -137,20 +137,20 @@ void nr_common_signal_procedures (PHY_VARS_gNB *gNB,int frame, int slot) {
|
||||
// Current implementation is based on SSB in first half frame, first candidate
|
||||
LOG_D(PHY,"SS TX: frame %d, slot %d, start_symbol %d\n",frame,slot, ssb_start_symbol);
|
||||
|
||||
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_pss(gNB->d_pss, txdataF[0], AMP, ssb_start_symbol, cfg, fp);
|
||||
nr_generate_sss(gNB->d_sss, txdataF[0], AMP_OVER_2, ssb_start_symbol, cfg, fp);
|
||||
|
||||
if (!(frame&7)){
|
||||
LOG_D(PHY,"%d.%d : pbch_configured %d\n",frame,slot,gNB->pbch_configured);
|
||||
if (gNB->pbch_configured != 1)return;
|
||||
gNB->pbch_configured = 0;
|
||||
}
|
||||
nr_generate_pbch_dmrs(gNB->nr_gold_pbch_dmrs[n_hf][ssb_index],txdataF, AMP_OVER_2, ssb_start_symbol, cfg, fp);
|
||||
nr_generate_pbch_dmrs(gNB->nr_gold_pbch_dmrs[n_hf][ssb_index],txdataF[0], AMP_OVER_2, ssb_start_symbol, cfg, fp);
|
||||
nr_generate_pbch(&gNB->pbch,
|
||||
gNB->nrPolar_params,
|
||||
pbch_pdu,
|
||||
gNB->nr_pbch_interleaver,
|
||||
txdataF,
|
||||
txdataF[0],
|
||||
AMP_OVER_2,
|
||||
ssb_start_symbol,
|
||||
n_hf,Lmax,ssb_index,
|
||||
@@ -179,7 +179,7 @@ void phy_procedures_gNB_TX(PHY_VARS_gNB *gNB,
|
||||
if (do_meas==1) start_meas(&gNB->phy_proc_tx);
|
||||
|
||||
// clear the transmit data array for the current subframe
|
||||
for (aa=0; aa<cfg->rf_config.tx_antenna_ports.value; aa++) {
|
||||
for (aa=0; aa<1/*15*/; aa++) {
|
||||
memset(gNB->common_vars.txdataF[aa],0,fp->samples_per_slot_wCP*sizeof(int32_t));
|
||||
}
|
||||
|
||||
@@ -199,7 +199,7 @@ void phy_procedures_gNB_TX(PHY_VARS_gNB *gNB,
|
||||
nr_generate_dci_top(gNB->pdcch_vars,
|
||||
&gNB->nrPolar_params,
|
||||
gNB->nr_gold_pdcch_dmrs[slot],
|
||||
gNB->common_vars.txdataF,
|
||||
gNB->common_vars.txdataF[0],
|
||||
AMP, *fp, *cfg);
|
||||
}
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_TX+offset,0);
|
||||
|
||||
@@ -1650,7 +1650,7 @@ int main(int argc, char **argv)
|
||||
|
||||
start_meas(&eNB->ofdm_mod_stats);
|
||||
|
||||
ru->proc.subframe_tx=subframe;
|
||||
ru->proc.tti_tx=subframe;
|
||||
memcpy((void*)ru->frame_parms,(void*)&eNB->frame_parms,sizeof(LTE_DL_FRAME_PARMS));
|
||||
feptx_prec(ru);
|
||||
feptx_ofdm(ru);
|
||||
@@ -1670,7 +1670,7 @@ int main(int argc, char **argv)
|
||||
phy_procedures_eNB_TX(eNB,proc_eNB,0);
|
||||
|
||||
|
||||
ru->proc.subframe_tx=(subframe+1)%10;
|
||||
ru->proc.tti_tx=(subframe+1)%10;
|
||||
feptx_prec(ru);
|
||||
feptx_ofdm(ru);
|
||||
|
||||
|
||||
@@ -1158,7 +1158,7 @@ int main(int argc, char **argv) {
|
||||
eNB->proc.frame_rx = 1;
|
||||
eNB->proc.subframe_rx = subframe;
|
||||
ru->proc.frame_rx = 1;
|
||||
ru->proc.subframe_rx = subframe;
|
||||
ru->proc.tti_rx = subframe;
|
||||
proc_rxtx_ue->frame_tx = proc_rxtx->frame_rx;
|
||||
proc_rxtx_ue->frame_rx = proc_rxtx->frame_tx;
|
||||
proc_rxtx_ue->subframe_tx = proc_rxtx->subframe_rx;
|
||||
|
||||
Reference in New Issue
Block a user