Merge remote-tracking branch 'origin/develop' into NR_UE_reworking_UCI_procedures
This commit is contained in:
@@ -595,27 +595,6 @@ void init_nr_transport(PHY_VARS_gNB *gNB) {
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
/*
|
||||
LOG_I(PHY,"Initializing nFAPI for ULSCH, UE %d\n",i);
|
||||
// [hna] added here for RT implementation
|
||||
uint8_t harq_pid = 0;
|
||||
nfapi_nr_ul_config_ulsch_pdu *rel15_ul = &gNB->ulsch[i+1][j]->harq_processes[harq_pid]->ulsch_pdu;
|
||||
|
||||
// --------- setting rel15_ul parameters ----------
|
||||
rel15_ul->rnti = 0x1234;
|
||||
rel15_ul->ulsch_pdu_rel15.start_rb = 0;
|
||||
rel15_ul->ulsch_pdu_rel15.number_rbs = 50;
|
||||
rel15_ul->ulsch_pdu_rel15.start_symbol = 2;
|
||||
rel15_ul->ulsch_pdu_rel15.number_symbols = 12;
|
||||
rel15_ul->ulsch_pdu_rel15.length_dmrs = gNB->dmrs_UplinkConfig.pusch_maxLength;
|
||||
rel15_ul->ulsch_pdu_rel15.Qm = 2;
|
||||
rel15_ul->ulsch_pdu_rel15.R = 679;
|
||||
rel15_ul->ulsch_pdu_rel15.mcs = 9;
|
||||
rel15_ul->ulsch_pdu_rel15.rv = 0;
|
||||
rel15_ul->ulsch_pdu_rel15.n_layers = 1;
|
||||
///////////////////////////////////////////////////
|
||||
*/
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -131,15 +131,15 @@ int nr_phy_init_RU(RU_t *ru) {
|
||||
}
|
||||
AssertFatal(ru->nb_bfw==(beam_count*ru->nb_tx),"Number of beam weights from config file is %d while the expected number is %d",ru->nb_bfw,(beam_count*ru->nb_tx));
|
||||
|
||||
int l_ind = 0;
|
||||
for (i=0; i<ru->num_gNB; i++) {
|
||||
int l_ind = 0;
|
||||
for (p=0;p<ru->nb_log_antennas;p++) {
|
||||
//if ((fp->L_ssb >> (63-p)) & 0x01) {
|
||||
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));
|
||||
for (re=0; re<fp->ofdm_symbol_size; re++)
|
||||
ru->beam_weights[i][p][j][re] = ru->bw_list[j][l_ind];
|
||||
ru->beam_weights[i][p][j][re] = ru->bw_list[i][l_ind];
|
||||
//printf("Beam Weight %08x for beam %d and tx %d\n",ru->bw_list[i][l_ind],p,j);
|
||||
l_ind++;
|
||||
} // for j
|
||||
|
||||
@@ -143,8 +143,6 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue,
|
||||
uint16_t N_n_scid[2] = {0,1}; // [HOTFIX] This is a temporary implementation of scramblingID0 and scramblingID1 which are given by DMRS-UplinkConfig
|
||||
int n_scid;
|
||||
abstraction_flag = 0;
|
||||
// dmrs_UplinkConfig_t *dmrs_Uplink_Config = &ue->pusch_config.dmrs_UplinkConfig;
|
||||
// ptrs_UplinkConfig_t *ptrs_Uplink_Config = &ue->pusch_config.dmrs_UplinkConfig.ptrs_UplinkConfig;
|
||||
LOG_I(PHY, "Initializing UE vars (abstraction %u) for gNB TXant %u, UE RXant %u\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_gNB_INST);
|
||||
phy_init_nr_top(ue);
|
||||
@@ -198,29 +196,6 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue,
|
||||
|
||||
/////////////////////////PUSCH DMRS init/////////////////////////
|
||||
///////////
|
||||
|
||||
// default values until overwritten by RRCConnectionReconfiguration
|
||||
|
||||
for (i=0; i<MAX_NR_OF_UL_ALLOCATIONS; i++) {
|
||||
ue->pusch_config.pusch_TimeDomainResourceAllocation[i] = (PUSCH_TimeDomainResourceAllocation_t *)malloc16(sizeof(PUSCH_TimeDomainResourceAllocation_t));
|
||||
ue->pusch_config.pusch_TimeDomainResourceAllocation[i]->mappingType = typeB;
|
||||
}
|
||||
|
||||
for (i=0;i<MAX_NR_OF_DL_ALLOCATIONS;i++){
|
||||
ue->PDSCH_Config.pdsch_TimeDomainResourceAllocation[i] = (PDSCH_TimeDomainResourceAllocation_t *)malloc16(sizeof(PDSCH_TimeDomainResourceAllocation_t));
|
||||
ue->PDSCH_Config.pdsch_TimeDomainResourceAllocation[i]->mappingType = typeA;
|
||||
}
|
||||
|
||||
//------------- config DMRS parameters--------------//
|
||||
// dmrs_Uplink_Config->pusch_dmrs_type = pusch_dmrs_type1;
|
||||
// dmrs_Uplink_Config->pusch_dmrs_AdditionalPosition = pusch_dmrs_pos0;
|
||||
// dmrs_Uplink_Config->pusch_maxLength = pusch_len1;
|
||||
//-------------------------------------------------//
|
||||
ue->dmrs_DownlinkConfig.pdsch_dmrs_type = pdsch_dmrs_type1;
|
||||
ue->dmrs_DownlinkConfig.pdsch_dmrs_AdditionalPosition = pdsch_dmrs_pos0;
|
||||
ue->dmrs_DownlinkConfig.pdsch_maxLength = pdsch_len1;
|
||||
//-------------------------------------------------//
|
||||
|
||||
ue->nr_gold_pusch_dmrs = (uint32_t ****)malloc16(fp->slots_per_frame*sizeof(uint32_t ***));
|
||||
pusch_dmrs = ue->nr_gold_pusch_dmrs;
|
||||
n_scid = 0; // This quantity is indicated by higher layer parameter dmrs-SeqInitialization
|
||||
|
||||
@@ -111,9 +111,10 @@ int nr_pdsch_dmrs_rx(PHY_VARS_NR_UE *ue,
|
||||
int32_t *output,
|
||||
unsigned short p,
|
||||
unsigned char lp,
|
||||
unsigned short nb_pdsch_rb)
|
||||
unsigned short nb_pdsch_rb,
|
||||
uint8_t config_type)
|
||||
{
|
||||
int8_t w,config_type;
|
||||
int8_t w;
|
||||
short *mod_table;
|
||||
unsigned char idx=0;
|
||||
|
||||
@@ -121,18 +122,16 @@ int nr_pdsch_dmrs_rx(PHY_VARS_NR_UE *ue,
|
||||
array_of_w *wf;
|
||||
array_of_w *wt;
|
||||
|
||||
config_type = ue->dmrs_DownlinkConfig.pdsch_dmrs_type;
|
||||
|
||||
wf = (config_type==pdsch_dmrs_type1) ? wf1 : wf2;
|
||||
wt = (config_type==pdsch_dmrs_type1) ? wt1 : wt2;
|
||||
wf = (config_type==NFAPI_NR_DMRS_TYPE1) ? wf1 : wf2;
|
||||
wt = (config_type==NFAPI_NR_DMRS_TYPE1) ? wt1 : wt2;
|
||||
|
||||
if (config_type > 1)
|
||||
LOG_E(PHY,"Bad PDSCH DMRS config type %d\n", config_type);
|
||||
|
||||
if ((p>=1000) && (p<((config_type==pdsch_dmrs_type1) ? 1008 : 1012))) {
|
||||
if ((p>=1000) && (p<((config_type==NFAPI_NR_DMRS_TYPE1) ? 1008 : 1012))) {
|
||||
if (ue->frame_parms.Ncp == NORMAL) {
|
||||
|
||||
for (int i=0; i<nb_pdsch_rb*((config_type==pdsch_dmrs_type1) ? 6:4); i++) {
|
||||
for (int i=0; i<nb_pdsch_rb*((config_type==NFAPI_NR_DMRS_TYPE1) ? 6:4); i++) {
|
||||
|
||||
w = (wf[p-1000][i&1])*(wt[p-1000][lp]);
|
||||
mod_table = (w==1) ? nr_rx_mod_table : nr_rx_nmod_table;
|
||||
|
||||
@@ -52,7 +52,8 @@ int nr_pdsch_dmrs_rx(PHY_VARS_NR_UE *ue,
|
||||
int32_t *output,
|
||||
unsigned short p,
|
||||
unsigned char lp,
|
||||
unsigned short nb_pdsch_rb);
|
||||
unsigned short nb_pdsch_rb,
|
||||
uint8_t config_type);
|
||||
|
||||
void nr_gold_pbch(PHY_VARS_NR_UE* ue);
|
||||
|
||||
|
||||
@@ -70,7 +70,7 @@ void nr_generate_dci(PHY_VARS_gNB *gNB,
|
||||
uint32_t **gold_pdcch_dmrs,
|
||||
int32_t *txdataF,
|
||||
int16_t amp,
|
||||
NR_DL_FRAME_PARMS frame_parms) {
|
||||
NR_DL_FRAME_PARMS *frame_parms) {
|
||||
|
||||
int16_t mod_dmrs[NR_MAX_CSET_DURATION][NR_MAX_PDCCH_DMRS_LENGTH>>1] __attribute__((aligned(16))); // 3 for the max coreset duration
|
||||
uint16_t cset_start_sc;
|
||||
@@ -85,7 +85,7 @@ void nr_generate_dci(PHY_VARS_gNB *gNB,
|
||||
// compute rb_offset and n_prb based on frequency allocation
|
||||
nr_fill_cce_list(gNB,0,pdcch_pdu_rel15);
|
||||
get_coreset_rballoc(pdcch_pdu_rel15->FreqDomainResource,&n_rb,&rb_offset);
|
||||
cset_start_sc = frame_parms.first_carrier_offset + (pdcch_pdu_rel15->BWPStart + rb_offset) * NR_NB_SC_PER_RB;
|
||||
cset_start_sc = frame_parms->first_carrier_offset + (pdcch_pdu_rel15->BWPStart + rb_offset) * NR_NB_SC_PER_RB;
|
||||
|
||||
for (int d=0;d<pdcch_pdu_rel15->numDlDci;d++) {
|
||||
/*The coreset is initialised
|
||||
@@ -165,8 +165,8 @@ void nr_generate_dci(PHY_VARS_gNB *gNB,
|
||||
|
||||
/// Resource mapping
|
||||
|
||||
if (cset_start_sc >= frame_parms.ofdm_symbol_size)
|
||||
cset_start_sc -= frame_parms.ofdm_symbol_size;
|
||||
if (cset_start_sc >= frame_parms->ofdm_symbol_size)
|
||||
cset_start_sc -= frame_parms->ofdm_symbol_size;
|
||||
|
||||
// Get cce_list indices by reg_idx in ascending order
|
||||
int reg_list_index = 0;
|
||||
@@ -191,8 +191,8 @@ void nr_generate_dci(PHY_VARS_gNB *gNB,
|
||||
|
||||
k = cset_start_sc + gNB->cce_list[d][cce_idx].reg_list[reg_in_cce_idx].start_sc_idx;
|
||||
|
||||
if (k >= frame_parms.ofdm_symbol_size)
|
||||
k -= frame_parms.ofdm_symbol_size;
|
||||
if (k >= frame_parms->ofdm_symbol_size)
|
||||
k -= frame_parms->ofdm_symbol_size;
|
||||
|
||||
l = cset_start_symb + symbol_idx;
|
||||
|
||||
@@ -206,26 +206,26 @@ void nr_generate_dci(PHY_VARS_gNB *gNB,
|
||||
|
||||
for (int m = 0; m < NR_NB_SC_PER_RB; m++) {
|
||||
if (m == (k_prime << 2) + 1) { // DMRS if not already mapped
|
||||
((int16_t *) txdataF)[(l * frame_parms.ofdm_symbol_size + k) << 1] =
|
||||
((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] =
|
||||
((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("PDCCH DMRS: l %d position %d => (%d,%d)\n",l,k,((int16_t *)txdataF)[(l*frame_parms.ofdm_symbol_size + k)<<1],
|
||||
((int16_t *)txdataF)[((l*frame_parms.ofdm_symbol_size + k)<<1)+1]);
|
||||
printf("PDCCH DMRS: l %d position %d => (%d,%d)\n",l,k,((int16_t *)txdataF)[(l*frame_parms->ofdm_symbol_size + k)<<1],
|
||||
((int16_t *)txdataF)[((l*frame_parms->ofdm_symbol_size + k)<<1)+1]);
|
||||
#endif
|
||||
|
||||
dmrs_idx++;
|
||||
k_prime++;
|
||||
|
||||
} else { // DCI payload
|
||||
((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] =
|
||||
((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;
|
||||
#ifdef DEBUG_DCI
|
||||
printf("PDCCH: l %d position %d => (%d,%d)\n",l,k,((int16_t *)txdataF)[(l*frame_parms.ofdm_symbol_size + k)<<1],
|
||||
((int16_t *)txdataF)[((l*frame_parms.ofdm_symbol_size + k)<<1)+1]);
|
||||
printf("PDCCH: l %d position %d => (%d,%d)\n",l,k,((int16_t *)txdataF)[(l*frame_parms->ofdm_symbol_size + k)<<1],
|
||||
((int16_t *)txdataF)[((l*frame_parms->ofdm_symbol_size + k)<<1)+1]);
|
||||
#endif
|
||||
|
||||
dci_idx++;
|
||||
@@ -233,8 +233,8 @@ void nr_generate_dci(PHY_VARS_gNB *gNB,
|
||||
|
||||
k++;
|
||||
|
||||
if (k >= frame_parms.ofdm_symbol_size)
|
||||
k -= frame_parms.ofdm_symbol_size;
|
||||
if (k >= frame_parms->ofdm_symbol_size)
|
||||
k -= frame_parms->ofdm_symbol_size;
|
||||
|
||||
} // m
|
||||
} // reg_in_cce_idx
|
||||
@@ -254,17 +254,15 @@ void nr_generate_dci_top(PHY_VARS_gNB *gNB,
|
||||
uint32_t **gold_pdcch_dmrs,
|
||||
int32_t *txdataF,
|
||||
int16_t amp,
|
||||
NR_DL_FRAME_PARMS frame_parms) {
|
||||
NR_DL_FRAME_PARMS *frame_parms) {
|
||||
|
||||
AssertFatal(pdcch_pdu!=NULL || ul_dci_pdu!=NULL,"At least one pointer has to be !NULL\n");
|
||||
|
||||
if (pdcch_pdu && ul_dci_pdu) {
|
||||
if (pdcch_pdu) {
|
||||
nr_generate_dci(gNB,&pdcch_pdu->pdcch_pdu_rel15,gold_pdcch_dmrs,txdataF,amp,frame_parms);
|
||||
}
|
||||
if (ul_dci_pdu) {
|
||||
nr_generate_dci(gNB,&ul_dci_pdu->pdcch_pdu_rel15,gold_pdcch_dmrs,txdataF,amp,frame_parms);
|
||||
}
|
||||
else if (pdcch_pdu)
|
||||
nr_generate_dci(gNB,&pdcch_pdu->pdcch_pdu_rel15,gold_pdcch_dmrs,txdataF,amp,frame_parms);
|
||||
else
|
||||
nr_generate_dci(gNB,&ul_dci_pdu->pdcch_pdu_rel15,gold_pdcch_dmrs,txdataF,amp,frame_parms);
|
||||
}
|
||||
|
||||
|
||||
@@ -35,7 +35,7 @@ void nr_generate_dci_top(PHY_VARS_gNB *gNB,
|
||||
uint32_t **gold_pdcch_dmrs,
|
||||
int32_t *txdataF,
|
||||
int16_t amp,
|
||||
NR_DL_FRAME_PARMS frame_parms);
|
||||
NR_DL_FRAME_PARMS *frame_parms);
|
||||
|
||||
void nr_pdcch_scrambling(uint32_t *in,
|
||||
uint32_t size,
|
||||
|
||||
@@ -448,7 +448,7 @@ uint8_t nr_generate_pdsch(PHY_VARS_gNB *gNB,
|
||||
(void*)&txdataF_precoding[ap][2*(l*frame_parms->ofdm_symbol_size + txdataF_offset+ k)],
|
||||
NR_NB_SC_PER_RB*sizeof(int32_t));
|
||||
else
|
||||
memset((void*)&txdataF[ap][rel15->StartSymbolIndex*frame_parms->ofdm_symbol_size + txdataF_offset +k],
|
||||
memset((void*)&txdataF[ap][l*frame_parms->ofdm_symbol_size + txdataF_offset + k],
|
||||
0,
|
||||
NR_NB_SC_PER_RB*sizeof(int32_t));
|
||||
k += NR_NB_SC_PER_RB;
|
||||
|
||||
@@ -192,14 +192,15 @@ NR_gNB_DLSCH_t *new_gNB_dlsch(NR_DL_FRAME_PARMS *frame_parms,
|
||||
AssertFatal(harq->d[r], "cannot allocate harq->d[%d]\n", r); // max size for coded output
|
||||
bzero(harq->c[r], 8448);
|
||||
bzero(harq->d[r], (3 * 8448));
|
||||
harq->e = malloc16(14 * N_RB * 12 * 8);
|
||||
AssertFatal(harq->e, "cannot allocate harq->e\n");
|
||||
bzero(harq->e, 14 * N_RB * 12 * 8);
|
||||
harq->f = malloc16(14 * N_RB * 12 * 8);
|
||||
AssertFatal(harq->f, "cannot allocate harq->f\n");
|
||||
bzero(harq->f, 14 * N_RB * 12 * 8);
|
||||
}
|
||||
|
||||
harq->e = malloc16(N_RB * NR_SYMBOLS_PER_SLOT * NR_NB_SC_PER_RB * 8 * NR_MAX_NB_LAYERS);
|
||||
AssertFatal(harq->e, "cannot allocate harq->e\n");
|
||||
bzero(harq->e, N_RB * NR_SYMBOLS_PER_SLOT * NR_NB_SC_PER_RB * 8 * NR_MAX_NB_LAYERS);
|
||||
harq->f = malloc16(N_RB * NR_SYMBOLS_PER_SLOT * NR_NB_SC_PER_RB * 8 * NR_MAX_NB_LAYERS);
|
||||
AssertFatal(harq->f, "cannot allocate harq->f\n");
|
||||
bzero(harq->f, N_RB * NR_SYMBOLS_PER_SLOT * NR_NB_SC_PER_RB * 8 * NR_MAX_NB_LAYERS);
|
||||
|
||||
return(dlsch);
|
||||
}
|
||||
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
|
||||
int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue,
|
||||
UE_nr_rxtx_proc_t *proc,
|
||||
uint8_t eNB_offset,
|
||||
uint8_t gNB_id,
|
||||
unsigned char Ns,
|
||||
unsigned char symbol,
|
||||
int dmrss,
|
||||
@@ -70,7 +70,7 @@ int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue,
|
||||
k = nushift;
|
||||
|
||||
#ifdef DEBUG_CH
|
||||
printf("PBCH DMRS Correlation : ThreadId %d, eNB_offset %d , OFDM size %d, Ncp=%d, Ns=%d, k=%d symbol %d\n",proc->thread_id, eNB_offset,ue->frame_parms.ofdm_symbol_size,
|
||||
printf("PBCH DMRS Correlation : ThreadId %d, gNB_id %d , OFDM size %d, Ncp=%d, Ns=%d, k=%d symbol %d\n",proc->thread_id, gNB_id,ue->frame_parms.ofdm_symbol_size,
|
||||
ue->frame_parms.Ncp,Ns,k, symbol);
|
||||
#endif
|
||||
|
||||
@@ -198,7 +198,7 @@ int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue,
|
||||
|
||||
int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue,
|
||||
UE_nr_rxtx_proc_t *proc,
|
||||
uint8_t eNB_offset,
|
||||
uint8_t gNB_id,
|
||||
unsigned char Ns,
|
||||
unsigned char symbol,
|
||||
int dmrss,
|
||||
@@ -213,10 +213,8 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue,
|
||||
int ch_offset,symbol_offset;
|
||||
//int slot_pbch;
|
||||
|
||||
//uint16_t Nid_cell = (eNB_offset == 0) ? ue->frame_parms.Nid_cell : ue->measurements.adj_cell_id[eNB_offset-1];
|
||||
|
||||
uint8_t nushift;
|
||||
int **dl_ch_estimates =ue->pbch_vars[eNB_offset]->dl_ch_estimates;
|
||||
int **dl_ch_estimates =ue->pbch_vars[gNB_id]->dl_ch_estimates;
|
||||
int **rxdataF=ue->common_vars.common_vars_rx_data_per_thread[proc->thread_id].rxdataF;
|
||||
|
||||
nushift = ue->frame_parms.Nid_cell%4;
|
||||
@@ -239,7 +237,7 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue,
|
||||
k = nushift;
|
||||
|
||||
#ifdef DEBUG_CH
|
||||
printf("PBCH Channel Estimation : ThreadId %d, eNB_offset %d ch_offset %d, OFDM size %d, Ncp=%d, Ns=%d, k=%d symbol %d\n",proc->thread_id, eNB_offset,ch_offset,ue->frame_parms.ofdm_symbol_size,
|
||||
printf("PBCH Channel Estimation : ThreadId %d, gNB_id %d ch_offset %d, OFDM size %d, Ncp=%d, Ns=%d, k=%d symbol %d\n",proc->thread_id, gNB_id,ch_offset,ue->frame_parms.ofdm_symbol_size,
|
||||
ue->frame_parms.Ncp,Ns,k, symbol);
|
||||
#endif
|
||||
|
||||
@@ -456,12 +454,12 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue,
|
||||
// do ifft of channel estimate
|
||||
for (aarx=0; aarx<ue->frame_parms.nb_antennas_rx; aarx++)
|
||||
for (p=0; p<ue->frame_parms.nb_antenna_ports_gNB; p++) {
|
||||
if (ue->pbch_vars[eNB_offset]->dl_ch_estimates[(p*ue->frame_parms.nb_antennas_rx)+aarx])
|
||||
if (ue->pbch_vars[gNB_id]->dl_ch_estimates[(p*ue->frame_parms.nb_antennas_rx)+aarx])
|
||||
{
|
||||
LOG_D(PHY,"Channel Impulse Computation Slot %d ThreadId %d Symbol %d ch_offset %d\n", Ns, proc->thread_id, symbol, ch_offset);
|
||||
idft(idftsizeidx,
|
||||
(int16_t*) &ue->pbch_vars[eNB_offset]->dl_ch_estimates[(p*ue->frame_parms.nb_antennas_rx)+aarx][ch_offset],
|
||||
(int16_t*) ue->pbch_vars[eNB_offset]->dl_ch_estimates_time[(p*ue->frame_parms.nb_antennas_rx)+aarx],1);
|
||||
(int16_t*) &ue->pbch_vars[gNB_id]->dl_ch_estimates[(p*ue->frame_parms.nb_antennas_rx)+aarx][ch_offset],
|
||||
(int16_t*) ue->pbch_vars[gNB_id]->dl_ch_estimates_time[(p*ue->frame_parms.nb_antennas_rx)+aarx],1);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -474,7 +472,7 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue,
|
||||
|
||||
int nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue,
|
||||
UE_nr_rxtx_proc_t *proc,
|
||||
uint8_t eNB_offset,
|
||||
uint8_t gNB_id,
|
||||
unsigned char Ns,
|
||||
unsigned char symbol,
|
||||
unsigned short coreset_start_subcarrier,
|
||||
@@ -487,9 +485,7 @@ int nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue,
|
||||
int16_t ch[2],*pil,*rxF,*dl_ch,*fl,*fm,*fr;
|
||||
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];
|
||||
|
||||
int **dl_ch_estimates =ue->pdcch_vars[proc->thread_id][eNB_offset]->dl_ch_estimates;
|
||||
int **dl_ch_estimates =ue->pdcch_vars[proc->thread_id][gNB_id]->dl_ch_estimates;
|
||||
int **rxdataF=ue->common_vars.common_vars_rx_data_per_thread[proc->thread_id].rxdataF;
|
||||
|
||||
|
||||
@@ -500,10 +496,9 @@ int nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue,
|
||||
|
||||
symbol_offset = ue->frame_parms.ofdm_symbol_size*symbol;
|
||||
|
||||
k = coreset_start_subcarrier;
|
||||
|
||||
#ifdef DEBUG_PDCCH
|
||||
printf("PDCCH Channel Estimation : ThreadId %d, eNB_offset %d ch_offset %d, OFDM size %d, Ncp=%d, Ns=%d, k=%d symbol %d\n",proc->thread_id, eNB_offset,ch_offset,ue->frame_parms.ofdm_symbol_size,
|
||||
printf("PDCCH Channel Estimation : ThreadId %d, gNB_id %d ch_offset %d, OFDM size %d, Ncp=%d, Ns=%d, k=%d symbol %d\n",proc->thread_id, gNB_id,ch_offset,ue->frame_parms.ofdm_symbol_size,
|
||||
ue->frame_parms.Ncp,Ns,k, symbol);
|
||||
#endif
|
||||
|
||||
@@ -521,11 +516,12 @@ int nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue,
|
||||
|
||||
// generate pilot
|
||||
int pilot[nb_rb_coreset * 3] __attribute__((aligned(16)));
|
||||
nr_pdcch_dmrs_rx(ue,eNB_offset,Ns,ue->nr_gold_pdcch[eNB_offset][Ns][symbol], &pilot[0],2000,nb_rb_coreset);
|
||||
nr_pdcch_dmrs_rx(ue,gNB_id,Ns,ue->nr_gold_pdcch[gNB_id][Ns][symbol], &pilot[0],2000,nb_rb_coreset);
|
||||
|
||||
|
||||
for (aarx=0; aarx<ue->frame_parms.nb_antennas_rx; aarx++) {
|
||||
|
||||
k = coreset_start_subcarrier;
|
||||
pil = (int16_t *)&pilot[0];
|
||||
rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+k+1)];
|
||||
dl_ch = (int16_t *)&dl_ch_estimates[aarx][ch_offset];
|
||||
@@ -656,7 +652,7 @@ int nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue,
|
||||
|
||||
int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
|
||||
UE_nr_rxtx_proc_t *proc,
|
||||
uint8_t eNB_offset,
|
||||
uint8_t gNB_id,
|
||||
bool is_SI,
|
||||
unsigned char Ns,
|
||||
unsigned short p,
|
||||
@@ -673,10 +669,12 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
|
||||
int16_t *fl,*fm,*fr,*fml,*fmr,*fmm,*fdcl,*fdcr,*fdclh,*fdcrh, *frl, *frr;
|
||||
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];
|
||||
NR_UE_DLSCH_t **dlsch = ue->dlsch[proc->thread_id][gNB_id];
|
||||
const unsigned char harq_pid = dlsch[0]->current_harq_pid;
|
||||
NR_DL_UE_HARQ_t *dlsch0_harq = dlsch[0]->harq_processes[harq_pid];
|
||||
|
||||
uint8_t nushift;
|
||||
int **dl_ch_estimates =ue->pdsch_vars[proc->thread_id][eNB_offset]->dl_ch_estimates;
|
||||
int **dl_ch_estimates =ue->pdsch_vars[proc->thread_id][gNB_id]->dl_ch_estimates;
|
||||
int **rxdataF=ue->common_vars.common_vars_rx_data_per_thread[proc->thread_id].rxdataF;
|
||||
|
||||
if (ue->high_speed_flag == 0)
|
||||
@@ -690,7 +688,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
|
||||
int re_offset = k;
|
||||
|
||||
#ifdef DEBUG_CH
|
||||
printf("PDSCH Channel Estimation : ThreadId %d, eNB_offset %d ch_offset %d, symbol_offset %d OFDM size %d, Ncp=%d, Ns=%d, k=%d symbol %d\n",proc->thread_id, eNB_offset,ch_offset,symbol_offset,ue->frame_parms.ofdm_symbol_size,
|
||||
printf("PDSCH Channel Estimation : ThreadId %d, gNB_id %d ch_offset %d, symbol_offset %d OFDM size %d, Ncp=%d, Ns=%d, k=%d symbol %d\n",proc->thread_id, gNB_id,ch_offset,symbol_offset,ue->frame_parms.ofdm_symbol_size,
|
||||
ue->frame_parms.Ncp,Ns,k, symbol);
|
||||
#endif
|
||||
|
||||
@@ -699,19 +697,19 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
|
||||
if (is_SI) {
|
||||
rb_offset -= BWPStart;
|
||||
}
|
||||
uint8_t config_type = ue->dmrs_DownlinkConfig.pdsch_dmrs_type;
|
||||
uint8_t config_type = dlsch0_harq->dmrsConfigType;
|
||||
int8_t delta = get_delta(p, config_type);
|
||||
|
||||
// checking if re-initialization of scrambling IDs is needed
|
||||
if ((ue->dmrs_DownlinkConfig.scramblingID0 != ue->scramblingID[0]) || (ue->dmrs_DownlinkConfig.scramblingID1 != ue->scramblingID[1])){
|
||||
ue->scramblingID[0]=ue->dmrs_DownlinkConfig.scramblingID0;
|
||||
ue->scramblingID[1]=ue->dmrs_DownlinkConfig.scramblingID1;
|
||||
/*if ((XXX.scramblingID0 != ue->scramblingID[0]) || (XXX.scramblingID1 != ue->scramblingID[1])){
|
||||
ue->scramblingID[0] = XXX.scramblingID0;
|
||||
ue->scramblingID[1] = XXX.scramblingID1;
|
||||
nr_gold_pdsch(ue,ue->scramblingID);
|
||||
}
|
||||
}*/
|
||||
|
||||
nr_pdsch_dmrs_rx(ue,Ns,ue->nr_gold_pdsch[eNB_offset][Ns][symbol][0], &pilot[0],1000+p,0,nb_rb_pdsch+rb_offset);
|
||||
nr_pdsch_dmrs_rx(ue, Ns, ue->nr_gold_pdsch[gNB_id][Ns][symbol][0], &pilot[0], 1000+p, 0, nb_rb_pdsch+rb_offset, config_type);
|
||||
|
||||
if (config_type == pdsch_dmrs_type1){
|
||||
if (config_type == NFAPI_NR_DMRS_TYPE1){
|
||||
nushift = (p>>1)&1;
|
||||
if (p<4) ue->frame_parms.nushift = nushift;
|
||||
switch (delta) {
|
||||
@@ -751,7 +749,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
|
||||
return -1;
|
||||
break;
|
||||
}
|
||||
} else {//pdsch_dmrs_type2
|
||||
} else {//NFAPI_NR_DMRS_TYPE2
|
||||
nushift = delta;
|
||||
if (p<6) ue->frame_parms.nushift = nushift;
|
||||
switch (delta) {
|
||||
@@ -793,7 +791,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
|
||||
}
|
||||
|
||||
for (aarx=0; aarx<ue->frame_parms.nb_antennas_rx; aarx++) {
|
||||
pil = (int16_t *)&pilot[rb_offset*((config_type==pdsch_dmrs_type1) ? 6:4)];
|
||||
pil = (int16_t *)&pilot[rb_offset*((config_type==NFAPI_NR_DMRS_TYPE1) ? 6:4)];
|
||||
k = k % ue->frame_parms.ofdm_symbol_size;
|
||||
re_offset = k;
|
||||
rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+re_offset+nushift)];
|
||||
@@ -811,7 +809,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
|
||||
printf("dl_ch addr %p nushift %d\n",dl_ch,nushift);
|
||||
#endif
|
||||
|
||||
if (config_type == pdsch_dmrs_type1) {
|
||||
if (config_type == NFAPI_NR_DMRS_TYPE1) {
|
||||
|
||||
// Treat first 2 pilots specially (left edge)
|
||||
ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
|
||||
@@ -944,11 +942,11 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
|
||||
|
||||
// check if PRB crosses DC and improve estimates around DC
|
||||
if ((bwp_start_subcarrier < ue->frame_parms.ofdm_symbol_size) && (bwp_start_subcarrier+nb_rb_pdsch*12 >= ue->frame_parms.ofdm_symbol_size)) {
|
||||
dl_ch = (int16_t *)&dl_ch_estimates[aarx][ch_offset];
|
||||
dl_ch = (int16_t *)&dl_ch_estimates[p*ue->frame_parms.nb_antennas_rx+aarx][ch_offset];
|
||||
uint16_t idxDC = 2*(ue->frame_parms.ofdm_symbol_size - bwp_start_subcarrier);
|
||||
uint16_t idxPil = idxDC/2;
|
||||
re_offset = k;
|
||||
pil = (int16_t *)&pilot[rb_offset*((config_type==pdsch_dmrs_type1) ? 6:4)];
|
||||
pil = (int16_t *)&pilot[rb_offset*((config_type==NFAPI_NR_DMRS_TYPE1) ? 6:4)];
|
||||
pil += (idxPil-2);
|
||||
dl_ch += (idxDC-4);
|
||||
dl_ch = memset(dl_ch, 0, sizeof(int16_t)*10);
|
||||
@@ -994,7 +992,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
|
||||
8);
|
||||
}
|
||||
}
|
||||
} else { //pdsch_dmrs_type2 |dmrs_r,dmrs_l,0,0,0,0,dmrs_r,dmrs_l,0,0,0,0|
|
||||
} else { //NFAPI_NR_DMRS_TYPE2 |dmrs_r,dmrs_l,0,0,0,0,dmrs_r,dmrs_l,0,0,0,0|
|
||||
|
||||
// Treat first 4 pilots specially (left edge)
|
||||
ch_l[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
|
||||
@@ -1224,16 +1222,15 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
|
||||
*
|
||||
* NAME : nr_pdsch_ptrs_processing
|
||||
*
|
||||
* PARAMETERS : ue : ue data structure
|
||||
* PARAMETERS : PHY_VARS_NR_UE : ue data structure
|
||||
* NR_UE_PDSCH : pdsch_vars pointer
|
||||
* NR_DL_FRAME_PARMS : frame_parms pointer
|
||||
* NR_DL_UE_HARQ_t : dlsch0_harq pointer
|
||||
* NR_DL_UE_HARQ_t : dlsch1_harq pointer
|
||||
* uint8_t : eNB_id,
|
||||
* uint8_t : gNB_id,
|
||||
* uint8_t : nr_slot_rx,
|
||||
* unsigned char : symbol,
|
||||
* uint32_t : nb_re_pdsch,
|
||||
* unsigned char : harq_pid
|
||||
* uint16_t : rnti
|
||||
* RX_type_t : rx_type
|
||||
* RETURN : Nothing
|
||||
@@ -1249,11 +1246,10 @@ void nr_pdsch_ptrs_processing(PHY_VARS_NR_UE *ue,
|
||||
NR_DL_FRAME_PARMS *frame_parms,
|
||||
NR_DL_UE_HARQ_t *dlsch0_harq,
|
||||
NR_DL_UE_HARQ_t *dlsch1_harq,
|
||||
uint8_t eNB_id,
|
||||
uint8_t gNB_id,
|
||||
uint8_t nr_slot_rx,
|
||||
unsigned char symbol,
|
||||
uint32_t nb_re_pdsch,
|
||||
unsigned char harq_pid,
|
||||
uint16_t rnti,
|
||||
RX_type_t rx_type)
|
||||
{
|
||||
@@ -1284,7 +1280,7 @@ void nr_pdsch_ptrs_processing(PHY_VARS_NR_UE *ue,
|
||||
ptrsSymbPos = &dlsch0_harq->ptrs_symbols;
|
||||
ptrsSymbIdx = &dlsch0_harq->ptrs_symbol_index;
|
||||
ptrsReOffset = &dlsch0_harq->PTRSReOffset;
|
||||
dmrsConfigType = &dlsch0_harq->ptrs_symbol_index;
|
||||
dmrsConfigType = &dlsch0_harq->dmrsConfigType;
|
||||
nb_rb = &dlsch0_harq->nb_rb;
|
||||
}
|
||||
if(dlsch1_harq) {
|
||||
@@ -1297,13 +1293,13 @@ void nr_pdsch_ptrs_processing(PHY_VARS_NR_UE *ue,
|
||||
ptrsSymbPos = &dlsch1_harq->ptrs_symbols;
|
||||
ptrsSymbIdx = &dlsch1_harq->ptrs_symbol_index;
|
||||
ptrsReOffset = &dlsch1_harq->PTRSReOffset;
|
||||
dmrsConfigType = &dlsch1_harq->ptrs_symbol_index;
|
||||
dmrsConfigType = &dlsch1_harq->dmrsConfigType;
|
||||
nb_rb = &dlsch1_harq->nb_rb;
|
||||
}
|
||||
/* loop over antennas */
|
||||
for (int aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
|
||||
phase_per_symbol = (int16_t*)pdsch_vars[eNB_id]->ptrs_phase_per_slot[aarx];
|
||||
ptrs_re_symbol = (int32_t*)pdsch_vars[eNB_id]->ptrs_re_per_slot[aarx];
|
||||
phase_per_symbol = (int16_t*)pdsch_vars[gNB_id]->ptrs_phase_per_slot[aarx];
|
||||
ptrs_re_symbol = (int32_t*)pdsch_vars[gNB_id]->ptrs_re_per_slot[aarx];
|
||||
ptrs_re_symbol[symbol] = 0;
|
||||
phase_per_symbol[(2*symbol)+1] = 0; // Imag
|
||||
/* set DMRS estimates to 0 angle with magnitude 1 */
|
||||
@@ -1337,11 +1333,11 @@ void nr_pdsch_ptrs_processing(PHY_VARS_NR_UE *ue,
|
||||
/*------------------------------------------------------------------------------------------------------- */
|
||||
nr_ptrs_cpe_estimation(*K_ptrs,*ptrsReOffset,*dmrsConfigType,*nb_rb,
|
||||
rnti,
|
||||
(int16_t *)&pdsch_vars[eNB_id]->dl_ch_ptrs_estimates_ext[aarx][symbol*nb_re_pdsch],
|
||||
(int16_t *)&pdsch_vars[gNB_id]->dl_ch_ptrs_estimates_ext[aarx][symbol*nb_re_pdsch],
|
||||
nr_slot_rx,
|
||||
symbol,frame_parms->ofdm_symbol_size,
|
||||
(int16_t*)&pdsch_vars[eNB_id]->rxdataF_comp0[aarx][(symbol * nb_re_pdsch)],
|
||||
ue->nr_gold_pdsch[eNB_id][nr_slot_rx][symbol][0],
|
||||
(int16_t*)&pdsch_vars[gNB_id]->rxdataF_comp0[aarx][(symbol * nb_re_pdsch)],
|
||||
ue->nr_gold_pdsch[gNB_id][nr_slot_rx][symbol][0],
|
||||
&phase_per_symbol[2* symbol],
|
||||
&ptrs_re_symbol[symbol]);
|
||||
}
|
||||
@@ -1360,9 +1356,9 @@ void nr_pdsch_ptrs_processing(PHY_VARS_NR_UE *ue,
|
||||
}
|
||||
}
|
||||
#ifdef DEBUG_DL_PTRS
|
||||
LOG_M("ptrsEst.m","est",pdsch_vars[eNB_id]->ptrs_phase_per_slot[aarx],frame_parms->symbols_per_slot,1,1 );
|
||||
LOG_M("ptrsEst.m","est",pdsch_vars[gNB_id]->ptrs_phase_per_slot[aarx],frame_parms->symbols_per_slot,1,1 );
|
||||
LOG_M("rxdataF_bf_ptrs_comp.m","bf_ptrs_cmp",
|
||||
&pdsch_vars[eNB_id]->rxdataF_comp0[aarx][(*startSymbIndex) * NR_NB_SC_PER_RB * (*nb_rb) ],
|
||||
&pdsch_vars[gNB_id]->rxdataF_comp0[aarx][(*startSymbIndex) * NR_NB_SC_PER_RB * (*nb_rb) ],
|
||||
(*nb_rb) * NR_NB_SC_PER_RB * (*nbSymb),1,1);
|
||||
#endif
|
||||
/*------------------------------------------------------------------------------------------------------- */
|
||||
@@ -1375,9 +1371,9 @@ void nr_pdsch_ptrs_processing(PHY_VARS_NR_UE *ue,
|
||||
#ifdef DEBUG_DL_PTRS
|
||||
printf("[PHY][DL][PTRS]: Rotate Symbol %2d with %d + j* %d\n", i, phase_per_symbol[2* i],phase_per_symbol[(2* i) +1]);
|
||||
#endif
|
||||
rotate_cpx_vector((int16_t*)&pdsch_vars[eNB_id]->rxdataF_comp0[aarx][(i * (*nb_rb) * NR_NB_SC_PER_RB)],
|
||||
rotate_cpx_vector((int16_t*)&pdsch_vars[gNB_id]->rxdataF_comp0[aarx][(i * (*nb_rb) * NR_NB_SC_PER_RB)],
|
||||
&phase_per_symbol[2* i],
|
||||
(int16_t*)&pdsch_vars[eNB_id]->rxdataF_comp0[aarx][(i * (*nb_rb) * NR_NB_SC_PER_RB)],
|
||||
(int16_t*)&pdsch_vars[gNB_id]->rxdataF_comp0[aarx][(i * (*nb_rb) * NR_NB_SC_PER_RB)],
|
||||
((*nb_rb) * NR_NB_SC_PER_RB), 15);
|
||||
}// if not DMRS Symbol
|
||||
}// symbol loop
|
||||
|
||||
@@ -34,17 +34,14 @@
|
||||
|
||||
/*!
|
||||
\brief This function performs channel estimation including frequency and temporal interpolation
|
||||
\param phy_vars_ue Pointer to UE PHY variables
|
||||
\param eNB_id Index of target eNB
|
||||
\param eNB_offset Offset for interfering eNB (in terms cell ID mod 3)
|
||||
\param ue Pointer to UE PHY variables
|
||||
\param gNB_id Index of target gNB
|
||||
\param Ns slot number (0..19)
|
||||
\param p antenna port
|
||||
\param l symbol within slot
|
||||
\param symbol symbol within frame
|
||||
\param symbol symbol within slot
|
||||
*/
|
||||
int nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue,
|
||||
UE_nr_rxtx_proc_t *proc,
|
||||
uint8_t eNB_offset,
|
||||
uint8_t gNB_id,
|
||||
unsigned char Ns,
|
||||
unsigned char symbol,
|
||||
unsigned short coreset_start_subcarrier,
|
||||
@@ -52,7 +49,7 @@ int nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue,
|
||||
|
||||
int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue,
|
||||
UE_nr_rxtx_proc_t *proc,
|
||||
uint8_t eNB_offset,
|
||||
uint8_t gNB_id,
|
||||
unsigned char Ns,
|
||||
unsigned char symbol,
|
||||
int dmrss,
|
||||
@@ -60,7 +57,7 @@ int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue,
|
||||
|
||||
int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue,
|
||||
UE_nr_rxtx_proc_t *proc,
|
||||
uint8_t eNB_offset,
|
||||
uint8_t gNB_id,
|
||||
unsigned char Ns,
|
||||
unsigned char symbol,
|
||||
int dmrss,
|
||||
@@ -69,7 +66,7 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue,
|
||||
|
||||
int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
|
||||
UE_nr_rxtx_proc_t *proc,
|
||||
uint8_t eNB_offset,
|
||||
uint8_t gNB_id,
|
||||
bool is_SI,
|
||||
unsigned char Ns,
|
||||
unsigned short p,
|
||||
@@ -80,7 +77,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
|
||||
|
||||
void nr_adjust_synch_ue(NR_DL_FRAME_PARMS *frame_parms,
|
||||
PHY_VARS_NR_UE *ue,
|
||||
module_id_t eNB_id,
|
||||
module_id_t gNB_id,
|
||||
uint8_t frame,
|
||||
uint8_t subframe,
|
||||
unsigned char clear,
|
||||
@@ -102,7 +99,7 @@ void nr_ue_rrc_measurements(PHY_VARS_NR_UE *ue,
|
||||
|
||||
void phy_adjust_gain_nr(PHY_VARS_NR_UE *ue,
|
||||
uint32_t rx_power_fil_dB,
|
||||
uint8_t eNB_id);
|
||||
uint8_t gNB_id);
|
||||
|
||||
int16_t get_nr_PL(uint8_t Mod_id, uint8_t CC_id, uint8_t gNB_index);
|
||||
|
||||
@@ -111,11 +108,10 @@ void nr_pdsch_ptrs_processing(PHY_VARS_NR_UE *ue,
|
||||
NR_DL_FRAME_PARMS *frame_parms,
|
||||
NR_DL_UE_HARQ_t *dlsch0_harq,
|
||||
NR_DL_UE_HARQ_t *dlsch1_harq,
|
||||
uint8_t eNB_id,
|
||||
uint8_t gNB_id,
|
||||
uint8_t nr_slot_rx,
|
||||
unsigned char symbol,
|
||||
uint32_t nb_re_pdsch,
|
||||
unsigned char harq_pid,
|
||||
uint16_t rnti,
|
||||
RX_type_t rx_type);
|
||||
|
||||
|
||||
@@ -761,7 +761,7 @@ int32_t nr_rx_pdcch(PHY_VARS_NR_UE *ue,
|
||||
for (aarx = 0; aarx < frame_parms->nb_antennas_rx; aarx++)
|
||||
avgs = cmax(avgs, avgP[aarx]);
|
||||
|
||||
log2_maxh = (log2_approx(avgs) / 2) + 5; //+frame_parms->nb_antennas_rx;
|
||||
log2_maxh = (log2_approx(avgs) / 2) + 1; //+frame_parms->nb_antennas_rx;
|
||||
#ifdef UE_DEBUG_TRACE
|
||||
LOG_D(PHY,"slot %d: pdcch log2_maxh = %d (%d,%d)\n",slot,log2_maxh,avgP[0],avgs);
|
||||
#endif
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -629,16 +629,16 @@ __m128i tmp_result4 __attribute__ ((aligned(16)));
|
||||
//----------------------------------------------------------------------------------------------
|
||||
|
||||
int nr_dlsch_qpsk_llr(NR_DL_FRAME_PARMS *frame_parms,
|
||||
int32_t **rxdataF_comp,
|
||||
int32_t *rxdataF_comp,
|
||||
int16_t *dlsch_llr,
|
||||
uint8_t symbol,
|
||||
uint32_t len,
|
||||
uint8_t first_symbol_flag,
|
||||
uint32_t len,
|
||||
uint8_t first_symbol_flag,
|
||||
uint16_t nb_rb,
|
||||
uint8_t beamforming_mode)
|
||||
{
|
||||
|
||||
uint32_t *rxF = (uint32_t*)&rxdataF_comp[0][((int32_t)symbol*nb_rb*12)];
|
||||
uint32_t *rxF = (uint32_t *)&rxdataF_comp[((int32_t)symbol*nb_rb*12)];
|
||||
uint32_t *llr32;
|
||||
int i;
|
||||
|
||||
@@ -670,24 +670,23 @@ int nr_dlsch_qpsk_llr(NR_DL_FRAME_PARMS *frame_parms,
|
||||
//----------------------------------------------------------------------------------------------
|
||||
|
||||
void nr_dlsch_16qam_llr(NR_DL_FRAME_PARMS *frame_parms,
|
||||
int32_t **rxdataF_comp,
|
||||
int32_t *rxdataF_comp,
|
||||
int16_t *dlsch_llr,
|
||||
int32_t **dl_ch_mag,
|
||||
int32_t *dl_ch_mag,
|
||||
uint8_t symbol,
|
||||
uint32_t len,
|
||||
uint32_t len,
|
||||
uint8_t first_symbol_flag,
|
||||
uint16_t nb_rb,
|
||||
int16_t **llr32p,
|
||||
uint8_t beamforming_mode)
|
||||
{
|
||||
|
||||
#if defined(__x86_64__) || defined(__i386__)
|
||||
__m128i *rxF = (__m128i*)&rxdataF_comp[0][(symbol*nb_rb*12)];
|
||||
__m128i *rxF = (__m128i*)&rxdataF_comp[(symbol*nb_rb*12)];
|
||||
__m128i *ch_mag;
|
||||
__m128i llr128[2];
|
||||
uint32_t *llr32;
|
||||
#elif defined(__arm__)
|
||||
int16x8_t *rxF = (int16x8_t*)&rxdataF_comp[0][(symbol*nb_rb*12)];
|
||||
int16x8_t *rxF = (int16x8_t*)&rxdataF_comp[(symbol*nb_rb*12)];
|
||||
int16x8_t *ch_mag;
|
||||
int16x8_t xmm0;
|
||||
int16_t *llr16;
|
||||
@@ -699,30 +698,17 @@ void nr_dlsch_16qam_llr(NR_DL_FRAME_PARMS *frame_parms,
|
||||
|
||||
|
||||
#if defined(__x86_64__) || defined(__i386__)
|
||||
if (first_symbol_flag==1) {
|
||||
llr32 = (uint32_t*)dlsch_llr;
|
||||
} else {
|
||||
llr32 = (uint32_t*)*llr32p;
|
||||
}
|
||||
#elif defined(__arm__)
|
||||
if (first_symbol_flag==1) {
|
||||
llr16 = (int16_t*)dlsch_llr;
|
||||
} else {
|
||||
llr16 = (int16_t*)*llr32p;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(__x86_64__) || defined(__i386__)
|
||||
ch_mag = (__m128i*)&dl_ch_mag[0][(symbol*nb_rb*12)];
|
||||
ch_mag = (__m128i*)&dl_ch_mag[(symbol*nb_rb*12)];
|
||||
#elif defined(__arm__)
|
||||
ch_mag = (int16x8_t*)&dl_ch_mag[0][(symbol*nb_rb*12)];
|
||||
ch_mag = (int16x8_t*)&dl_ch_mag[(symbol*nb_rb*12)];
|
||||
#endif
|
||||
|
||||
// update output pointer according to number of REs in this symbol (<<2 because 4 bits per RE)
|
||||
if (first_symbol_flag == 1)
|
||||
*llr32p = dlsch_llr + (len<<2);
|
||||
else
|
||||
*llr32p += (len<<2);
|
||||
|
||||
// printf("len=%d\n", len);
|
||||
len_mod4 = len&3;
|
||||
@@ -786,47 +772,35 @@ void nr_dlsch_16qam_llr(NR_DL_FRAME_PARMS *frame_parms,
|
||||
//----------------------------------------------------------------------------------------------
|
||||
|
||||
void nr_dlsch_64qam_llr(NR_DL_FRAME_PARMS *frame_parms,
|
||||
int32_t **rxdataF_comp,
|
||||
int32_t *rxdataF_comp,
|
||||
int16_t *dlsch_llr,
|
||||
int32_t **dl_ch_mag,
|
||||
int32_t **dl_ch_magb,
|
||||
int32_t *dl_ch_mag,
|
||||
int32_t *dl_ch_magb,
|
||||
uint8_t symbol,
|
||||
uint32_t len,
|
||||
uint8_t first_symbol_flag,
|
||||
uint16_t nb_rb,
|
||||
uint32_t llr_offset,
|
||||
uint8_t beamforming_mode)
|
||||
{
|
||||
#if defined(__x86_64__) || defined(__i386__)
|
||||
__m128i *rxF = (__m128i*)&rxdataF_comp[0][(symbol*nb_rb*12)];
|
||||
__m128i *rxF = (__m128i*)&rxdataF_comp[(symbol*nb_rb*12)];
|
||||
__m128i *ch_mag,*ch_magb;
|
||||
#elif defined(__arm__)
|
||||
int16x8_t *rxF = (int16x8_t*)&rxdataF_comp[0][(symbol*nb_rb*12)];
|
||||
int16x8_t *rxF = (int16x8_t*)&rxdataF_comp[(symbol*nb_rb*12)];
|
||||
int16x8_t *ch_mag,*ch_magb,xmm1,xmm2;
|
||||
#endif
|
||||
int i,len2;
|
||||
unsigned char len_mod4;
|
||||
short *llr;
|
||||
int16_t *llr2;
|
||||
int8_t *pllr_symbol;
|
||||
|
||||
/*
|
||||
if (first_symbol_flag==1)
|
||||
llr = dlsch_llr;
|
||||
else
|
||||
llr = *llr_save;
|
||||
*/
|
||||
llr = dlsch_llr;
|
||||
|
||||
pllr_symbol = (int8_t*)dlsch_llr;
|
||||
pllr_symbol += llr_offset;
|
||||
llr2 = dlsch_llr;
|
||||
|
||||
#if defined(__x86_64__) || defined(__i386__)
|
||||
ch_mag = (__m128i*)&dl_ch_mag[0][(symbol*nb_rb*12)];
|
||||
ch_magb = (__m128i*)&dl_ch_magb[0][(symbol*nb_rb*12)];
|
||||
ch_mag = (__m128i*)&dl_ch_mag[(symbol*nb_rb*12)];
|
||||
ch_magb = (__m128i*)&dl_ch_magb[(symbol*nb_rb*12)];
|
||||
#elif defined(__arm__)
|
||||
ch_mag = (int16x8_t*)&dl_ch_mag[0][(symbol*nb_rb*12)];
|
||||
ch_magb = (int16x8_t*)&dl_ch_magb[0][(symbol*nb_rb*12)];
|
||||
ch_mag = (int16x8_t*)&dl_ch_mag[(symbol*nb_rb*12)];
|
||||
ch_magb = (int16x8_t*)&dl_ch_magb[(symbol*nb_rb*12)];
|
||||
#endif
|
||||
|
||||
// printf("nr_dlsch_64qam_llr: symbol %d,nb_rb %d, len %d,pbch_pss_sss_adjust %d\n",symbol,nb_rb,len,pbch_pss_sss_adjust);
|
||||
@@ -838,9 +812,6 @@ void nr_dlsch_64qam_llr(NR_DL_FRAME_PARMS *frame_parms,
|
||||
dlsch_llr,
|
||||
pllr_symbol);*/
|
||||
|
||||
llr2 = llr;
|
||||
llr += (len*6);
|
||||
|
||||
len_mod4 =len&3;
|
||||
len2=len>>2; // length in quad words (4 REs)
|
||||
len2+=((len_mod4==0)?0:1);
|
||||
@@ -1095,43 +1066,29 @@ void nr_dlsch_64qam_llr_SIC(NR_DL_FRAME_PARMS *frame_parms,
|
||||
//----------------------------------------------------------------------------------------------
|
||||
|
||||
void nr_dlsch_256qam_llr(NR_DL_FRAME_PARMS *frame_parms,
|
||||
int32_t **rxdataF_comp,
|
||||
int32_t *rxdataF_comp,
|
||||
int16_t *dlsch_llr,
|
||||
int32_t **dl_ch_mag,
|
||||
int32_t **dl_ch_magb,
|
||||
int32_t **dl_ch_magr,
|
||||
int32_t *dl_ch_mag,
|
||||
int32_t *dl_ch_magb,
|
||||
int32_t *dl_ch_magr,
|
||||
uint8_t symbol,
|
||||
uint32_t len,
|
||||
uint8_t first_symbol_flag,
|
||||
uint16_t nb_rb,
|
||||
uint32_t llr_offset,
|
||||
uint8_t beamforming_mode)
|
||||
{
|
||||
__m128i *rxF = (__m128i*)&rxdataF_comp[0][(symbol*nb_rb*12)];
|
||||
__m128i *rxF = (__m128i*)&rxdataF_comp[(symbol*nb_rb*12)];
|
||||
__m128i *ch_mag,*ch_magb,*ch_magr;
|
||||
|
||||
int i,len2;
|
||||
unsigned char len_mod4;
|
||||
short *llr;
|
||||
int16_t *llr2;
|
||||
int8_t *pllr_symbol;
|
||||
|
||||
/*
|
||||
if (first_symbol_flag==1)
|
||||
llr = dlsch_llr;
|
||||
else
|
||||
llr = *llr_save;
|
||||
*/
|
||||
llr = dlsch_llr;
|
||||
llr2 = dlsch_llr;
|
||||
|
||||
pllr_symbol = (int8_t*)dlsch_llr;
|
||||
pllr_symbol += llr_offset;
|
||||
|
||||
ch_mag = (__m128i*)&dl_ch_mag[0][(symbol*nb_rb*12)];
|
||||
ch_magb = (__m128i*)&dl_ch_magb[0][(symbol*nb_rb*12)];
|
||||
ch_magr = (__m128i*)&dl_ch_magr[0][(symbol*nb_rb*12)];
|
||||
llr2 = llr;
|
||||
llr += (len*8);
|
||||
ch_mag = (__m128i*)&dl_ch_mag[(symbol*nb_rb*12)];
|
||||
ch_magb = (__m128i*)&dl_ch_magb[(symbol*nb_rb*12)];
|
||||
ch_magr = (__m128i*)&dl_ch_magr[(symbol*nb_rb*12)];
|
||||
|
||||
len_mod4 =len&3;
|
||||
len2=len>>2; // length in quad words (4 REs)
|
||||
|
||||
@@ -471,7 +471,7 @@ int nr_dlsch_64qam_64qam_llr(NR_DL_FRAME_PARMS *frame_parms,
|
||||
@param beamforming_mode beamforming mode
|
||||
*/
|
||||
int32_t nr_dlsch_qpsk_llr(NR_DL_FRAME_PARMS *frame_parms,
|
||||
int32_t **rxdataF_comp,
|
||||
int32_t *rxdataF_comp,
|
||||
int16_t *dlsch_llr,
|
||||
uint8_t symbol,
|
||||
uint32_t len,
|
||||
@@ -505,14 +505,13 @@ int32_t nr_dlsch_qpsk_llr_SIC(NR_DL_FRAME_PARMS *frame_parms,
|
||||
uint32_t rb_alloc);
|
||||
|
||||
void nr_dlsch_16qam_llr(NR_DL_FRAME_PARMS *frame_parms,
|
||||
int32_t **rxdataF_comp,
|
||||
int32_t *rxdataF_comp,
|
||||
int16_t *dlsch_llr,
|
||||
int32_t **dl_ch_mag,
|
||||
int32_t *dl_ch_mag,
|
||||
uint8_t symbol,
|
||||
uint32_t len,
|
||||
uint32_t len,
|
||||
uint8_t first_symbol_flag,
|
||||
uint16_t nb_rb,
|
||||
int16_t **llr32p,
|
||||
uint8_t beamforming_mode);
|
||||
/**
|
||||
\brief This function generates log-likelihood ratios (decoder input) for single-stream 16QAM received waveforms
|
||||
@@ -553,28 +552,26 @@ void dlsch_64qam_llr_SIC(NR_DL_FRAME_PARMS *frame_parms,
|
||||
uint32_t rb_alloc);
|
||||
|
||||
void nr_dlsch_64qam_llr(NR_DL_FRAME_PARMS *frame_parms,
|
||||
int32_t **rxdataF_comp,
|
||||
int32_t *rxdataF_comp,
|
||||
int16_t *dlsch_llr,
|
||||
int32_t **dl_ch_mag,
|
||||
int32_t **dl_ch_magb,
|
||||
int32_t *dl_ch_mag,
|
||||
int32_t *dl_ch_magb,
|
||||
uint8_t symbol,
|
||||
uint32_t len,
|
||||
uint32_t len,
|
||||
uint8_t first_symbol_flag,
|
||||
uint16_t nb_rb,
|
||||
uint32_t llr_offset,
|
||||
uint8_t beamforming_mode);
|
||||
|
||||
void nr_dlsch_256qam_llr(NR_DL_FRAME_PARMS *frame_parms,
|
||||
int32_t **rxdataF_comp,
|
||||
int32_t *rxdataF_comp,
|
||||
int16_t *dlsch_llr,
|
||||
int32_t **dl_ch_mag,
|
||||
int32_t **dl_ch_magb,
|
||||
int32_t **dl_ch_magr,
|
||||
int32_t *dl_ch_mag,
|
||||
int32_t *dl_ch_magb,
|
||||
int32_t *dl_ch_magr,
|
||||
uint8_t symbol,
|
||||
uint32_t len,
|
||||
uint8_t first_symbol_flag,
|
||||
uint16_t nb_rb,
|
||||
uint32_t llr_offset,
|
||||
uint8_t beamforming_mode);
|
||||
|
||||
/** \fn dlsch_siso(NR_DL_FRAME_PARMS *frame_parms,
|
||||
@@ -807,7 +804,7 @@ void nr_dlsch_channel_compensation(int32_t **rxdataF_ext,
|
||||
NR_DL_FRAME_PARMS *frame_parms,
|
||||
uint8_t nb_aatx,
|
||||
uint8_t symbol,
|
||||
uint8_t start_symbol,
|
||||
int length,
|
||||
uint8_t first_symbol_flag,
|
||||
uint8_t mod_order,
|
||||
uint16_t nb_rb,
|
||||
@@ -891,13 +888,15 @@ void nr_dlsch_channel_level_median(int **dl_ch_estimates_ext,
|
||||
int start_point);
|
||||
|
||||
void nr_dlsch_detection_mrc(int **rxdataF_comp,
|
||||
int ***rho,
|
||||
int **dl_ch_mag,
|
||||
int **dl_ch_magb,
|
||||
short n_tx,
|
||||
short n_rx,
|
||||
unsigned char symbol,
|
||||
unsigned short nb_rb);
|
||||
int ***rho,
|
||||
int **dl_ch_mag,
|
||||
int **dl_ch_magb,
|
||||
int **dl_ch_magr,
|
||||
short n_tx,
|
||||
short n_rx,
|
||||
unsigned char symbol,
|
||||
unsigned short nb_rb,
|
||||
int length);
|
||||
|
||||
void nr_dlsch_detection_mrc_core(int **rxdataF_comp,
|
||||
int **rxdataF_comp_i,
|
||||
|
||||
@@ -114,7 +114,6 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
|
||||
|
||||
NR_DL_FRAME_PARMS *frame_parms = &UE->frame_parms;
|
||||
NR_UE_PUSCH *pusch_ue = UE->pusch_vars[thread_id][gNB_id];
|
||||
// ptrs_UplinkConfig_t *ptrs_Uplink_Config = &UE->pusch_config.dmrs_UplinkConfig.ptrs_UplinkConfig;
|
||||
|
||||
uint8_t num_of_codewords = 1; // tmp assumption
|
||||
int Nid_cell = 0;
|
||||
|
||||
@@ -966,22 +966,7 @@ typedef struct {
|
||||
|
||||
//#if defined(UPGRADE_RAT_NR)
|
||||
#if 1
|
||||
|
||||
SystemInformationBlockType1_nr_t systemInformationBlockType1_nr;
|
||||
|
||||
CellGroupConfig_t cell_group_config;
|
||||
PDSCH_ServingCellConfig_t PDSCH_ServingCellConfig;
|
||||
PDSCH_Config_t PDSCH_Config;
|
||||
|
||||
PUSCH_Config_t pusch_config;
|
||||
SRS_NR srs;
|
||||
|
||||
crossCarrierSchedulingConfig_t crossCarrierSchedulingConfig;
|
||||
supplementaryUplink_t supplementaryUplink;
|
||||
dmrs_DownlinkConfig_t dmrs_DownlinkConfig;
|
||||
csi_MeasConfig_t csi_MeasConfig;
|
||||
PUSCH_ServingCellConfig_t PUSCH_ServingCellConfig;
|
||||
|
||||
#endif
|
||||
|
||||
uint8_t ncs_cell[20][7];
|
||||
|
||||
@@ -93,18 +93,18 @@
|
||||
#define NR_MAX_CSET_DURATION 3
|
||||
|
||||
#define NR_MAX_NB_RBG 18
|
||||
#define NR_MAX_NB_LAYERS 8 // SU-MIMO (3GPP TS 38.211 V15.4.0 section 7.3.1.3)
|
||||
#define NR_MAX_NB_LAYERS 2 // 8 // SU-MIMO (3GPP TS 38.211 V15.4.0 section 7.3.1.3)
|
||||
#define NR_MAX_NB_CODEWORDS 2
|
||||
#define NR_MAX_NB_HARQ_PROCESSES 16
|
||||
#define NR_MAX_PDSCH_ENCODED_LENGTH NR_MAX_NB_RB*NR_SYMBOLS_PER_SLOT*NR_NB_SC_PER_RB*8*NR_MAX_NB_LAYERS // 8 is the maximum modulation order (it was 950984 before !!)
|
||||
#define NR_MAX_PDSCH_ENCODED_LENGTH (NR_MAX_NB_RB*NR_SYMBOLS_PER_SLOT*NR_NB_SC_PER_RB*8*NR_MAX_NB_LAYERS) // 8 is the maximum modulation order (it was 950984 before !!)
|
||||
#define NR_MAX_PUSCH_ENCODED_LENGTH NR_MAX_PDSCH_ENCODED_LENGTH
|
||||
#define NR_MAX_PDSCH_TBS 3824
|
||||
#define NR_MAX_SIB_LENGTH 2976 // 3GPP TS 38.331 section 5.2.1 - The physical layer imposes a limit to the maximum size a SIB can take. The maximum SIB1 or SI message size is 2976 bits.
|
||||
|
||||
#define MAX_NUM_NR_DLSCH_SEGMENTS 34
|
||||
#define MAX_NUM_NR_DLSCH_SEGMENTS (NR_MAX_NB_LAYERS*34)
|
||||
#define MAX_NR_DLSCH_PAYLOAD_BYTES (MAX_NUM_NR_DLSCH_SEGMENTS*1056)
|
||||
|
||||
#define MAX_NUM_NR_ULSCH_SEGMENTS MAX_NUM_NR_DLSCH_SEGMENTS
|
||||
#define MAX_NUM_NR_ULSCH_SEGMENTS 34
|
||||
#define MAX_NR_ULSCH_PAYLOAD_BYTES (MAX_NUM_NR_ULSCH_SEGMENTS*1056)
|
||||
|
||||
#define MAX_NUM_NR_CHANNEL_BITS (14*273*12*8) // 14 symbols, 273 RB
|
||||
|
||||
+9
-414
@@ -339,124 +339,22 @@ typedef struct {
|
||||
*
|
||||
************************************************************************/
|
||||
|
||||
/* FFS TODO_NR partial structure that should be complete */
|
||||
|
||||
typedef enum {
|
||||
semiStatic = 0,
|
||||
dynamic = 1
|
||||
} pdsch_HARQ_ACK_Codebook_t;
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////################################
|
||||
#define MAX_NR_RATE_MATCH_PATTERNS 4
|
||||
#define MAX_NR_ZP_CSI_RS_RESOURCES 32
|
||||
#define MAX_NR_OF_DL_ALLOCATIONS 16
|
||||
#define MAX_NR_OF_UL_ALLOCATIONS (16)
|
||||
|
||||
typedef enum{
|
||||
dl_resourceAllocationType0 = 1,
|
||||
dl_resourceAllocationType1 = 2,
|
||||
dl_dynamicSwitch = 3
|
||||
} dl_resourceAllocation_t;
|
||||
typedef enum{
|
||||
dl_rgb_config1 = 1,
|
||||
dl_rgb_config2 = 2
|
||||
} dl_rgb_Size_t;
|
||||
typedef enum {
|
||||
st_n4 = 1,
|
||||
st_wideband = 2
|
||||
} static_bundleSize_t;
|
||||
typeA = 0,
|
||||
typeB = 1
|
||||
} mappingType_t;
|
||||
|
||||
typedef enum {
|
||||
dy_1_n4 = 1,
|
||||
dy_1_wideband = 2,
|
||||
dy_1_n2_wideband = 3,
|
||||
dy_1_n4_wideband = 4
|
||||
} bundleSizeSet1_t;
|
||||
typedef enum {
|
||||
dy_2_n4 = 1,
|
||||
dy_2_wideband = 2,
|
||||
} bundleSizeSet2_t;
|
||||
typedef struct{
|
||||
bundleSizeSet1_t bundleSizeSet1;
|
||||
bundleSizeSet2_t bundleSizeSet2;
|
||||
} dynamic_bundleSize_t;
|
||||
typedef struct {
|
||||
static_bundleSize_t staticBundling;
|
||||
dynamic_bundleSize_t dynamicBundlig;
|
||||
} prb_bundleType_t;
|
||||
typedef enum {
|
||||
nb_code_n1 = 1,
|
||||
nb_code_n2 = 2
|
||||
} maxNrofCodeWordsScheduledByDCI_t;
|
||||
typedef struct{
|
||||
// to be defined FIXME!!!
|
||||
}rateMatchPattern_t;
|
||||
typedef struct{
|
||||
// to be defined FIXME!!!
|
||||
}zp_CSI_RS_Resource_t;
|
||||
|
||||
typedef struct{
|
||||
int k0;
|
||||
int mappingType;
|
||||
int startSymbolAndLength;
|
||||
|
||||
}PDSCH_TimeDomainResourceAllocation_t;
|
||||
typedef struct {
|
||||
/*
|
||||
* resourceAllocation
|
||||
*/
|
||||
dl_resourceAllocation_t dl_resourceAllocation;
|
||||
/*
|
||||
* corresponds to I, where I the number of entries in the higher layer parameter pdsch-AllocationList
|
||||
*/
|
||||
uint8_t n_pdsh_alloc_list;
|
||||
/*
|
||||
* rateMatchPatternToAddModList
|
||||
*/
|
||||
rateMatchPattern_t rateMatchPatternToAddModList[MAX_NR_RATE_MATCH_PATTERNS];
|
||||
/*
|
||||
* rateMatchPatternToReleaseList
|
||||
*/
|
||||
uint8_t rateMatchPatternToReleaseList[MAX_NR_RATE_MATCH_PATTERNS];
|
||||
/*
|
||||
* n_rateMatchPatterns indicates the number of rateMatchPatterns defined currently
|
||||
*/
|
||||
uint8_t n_rateMatchPatterns;
|
||||
/*
|
||||
* zp-CSI-RS-ResourceToAddModList
|
||||
*/
|
||||
zp_CSI_RS_Resource_t zp_CSI_RS_Resource[MAX_NR_ZP_CSI_RS_RESOURCES];
|
||||
/*
|
||||
* zp-CSI-RS-ResourceToReleaseList
|
||||
*/
|
||||
uint8_t zp_CSI_RS_ResourceId[MAX_NR_ZP_CSI_RS_RESOURCES];
|
||||
/*
|
||||
* n_zp-CSI-RS-Resource
|
||||
*/
|
||||
uint8_t n_zp_CSI_RS_ResourceId;
|
||||
/*
|
||||
* rgb_Size
|
||||
*/
|
||||
dl_rgb_Size_t dl_rgbSize;
|
||||
/*
|
||||
* prb-BundlingType
|
||||
*/
|
||||
prb_bundleType_t prbBundleType;
|
||||
/*
|
||||
* pdsch-HARQ-ACK-Codebook: this is part of the IE PhysicalCellGroupConfig which is used to configure cell-group specific L1 parameters (TS 38.331)
|
||||
*/
|
||||
pdsch_HARQ_ACK_Codebook_t pdsch_HARQ_ACK_Codebook;
|
||||
////////////////////////////////////////////////////////////////////////////////################################
|
||||
|
||||
/*
|
||||
Maximum number of code words that a single DCI may schedule. This changes the number of MCS/RV/NDI bits in the DCI message from 1 to 2.
|
||||
*/
|
||||
maxNrofCodeWordsScheduledByDCI_t maxNrofCodeWordsScheduledByDCI;
|
||||
|
||||
|
||||
PDSCH_TimeDomainResourceAllocation_t *pdsch_TimeDomainResourceAllocation[MAX_NR_OF_DL_ALLOCATIONS];
|
||||
|
||||
} PDSCH_Config_t;
|
||||
pdsch_dmrs_pos0 = 0,
|
||||
pdsch_dmrs_pos1 = 1,
|
||||
pdsch_dmrs_pos2 = 2,
|
||||
pdsch_dmrs_pos3 = 3,
|
||||
} pdsch_dmrs_AdditionalPosition_t;
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
@@ -466,128 +364,20 @@ typedef struct {
|
||||
*
|
||||
************************************************************************/
|
||||
|
||||
|
||||
typedef enum {
|
||||
enable_tpc_accumulation = 0, /* by default it is enable */
|
||||
disable_tpc_accumulation = 1
|
||||
} tpc_Accumulation_t;
|
||||
|
||||
typedef enum {
|
||||
typeA = 0,
|
||||
typeB = 1
|
||||
} mappingType_t;
|
||||
|
||||
typedef struct {
|
||||
tpc_Accumulation_t tpc_Accumulation;
|
||||
} PUSCH_PowerControl_t;
|
||||
|
||||
typedef struct {
|
||||
|
||||
uint8_t k2;
|
||||
mappingType_t mappingType;
|
||||
uint8_t startSymbolAndLength;
|
||||
} PUSCH_TimeDomainResourceAllocation_t;
|
||||
////////////////////////////////////////////////////////////////////////////////################################
|
||||
typedef enum{
|
||||
maxCodeBlockGroupsPerTransportBlock_n2 = 2,
|
||||
maxCodeBlockGroupsPerTransportBlock_n4 = 4,
|
||||
maxCodeBlockGroupsPerTransportBlock_n6 = 6,
|
||||
maxCodeBlockGroupsPerTransportBlock_n8 = 8
|
||||
} maxCodeBlockGroupsPerTransportBlock_t;
|
||||
typedef struct{ // The IE PUSCH-ServingCellConfig is used to configure UE specific PUSCH parameters that are common across the UE's BWPs of one serving cell
|
||||
maxCodeBlockGroupsPerTransportBlock_t maxCodeBlockGroupsPerTransportBlock;
|
||||
} PUSCH_ServingCellConfig_t;
|
||||
typedef struct{ // CSI-MeasConfig IE is used to configure CSI-RS (reference signals)
|
||||
uint8_t reportTriggerSize;
|
||||
} csi_MeasConfig_t;
|
||||
typedef enum {
|
||||
pdsch_dmrs_type1 = 0,
|
||||
pdsch_dmrs_type2 = 1
|
||||
} pdsch_dmrs_type_t;
|
||||
typedef enum {
|
||||
pusch_dmrs_type1 = 0,
|
||||
pusch_dmrs_type2 = 1
|
||||
} pusch_dmrs_type_t;
|
||||
typedef enum {
|
||||
pdsch_dmrs_pos0 = 0,
|
||||
pdsch_dmrs_pos1 = 1,
|
||||
pdsch_dmrs_pos3 = 3,
|
||||
} pdsch_dmrs_AdditionalPosition_t;
|
||||
typedef enum {
|
||||
pusch_dmrs_pos0 = 0,
|
||||
pusch_dmrs_pos1 = 1,
|
||||
pusch_dmrs_pos2 = 2,
|
||||
pusch_dmrs_pos3 = 3,
|
||||
} pusch_dmrs_AdditionalPosition_t;
|
||||
typedef enum {
|
||||
offset00 = 0,
|
||||
offset01 = 1,
|
||||
offset10 = 2,
|
||||
offset11 = 3,
|
||||
} ptrs_resource_elementoffset_t;
|
||||
typedef enum {
|
||||
pdsch_len1 = 1,
|
||||
pdsch_len2 = 2
|
||||
} pdsch_maxLength_t;
|
||||
typedef enum {
|
||||
pusch_len1 = 1,
|
||||
pusch_len2 = 2
|
||||
} pusch_maxLength_t;
|
||||
typedef struct {
|
||||
uint8_t ptrs_mcs1;
|
||||
uint8_t ptrs_mcs2;
|
||||
uint8_t ptrs_mcs3;
|
||||
} ptrs_time_density_t;
|
||||
typedef struct {
|
||||
uint16_t n_rb0;
|
||||
uint16_t n_rb1;
|
||||
} ptrs_frequency_density_t;
|
||||
typedef struct { // The IE PTRS-UplinkConfig is used to configure uplink Phase-Tracking-Reference-Signals (PTRS)
|
||||
uint8_t num_ptrs_ports;
|
||||
ptrs_resource_elementoffset_t resourceElementOffset;
|
||||
ptrs_time_density_t timeDensity;
|
||||
ptrs_frequency_density_t frequencyDensity;
|
||||
uint32_t ul_ptrs_power;
|
||||
} ptrs_UplinkConfig_t;
|
||||
typedef struct { // The IE DMRS-DownlinkConfig is used to configure downlink demodulation reference signals for PDSCH
|
||||
pdsch_dmrs_type_t pdsch_dmrs_type;
|
||||
pdsch_dmrs_AdditionalPosition_t pdsch_dmrs_AdditionalPosition;
|
||||
pdsch_maxLength_t pdsch_maxLength;
|
||||
uint16_t scramblingID0;
|
||||
uint16_t scramblingID1;
|
||||
} dmrs_DownlinkConfig_t;
|
||||
typedef struct { // The IE DMRS-UplinkConfig is used to configure uplink demodulation reference signals for PUSCH
|
||||
pusch_dmrs_type_t pusch_dmrs_type;
|
||||
pusch_dmrs_AdditionalPosition_t pusch_dmrs_AdditionalPosition;
|
||||
pusch_maxLength_t pusch_maxLength;
|
||||
ptrs_UplinkConfig_t ptrs_UplinkConfig;
|
||||
uint16_t scramblingID0;
|
||||
uint16_t scramblingID1;
|
||||
} dmrs_UplinkConfig_t;
|
||||
typedef struct {
|
||||
/*
|
||||
* Serving cell ID of a PSCell. The PCell of the Master Cell Group uses ID = 0
|
||||
*/
|
||||
uint8_t servCellIndex;
|
||||
}servCellIndex_t;
|
||||
typedef struct{
|
||||
uint8_t cif_presence;
|
||||
}own_t;
|
||||
typedef struct{
|
||||
servCellIndex_t scheduling_cell_id;
|
||||
uint8_t cif_InSchedulingCell;
|
||||
}other_t;
|
||||
typedef struct{
|
||||
own_t own;
|
||||
other_t other;
|
||||
}schedulingCellInfo_t;
|
||||
typedef struct{
|
||||
schedulingCellInfo_t schedulingCellInfo;
|
||||
} crossCarrierSchedulingConfig_t;
|
||||
typedef struct{
|
||||
// this variable will be filled with '1' if SUL is supported and '0' if SUL is not supported
|
||||
uint8_t supplementaryUplink;
|
||||
}supplementaryUplink_t;
|
||||
|
||||
typedef enum {
|
||||
txConfig_codebook = 1,
|
||||
@@ -628,57 +418,6 @@ typedef struct {
|
||||
betaOffset_type_t betaOffset_type;
|
||||
betaOffset_t betaOffset;
|
||||
} uci_onPusch_t;
|
||||
typedef struct {
|
||||
/*
|
||||
* txConfig
|
||||
*/
|
||||
txConfig_t txConfig;
|
||||
/*
|
||||
* frequencyHopping
|
||||
*/
|
||||
frequencyHopping_t frequencyHopping;
|
||||
/*
|
||||
* frequencyHoppingOffsetLists
|
||||
*/
|
||||
uint16_t frequencyHoppingOffsetLists[4];
|
||||
// n_frequencyHoppingOffsetLists contains the number of offsets listed. We can list up to 4 offsets
|
||||
uint8_t n_frequencyHoppingOffsetLists;
|
||||
/*
|
||||
* resourceAllocation
|
||||
*/
|
||||
ul_resourceAllocation_t ul_resourceAllocation;
|
||||
/*
|
||||
* DMRS-Uplinkconfig
|
||||
*/
|
||||
dmrs_UplinkConfig_t dmrs_UplinkConfig;
|
||||
/*
|
||||
* rgb_Size
|
||||
*/
|
||||
ul_rgb_Size_t ul_rgbSize;
|
||||
/*
|
||||
* corresponds to I, where I the number of entries in the higher layer parameter pusch-AllocationList
|
||||
*/
|
||||
uint8_t n_push_alloc_list;
|
||||
/*
|
||||
* transformPrecoder
|
||||
*/
|
||||
transformPrecoder_t transformPrecoder;
|
||||
/*
|
||||
* codebookSubset
|
||||
*/
|
||||
codebookSubset_t codebookSubset;
|
||||
/*
|
||||
* maxRank
|
||||
*/
|
||||
uint8_t maxRank;
|
||||
/*
|
||||
* uci_onPusch
|
||||
*/
|
||||
uci_onPusch_t uci_onPusch;
|
||||
////////////////////////////////////////////////////////////////////////////////################################
|
||||
PUSCH_PowerControl_t pusch_PowerControl;
|
||||
PUSCH_TimeDomainResourceAllocation_t *pusch_TimeDomainResourceAllocation[MAX_NR_OF_UL_ALLOCATIONS];
|
||||
} PUSCH_Config_t;
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
@@ -885,150 +624,6 @@ typedef struct {
|
||||
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* FUNCTIONALITY : PhysicalCellGroupConfig
|
||||
*
|
||||
* DESCRIPTION : Physical cell group configuration
|
||||
*
|
||||
************************************************************************/
|
||||
|
||||
typedef uint16_t RNTI_value_t;
|
||||
|
||||
typedef struct {
|
||||
/*
|
||||
-- Enables spatial bundling of HARQ ACKs. It is configured per cell group (i.e. for all the cells within the cell group) for PUCCH
|
||||
-- reporting of HARQ-ACK. It is only applicable when more than 4 layers are possible to schedule.
|
||||
-- Corresponds to L1 parameter 'HARQ-ACK-spatial-bundling' (see 38.213, section FFS_Section)
|
||||
-- Absence indicates that spatial bundling is disabled.
|
||||
*/
|
||||
bool harq_ACK_SpatialBundlingPUCCH;
|
||||
/*
|
||||
-- Enables spatial bundling of HARQ ACKs. It is configured per cell group (i.e. for all the cells within the cell group) for PUSCH
|
||||
-- reporting of HARQ-ACK. It is only applicable when more than 4 layers are possible to schedule.
|
||||
-- Corresponds to L1 parameter 'HARQ-ACK-spatial-bundling' (see 38.213, section FFS_Section)
|
||||
-- Absence indicates that spatial bundling is disabled.
|
||||
*/
|
||||
bool harq_ACK_SpatialBundlingPUSCH;
|
||||
/*
|
||||
-- The maximum transmit power to be used by the UE in this NR cell group.
|
||||
*/
|
||||
uint8_t p_NR;
|
||||
/*
|
||||
-- The PDSCH HARQ-ACK codebook is either semi-static of dynamic. This is applicable to both CA and none CA operation.
|
||||
-- Corresponds to L1 parameter 'HARQ-ACK-codebook' (see 38.213, section FFS_Section)
|
||||
*/
|
||||
pdsch_HARQ_ACK_Codebook_t pdsch_HARQ_ACK_Codebook;
|
||||
/*
|
||||
-- RNTI used for SRS TPC commands on DCI. Corresponds to L1 parameter 'TPC-SRS-RNTI' (see 38.213, section 10)
|
||||
*/
|
||||
RNTI_value_t tpc_SRS_RNTI;
|
||||
/*
|
||||
-- RNTI used for PUCCH TPC commands on DCI. Corresponds to L1 parameter 'TPC-PUCCH-RNTI' (see 38.213, section 10).
|
||||
*/
|
||||
RNTI_value_t tpc_PUCCH_RNTI;
|
||||
/*
|
||||
-- RNTI used for PUSCH TPC commands on DCI. Corresponds to L1 parameter 'TPC-PUSCH-RNTI' (see 38.213, section 10)
|
||||
*/
|
||||
RNTI_value_t tpc_PUSCH_RNTI;
|
||||
} PhysicalCellGroupConfig_t;
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* FUNCTIONALITY : CellGroupConfig
|
||||
*
|
||||
* DESCRIPTION : Cell Group configuration
|
||||
*
|
||||
************************************************************************/
|
||||
|
||||
/* FFS TODO_NR partial structure that should be complete */
|
||||
|
||||
typedef struct {
|
||||
/*
|
||||
cellGroupId CellGroupId,
|
||||
|
||||
-- Logical Channel configuration and association with radio bearers:
|
||||
rlc-BearerToAddModList SEQUENCE (SIZE(1..maxLC-ID)) OF RLC-Bearer-Config OPTIONAL, -- Need N
|
||||
rlc-BearerToReleaseList SEQUENCE (SIZE(1..maxLC-ID)) OF LogicalChannelIdentity OPTIONAL, -- Need N
|
||||
|
||||
-- Parameters applicable for the entire cell group:
|
||||
mac-CellGroupConfig MAC-CellGroupConfig OPTIONAL, -- Need M
|
||||
*/
|
||||
PhysicalCellGroupConfig_t physicalCellGroupConfig;
|
||||
/*
|
||||
-- Serving Cell specific parameters (SpCell and SCells)
|
||||
spCellConfig SpCellConfig OPTIONAL, -- Need M
|
||||
sCellToAddModList SEQUENCE (SIZE (1..maxNrofSCells)) OF SCellConfig OPTIONAL, -- Need N
|
||||
-- List of seconary serving cells to be released (not applicable for SpCells)
|
||||
sCellToReleaseList SEQUENCE (SIZE (1..maxNrofSCells)) OF SCellIndex OPTIONAL, -- Need N
|
||||
...
|
||||
*/
|
||||
} CellGroupConfig_t;
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* FUNCTIONALITY : PDSCH_ServingCellConfig
|
||||
*
|
||||
* DESCRIPTION : pdsch serving cell configuration
|
||||
*
|
||||
************************************************************************/
|
||||
|
||||
/* FFS TODO_NR partial structure that should be complete */
|
||||
|
||||
typedef int PDSCH_CodeBlockGroupTransmission_t; /* dummy struct which should be change by correct structure */
|
||||
|
||||
typedef enum {
|
||||
xOh6 = 0,
|
||||
xOh12 = 1,
|
||||
xOh18 = 2
|
||||
} xOverhead_t;
|
||||
|
||||
typedef enum {
|
||||
n2_dl_harq = 2,
|
||||
n4_dl_harq = 4,
|
||||
n6_dl_harq = 6,
|
||||
n10_dl_harq = 10,
|
||||
n12_dl_harq = 12,
|
||||
n16_dl_harq = 16
|
||||
} nrofHARQ_ProcessesForPDSCH_t;
|
||||
typedef enum{
|
||||
maxCodeBlockGroupsPerTransportBlock_dl_n2 = 2,
|
||||
maxCodeBlockGroupsPerTransportBlock_dl_n4 = 4,
|
||||
maxCodeBlockGroupsPerTransportBlock_dl_n6 = 6,
|
||||
maxCodeBlockGroupsPerTransportBlock_dl_n8 = 8
|
||||
} maxCodeBlockGroupsPerTransportBlock_dl_t;
|
||||
|
||||
typedef struct {
|
||||
/*
|
||||
-- Enables and configures code-block-group (CBG) based transmission (see 38.213, section 9.1.1)
|
||||
*/
|
||||
PDSCH_CodeBlockGroupTransmission_t *codeBlockGroupTransmission;
|
||||
/*
|
||||
-- Accounts for overhead from CSI-RS, CORESET, etc. If the field is absent, the UE applies value xOh0.
|
||||
-- Corresponds to L1 parameter 'Xoh-PDSCH' (see 38.214, section 5.1.3.2)
|
||||
*/
|
||||
xOverhead_t xOverhead;
|
||||
/*
|
||||
-- The number of HARQ processes to be used on the PDSCH of a serving cell. n2 corresponds to 2 HARQ processes, n4 to 4 HARQ processes
|
||||
-- and so on. If the field is absent, the UE uses 8 HARQ processes.
|
||||
-- Corresponds to L1 parameter 'number-HARQ-process-PDSCH' (see 38.214, section REF)
|
||||
*/
|
||||
nrofHARQ_ProcessesForPDSCH_t nrofHARQ_ProcessesForPDSCH;
|
||||
/*
|
||||
-- The ID of the serving cell (of the same cell group) to use for PUCCH.
|
||||
-- If the field is absent, the UE sends the HARQ feedback on the PUCCH of the SpCell of this cell group.
|
||||
*/
|
||||
uint8_t pucch_Cell;
|
||||
/*
|
||||
* maxCodeBlockGroupsPerTransportBlock_dl_t
|
||||
*/
|
||||
maxCodeBlockGroupsPerTransportBlock_dl_t maxCodeBlockGroupsPerTransportBlock_dl;
|
||||
/*
|
||||
* codeBlockGroupFlushIndicator (boolean)
|
||||
*/
|
||||
uint8_t codeBlockGroupFlushIndicator;
|
||||
} PDSCH_ServingCellConfig_t;
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* FUNCTIONALITY : Scheduling Request Configuration (SR)
|
||||
|
||||
Reference in New Issue
Block a user