Commit 630e39ae authored by Elena_Lukashova's avatar Elena_Lukashova

Intermediate commit. Adding HARQ support for SIC receiver. Changes in...

Intermediate commit. Adding HARQ support for SIC receiver. Changes in dci_tools.c to map TB to CW in a proper way.
Enable different options for TB1 retransmissions. Needs further improvements.
parent 64116b90
...@@ -878,7 +878,7 @@ int generate_eNB_dlsch_params_from_dci(int frame, ...@@ -878,7 +878,7 @@ int generate_eNB_dlsch_params_from_dci(int frame,
uint32_t rballoc = UINT32_MAX; uint32_t rballoc = UINT32_MAX;
uint32_t RIV_max = 0; uint32_t RIV_max = 0;
uint8_t NPRB,tbswap,tpmi=0; uint8_t NPRB,tbswap,tpmi=0;
LTE_eNB_DLSCH_t *dlsch0=NULL,*dlsch1; LTE_eNB_DLSCH_t *dlsch0=NULL,*dlsch1=NULL;
uint8_t frame_type=frame_parms->frame_type; uint8_t frame_type=frame_parms->frame_type;
uint8_t vrb_type=0; uint8_t vrb_type=0;
uint8_t mcs=0,mcs1=0,mcs2=0; uint8_t mcs=0,mcs1=0,mcs2=0;
...@@ -886,6 +886,7 @@ int generate_eNB_dlsch_params_from_dci(int frame, ...@@ -886,6 +886,7 @@ int generate_eNB_dlsch_params_from_dci(int frame,
uint8_t rv=0,rv1=0,rv2=0; uint8_t rv=0,rv1=0,rv2=0;
uint8_t rah=0; uint8_t rah=0;
uint8_t TPC=0; uint8_t TPC=0;
uint8_t TB0_active=0,TB1_active=0;
LTE_DL_eNB_HARQ_t *dlsch0_harq=NULL,*dlsch1_harq=NULL; LTE_DL_eNB_HARQ_t *dlsch0_harq=NULL,*dlsch1_harq=NULL;
// printf("Generate eNB DCI, format %d, rnti %x (pdu %p)\n",dci_format,rnti,dci_pdu); // printf("Generate eNB DCI, format %d, rnti %x (pdu %p)\n",dci_format,rnti,dci_pdu);
...@@ -926,6 +927,7 @@ int generate_eNB_dlsch_params_from_dci(int frame, ...@@ -926,6 +927,7 @@ int generate_eNB_dlsch_params_from_dci(int frame,
} }
dlsch0_harq = dlsch[0]->harq_processes[harq_pid]; dlsch0_harq = dlsch[0]->harq_processes[harq_pid];
dlsch0_harq->codeword=0;
if (vrb_type==LOCALIZED) { if (vrb_type==LOCALIZED) {
dlsch0_harq->rb_alloc[0] = localRIV2alloc_LUT6[rballoc]; dlsch0_harq->rb_alloc[0] = localRIV2alloc_LUT6[rballoc];
...@@ -1216,6 +1218,7 @@ int generate_eNB_dlsch_params_from_dci(int frame, ...@@ -1216,6 +1218,7 @@ int generate_eNB_dlsch_params_from_dci(int frame,
} }
dlsch0_harq = dlsch[0]->harq_processes[harq_pid]; dlsch0_harq = dlsch[0]->harq_processes[harq_pid];
dlsch0_harq->codeword=0;
// msg("DCI: Setting subframe_tx for subframe %d\n",subframe); // msg("DCI: Setting subframe_tx for subframe %d\n",subframe);
dlsch[0]->subframe_tx[subframe] = 1; dlsch[0]->subframe_tx[subframe] = 1;
...@@ -1497,66 +1500,128 @@ int generate_eNB_dlsch_params_from_dci(int frame, ...@@ -1497,66 +1500,128 @@ int generate_eNB_dlsch_params_from_dci(int frame,
// Flip the TB to codeword mapping as described in 5.3.3.1.5 of 36-212 V11.3.0 // Flip the TB to codeword mapping as described in 5.3.3.1.5 of 36-212 V11.3.0
// note that we must set tbswap=0 in eNB scheduler if one TB is deactivated // note that we must set tbswap=0 in eNB scheduler if one TB is deactivated
if (tbswap == 0) { TB0_active = 1;
dlsch0 = dlsch[0]; TB1_active = 1;
dlsch1 = dlsch[1];
} else { if ((rv1 == 1) && (mcs1 == 0)) {
dlsch0 = dlsch[1]; TB0_active=0;
dlsch1 = dlsch[0]; }
if ((rv2 == 1) && (mcs2 == 0)) {
TB1_active=0;
} }
if (TB0_active && TB1_active && tbswap==0) {
dlsch0=dlsch[0];
dlsch1=dlsch[1];
dlsch0->active = 1;
dlsch1->active = 1;
dlsch0_harq = dlsch0->harq_processes[harq_pid]; dlsch0_harq = dlsch0->harq_processes[harq_pid];
dlsch1_harq = dlsch1->harq_processes[harq_pid]; dlsch1_harq = dlsch1->harq_processes[harq_pid];
dlsch0_harq->mcs = mcs1;
dlsch1_harq->mcs = mcs2;
dlsch0_harq->rvidx = rv1;
dlsch1_harq->rvidx = rv2;
dlsch0_harq->status = ACTIVE;
dlsch1_harq->status = ACTIVE;
dlsch0_harq->codeword=0;
dlsch1_harq->codeword=1;
printf("\n ENB: BOTH ACTIVE\n");
}
else if (TB0_active && TB1_active && tbswap==1) {
dlsch0=dlsch[0];
dlsch1=dlsch[1];
dlsch0->active = 1;
dlsch1->active = 1;
dlsch0_harq = dlsch0->harq_processes[harq_pid];
dlsch1_harq = dlsch1->harq_processes[harq_pid];
dlsch0_harq->mcs = mcs1;
dlsch1_harq->mcs = mcs2;
dlsch0_harq->rvidx = rv1;
dlsch1_harq->rvidx = rv2;
dlsch0_harq->status = ACTIVE;
dlsch1_harq->status = ACTIVE;
dlsch0_harq->codeword=1;
dlsch1_harq->codeword=0;
}
else if (TB0_active && (TB1_active==0)) {
dlsch0=dlsch[0];
dlsch0->active = 1;
dlsch0_harq = dlsch0->harq_processes[harq_pid];
dlsch0_harq->mcs = mcs1;
dlsch0_harq->rvidx = rv1;
dlsch0_harq->status = ACTIVE;
dlsch0_harq->codeword = 0;
dlsch1=NULL;
dlsch1_harq = NULL;
}
else if ((TB0_active==0) && TB1_active) {
dlsch1=dlsch[1];
dlsch1->active = 1;
dlsch1_harq = dlsch1->harq_processes[harq_pid];
dlsch1_harq->mcs = mcs2;
dlsch1_harq->rvidx = rv2;
dlsch1_harq->status = ACTIVE;
dlsch1_harq->codeword = 0;
dlsch0=NULL;
dlsch0_harq = NULL;
printf("\n ENB: TB0 is deactivated, retransmit TB1 transmit in TM6\n");
}
if (dlsch0 != NULL){
dlsch0->subframe_tx[subframe] = 1; dlsch0->subframe_tx[subframe] = 1;
dlsch0->current_harq_pid = harq_pid; dlsch0->current_harq_pid = harq_pid;
dlsch1->current_harq_pid = harq_pid;
dlsch0->harq_ids[subframe] = harq_pid; dlsch0->harq_ids[subframe] = harq_pid;
}
if (dlsch1_harq != NULL){
dlsch1->current_harq_pid = harq_pid;
dlsch1->harq_ids[subframe] = harq_pid; dlsch1->harq_ids[subframe] = harq_pid;
// printf("Setting DLSCH harq id %d to subframe %d\n",harq_pid,subframe); }
if (dlsch0 != NULL ){
conv_rballoc(rah, conv_rballoc(rah,
rballoc, rballoc,
frame_parms->N_RB_DL, frame_parms->N_RB_DL,
dlsch0_harq->rb_alloc); dlsch0_harq->rb_alloc);
dlsch1_harq->rb_alloc[0] = dlsch0_harq->rb_alloc[0];
dlsch0_harq->nb_rb = conv_nprb(rah, rballoc, frame_parms->N_RB_DL); dlsch0_harq->nb_rb = conv_nprb(rah, rballoc, frame_parms->N_RB_DL);
if (dlsch1 != NULL){
dlsch1_harq->rb_alloc[0] = dlsch0_harq->rb_alloc[0];
dlsch1_harq->nb_rb = dlsch0_harq->nb_rb; dlsch1_harq->nb_rb = dlsch0_harq->nb_rb;
}
} else if ((dlsch0 == NULL ) && (dlsch1 != NULL )){
conv_rballoc(rah,
rballoc,
frame_parms->N_RB_DL,
dlsch1_harq->rb_alloc);
if (dlsch0_harq->nb_rb == 0) dlsch1_harq->nb_rb = conv_nprb(rah, rballoc, frame_parms->N_RB_DL);
return(-1); }
/*if (dlsch0_harq->nb_rb == 0)
return(-1);*/
dlsch0_harq->mcs = mcs1;
dlsch1_harq->mcs = mcs2;
dlsch0_harq->rvidx = rv1;
dlsch1_harq->rvidx = rv2;
// assume both TBs are active // assume both TBs are active
if (dlsch0_harq != NULL)
dlsch0_harq->Nl = 1; dlsch0_harq->Nl = 1;
if (dlsch1_harq != NULL)
dlsch1_harq->Nl = 1; dlsch1_harq->Nl = 1;
dlsch0->active = 1;
dlsch1->active = 1;
// check if either TB is disabled (see 36-213 V11.3 Section ) // check if either TB is disabled (see 36-213 V11.3 Section )
if ((dlsch0_harq->rvidx == 1) && (dlsch0_harq->mcs == 0)) {
dlsch0->active = 0;
}
if ((dlsch1_harq->rvidx == 1) && (dlsch1_harq->mcs == 0)) {
dlsch1->active = 0;
}
if (frame_parms->nb_antennas_tx == 2) { if (frame_parms->nb_antennas_tx == 2) {
if (dlsch0->active == 1 && dlsch1->active == 1) { // both TBs are active if ((dlsch0 != NULL) && (dlsch1 != NULL)) { //two CW active
dlsch0_harq->dl_power_off = 1; dlsch0_harq->dl_power_off = 1;
dlsch1_harq->dl_power_off = 1; dlsch1_harq->dl_power_off = 1;
dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1]; dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1];
dlsch1_harq->TBS = TBStable[get_I_TBS(dlsch1_harq->mcs)][dlsch0_harq->nb_rb-1]; dlsch1_harq->TBS = TBStable[get_I_TBS(dlsch1_harq->mcs)][dlsch1_harq->nb_rb-1];
switch (tpmi) { switch (tpmi) {
case 0: case 0:
dlsch0_harq->mimo_mode = DUALSTREAM_UNIFORM_PRECODING1; dlsch0_harq->mimo_mode = DUALSTREAM_UNIFORM_PRECODING1;
...@@ -1580,8 +1645,7 @@ int generate_eNB_dlsch_params_from_dci(int frame, ...@@ -1580,8 +1645,7 @@ int generate_eNB_dlsch_params_from_dci(int frame,
default: default:
break; break;
} }
} } else if ((dlsch0 != NULL) && (dlsch1 == NULL)) { // only CW 0 active
else if (dlsch1->active == 0) { // only one is active
dlsch0_harq->dl_power_off = 1; dlsch0_harq->dl_power_off = 1;
dlsch0_harq->TBS= TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1]; dlsch0_harq->TBS= TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1];
switch (tpmi) { switch (tpmi) {
...@@ -1613,8 +1677,7 @@ int generate_eNB_dlsch_params_from_dci(int frame, ...@@ -1613,8 +1677,7 @@ int generate_eNB_dlsch_params_from_dci(int frame,
dlsch0_harq->pmi_alloc = DL_pmi_single; dlsch0_harq->pmi_alloc = DL_pmi_single;
break; break;
} }
} } else if ((dlsch0 == NULL) && (dlsch1 != NULL)) {
else if (dlsch0->active == 0) { // only one is active
dlsch1_harq->dl_power_off = 1; dlsch1_harq->dl_power_off = 1;
dlsch1_harq->TBS= TBStable[get_I_TBS(dlsch1_harq->mcs)][dlsch1_harq->nb_rb-1]; dlsch1_harq->TBS= TBStable[get_I_TBS(dlsch1_harq->mcs)][dlsch1_harq->nb_rb-1];
switch (tpmi) { switch (tpmi) {
...@@ -1647,18 +1710,20 @@ int generate_eNB_dlsch_params_from_dci(int frame, ...@@ -1647,18 +1710,20 @@ int generate_eNB_dlsch_params_from_dci(int frame,
break; break;
} }
} }
} else if (frame_parms->nb_antennas_tx == 4) { } else if (frame_parms->nb_antennas_tx == 4) {
// fill in later // fill in later
} }
// reset HARQ process if this is the first transmission // reset HARQ process if this is the first transmission
if (dlsch0_harq->round == 0) /* if (dlsch0_harq->round == 0)
dlsch0_harq->status = ACTIVE; dlsch0_harq->status = ACTIVE;
if (dlsch1_harq->round == 0) if (dlsch1_harq->round == 0)
dlsch1_harq->status = ACTIVE; dlsch1_harq->status = ACTIVE;*/
if (dlsch0_harq != NULL)
dlsch0->rnti = rnti; dlsch0->rnti = rnti;
if (dlsch1 != NULL)
dlsch1->rnti = rnti; dlsch1->rnti = rnti;
break; break;
...@@ -1869,6 +1934,7 @@ int generate_eNB_dlsch_params_from_dci(int frame, ...@@ -1869,6 +1934,7 @@ int generate_eNB_dlsch_params_from_dci(int frame,
// Flip the TB to codeword mapping as described in 5.3.3.1.5 of 36-212 V11.3.0 // Flip the TB to codeword mapping as described in 5.3.3.1.5 of 36-212 V11.3.0
// note that we must set tbswap=0 in eNB scheduler if one TB is deactivated // note that we must set tbswap=0 in eNB scheduler if one TB is deactivated
// This must be set as in TM4, does not work properly now.
if (tbswap == 0) { if (tbswap == 0) {
dlsch0 = dlsch[0]; dlsch0 = dlsch[0];
dlsch1 = dlsch[1]; dlsch1 = dlsch[1];
...@@ -2154,6 +2220,10 @@ int generate_eNB_dlsch_params_from_dci(int frame, ...@@ -2154,6 +2220,10 @@ int generate_eNB_dlsch_params_from_dci(int frame,
dlsch0_harq = dlsch0->harq_processes[harq_pid]; dlsch0_harq = dlsch0->harq_processes[harq_pid];
dlsch1_harq = dlsch1->harq_processes[harq_pid]; dlsch1_harq = dlsch1->harq_processes[harq_pid];
// Needs to be checked
dlsch0_harq->codeword=0;
dlsch1_harq->codeword=1;
conv_rballoc(rah, conv_rballoc(rah,
rballoc, rballoc,
frame_parms->N_RB_DL, frame_parms->N_RB_DL,
...@@ -2315,6 +2385,10 @@ int generate_eNB_dlsch_params_from_dci(int frame, ...@@ -2315,6 +2385,10 @@ int generate_eNB_dlsch_params_from_dci(int frame,
dlsch0_harq = dlsch0->harq_processes[harq_pid]; dlsch0_harq = dlsch0->harq_processes[harq_pid];
dlsch1_harq = dlsch1->harq_processes[harq_pid]; dlsch1_harq = dlsch1->harq_processes[harq_pid];
// Needs to be checked
dlsch0_harq->codeword=0;
dlsch1_harq->codeword=1;
conv_rballoc(rah, conv_rballoc(rah,
rballoc, rballoc,
frame_parms->N_RB_DL, frame_parms->N_RB_DL,
...@@ -2487,6 +2561,10 @@ int generate_eNB_dlsch_params_from_dci(int frame, ...@@ -2487,6 +2561,10 @@ int generate_eNB_dlsch_params_from_dci(int frame,
dlsch0_harq = dlsch0->harq_processes[harq_pid]; dlsch0_harq = dlsch0->harq_processes[harq_pid];
dlsch1_harq = dlsch1->harq_processes[harq_pid]; dlsch1_harq = dlsch1->harq_processes[harq_pid];
// Needs to be checked
dlsch0_harq->codeword=0;
dlsch1_harq->codeword=1;
conv_rballoc(rah, conv_rballoc(rah,
rballoc, rballoc,
frame_parms->N_RB_DL, frame_parms->N_RB_DL,
...@@ -2568,6 +2646,8 @@ int generate_eNB_dlsch_params_from_dci(int frame, ...@@ -2568,6 +2646,8 @@ int generate_eNB_dlsch_params_from_dci(int frame,
//dlsch1->harq_ids[subframe] = harq_pid; //dlsch1->harq_ids[subframe] = harq_pid;
// printf("Setting DLSCH harq id %d to subframe %d\n",harq_pid,subframe); // printf("Setting DLSCH harq id %d to subframe %d\n",harq_pid,subframe);
dlsch0_harq = dlsch0->harq_processes[harq_pid]; dlsch0_harq = dlsch0->harq_processes[harq_pid];
// Needs to be checked
dlsch0_harq->codeword=0;
conv_rballoc(((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rah, conv_rballoc(((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rah,
((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rballoc,frame_parms->N_RB_DL, ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rballoc,frame_parms->N_RB_DL,
...@@ -3859,13 +3939,14 @@ int generate_ue_dlsch_params_from_dci(int frame, ...@@ -3859,13 +3939,14 @@ int generate_ue_dlsch_params_from_dci(int frame,
uint8_t vrb_type=0; uint8_t vrb_type=0;
uint8_t mcs=0,mcs1=0,mcs2=0; uint8_t mcs=0,mcs1=0,mcs2=0;
uint8_t rv=0,rv1=0,rv2=0; uint8_t rv=0,rv1=0,rv2=0;
uint8_t TB0_active=0,TB1_active=0;
uint8_t ndi=0,ndi1=0,ndi2=0; uint8_t ndi=0,ndi1=0,ndi2=0;
uint8_t rah=0; uint8_t rah=0;
uint8_t TPC=0; uint8_t TPC=0;
uint8_t NPRB=0,tbswap=0,tpmi=0; uint8_t NPRB=0,tbswap=0,tpmi=0;
uint8_t Ngap; uint8_t Ngap;
LTE_UE_DLSCH_t *dlsch0=NULL,*dlsch1=NULL; LTE_UE_DLSCH_t *dlsch0=NULL,*dlsch1=NULL;
LTE_DL_UE_HARQ_t *dlsch0_harq,*dlsch1_harq; LTE_DL_UE_HARQ_t *dlsch0_harq=NULL,*dlsch1_harq=NULL;
#ifdef DEBUG_DCI #ifdef DEBUG_DCI
LOG_D(PHY,"dci_tools.c: Filling ue dlsch params -> rnti %x, dci_format %d\n",rnti,dci_format); LOG_D(PHY,"dci_tools.c: Filling ue dlsch params -> rnti %x, dci_format %d\n",rnti,dci_format);
...@@ -3915,6 +3996,8 @@ int generate_ue_dlsch_params_from_dci(int frame, ...@@ -3915,6 +3996,8 @@ int generate_ue_dlsch_params_from_dci(int frame,
} }
dlsch0_harq = dlsch[0]->harq_processes[harq_pid]; dlsch0_harq = dlsch[0]->harq_processes[harq_pid];
NPRB = RIV2nb_rb_LUT6[rballoc]; NPRB = RIV2nb_rb_LUT6[rballoc];
dlsch0_harq->delta_PUCCH = delta_PUCCH_lut[TPC&3]; dlsch0_harq->delta_PUCCH = delta_PUCCH_lut[TPC&3];
dlsch[0]->g_pucch += delta_PUCCH_lut[TPC&3]; dlsch[0]->g_pucch += delta_PUCCH_lut[TPC&3];
...@@ -4170,6 +4253,9 @@ int generate_ue_dlsch_params_from_dci(int frame, ...@@ -4170,6 +4253,9 @@ int generate_ue_dlsch_params_from_dci(int frame,
dlsch0_harq->mimo_mode = frame_parms->mode1_flag == 1 ?SISO : ALAMOUTI; dlsch0_harq->mimo_mode = frame_parms->mode1_flag == 1 ?SISO : ALAMOUTI;
dlsch0_harq->dl_power_off = 1; //no power offset dlsch0_harq->dl_power_off = 1; //no power offset
// Needs to be checked
dlsch0_harq->codeword=0;
LOG_D(PHY,"UE (%x/%d): Subframe %d Format1A DCI: ndi %d, old_ndi %d (first tx %d) harq_status %d, round %d\n", LOG_D(PHY,"UE (%x/%d): Subframe %d Format1A DCI: ndi %d, old_ndi %d (first tx %d) harq_status %d, round %d\n",
dlsch[0]->rnti, dlsch[0]->rnti,
harq_pid, harq_pid,
...@@ -4323,6 +4409,9 @@ int generate_ue_dlsch_params_from_dci(int frame, ...@@ -4323,6 +4409,9 @@ int generate_ue_dlsch_params_from_dci(int frame,
dlsch0_harq->mimo_mode = frame_parms->mode1_flag == 1 ?SISO : ALAMOUTI; dlsch0_harq->mimo_mode = frame_parms->mode1_flag == 1 ?SISO : ALAMOUTI;
dlsch0_harq->dl_power_off = 1; //no power offset dlsch0_harq->dl_power_off = 1; //no power offset
// Needs to be checked
dlsch0_harq->codeword=0;
LOG_D(PHY,"UE (%x/%d): Subframe %d Format1C DCI: harq_status %d, round %d\n", LOG_D(PHY,"UE (%x/%d): Subframe %d Format1C DCI: harq_status %d, round %d\n",
dlsch[0]->rnti, dlsch[0]->rnti,
harq_pid, harq_pid,
...@@ -4472,6 +4561,9 @@ int generate_ue_dlsch_params_from_dci(int frame, ...@@ -4472,6 +4561,9 @@ int generate_ue_dlsch_params_from_dci(int frame,
dlsch0_harq->dl_power_off = 1; //no power offset dlsch0_harq->dl_power_off = 1; //no power offset
// Needs to be checked
dlsch0_harq->codeword=0;
LOG_D(PHY,"UE (%x/%d): Subframe %d Format1 DCI: ndi %d, old_ndi %d (first tx %d) harq_status %d\n",dlsch[0]->rnti,harq_pid,subframe,ndi,dlsch0_harq->DCINdi, LOG_D(PHY,"UE (%x/%d): Subframe %d Format1 DCI: ndi %d, old_ndi %d (first tx %d) harq_status %d\n",dlsch[0]->rnti,harq_pid,subframe,ndi,dlsch0_harq->DCINdi,
dlsch0_harq->first_tx,dlsch0_harq->status); dlsch0_harq->first_tx,dlsch0_harq->status);
...@@ -4777,27 +4869,89 @@ int generate_ue_dlsch_params_from_dci(int frame, ...@@ -4777,27 +4869,89 @@ int generate_ue_dlsch_params_from_dci(int frame,
return(-1); return(-1);
} }
/*if (frame_type == TDD) // check if either TB is disabled (see 36-213 V8.6 p. 26)
tbswap = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->tb_swap; TB0_active = 1;
else TB1_active = 1;
tbswap = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->tb_swap;*/
if (tbswap == 0) { if ((rv1 == 1) && (mcs1 == 0)) {
dlsch0 = dlsch[0]; TB0_active=0;
dlsch1 = dlsch[1]; }
} else { if ((rv2 == 1) && (mcs2 == 0)) {
dlsch0 = dlsch[1]; TB1_active=0;
dlsch1 = dlsch[0];
} }
//printf("RV TB0 = %d\n", rv1);
if (TB0_active && TB1_active && tbswap==0) { //dlsch0, dlsch0_harq are at the TB level
dlsch0=dlsch[0];
dlsch1=dlsch[1];
dlsch0->active = 1;
dlsch1->active = 1;
dlsch0_harq = dlsch0->harq_processes[harq_pid]; dlsch0_harq = dlsch0->harq_processes[harq_pid];
dlsch1_harq = dlsch1->harq_processes[harq_pid]; dlsch1_harq = dlsch1->harq_processes[harq_pid];
dlsch0_harq->mcs = mcs1;
dlsch1_harq->mcs = mcs2;
dlsch0_harq->rvidx = rv1;
dlsch1_harq->rvidx = rv2;
dlsch0_harq->status = ACTIVE;
dlsch1_harq->status = ACTIVE;
dlsch0_harq->codeword=0;
dlsch1_harq->codeword=1;
//printf("\n UE: BOTH ACTIVE\n");
}
else if (TB0_active && TB1_active && tbswap==1) {
dlsch0=dlsch[0];
dlsch1=dlsch[1];
dlsch0->active = 1;
dlsch1->active = 1;
dlsch0_harq = dlsch0->harq_processes[harq_pid];
dlsch1_harq = dlsch1->harq_processes[harq_pid];
dlsch0_harq->mcs = mcs1;
dlsch1_harq->mcs = mcs2;
dlsch0_harq->rvidx = rv1;
dlsch1_harq->rvidx = rv2;
dlsch0_harq->status = ACTIVE;
dlsch1_harq->status = ACTIVE;
dlsch0_harq->codeword=1;
dlsch1_harq->codeword=0;
}
else if (TB0_active && (TB1_active==0)) {
dlsch0=dlsch[0];
dlsch0->active = 1;
dlsch0_harq = dlsch0->harq_processes[harq_pid];
dlsch0_harq->mcs = mcs1;
dlsch0_harq->rvidx = rv1;
dlsch0_harq->status = ACTIVE;
dlsch0_harq->codeword = 0;
dlsch1=NULL;
dlsch1_harq = NULL;
}
else if ((TB0_active==0) && TB1_active) {
dlsch1=dlsch[1];
dlsch1->active = 1;
dlsch1_harq = dlsch1->harq_processes[harq_pid];
dlsch1_harq->mcs = mcs2;
dlsch1_harq->rvidx = rv2;
dlsch1_harq->status = ACTIVE;
dlsch1_harq->codeword = 0;
dlsch0=NULL;
dlsch0_harq = NULL;
//printf("\n UE: TB0 is deactivated, retransmit TB1 transmit in TM6\n");
}
if (dlsch0 != NULL){
dlsch0->current_harq_pid = harq_pid; dlsch0->current_harq_pid = harq_pid;
dlsch1->current_harq_pid = harq_pid;
dlsch0->harq_ack[subframe].harq_id = harq_pid; dlsch0->harq_ack[subframe].harq_id = harq_pid;
}
if (dlsch1 != NULL){
dlsch1->current_harq_pid = harq_pid;
dlsch1->harq_ack[subframe].harq_id = harq_pid; dlsch1->harq_ack[subframe].harq_id = harq_pid;
}
if (dlsch0_harq != NULL){
conv_rballoc(rah, conv_rballoc(rah,
rballoc, rballoc,
frame_parms->N_RB_DL, frame_parms->N_RB_DL,
...@@ -4808,6 +4962,7 @@ int generate_ue_dlsch_params_from_dci(int frame, ...@@ -4808,6 +4962,7 @@ int generate_ue_dlsch_params_from_dci(int frame,
dlsch0_harq->rb_alloc_odd[2]= dlsch0_harq->rb_alloc_even[2]; dlsch0_harq->rb_alloc_odd[2]= dlsch0_harq->rb_alloc_even[2];
dlsch0_harq->rb_alloc_odd[3]= dlsch0_harq->rb_alloc_even[3]; dlsch0_harq->rb_alloc_odd[3]= dlsch0_harq->rb_alloc_even[3];
if (dlsch1_harq != NULL){
dlsch1_harq->rb_alloc_even[0]= dlsch0_harq->rb_alloc_even[0]; dlsch1_harq->rb_alloc_even[0]= dlsch0_harq->rb_alloc_even[0];
dlsch1_harq->rb_alloc_even[1]= dlsch0_harq->rb_alloc_even[1]; dlsch1_harq->rb_alloc_even[1]= dlsch0_harq->rb_alloc_even[1];
dlsch1_harq->rb_alloc_even[2]= dlsch0_harq->rb_alloc_even[2]; dlsch1_harq->rb_alloc_even[2]= dlsch0_harq->rb_alloc_even[2];
...@@ -4817,56 +4972,47 @@ int generate_ue_dlsch_params_from_dci(int frame, ...@@ -4817,56 +4972,47 @@ int generate_ue_dlsch_params_from_dci(int frame,
dlsch1_harq->rb_alloc_odd[2] = dlsch0_harq->rb_alloc_odd[2]; dlsch1_harq->rb_alloc_odd[2] = dlsch0_harq->rb_alloc_odd[2];
dlsch1_harq->rb_alloc_odd[3] = dlsch0_harq->rb_alloc_odd[3]; dlsch1_harq->rb_alloc_odd[3] = dlsch0_harq->rb_alloc_odd[3];
dlsch0_harq->nb_rb = conv_nprb(rah,
rballoc,
frame_parms->N_RB_DL);
dlsch1_harq->nb_rb = dlsch0_harq->nb_rb; dlsch1_harq->nb_rb = dlsch0_harq->nb_rb;
dlsch0_harq->mcs = mcs1;
dlsch1_harq->mcs = mcs2;
dlsch0_harq->delta_PUCCH = delta_PUCCH_lut[TPC&3];
dlsch1_harq->delta_PUCCH = delta_PUCCH_lut[TPC&3];
dlsch[0]->g_pucch += delta_PUCCH_lut[TPC&3];
dlsch[1]->g_pucch += delta_PUCCH_lut[TPC&3];
/*
if (dlsch0_harq->mcs>20) {
msg("dci_tools.c: mcs > 20 disabled for now (asked %d)\n",dlsch0_harq->mcs);
return(-1);
} }
*/
dlsch0_harq->nb_rb = conv_nprb(rah,
rballoc,
frame_parms->N_RB_DL);
dlsch0_harq->rvidx = rv1; } else if ((dlsch0_harq == NULL) && (dlsch1_harq != NULL)){
dlsch1_harq->rvidx = rv2;
// assume both TBs are active
dlsch0_harq->Nl = 1;
dlsch1_harq->Nl = 1;
dlsch0->active = 1;
dlsch1->active = 1;
conv_rballoc(rah,
rballoc,
frame_parms->N_RB_DL,
dlsch1_harq->rb_alloc_even);
// check if either TB is disabled (see 36-213 V8.6 p. 26) dlsch1_harq->rb_alloc_odd[0]= dlsch1_harq->rb_alloc_even[0];
dlsch1_harq->rb_alloc_odd[1]= dlsch1_harq->rb_alloc_even[1];
dlsch1_harq->rb_alloc_odd[2]= dlsch1_harq->rb_alloc_even[2];
dlsch1_harq->rb_alloc_odd[3]= dlsch1_harq->rb_alloc_even[3];
dlsch1_harq->nb_rb = dlsch0_harq->nb_rb;
}
if ((dlsch0_harq->rvidx == 1) && (dlsch0_harq->mcs == 0)) {
dlsch0_harq->status = DISABLED; if (dlsch0_harq != NULL) {
dlsch0->active = 0; dlsch0_harq->delta_PUCCH = delta_PUCCH_lut[TPC&3];
dlsch0->g_pucch += delta_PUCCH_lut[TPC&3];
} }
if ((dlsch1_harq->rvidx == 1) && (dlsch1_harq->mcs == 0)) { if (dlsch1_harq != NULL) {
dlsch1_harq->status = DISABLED; dlsch1_harq->delta_PUCCH = delta_PUCCH_lut[TPC&3];
dlsch1->active = 0; dlsch1->g_pucch += delta_PUCCH_lut[TPC&3];
} }
// assume one layer per codeword (2 antenna port case)
if (dlsch0_harq != NULL)
dlsch0_harq->Nl = 1; dlsch0_harq->Nl = 1;
if (dlsch1_harq != NULL)
dlsch1_harq->Nl = 1; dlsch1_harq->Nl = 1;
// dlsch0->layer_index = tbswap;
// dlsch1->layer_index = 1-tbswap;
if (dlsch0->active==1 && dlsch1->active==1) { //two TB if ((dlsch0 != NULL) && (dlsch1 != NULL)){ //two CW active
dlsch0_harq->dl_power_off = 1; dlsch0_harq->dl_power_off = 1;
dlsch1_harq->dl_power_off = 1; dlsch1_harq->dl_power_off = 1;
switch (tpmi) { switch (tpmi) {
...@@ -4879,19 +5025,24 @@ int generate_ue_dlsch_params_from_dci(int frame, ...@@ -4879,19 +5025,24 @@ int generate_ue_dlsch_params_from_dci(int frame,
case 1: case 1:
dlsch0_harq->mimo_mode = DUALSTREAM_UNIFORM_PRECODINGj; dlsch0_harq->mimo_mode = DUALSTREAM_UNIFORM_PRECODINGj;
dlsch1_harq->mimo_mode = DUALSTREAM_UNIFORM_PRECODINGj; dlsch1_harq->mimo_mode = DUALSTREAM_UNIFORM_PRECODINGj;
dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,1,1); dlsch0_harq->pmi_alloc = pmi_extend(frame_parms,1, 1);
dlsch1_harq->pmi_alloc = pmi_extend(frame_parms,1, 1); dlsch1_harq->pmi_alloc = pmi_extend(frame_parms,1, 1);
break; break;
case 2: // PUSCH precoding case 2: // PUSCH precoding
dlsch0_harq->mimo_mode = DUALSTREAM_PUSCH_PRECODING; dlsch0_harq->mimo_mode = DUALSTREAM_PUSCH_PRECODING;
dlsch0_harq->pmi_alloc = dlsch0->pmi_alloc;
dlsch1_harq->mimo_mode = DUALSTREAM_PUSCH_PRECODING; dlsch1_harq->mimo_mode = DUALSTREAM_PUSCH_PRECODING;
if (tbswap==0){
dlsch0_harq->pmi_alloc = dlsch0->pmi_alloc;
dlsch1_harq->pmi_alloc = dlsch0->pmi_alloc^0x1555; dlsch1_harq->pmi_alloc = dlsch0->pmi_alloc^0x1555;
} else {
dlsch1_harq->pmi_alloc = dlsch0->pmi_alloc;
dlsch0_harq->pmi_alloc = dlsch0->pmi_alloc^0x1555;
}
break; break;
default: default:
break; break;
} }
} else if (dlsch1_harq->status == DISABLED) { } else if ((dlsch0 != NULL) && (dlsch1 == NULL)) { // only CW 0 active
dlsch0_harq->dl_power_off = 1; dlsch0_harq->dl_power_off = 1;
switch (tpmi) { switch (tpmi) {
case 0 : case 0 :
...@@ -4916,16 +5067,17 @@ int generate_ue_dlsch_params_from_dci(int frame, ...@@ -4916,16 +5067,17 @@ int generate_ue_dlsch_params_from_dci(int frame,
case 5: case 5:
dlsch0_harq->mimo_mode = PUSCH_PRECODING0; dlsch0_harq->mimo_mode = PUSCH_PRECODING0;
// pmi stored from ulsch allocation routine // pmi stored from ulsch allocation routine
dlsch0_harq->pmi_alloc = dlsch0->pmi_alloc; // we need to extract the first column of precoding matrix (which was computed assuming rank==2)
dlsch0_harq->pmi_alloc = 0;//pmi_convert(frame_parms,dlsch0->pmi_alloc,0);
//LOG_I(PHY,"XXX using PMI %x\n",pmi2hex_2Ar1(dlsch0_harq->pmi_alloc)); //LOG_I(PHY,"XXX using PMI %x\n",pmi2hex_2Ar1(dlsch0_harq->pmi_alloc));
break; break;
case 6: case 6:
dlsch0_harq->mimo_mode = PUSCH_PRECODING1; dlsch0_harq->mimo_mode = PUSCH_PRECODING1;
LOG_E(PHY,"Unsupported TPMI\n"); // we need to extract the second column of precoding matrix (which was computed assuming rank==2)
return(-1); dlsch0_harq->pmi_alloc = 0;//pmi_convert(frame_parms,dlsch0->pmi_alloc,1);
break; break;
} }
} else if (dlsch0_harq->status == DISABLED) { } else {
dlsch1_harq->dl_power_off = 1; dlsch1_harq->dl_power_off = 1;
switch (tpmi) { switch (tpmi) {
case 0 : case 0 :
...@@ -4955,28 +5107,27 @@ int generate_ue_dlsch_params_from_dci(int frame, ...@@ -4955,28 +5107,27 @@ int generate_ue_dlsch_params_from_dci(int frame,
break; break;
case 6: case 6:
dlsch1_harq->mimo_mode = PUSCH_PRECODING1; dlsch1_harq->mimo_mode = PUSCH_PRECODING1;
LOG_E(PHY,"Unsupported TPMI\n"); dlsch1_harq->pmi_alloc = dlsch0->pmi_alloc;
return(-1); return(-1);
break; break;
} }
} }
if (frame_parms->mode1_flag == 1) if ((frame_parms->mode1_flag == 1) && (dlsch0_harq != NULL))
dlsch0_harq->mimo_mode = SISO; dlsch0_harq->mimo_mode = SISO;
if (dlsch0->active == 1) { if (dlsch0 != NULL) {
if ((ndi1!=dlsch0_harq->DCINdi) || (dlsch0_harq->first_tx==1)) { if ((ndi1!=dlsch0_harq->DCINdi) || (dlsch0_harq->first_tx==1)) {
dlsch0_harq->round = 0; dlsch0_harq->round = 0;
dlsch0_harq->status = ACTIVE; dlsch0_harq->status = ACTIVE;
dlsch0_harq->DCINdi = ndi1; dlsch0_harq->DCINdi = ndi1;
if (dlsch0_harq->first_tx==1) { if ( dlsch0_harq->first_tx==1) {
LOG_D(PHY,"Format 2 DCI First TX0: Clearing flag\n"); LOG_D(PHY,"Format 2 DCI First TX0: Clearing flag\n");
dlsch0_harq->first_tx = 0; dlsch0_harq->first_tx = 0;
} }
} } else if (dlsch0_harq->status == SCH_IDLE) { // we got an Ndi = 0 for a previously decoded process,
else if (dlsch0_harq->status == SCH_IDLE) { // we got an Ndi = 0 for a previously decoded process,
// this happens if either another harq process in the same // this happens if either another harq process in the same
// is NAK or an ACK was not received // is NAK or an ACK was not received
...@@ -4988,7 +5139,7 @@ int generate_ue_dlsch_params_from_dci(int frame, ...@@ -4988,7 +5139,7 @@ int generate_ue_dlsch_params_from_dci(int frame,
} }
} }
if (dlsch1->active == 1) { if ((dlsch1 != NULL) && (dlsch1->active == 1 )) {
if ((ndi2!=dlsch1_harq->DCINdi) || (dlsch1_harq->first_tx==1)) { if ((ndi2!=dlsch1_harq->DCINdi) || (dlsch1_harq->first_tx==1)) {
dlsch1_harq->round = 0; dlsch1_harq->round = 0;
dlsch1_harq->status = ACTIVE; dlsch1_harq->status = ACTIVE;
...@@ -4998,7 +5149,7 @@ int generate_ue_dlsch_params_from_dci(int frame, ...@@ -4998,7 +5149,7 @@ int generate_ue_dlsch_params_from_dci(int frame,
dlsch1_harq->first_tx = 0; dlsch1_harq->first_tx = 0;
} }
} }
else if (dlsch1_harq->status == SCH_IDLE) { // we got an Ndi = 0 for a previously decoded process, else if ((dlsch1 != NULL) && (dlsch1_harq->status == SCH_IDLE)) { // we got an Ndi = 0 for a previously decoded process,
// this happens if either another harq process in the same // this happens if either another harq process in the same
// is NAK or an ACK was not received // is NAK or an ACK was not received
...@@ -5009,8 +5160,7 @@ int generate_ue_dlsch_params_from_dci(int frame, ...@@ -5009,8 +5160,7 @@ int generate_ue_dlsch_params_from_dci(int frame,
} }
} }
// dlsch0_harq->mcs = mcs1; if (dlsch0 != NULL){
if (dlsch0_harq->nb_rb>1) { if (dlsch0_harq->nb_rb>1) {
dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1]; dlsch0_harq->TBS = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1];
if (mcs1 <= 28) if (mcs1 <= 28)
...@@ -5022,19 +5172,16 @@ int generate_ue_dlsch_params_from_dci(int frame, ...@@ -5022,19 +5172,16 @@ int generate_ue_dlsch_params_from_dci(int frame,
} else } else
dlsch0_harq->TBS =0; dlsch0_harq->TBS =0;
dlsch0->rnti = rnti;
}
/* if (dlsch1 != NULL) {
if (dlsch0_harq->mcs > 18)
printf("mcs %d, TBS %d\n",dlsch0_harq->mcs,dlsch0_harq->TBS);
*/
if (dlsch1_harq->DCINdi != ndi2) { if (dlsch1_harq->DCINdi != ndi2) {
dlsch1_harq->round=0; dlsch1_harq->round=0;
dlsch1_harq->status = ACTIVE; dlsch1_harq->status = ACTIVE;
} }
dlsch1_harq->DCINdi = ndi2; dlsch1_harq->DCINdi = ndi2;
// dlsch1_harq->mcs = mcs2;
if (dlsch1_harq->nb_rb>1) { if (dlsch1_harq->nb_rb>1) {
dlsch1_harq->TBS = TBStable[get_I_TBS(dlsch1_harq->mcs)][dlsch1_harq->nb_rb-1]; dlsch1_harq->TBS = TBStable[get_I_TBS(dlsch1_harq->mcs)][dlsch1_harq->nb_rb-1];
...@@ -5047,9 +5194,8 @@ int generate_ue_dlsch_params_from_dci(int frame, ...@@ -5047,9 +5194,8 @@ int generate_ue_dlsch_params_from_dci(int frame,
} else } else
dlsch1_harq->TBS = 0; dlsch1_harq->TBS = 0;
dlsch0->rnti = rnti;
dlsch1->rnti = rnti; dlsch1->rnti = rnti;
}
break; break;
...@@ -5292,6 +5438,7 @@ int generate_ue_dlsch_params_from_dci(int frame, ...@@ -5292,6 +5438,7 @@ int generate_ue_dlsch_params_from_dci(int frame,
// Flip the TB to codeword mapping as described in 5.3.3.1.5 of 36-212 V11.3.0 // Flip the TB to codeword mapping as described in 5.3.3.1.5 of 36-212 V11.3.0
// note that we must set tbswap=0 in eNB scheduler if one TB is deactivated // note that we must set tbswap=0 in eNB scheduler if one TB is deactivated
//Needs to be done in the same manner as TM$.
if (tbswap == 0) { if (tbswap == 0) {
dlsch0 = dlsch[0]; dlsch0 = dlsch[0];
dlsch1 = dlsch[1]; dlsch1 = dlsch[1];
...@@ -5302,6 +5449,9 @@ int generate_ue_dlsch_params_from_dci(int frame, ...@@ -5302,6 +5449,9 @@ int generate_ue_dlsch_params_from_dci(int frame,
dlsch0_harq = dlsch[0]->harq_processes[harq_pid]; dlsch0_harq = dlsch[0]->harq_processes[harq_pid];
dlsch1_harq = dlsch[1]->harq_processes[harq_pid]; dlsch1_harq = dlsch[1]->harq_processes[harq_pid];
// Needs to be checked
dlsch0_harq->codeword=0;
dlsch1_harq->codeword=1;
dlsch0->current_harq_pid = harq_pid; dlsch0->current_harq_pid = harq_pid;
dlsch1->current_harq_pid = harq_pid; dlsch1->current_harq_pid = harq_pid;
dlsch0->harq_ack[subframe].harq_id = harq_pid; dlsch0->harq_ack[subframe].harq_id = harq_pid;
...@@ -5560,6 +5710,8 @@ int generate_ue_dlsch_params_from_dci(int frame, ...@@ -5560,6 +5710,8 @@ int generate_ue_dlsch_params_from_dci(int frame,
dlsch0 = dlsch[0]; dlsch0 = dlsch[0];
dlsch0_harq = dlsch[0]->harq_processes[harq_pid]; dlsch0_harq = dlsch[0]->harq_processes[harq_pid];
// Needs to be checked
dlsch0_harq->codeword=0;
conv_rballoc(((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rah, conv_rballoc(((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rah,
((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rballoc,frame_parms->N_RB_DL, ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rballoc,frame_parms->N_RB_DL,
dlsch0_harq->rb_alloc_even); dlsch0_harq->rb_alloc_even);
......
...@@ -172,6 +172,8 @@ typedef struct { ...@@ -172,6 +172,8 @@ typedef struct {
uint8_t Nlayers; uint8_t Nlayers;
/// First layer for this PSCH transmission /// First layer for this PSCH transmission
uint8_t first_layer; uint8_t first_layer;
/// codeword this transport block is mapped to
uint8_t codeword;
} LTE_DL_eNB_HARQ_t; } LTE_DL_eNB_HARQ_t;
typedef struct { typedef struct {
...@@ -575,6 +577,8 @@ typedef struct { ...@@ -575,6 +577,8 @@ typedef struct {
uint32_t trials[8]; uint32_t trials[8];
/// error statistics per round /// error statistics per round
uint32_t errors[8]; uint32_t errors[8];
/// codeword this transport block is mapped to
uint8_t codeword;
} LTE_DL_UE_HARQ_t; } LTE_DL_UE_HARQ_t;
typedef struct { typedef struct {
......
...@@ -120,6 +120,8 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue, ...@@ -120,6 +120,8 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue,
int32_t **rxdataF_comp_ptr; int32_t **rxdataF_comp_ptr;
int32_t **dl_ch_mag_ptr; int32_t **dl_ch_mag_ptr;
int32_t codeword_TB0;
int32_t codeword_TB1;
...@@ -139,8 +141,10 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue, ...@@ -139,8 +141,10 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue,
case PDSCH: case PDSCH:
lte_ue_pdsch_vars = &phy_vars_ue->lte_ue_pdsch_vars[eNB_id]; lte_ue_pdsch_vars = &phy_vars_ue->lte_ue_pdsch_vars[eNB_id];
dlsch_ue = phy_vars_ue->dlsch_ue[eNB_id]; dlsch_ue = phy_vars_ue->dlsch_ue[eNB_id];
dlsch0_harq = dlsch_ue[0]->harq_processes[harq_pid]; codeword_TB0 = dlsch_ue[0]->harq_processes[harq_pid]->codeword;
dlsch1_harq = dlsch_ue[1]->harq_processes[harq_pid]; codeword_TB1 = dlsch_ue[1]->harq_processes[harq_pid]->codeword;
dlsch0_harq = dlsch_ue[codeword_TB0]->harq_processes[harq_pid];
dlsch1_harq = dlsch_ue[codeword_TB1]->harq_processes[harq_pid];
break; break;
default: default:
......
...@@ -155,13 +155,13 @@ int allocate_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms, ...@@ -155,13 +155,13 @@ int allocate_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms,
{ {
uint8_t *x0 = dlsch0_harq->e; uint8_t *x0 = NULL; //dlsch0_harq->e;
MIMO_mode_t mimo_mode = dlsch0_harq->mimo_mode; MIMO_mode_t mimo_mode = dlsch0_harq->mimo_mode;
int first_layer0 = dlsch0_harq->first_layer; int first_layer0; //= dlsch0_harq->first_layer;
int Nlayers0 = dlsch0_harq->Nlayers; int Nlayers0; // = dlsch0_harq->Nlayers;
uint8_t mod_order0 = get_Qm(dlsch0_harq->mcs); uint8_t mod_order0; // = get_Qm(dlsch0_harq->mcs);
uint8_t mod_order1=2; uint8_t mod_order1; //=2;
uint8_t precoder_index0,precoder_index1; uint8_t precoder_index0,precoder_index1;
uint8_t *x1=NULL; uint8_t *x1=NULL;
...@@ -199,15 +199,40 @@ int allocate_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms, ...@@ -199,15 +199,40 @@ int allocate_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms,
gain_lin_QPSK = (int16_t)((amp*ONE_OVER_SQRT2_Q15)>>15); gain_lin_QPSK = (int16_t)((amp*ONE_OVER_SQRT2_Q15)>>15);
// if (mimo_mode == LARGE_CDD) gain_lin_QPSK>>=1; // if (mimo_mode == LARGE_CDD) gain_lin_QPSK>>=1;
if (dlsch1_harq) {
if ((dlsch0_harq != NULL) && (dlsch1_harq != NULL)) { //this is for TM3, TM4
x0 = dlsch0_harq->e;
mimo_mode = dlsch0_harq->mimo_mode;
first_layer0 = dlsch0_harq->first_layer;
Nlayers0 = dlsch0_harq->Nlayers;
mod_order0 = get_Qm(dlsch0_harq->mcs);
x1 = dlsch1_harq->e; x1 = dlsch1_harq->e;
// Fill these in later for TM8-10 // Fill these in later for TM8-10
// Nlayers1 = dlsch1_harq->Nlayers; // Nlayers1 = dlsch1_harq->Nlayers;
// first_layer1 = dlsch1_harq->first_layer; // first_layer1 = dlsch1_harq->first_layer;
mod_order1 = get_Qm(dlsch1_harq->mcs); mod_order1 = get_Qm(dlsch1_harq->mcs);
} else if ((dlsch0_harq != NULL) && (dlsch1_harq == NULL)){ //This is for SIS0 TM1, TM6, etc
x0 = dlsch0_harq->e;
mimo_mode = dlsch0_harq->mimo_mode;
first_layer0 = dlsch0_harq->first_layer;
Nlayers0 = dlsch0_harq->Nlayers;
mod_order0 = get_Qm(dlsch0_harq->mcs);
} else if ((dlsch0_harq == NULL) && (dlsch1_harq != NULL)){ // This is for TM4 retransmission
x0 = dlsch1_harq->e;
mimo_mode = dlsch1_harq->mimo_mode;
first_layer0 = dlsch1_harq->first_layer;
Nlayers0 = dlsch1_harq->Nlayers;
mod_order0 = get_Qm(dlsch1_harq->mcs);
} }
/* /*
switch (mod_order) { switch (mod_order) {
case 2: case 2:
...@@ -229,9 +254,16 @@ int allocate_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms, ...@@ -229,9 +254,16 @@ int allocate_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms,
} }
*/ */
#ifdef DEBUG_DLSCH_MODULATION if (dlsch0_harq != NULL){
#ifdef DEBUG_DLSCH_MODULATION
printf("allocate_re (mod %d): symbol_offset %d re_offset %d (%d,%d), jj %d -> %d,%d\n",mod_order0,symbol_offset,re_offset,skip_dc,skip_half,*jj, x0[*jj], x0[1+*jj]); printf("allocate_re (mod %d): symbol_offset %d re_offset %d (%d,%d), jj %d -> %d,%d\n",mod_order0,symbol_offset,re_offset,skip_dc,skip_half,*jj, x0[*jj], x0[1+*jj]);
#endif #endif
} else{
#ifdef DEBUG_DLSCH_MODULATION
printf("allocate_re (mod %d): symbol_offset %d re_offset %d (%d,%d), jj %d -> %d,%d\n",mod_order0,symbol_offset,re_offset,skip_dc,skip_half,*jj, x0[*jj], x0[1+*jj]);
#endif
}
first_re=0; first_re=0;
last_re=12; last_re=12;
...@@ -1097,7 +1129,6 @@ int allocate_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms, ...@@ -1097,7 +1129,6 @@ int allocate_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms,
return(0); return(0);
} }
int allocate_REs_in_RB_MCH(int32_t **txdataF, int allocate_REs_in_RB_MCH(int32_t **txdataF,
uint32_t *jj, uint32_t *jj,
uint16_t re_offset, uint16_t re_offset,
...@@ -1305,32 +1336,75 @@ int dlsch_modulation(int32_t **txdataF, ...@@ -1305,32 +1336,75 @@ int dlsch_modulation(int32_t **txdataF,
{ {
uint8_t nsymb; uint8_t nsymb;
uint8_t harq_pid = dlsch0->current_harq_pid; uint8_t harq_pid; //= dlsch0->current_harq_pid;
LTE_DL_eNB_HARQ_t *dlsch0_harq = dlsch0->harq_processes[harq_pid]; LTE_DL_eNB_HARQ_t *dlsch0_harq;
LTE_DL_eNB_HARQ_t *dlsch1_harq; //= dlsch1->harq_processes[harq_pid]; LTE_DL_eNB_HARQ_t *dlsch1_harq; //= dlsch1->harq_processes[harq_pid];
uint32_t i,jj,jj2,re_allocated,symbol_offset; uint32_t i,jj,jj2,re_allocated,symbol_offset;
uint16_t l,rb,re_offset; uint16_t l,rb,re_offset;
uint32_t rb_alloc_ind; uint32_t rb_alloc_ind;
uint32_t *rb_alloc = dlsch0_harq->rb_alloc; uint32_t *rb_alloc; //=dlsch0_harq->rb_alloc;
uint8_t pilots=0; uint8_t pilots=0;
uint8_t skip_dc,skip_half; uint8_t skip_dc,skip_half;
uint8_t mod_order0 = get_Qm(dlsch0_harq->mcs); uint8_t mod_order0 = 0;
uint8_t mod_order1 = 0; uint8_t mod_order1 = 0;
int16_t amp_rho_a, amp_rho_b; int16_t amp_rho_a, amp_rho_b;
int16_t qam16_table_a0[4],qam64_table_a0[8],qam16_table_b0[4],qam64_table_b0[8]; int16_t qam16_table_a0[4],qam64_table_a0[8],qam16_table_b0[4],qam64_table_b0[8];
int16_t qam16_table_a1[4],qam64_table_a1[8],qam16_table_b1[4],qam64_table_b1[8]; int16_t qam16_table_a1[4],qam64_table_a1[8],qam16_table_b1[4],qam64_table_b1[8];
int16_t *qam_table_s0,*qam_table_s1; int16_t *qam_table_s0,*qam_table_s1;
uint8_t get_pmi_temp;
#ifdef DEBUG_DLSCH_MODULATION #ifdef DEBUG_DLSCH_MODULATION
uint8_t Nl0 = dlsch0_harq->Nl; uint8_t Nl0; //= dlsch0_harq->Nl;
uint8_t Nl1; uint8_t Nl1;
#endif #endif
if (dlsch1) { if ((dlsch0 != NULL) && (dlsch1 != NULL)){
harq_pid = dlsch0->current_harq_pid;
dlsch0_harq = dlsch0->harq_processes[harq_pid];
mod_order0 = get_Qm(dlsch0_harq->mcs);
rb_alloc = dlsch0_harq->rb_alloc;
#ifdef DEBUG_DLSCH_MODULATION
Nl0 = dlsch0_harq->Nl;
#endif
dlsch1_harq = dlsch1->harq_processes[harq_pid]; dlsch1_harq = dlsch1->harq_processes[harq_pid];
mod_order1 = get_Qm(dlsch1_harq->mcs); mod_order1 = get_Qm(dlsch1_harq->mcs);
#ifdef DEBUG_DLSCH_MODULATION #ifdef DEBUG_DLSCH_MODULATION
Nl1 = dlsch1_harq->Nl; Nl1 = dlsch1_harq->Nl;
#endif #endif
}else if ((dlsch0 != NULL) && (dlsch1 == NULL)){
harq_pid = dlsch0->current_harq_pid;
dlsch0_harq = dlsch0->harq_processes[harq_pid];
mod_order0 = get_Qm(dlsch0_harq->mcs);
rb_alloc = dlsch0_harq->rb_alloc;
#ifdef DEBUG_DLSCH_MODULATION
Nl0 = dlsch0_harq->Nl;
#endif
dlsch1_harq = NULL;
mod_order1 = 0;
#ifdef DEBUG_DLSCH_MODULATION
Nl1 = 0;
#endif
}else if ((dlsch0 == NULL) && (dlsch1 != NULL)){
harq_pid = dlsch1->current_harq_pid;
dlsch1_harq = dlsch1->harq_processes[harq_pid];
mod_order0 = get_Qm(dlsch1_harq->mcs);
rb_alloc = dlsch1_harq->rb_alloc;
#ifdef DEBUG_DLSCH_MODULATION
Nl0 = dlsch1_harq->Nl;
#endif
dlsch0_harq = NULL;
mod_order1 = 0;
#ifdef DEBUG_DLSCH_MODULATION
Nl1 = NULL;
#endif
} }
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_MODULATION, VCD_FUNCTION_IN); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_MODULATION, VCD_FUNCTION_IN);
......
...@@ -161,6 +161,7 @@ int main(int argc, char **argv) ...@@ -161,6 +161,7 @@ int main(int argc, char **argv)
uint16_t tdd_config=3; uint16_t tdd_config=3;
uint16_t n_rnti=0x1234; uint16_t n_rnti=0x1234;
int n_users = 1; int n_users = 1;
int TB=0;
RX_type_t rx_type=rx_standard; RX_type_t rx_type=rx_standard;
...@@ -258,6 +259,9 @@ int main(int argc, char **argv) ...@@ -258,6 +259,9 @@ int main(int argc, char **argv)
int llr8_flag=0; int llr8_flag=0;
double effective_rate=0.0; double effective_rate=0.0;
double thr_cw0_tm4 = 0.0;
double thr_cw0_tm4_nonconst = 0.0;
double thr_cw0[4]={0,0,0,0}, thr_cw1[4]={0,0,0,0}, thr_cw0_tot = 0.0, thr_cw1_tot = 0.0;
char channel_model_input[17]="I"; char channel_model_input[17]="I";
int TB0_active = 1; int TB0_active = 1;
...@@ -2155,6 +2159,8 @@ n(tikz_fname,"w"); ...@@ -2155,6 +2159,8 @@ n(tikz_fname,"w");
if (ret[1] > PHY_vars_UE->dlsch_ue[0][0]->max_turbo_iterations) if (ret[1] > PHY_vars_UE->dlsch_ue[0][0]->max_turbo_iterations)
round_trials[1][round]++; round_trials[1][round]++;
// printf("Trial %d, round %d , ret[0] %d, ret[1] %d, round_trials TB0 = %d, round_trials TB1 = %d \n",trials,round, ret[0], ret[1], round_trials[0][round], round_trials[1][round]);
/*printf("Trial %d, round cw0 = %d , round cw1 = %d, ret[0] = %d, ret[1] = %d, round_trials cw0 [%d]= %d, round_trials cw1 [%d]= %d\n",trials, round, round, \ /*printf("Trial %d, round cw0 = %d , round cw1 = %d, ret[0] = %d, ret[1] = %d, round_trials cw0 [%d]= %d, round_trials cw1 [%d]= %d\n",trials, round, round, \
ret[0], ret[1], round, round_trials[0][round], round, round_trials[1][round]);*/ ret[0], ret[1], round, round_trials[0][round], round, round_trials[1][round]);*/
...@@ -2189,6 +2195,7 @@ n(tikz_fname,"w"); ...@@ -2189,6 +2195,7 @@ n(tikz_fname,"w");
// Simulate HARQ procedures!!! // Simulate HARQ procedures!!!
if (common_flag == 0) { if (common_flag == 0) {
PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->rvidx = round&3; PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->rvidx = round&3;
if (transmission_mode == 3 || transmission_mode == 4) if (transmission_mode == 3 || transmission_mode == 4)
PHY_vars_eNB->dlsch_eNB[0][1]->harq_processes[0]->rvidx = round&3; PHY_vars_eNB->dlsch_eNB[0][1]->harq_processes[0]->rvidx = round&3;
...@@ -2196,6 +2203,12 @@ n(tikz_fname,"w"); ...@@ -2196,6 +2203,12 @@ n(tikz_fname,"w");
if (round == 0) { // First round if (round == 0) { // First round
TB0_active = 1; TB0_active = 1;
/* PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->rvidx = round&3;
if (transmission_mode == 3 || transmission_mode == 4)
PHY_vars_eNB->dlsch_eNB[0][1]->harq_processes[0]->rvidx = round&3;*/
if (PHY_vars_eNB->lte_frame_parms.frame_type == TDD) { if (PHY_vars_eNB->lte_frame_parms.frame_type == TDD) {
switch (transmission_mode) { switch (transmission_mode) {
...@@ -2499,6 +2512,7 @@ n(tikz_fname,"w"); ...@@ -2499,6 +2512,7 @@ n(tikz_fname,"w");
((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3;
} }
else { // deactivate TB0 else { // deactivate TB0
((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->tpmi = 2;
((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = 0; ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = 0;
((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 1; ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 1;
((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; ((DCI2_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1;
...@@ -2514,6 +2528,8 @@ n(tikz_fname,"w"); ...@@ -2514,6 +2528,8 @@ n(tikz_fname,"w");
((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3;
} }
else { // deactivate TB0 else { // deactivate TB0
printf("\n Requesting only TB1 from temp DCI\n");
((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = 2;
((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = 0; ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = 0;
((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 1; ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 1;
((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; ((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1;
...@@ -2529,6 +2545,7 @@ n(tikz_fname,"w"); ...@@ -2529,6 +2545,7 @@ n(tikz_fname,"w");
((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3;
} }
else { // deactivate TB0 else { // deactivate TB0
((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = 2;
((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = 0; ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = 0;
((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 1; ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 1;
((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; ((DCI2_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1;
...@@ -2544,6 +2561,7 @@ n(tikz_fname,"w"); ...@@ -2544,6 +2561,7 @@ n(tikz_fname,"w");
((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3;
} }
else { // deactivate TB0 else { // deactivate TB0
((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = 2;
((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = 0; ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = 0;
((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 1; ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 1;
((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; ((DCI2_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1;
...@@ -2662,6 +2680,7 @@ n(tikz_fname,"w"); ...@@ -2662,6 +2680,7 @@ n(tikz_fname,"w");
((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3;
} }
else { // deactivate TB0 else { // deactivate TB0
((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = 2;
((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = 0; ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = 0;
((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 1; ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 1;
((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; ((DCI2_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1;
...@@ -2677,6 +2696,8 @@ n(tikz_fname,"w"); ...@@ -2677,6 +2696,8 @@ n(tikz_fname,"w");
((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3;
} }
else { // deactivate TB0 else { // deactivate TB0
printf("\n Requesting only TB1 from temp DCI\n");
((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = 2;
((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = 0; ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = 0;
((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 1; ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 1;
((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; ((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1;
...@@ -2692,6 +2713,7 @@ n(tikz_fname,"w"); ...@@ -2692,6 +2713,7 @@ n(tikz_fname,"w");
((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3;
} }
else { // deactivate TB0 else { // deactivate TB0
((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = 2;
((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = 0; ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = 0;
((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 1; ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 1;
((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; ((DCI2_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1;
...@@ -2707,6 +2729,7 @@ n(tikz_fname,"w"); ...@@ -2707,6 +2729,7 @@ n(tikz_fname,"w");
((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3; ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2 = round&3;
} }
else { // deactivate TB0 else { // deactivate TB0
((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->tpmi = 2;
((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = 0; ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1 = 0;
((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 1; ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1 = 1;
((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1; ((DCI2_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2 = trials&1;
...@@ -2727,7 +2750,6 @@ n(tikz_fname,"w"); ...@@ -2727,7 +2750,6 @@ n(tikz_fname,"w");
} }
} }
} }
num_pdcch_symbols_2 = generate_dci_top(num_ue_spec_dci, num_pdcch_symbols_2 = generate_dci_top(num_ue_spec_dci,
num_common_dci, num_common_dci,
dci_alloc, dci_alloc,
...@@ -2743,32 +2765,35 @@ n(tikz_fname,"w"); ...@@ -2743,32 +2765,35 @@ n(tikz_fname,"w");
} }
for (k=0;k<n_users;k++) { for (k=0;k<n_users;k++) {
for (int cw=0; cw<Kmimo; cw++) { for (int TB=0; TB<Kmimo; TB++) {
coded_bits_per_codeword[cw] = get_G(&PHY_vars_eNB->lte_frame_parms, if (PHY_vars_eNB->dlsch_eNB[0][TB] == NULL)
PHY_vars_eNB->dlsch_eNB[k][cw]->harq_processes[0]->nb_rb, continue;
PHY_vars_eNB->dlsch_eNB[k][cw]->harq_processes[0]->rb_alloc,
get_Qm(PHY_vars_eNB->dlsch_eNB[k][cw]->harq_processes[0]->mcs), coded_bits_per_codeword[TB] = get_G(&PHY_vars_eNB->lte_frame_parms,
PHY_vars_eNB->dlsch_eNB[k][cw]->harq_processes[0]->Nl, PHY_vars_eNB->dlsch_eNB[k][TB]->harq_processes[0]->nb_rb,
PHY_vars_eNB->dlsch_eNB[k][TB]->harq_processes[0]->rb_alloc,
get_Qm(PHY_vars_eNB->dlsch_eNB[k][TB]->harq_processes[0]->mcs),
PHY_vars_eNB->dlsch_eNB[k][TB]->harq_processes[0]->Nl,
num_pdcch_symbols, num_pdcch_symbols,
0,subframe); 0,subframe);
#ifdef TBS_FIX // This is for MESH operation!!! #ifdef TBS_FIX // This is for MESH operation!!!
tbs[cw] = (double)3*TBStable[get_I_TBS(PHY_vars_eNB->dlsch_eNB[k][cw]->harq_processes[0]->mcs)][PHY_vars_eNB->dlsch_eNB[k][cw]->nb_rb-1]/4; tbs[TB] = (double)3*TBStable[get_I_TBS(PHY_vars_eNB->dlsch_eNB[k][TB]->harq_processes[0]->mcs)][PHY_vars_eNB->dlsch_eNB[k][TB]->nb_rb-1]/4;
#else #else
tbs[cw] = PHY_vars_eNB->dlsch_eNB[k][cw]->harq_processes[0]->TBS; tbs[TB] = PHY_vars_eNB->dlsch_eNB[k][TB]->harq_processes[0]->TBS;
#endif #endif
rate[cw] = (double)tbs[cw]/(double)coded_bits_per_codeword[cw]; rate[TB] = (double)tbs[TB]/(double)coded_bits_per_codeword[TB];
if ((SNR == snr0) && (trials == 0) && (round == 0) && (pmi_feedback == 0)) if ((SNR == snr0) && (trials == 0) && (round == 0) && (pmi_feedback == 0))
printf("User %d, cw %d: Rate = %f (%f bits/dim) (G %d, TBS %d, mod %d, pdcch_sym %d, ndi %d)\n", printf("User %d, TB %d: Rate = %f (%f bits/dim) (G %d, TBS %d, mod %d, pdcch_sym %d, ndi %d)\n",
k,cw,rate[cw],rate[cw]*get_Qm(PHY_vars_eNB->dlsch_eNB[k][cw]->harq_processes[0]->mcs), k,TB,rate[TB],rate[TB]*get_Qm(PHY_vars_eNB->dlsch_eNB[k][TB]->harq_processes[0]->mcs),
coded_bits_per_codeword[cw], coded_bits_per_codeword[TB],
tbs[cw], tbs[TB],
get_Qm(PHY_vars_eNB->dlsch_eNB[k][cw]->harq_processes[0]->mcs), get_Qm(PHY_vars_eNB->dlsch_eNB[k][TB]->harq_processes[0]->mcs),
num_pdcch_symbols, num_pdcch_symbols,
PHY_vars_eNB->dlsch_eNB[k][cw]->harq_processes[0]->round); PHY_vars_eNB->dlsch_eNB[k][TB]->harq_processes[0]->round);
// use the PMI from previous trial // use the PMI from previous trial
if (DLSCH_alloc_pdu2_1E[0].tpmi == 5) { if (DLSCH_alloc_pdu2_1E[0].tpmi == 5) {
...@@ -2785,20 +2810,20 @@ n(tikz_fname,"w"); ...@@ -2785,20 +2810,20 @@ n(tikz_fname,"w");
*/ */
} }
//Here need to add cases for TPMI 6 and TPMI 5 and check for both TB.
if (transmission_mode==4 && ((((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->tpmi == 2) ||(((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->tpmi == 2))){ if (transmission_mode == 4 && ((((DCI2_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->tpmi == 2) ||(((DCI2_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->tpmi == 2))){
PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->pmi_alloc = quantize_subband_pmi(&PHY_vars_UE->PHY_measurements,0,PHY_vars_eNB->lte_frame_parms.N_RB_DL); PHY_vars_eNB->dlsch_eNB[0][TB]->harq_processes[0]->pmi_alloc = quantize_subband_pmi(&PHY_vars_UE->PHY_measurements,0,PHY_vars_eNB->lte_frame_parms.N_RB_DL);
PHY_vars_UE->dlsch_ue[0][0]->pmi_alloc = quantize_subband_pmi(&PHY_vars_UE->PHY_measurements,0,PHY_vars_UE->lte_frame_parms.N_RB_DL); PHY_vars_UE->dlsch_ue[0][TB]->pmi_alloc = quantize_subband_pmi(&PHY_vars_UE->PHY_measurements,0,PHY_vars_UE->lte_frame_parms.N_RB_DL);
} }
start_meas(&PHY_vars_eNB->dlsch_encoding_stats); start_meas(&PHY_vars_eNB->dlsch_encoding_stats);
if (dlsch_encoding(((cw==0) ? input_buffer0[k] : input_buffer1[k]), if (dlsch_encoding(((TB==0) ? input_buffer0[k] : input_buffer1[k]),
&PHY_vars_eNB->lte_frame_parms, &PHY_vars_eNB->lte_frame_parms,
num_pdcch_symbols, num_pdcch_symbols,
PHY_vars_eNB->dlsch_eNB[k][cw], PHY_vars_eNB->dlsch_eNB[k][TB],
0,subframe, 0,subframe,
&PHY_vars_eNB->dlsch_rate_matching_stats, &PHY_vars_eNB->dlsch_rate_matching_stats,
&PHY_vars_eNB->dlsch_turbo_encoding_stats, &PHY_vars_eNB->dlsch_turbo_encoding_stats,
...@@ -2807,27 +2832,23 @@ n(tikz_fname,"w"); ...@@ -2807,27 +2832,23 @@ n(tikz_fname,"w");
stop_meas(&PHY_vars_eNB->dlsch_encoding_stats); stop_meas(&PHY_vars_eNB->dlsch_encoding_stats);
PHY_vars_eNB->dlsch_eNB[k][cw]->rnti = (common_flag==0) ? n_rnti+k : SI_RNTI; PHY_vars_eNB->dlsch_eNB[k][TB]->rnti = (common_flag==0) ? n_rnti+k : SI_RNTI;
start_meas(&PHY_vars_eNB->dlsch_scrambling_stats); start_meas(&PHY_vars_eNB->dlsch_scrambling_stats);
dlsch_scrambling(&PHY_vars_eNB->lte_frame_parms, dlsch_scrambling(&PHY_vars_eNB->lte_frame_parms,
0, 0,
PHY_vars_eNB->dlsch_eNB[k][cw], PHY_vars_eNB->dlsch_eNB[k][TB],
coded_bits_per_codeword[cw], coded_bits_per_codeword[TB],
cw, TB,
subframe<<1); subframe<<1);
stop_meas(&PHY_vars_eNB->dlsch_scrambling_stats); stop_meas(&PHY_vars_eNB->dlsch_scrambling_stats);
if (n_frames==1) { if (n_frames==1) {
for (s=0;s<PHY_vars_eNB->dlsch_eNB[k][cw]->harq_processes[0]->C;s++) { for (s=0;s<PHY_vars_eNB->dlsch_eNB[k][TB]->harq_processes[0]->C;s++) {
if (s<PHY_vars_eNB->dlsch_eNB[k][cw]->harq_processes[0]->Cminus) if (s<PHY_vars_eNB->dlsch_eNB[k][TB]->harq_processes[0]->Cminus)
Kr = PHY_vars_eNB->dlsch_eNB[k][cw]->harq_processes[0]->Kminus; Kr = PHY_vars_eNB->dlsch_eNB[k][TB]->harq_processes[0]->Kminus;
else else
Kr = PHY_vars_eNB->dlsch_eNB[k][cw]->harq_processes[0]->Kplus; Kr = PHY_vars_eNB->dlsch_eNB[k][TB]->harq_processes[0]->Kplus;
Kr_bytes = Kr>>3; Kr_bytes = Kr>>3;
// for (i=0;i<Kr_bytes;i++)
// printf("cw%d %d : (%x)\n",cw,i,PHY_vars_eNB->dlsch_eNB[k][cw]->harq_processes[0]->c[s][i]);
} }
} }
} }
...@@ -2839,16 +2860,10 @@ n(tikz_fname,"w"); ...@@ -2839,16 +2860,10 @@ n(tikz_fname,"w");
&PHY_vars_eNB->lte_frame_parms, &PHY_vars_eNB->lte_frame_parms,
num_pdcch_symbols, num_pdcch_symbols,
PHY_vars_eNB->dlsch_eNB[k][0], PHY_vars_eNB->dlsch_eNB[k][0],
PHY_vars_eNB->dlsch_eNB[k][1] PHY_vars_eNB->dlsch_eNB[k][1]);
);
stop_meas(&PHY_vars_eNB->dlsch_modulation_stats); stop_meas(&PHY_vars_eNB->dlsch_modulation_stats);
/*
if (trials==0 && round==0)
printf("RE count %d\n",re_allocated);
*/
} //n_users } //n_users
generate_pilots(PHY_vars_eNB, generate_pilots(PHY_vars_eNB,
PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNB_id], PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNB_id],
AMP, AMP,
...@@ -2888,10 +2903,23 @@ n(tikz_fname,"w"); ...@@ -2888,10 +2903,23 @@ n(tikz_fname,"w");
} }
tx_lev_dB = (unsigned int) dB_fixed(tx_lev); tx_lev_dB = (unsigned int) dB_fixed(tx_lev);
if (n_frames==1) {
write_output("txsigF0.m","txsF0", &PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNB_id][0][subframe*nsymb*PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size],nsymb*PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size,1,1);
if (PHY_vars_eNB->lte_frame_parms.nb_antennas_tx>1)
write_output("txsigF1.m","txsF1", &PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNB_id][1][subframe*nsymb*PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size],nsymb*PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size,1,1);
}
tx_lev = 0;
for (aa=0; aa<PHY_vars_eNB->lte_frame_parms.nb_antennas_tx; aa++) {
tx_lev += signal_energy(&PHY_vars_eNB->lte_eNB_common_vars.txdata[eNB_id][aa]
[subframe*PHY_vars_eNB->lte_frame_parms.samples_per_tti],
PHY_vars_eNB->lte_frame_parms.samples_per_tti);
}
tx_lev_dB = (unsigned int) dB_fixed(tx_lev);
if (n_frames==1) { if (n_frames==1) {
printf("tx_lev = %d (%d dB)\n",tx_lev,tx_lev_dB); printf("tx_lev = %d (%d dB)\n",tx_lev,tx_lev_dB);
write_output("txsig0.m","txs0", &PHY_vars_eNB->lte_eNB_common_vars.txdata[eNB_id][0][subframe* PHY_vars_eNB->lte_frame_parms.samples_per_tti], write_output("txsig0.m","txs0", &PHY_vars_eNB->lte_eNB_common_vars.txdata[eNB_id][0][subframe* PHY_vars_eNB->lte_frame_parms.samples_per_tti], PHY_vars_eNB->lte_frame_parms.samples_per_tti,1,1);
PHY_vars_eNB->lte_frame_parms.samples_per_tti,1,1);
} }
} }
/* /*
...@@ -2957,7 +2985,7 @@ n(tikz_fname,"w"); ...@@ -2957,7 +2985,7 @@ n(tikz_fname,"w");
// Multipath channel // Multipath channel
if (awgn_flag == 0) { if (awgn_flag == 0) {
multipath_channel(eNB2UE[round+round],s_re,s_im,r_re,r_im, multipath_channel(eNB2UE[round],s_re,s_im,r_re,r_im,
2*frame_parms->samples_per_tti,hold_channel); 2*frame_parms->samples_per_tti,hold_channel);
// printf("amc: ****************** eNB2UE[%d]->n_rx = %d,dd %d\n",round,eNB2UE[round]->nb_rx,eNB2UE[round]->channel_offset); // printf("amc: ****************** eNB2UE[%d]->n_rx = %d,dd %d\n",round,eNB2UE[round]->nb_rx,eNB2UE[round]->channel_offset);
if(abstx==1 && num_rounds>1) if(abstx==1 && num_rounds>1)
...@@ -2967,7 +2995,7 @@ n(tikz_fname,"w"); ...@@ -2967,7 +2995,7 @@ n(tikz_fname,"w");
random_channel(eNB2UE[3],0); random_channel(eNB2UE[3],0);
} }
if (PHY_vars_UE->perfect_ce==1){ if (PHY_vars_UE->perfect_ce==1){
freq_channel(eNB2UE[round+round],PHY_vars_UE->lte_frame_parms.N_RB_DL,12*PHY_vars_UE->lte_frame_parms.N_RB_DL + 1); freq_channel(eNB2UE[round],PHY_vars_UE->lte_frame_parms.N_RB_DL,12*PHY_vars_UE->lte_frame_parms.N_RB_DL + 1);
// write_output("channel.m","ch",eNB2UE[round]->ch[0],eNB2UE[round]->channel_length,1,8); // write_output("channel.m","ch",eNB2UE[round]->ch[0],eNB2UE[round]->channel_length,1,8);
// write_output("channelF.m","chF",eNB2UE[round]->chF[0],12*PHY_vars_UE->lte_frame_parms.N_RB_DL +1,1,8); // write_output("channelF.m","chF",eNB2UE[round]->chF[0],12*PHY_vars_UE->lte_frame_parms.N_RB_DL +1,1,8);
} }
...@@ -3119,9 +3147,9 @@ n(tikz_fname,"w"); ...@@ -3119,9 +3147,9 @@ n(tikz_fname,"w");
for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) { for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
for (i=0; i<frame_parms->N_RB_DL*12; i++) { for (i=0; i<frame_parms->N_RB_DL*12; i++) {
((int16_t *) PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[k][(aa<<1)+aarx])[2*i+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]= ((int16_t *) PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[k][(aa<<1)+aarx])[2*i+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=
(int16_t)(eNB2UE[round+round]->chF[aarx+(aa*frame_parms->nb_antennas_rx)][i].x*AMP); (int16_t)(eNB2UE[round]->chF[aarx+(aa*frame_parms->nb_antennas_rx)][i].x*AMP);
((int16_t *) PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[k][(aa<<1)+aarx])[2*i+1+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]= ((int16_t *) PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[k][(aa<<1)+aarx])[2*i+1+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=
(int16_t)(eNB2UE[round+round]->chF[aarx+(aa*frame_parms->nb_antennas_rx)][i].y*AMP); (int16_t)(eNB2UE[round]->chF[aarx+(aa*frame_parms->nb_antennas_rx)][i].y*AMP);
} }
} }
} }
...@@ -3447,60 +3475,63 @@ n(tikz_fname,"w"); ...@@ -3447,60 +3475,63 @@ n(tikz_fname,"w");
} }
} }
if (rx_type==rx_SIC_dual_stream){ /*if (rx_type==rx_SIC_dual_stream){
cw_to_decode_interf=1; cw_to_decode_interf=1;
cw_to_decode_interf_free=1; cw_to_decode_interf_free=1;
} }
else { else {
cw_to_decode_interf=Kmimo; cw_to_decode_interf=Kmimo;
} }*/
for (TB=0; TB<Kmimo; TB++){ // may be we ll have to swap CW
for (cw_non_sic=0; cw_non_sic<cw_to_decode_interf; cw_non_sic++){ // may be we ll have to swap CW if (PHY_vars_UE->dlsch_ue[0][TB] == NULL)
continue;
PHY_vars_UE->dlsch_ue[0][cw_non_sic]->rnti = (common_flag==0) ? n_rnti: SI_RNTI; PHY_vars_UE->dlsch_ue[0][TB]->rnti = (common_flag==0) ? n_rnti: SI_RNTI;
coded_bits_per_codeword[cw_non_sic] = get_G(&PHY_vars_eNB->lte_frame_parms, coded_bits_per_codeword[TB] = get_G(&PHY_vars_eNB->lte_frame_parms,
PHY_vars_eNB->dlsch_eNB[0][cw_non_sic]->harq_processes[0]->nb_rb, PHY_vars_eNB->dlsch_eNB[0][TB]->harq_processes[0]->nb_rb,
PHY_vars_eNB->dlsch_eNB[0][cw_non_sic]->harq_processes[0]->rb_alloc, PHY_vars_eNB->dlsch_eNB[0][TB]->harq_processes[0]->rb_alloc,
get_Qm(PHY_vars_eNB->dlsch_eNB[0][cw_non_sic]->harq_processes[0]->mcs), get_Qm(PHY_vars_eNB->dlsch_eNB[0][TB]->harq_processes[0]->mcs),
PHY_vars_eNB->dlsch_eNB[0][cw_non_sic]->harq_processes[0]->Nl, PHY_vars_eNB->dlsch_eNB[0][TB]->harq_processes[0]->Nl,
num_pdcch_symbols, num_pdcch_symbols,
0,subframe); 0,subframe);
PHY_vars_UE->dlsch_ue[0][cw_non_sic]->harq_processes[PHY_vars_UE->dlsch_ue[0][cw_non_sic]->current_harq_pid]->G = coded_bits_per_codeword[cw_non_sic]; PHY_vars_UE->dlsch_ue[0][TB]->harq_processes[PHY_vars_UE->dlsch_ue[0][TB]->current_harq_pid]->G = coded_bits_per_codeword[TB];
PHY_vars_UE->dlsch_ue[0][cw_non_sic]->harq_processes[PHY_vars_UE->dlsch_ue[0][cw_non_sic]->current_harq_pid]->Qm = get_Qm(PHY_vars_eNB->dlsch_eNB[0][cw_non_sic]->harq_processes[0]->mcs); PHY_vars_UE->dlsch_ue[0][TB]->harq_processes[PHY_vars_UE->dlsch_ue[0][TB]->current_harq_pid]->Qm = get_Qm(PHY_vars_eNB->dlsch_eNB[0][TB]->harq_processes[0]->mcs);
if (n_frames==1) { if (n_frames==1) {
printf("Kmimo=%d, cw=%d, G=%d, TBS=%d\n",Kmimo,cw_non_sic,coded_bits_per_codeword[cw_non_sic], printf("Kmimo=%d, TB=%d, G=%d, TBS=%d\n",Kmimo,TB,coded_bits_per_codeword[TB],
PHY_vars_UE->dlsch_ue[0][cw_non_sic]->harq_processes[PHY_vars_UE->dlsch_ue[0][cw_non_sic]->current_harq_pid]->TBS); PHY_vars_UE->dlsch_ue[0][TB]->harq_processes[PHY_vars_UE->dlsch_ue[0][TB]->current_harq_pid]->TBS);
// calculate uncoded BER // calculate uncoded BER
uncoded_ber_bit = (short*) malloc(sizeof(short)*coded_bits_per_codeword[cw_non_sic]); uncoded_ber_bit = (short*) malloc(sizeof(short)*coded_bits_per_codeword[TB]);
AssertFatal(uncoded_ber_bit, "uncoded_ber_bit==NULL"); AssertFatal(uncoded_ber_bit, "uncoded_ber_bit==NULL");
sprintf(fname,"dlsch%d_rxF_r%d_cw%d_llr.m",eNB_id,round, cw_non_sic); sprintf(fname,"dlsch%d_rxF_r%d_cw%d_llr.m",eNB_id,round, TB);
sprintf(vname,"dl%d_r%d_cw%d_llr",eNB_id,round, cw_non_sic); sprintf(vname,"dl%d_r%d_cw%d_llr",eNB_id,round, TB);
write_output(fname,vname, PHY_vars_UE->lte_ue_pdsch_vars[0]->llr[cw_non_sic],coded_bits_per_codeword[cw_non_sic],1,0); write_output(fname,vname, PHY_vars_UE->lte_ue_pdsch_vars[0]->llr[PHY_vars_UE->dlsch_ue[0][TB]->harq_processes[PHY_vars_UE->dlsch_ue[0][TB]->current_harq_pid]->codeword],coded_bits_per_codeword[TB],1,0);
sprintf(fname,"dlsch_cw%d_e.m", cw_non_sic); sprintf(fname,"dlsch_cw%d_e.m", TB);
sprintf(vname,"dlschcw%d_e", cw_non_sic); sprintf(vname,"dlschcw%d_e", TB);
write_output(fname, vname,PHY_vars_eNB->dlsch_eNB[0][cw_non_sic]->harq_processes[0]->e,coded_bits_per_codeword[cw_non_sic],1,4); write_output(fname, vname,PHY_vars_eNB->dlsch_eNB[0][TB]->harq_processes[0]->e,coded_bits_per_codeword[TB],1,4);
uncoded_ber=0; uncoded_ber=0;
printf("trials=%d\n", trials); printf("trials=%d\n", trials);
for (i=0;i<coded_bits_per_codeword[cw_non_sic];i++) for (i=0;i<coded_bits_per_codeword[TB];i++)
if (PHY_vars_eNB->dlsch_eNB[0][cw_non_sic]->harq_processes[0]->e[i] != (PHY_vars_UE->lte_ue_pdsch_vars[0]->llr[cw_non_sic][i]<0)) { if (PHY_vars_eNB->dlsch_eNB[0][TB]->harq_processes[0]->e[i] != (PHY_vars_UE->lte_ue_pdsch_vars[0]->llr[PHY_vars_UE->dlsch_ue[0][TB]->harq_processes[PHY_vars_UE->dlsch_ue[0][TB]->current_harq_pid]->codeword][i]<0)) {
uncoded_ber_bit[i] = 1; uncoded_ber_bit[i] = 1;
uncoded_ber++; uncoded_ber++;
} }
else else
uncoded_ber_bit[i] = 0; uncoded_ber_bit[i] = 0;
uncoded_ber/=coded_bits_per_codeword[cw_non_sic]; uncoded_ber/=coded_bits_per_codeword[TB];
avg_ber += uncoded_ber; avg_ber += uncoded_ber;
sprintf(fname,"cw%d_uncoded_ber_bit.m", cw_non_sic); sprintf(fname,"cw%d_uncoded_ber_bit.m", TB);
sprintf(vname,"uncoded_ber_bit_cw%d", cw_non_sic); sprintf(vname,"uncoded_ber_bit_cw%d", TB);
write_output(fname, vname,uncoded_ber_bit,coded_bits_per_codeword[cw_non_sic],1,0); write_output(fname, vname,uncoded_ber_bit,coded_bits_per_codeword[TB],1,0);
printf("cw %d, uncoded ber %f\n",cw_non_sic,uncoded_ber); printf("cw %d, uncoded ber %f\n",TB,uncoded_ber);
free(uncoded_ber_bit); free(uncoded_ber_bit);
...@@ -3511,21 +3542,21 @@ n(tikz_fname,"w"); ...@@ -3511,21 +3542,21 @@ n(tikz_fname,"w");
start_meas(&PHY_vars_UE->dlsch_unscrambling_stats); start_meas(&PHY_vars_UE->dlsch_unscrambling_stats);
dlsch_unscrambling(&PHY_vars_UE->lte_frame_parms, dlsch_unscrambling(&PHY_vars_UE->lte_frame_parms,
0, 0,
PHY_vars_UE->dlsch_ue[0][cw_non_sic], PHY_vars_UE->dlsch_ue[0][TB],
coded_bits_per_codeword[cw_non_sic], coded_bits_per_codeword[TB],
PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->llr[cw_non_sic], PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->llr[PHY_vars_UE->dlsch_ue[0][TB]->harq_processes[PHY_vars_UE->dlsch_ue[0][TB]->current_harq_pid]->codeword],
cw_non_sic, TB,
subframe<<1); subframe<<1);
stop_meas(&PHY_vars_UE->dlsch_unscrambling_stats); stop_meas(&PHY_vars_UE->dlsch_unscrambling_stats);
start_meas(&PHY_vars_UE->dlsch_decoding_stats); start_meas(&PHY_vars_UE->dlsch_decoding_stats);
ret[cw_non_sic] = dlsch_decoding(PHY_vars_UE, ret[TB] = dlsch_decoding(PHY_vars_UE,
PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->llr[cw_non_sic], PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->llr[TB],
&PHY_vars_UE->lte_frame_parms, &PHY_vars_UE->lte_frame_parms,
PHY_vars_UE->dlsch_ue[0][cw_non_sic], PHY_vars_UE->dlsch_ue[0][TB],
PHY_vars_UE->dlsch_ue[0][cw_non_sic]->harq_processes[PHY_vars_UE->dlsch_ue[0][cw_non_sic]->current_harq_pid], PHY_vars_UE->dlsch_ue[0][TB]->harq_processes[PHY_vars_UE->dlsch_ue[0][TB]->current_harq_pid],
subframe, subframe,
PHY_vars_UE->dlsch_ue[0][cw_non_sic]->current_harq_pid, PHY_vars_UE->dlsch_ue[0][TB]->current_harq_pid,
1,llr8_flag); 1,llr8_flag);
stop_meas(&PHY_vars_UE->dlsch_decoding_stats); stop_meas(&PHY_vars_UE->dlsch_decoding_stats);
//printf("retr cw 0 = %d\n", ret[0]); //printf("retr cw 0 = %d\n", ret[0]);
...@@ -3533,33 +3564,32 @@ n(tikz_fname,"w"); ...@@ -3533,33 +3564,32 @@ n(tikz_fname,"w");
if (ret[cw_non_sic] <= PHY_vars_UE->dlsch_ue[0][cw_non_sic]->max_turbo_iterations ) { //if CW0 is decoded, approach CW1 if (ret[TB] <= PHY_vars_UE->dlsch_ue[0][TB]->max_turbo_iterations ) { //if CW0 is decoded, approach CW1
if (cw_non_sic==0) {
avg_iter[0] += ret[0]; /*avg_iter[TB] += ret[TB];
iter_trials[0]++; iter_trials[TB]++;*/
}
if (n_frames==2) { if (n_frames==2) {
printf("cw non sic %d, round %d: No DLSCH errors found, uncoded ber %f\n",cw_non_sic,round,uncoded_ber); printf("cw non sic %d, round %d: No DLSCH errors found, uncoded ber %f\n",TB,round,uncoded_ber);
#ifdef PRINT_BYTES #ifdef PRINT_BYTES
for (s=0;s<PHY_vars_UE->dlsch_ue[0][cw_non_sic]->harq_processes[0]->C;s++) { for (s=0;s<PHY_vars_UE->dlsch_ue[0][TB]->harq_processes[0]->C;s++) {
if (s<PHY_vars_UE->dlsch_ue[0][cw_non_sic]->harq_processes[0]->Cminus) if (s<PHY_vars_UE->dlsch_ue[0][TB]->harq_processes[0]->Cminus)
Kr = PHY_vars_UE->dlsch_ue[0][cw_non_sic]->harq_processes[0]->Kminus; Kr = PHY_vars_UE->dlsch_ue[0][TB]->harq_processes[0]->Kminus;
else else
Kr = PHY_vars_UE->dlsch_ue[0][cw_non_sic]->harq_processes[0]->Kplus; Kr = PHY_vars_UE->dlsch_ue[0][TB]->harq_processes[0]->Kplus;
Kr_bytes = Kr>>3; Kr_bytes = Kr>>3;
printf("Decoded_output (Segment %d):\n",s); printf("Decoded_output (Segment %d):\n",s);
for (i=0;i<Kr_bytes;i++) for (i=0;i<Kr_bytes;i++)
printf("%d : %x (%x)\n",i,PHY_vars_UE->dlsch_ue[0][cw_non_sic]->harq_processes[0]->c[s][i], printf("%d : %x (%x)\n",i,PHY_vars_UE->dlsch_ue[0][TB]->harq_processes[0]->c[s][i],
PHY_vars_UE->dlsch_ue[0][cw_non_sic]->harq_processes[0]->c[s][i]^PHY_vars_eNB->dlsch_eNB[0][cw_non_sic]->harq_processes[0]->c[s][i]); PHY_vars_UE->dlsch_ue[0][TB]->harq_processes[0]->c[s][i]^PHY_vars_eNB->dlsch_eNB[0][TB]->harq_processes[0]->c[s][i]);
} }
#endif #endif
} }
PHY_vars_UE->total_TBS[eNB_id] = PHY_vars_UE->total_TBS[eNB_id] + PHY_vars_UE->dlsch_ue[eNB_id][cw_non_sic]->harq_processes[PHY_vars_UE->dlsch_ue[eNB_id][cw_non_sic]->current_harq_pid]->TBS; PHY_vars_UE->total_TBS[eNB_id] = PHY_vars_UE->total_TBS[eNB_id] + PHY_vars_UE->dlsch_ue[eNB_id][TB]->harq_processes[PHY_vars_UE->dlsch_ue[eNB_id][TB]->current_harq_pid]->TBS;
// If the receiver is NOT SIC, Here we are done with both CW, now only to calculate BLER // If the receiver is NOT SIC, Here we are done with both CW, now only to calculate BLER
//If the receiver IS SIC, we are done only with CW0, CW1 was only compensated by this moment (y1' obtained) //If the receiver IS SIC, we are done only with CW0, CW1 was only compensated by this moment (y1' obtained)
...@@ -3664,6 +3694,10 @@ n(tikz_fname,"w"); ...@@ -3664,6 +3694,10 @@ n(tikz_fname,"w");
rx_type==rx_SIC_dual_stream) { rx_type==rx_SIC_dual_stream) {
// printf("current round = %d\n", PHY_vars_UE->dlsch_ue[eNB_id][0]->harq_processes[PHY_vars_UE->dlsch_ue[eNB_id][0]->current_harq_pid]->round); // printf("current round = %d\n", PHY_vars_UE->dlsch_ue[eNB_id][0]->harq_processes[PHY_vars_UE->dlsch_ue[eNB_id][0]->current_harq_pid]->round);
//printf("\n CW 0 is decoded, i go for , round %d\n", round);
//printf("\n ret[TB0] = %d round %d\n", ret[TB], round);
for (round_sic = 0 ; round_sic < (round +1); round_sic++) { for (round_sic = 0 ; round_sic < (round +1); round_sic++) {
//printf("I enter round_sic loop \n"); //printf("I enter round_sic loop \n");
//printf("round_sic= %d\n", round_sic); //printf("round_sic= %d\n", round_sic);
...@@ -3696,7 +3730,7 @@ n(tikz_fname,"w"); ...@@ -3696,7 +3730,7 @@ n(tikz_fname,"w");
&PHY_vars_UE->dlsch_interleaving_stats); &PHY_vars_UE->dlsch_interleaving_stats);
coded_bits_per_codeword[cw_non_sic]= get_G(&PHY_vars_UE->lte_frame_parms, coded_bits_per_codeword[TB]= get_G(&PHY_vars_UE->lte_frame_parms,
PHY_vars_UE->dlsch_eNB[eNB_id]->harq_processes[PHY_vars_UE->dlsch_eNB[eNB_id]->current_harq_pid]->nb_rb, PHY_vars_UE->dlsch_eNB[eNB_id]->harq_processes[PHY_vars_UE->dlsch_eNB[eNB_id]->current_harq_pid]->nb_rb,
PHY_vars_UE->dlsch_eNB[eNB_id]->harq_processes[PHY_vars_UE->dlsch_eNB[eNB_id]->current_harq_pid]->rb_alloc, PHY_vars_UE->dlsch_eNB[eNB_id]->harq_processes[PHY_vars_UE->dlsch_eNB[eNB_id]->current_harq_pid]->rb_alloc,
get_Qm(PHY_vars_UE->dlsch_eNB[eNB_id]->harq_processes[PHY_vars_UE->dlsch_eNB[eNB_id]->current_harq_pid]->mcs), get_Qm(PHY_vars_UE->dlsch_eNB[eNB_id]->harq_processes[PHY_vars_UE->dlsch_eNB[eNB_id]->current_harq_pid]->mcs),
...@@ -3708,7 +3742,7 @@ n(tikz_fname,"w"); ...@@ -3708,7 +3742,7 @@ n(tikz_fname,"w");
dlsch_scrambling(&PHY_vars_UE->lte_frame_parms, dlsch_scrambling(&PHY_vars_UE->lte_frame_parms,
0, 0,
PHY_vars_UE->dlsch_eNB[eNB_id], PHY_vars_UE->dlsch_eNB[eNB_id],
coded_bits_per_codeword[cw_non_sic], coded_bits_per_codeword[TB],
0, 0,
subframe<<1); subframe<<1);
...@@ -3718,107 +3752,107 @@ n(tikz_fname,"w"); ...@@ -3718,107 +3752,107 @@ n(tikz_fname,"w");
num_pdcch_symbols, num_pdcch_symbols,
&PHY_vars_UE->dlsch_eNB[0][0], &PHY_vars_UE->dlsch_eNB[0][0],
NULL, NULL,
coded_bits_per_codeword[cw_non_sic]); coded_bits_per_codeword[TB]);
// write_output("sic_buffer.m","sic", *sic_buffer,re_allocated,1,1); // write_output("sic_buffer.m","sic", *sic_buffer,re_allocated,1,1);
// write_output("rxdataF_comp1.m","rxF_comp1", *PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->rxdataF_comp1[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid][round],14*12*25,1,1); // write_output("rxdataF_comp1.m","rxF_comp1", *PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->rxdataF_comp1[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid][round],14*12*25,1,1);
// write_output("rxdataF_rho.m","rho", *PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid][round],14*12*25,1,1); // write_output("rxdataF_rho.m","rho", *PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid][round],14*12*25,1,1);
switch (get_Qm(PHY_vars_eNB->dlsch_eNB[0][1]->harq_processes[0]->mcs)){ switch (get_Qm(PHY_vars_eNB->dlsch_eNB[0][TB+1]->harq_processes[0]->mcs)){
case 2: case 2:
dlsch_qpsk_llr_SIC(&PHY_vars_UE->lte_frame_parms, dlsch_qpsk_llr_SIC(&PHY_vars_UE->lte_frame_parms,
PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->rxdataF_comp1[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid][round_sic], PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->rxdataF_comp1[PHY_vars_UE->dlsch_ue[0][TB]->current_harq_pid][round_sic],
sic_buffer, sic_buffer,
PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid][round_sic], PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext[PHY_vars_UE->dlsch_ue[0][TB]->current_harq_pid][round_sic],
PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->llr[1], PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->llr[PHY_vars_UE->dlsch_ue[0][TB+1]->harq_processes[PHY_vars_UE->dlsch_ue[0][TB+1]->current_harq_pid]->codeword],
num_pdcch_symbols, num_pdcch_symbols,
dlsch0_eNB_harq->nb_rb, dlsch0_eNB_harq->nb_rb,
subframe, subframe,
dlsch0_eNB_harq->rb_alloc[0], dlsch0_eNB_harq->rb_alloc[0],
get_Qm(PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->mcs), get_Qm(PHY_vars_eNB->dlsch_eNB[0][TB]->harq_processes[0]->mcs),
PHY_vars_UE->dlsch_ue[eNB_id][0]); PHY_vars_UE->dlsch_ue[eNB_id][TB]);
break; break;
case 4: case 4:
dlsch_16qam_llr_SIC(&PHY_vars_UE->lte_frame_parms, dlsch_16qam_llr_SIC(&PHY_vars_UE->lte_frame_parms,
PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->rxdataF_comp1[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid][round_sic], PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->rxdataF_comp1[PHY_vars_UE->dlsch_ue[0][TB]->current_harq_pid][round_sic],
sic_buffer, sic_buffer,
PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid][round_sic], PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext[PHY_vars_UE->dlsch_ue[0][TB]->current_harq_pid][round_sic],
PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->llr[1], PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->llr[PHY_vars_UE->dlsch_ue[0][TB+1]->harq_processes[PHY_vars_UE->dlsch_ue[0][TB+1]->current_harq_pid]->codeword],
num_pdcch_symbols, num_pdcch_symbols,
PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->dl_ch_mag1[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid][round_sic], PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->dl_ch_mag1[PHY_vars_UE->dlsch_ue[0][TB]->current_harq_pid][round_sic],
dlsch0_eNB_harq->nb_rb, dlsch0_eNB_harq->nb_rb,
subframe, subframe,
dlsch0_eNB_harq->rb_alloc[0], dlsch0_eNB_harq->rb_alloc[0],
get_Qm(PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->mcs), get_Qm(PHY_vars_eNB->dlsch_eNB[0][TB]->harq_processes[0]->mcs),
PHY_vars_UE->dlsch_ue[eNB_id][0]); PHY_vars_UE->dlsch_ue[eNB_id][0]);
break; break;
case 6: case 6:
dlsch_64qam_llr_SIC(&PHY_vars_UE->lte_frame_parms, dlsch_64qam_llr_SIC(&PHY_vars_UE->lte_frame_parms,
PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->rxdataF_comp1[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid][round_sic], PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->rxdataF_comp1[PHY_vars_UE->dlsch_ue[0][TB]->current_harq_pid][round_sic],
sic_buffer, sic_buffer,
PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid][round_sic], PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext[PHY_vars_UE->dlsch_ue[0][TB]->current_harq_pid][round_sic],
PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->llr[1], PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->llr[PHY_vars_UE->dlsch_ue[0][TB+1]->harq_processes[PHY_vars_UE->dlsch_ue[0][TB+1]->current_harq_pid]->codeword],
num_pdcch_symbols, num_pdcch_symbols,
PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->dl_ch_mag1[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid][round_sic], PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->dl_ch_mag1[PHY_vars_UE->dlsch_ue[0][TB]->current_harq_pid][round_sic],
PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->dl_ch_magb1[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid][round_sic], PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->dl_ch_magb1[PHY_vars_UE->dlsch_ue[0][TB]->current_harq_pid][round_sic],
dlsch0_eNB_harq->nb_rb, dlsch0_eNB_harq->nb_rb,
subframe, subframe,
dlsch0_eNB_harq->rb_alloc[0], dlsch0_eNB_harq->rb_alloc[0],
get_Qm(PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->mcs), get_Qm(PHY_vars_eNB->dlsch_eNB[0][TB]->harq_processes[0]->mcs),
PHY_vars_UE->dlsch_ue[eNB_id][0]); PHY_vars_UE->dlsch_ue[eNB_id][TB]);
break; break;
} }
} }
// write_output("rxdata_llr1.m","llr1", PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->llr[1],re_allocated*2,1,0); // write_output("rxdata_llr1.m","llr1", PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->llr[1],re_allocated*2,1,0);
for (cw_sic=cw_to_decode_interf_free; cw_sic<cw_to_decode_interf_free+1;cw_sic++){ // replace cw_sic with TB+1
PHY_vars_UE->dlsch_ue[0][cw_sic]->rnti = (common_flag==0) ? n_rnti: SI_RNTI; PHY_vars_UE->dlsch_ue[0][TB+1]->rnti = (common_flag==0) ? n_rnti: SI_RNTI;
coded_bits_per_codeword[cw_sic]= get_G(&PHY_vars_eNB->lte_frame_parms, coded_bits_per_codeword[TB+1]= get_G(&PHY_vars_eNB->lte_frame_parms,
PHY_vars_eNB->dlsch_eNB[0][cw_sic]->harq_processes[0]->nb_rb, PHY_vars_eNB->dlsch_eNB[0][TB+1]->harq_processes[0]->nb_rb,
PHY_vars_eNB->dlsch_eNB[0][cw_sic]->harq_processes[0]->rb_alloc, PHY_vars_eNB->dlsch_eNB[0][TB+1]->harq_processes[0]->rb_alloc,
get_Qm(PHY_vars_eNB->dlsch_eNB[0][cw_sic]->harq_processes[0]->mcs), get_Qm(PHY_vars_eNB->dlsch_eNB[0][TB+1]->harq_processes[0]->mcs),
PHY_vars_eNB->dlsch_eNB[0][cw_sic]->harq_processes[0]->Nl, PHY_vars_eNB->dlsch_eNB[0][TB+1]->harq_processes[0]->Nl,
num_pdcch_symbols, num_pdcch_symbols,
0, 0,
subframe); subframe);
PHY_vars_UE->dlsch_ue[0][cw_sic]->harq_processes[PHY_vars_UE->dlsch_ue[0][cw_sic]->current_harq_pid]->G = coded_bits_per_codeword[cw_sic]; PHY_vars_UE->dlsch_ue[0][TB+1]->harq_processes[PHY_vars_UE->dlsch_ue[0][TB+1]->current_harq_pid]->G = coded_bits_per_codeword[TB+1];
PHY_vars_UE->dlsch_ue[0][cw_sic]->harq_processes[PHY_vars_UE->dlsch_ue[0][cw_sic]->current_harq_pid]->Qm = get_Qm(PHY_vars_eNB->dlsch_eNB[0][cw_sic]->harq_processes[0]->mcs); PHY_vars_UE->dlsch_ue[0][TB+1]->harq_processes[PHY_vars_UE->dlsch_ue[0][TB+1]->current_harq_pid]->Qm = get_Qm(PHY_vars_eNB->dlsch_eNB[0][TB+1]->harq_processes[0]->mcs);
if (n_frames==1) { if (n_frames==1) {
printf("Kmimo=%d, cw=%d, G=%d, TBS=%d\n",Kmimo,cw_sic,coded_bits_per_codeword[cw_sic], printf("Kmimo=%d, cw=%d, G=%d, TBS=%d\n",Kmimo,TB+1,coded_bits_per_codeword[TB+1],
PHY_vars_UE->dlsch_ue[0][cw_sic]->harq_processes[PHY_vars_UE->dlsch_ue[0][cw_sic]->current_harq_pid]->TBS); PHY_vars_UE->dlsch_ue[0][TB+1]->harq_processes[PHY_vars_UE->dlsch_ue[0][TB+1]->current_harq_pid]->TBS);
// calculate uncoded BER // calculate uncoded BER
uncoded_ber_bit = (short*) malloc(sizeof(short)*coded_bits_per_codeword[cw_sic]); uncoded_ber_bit = (short*) malloc(sizeof(short)*coded_bits_per_codeword[TB+1]);
AssertFatal(uncoded_ber_bit, "uncoded_ber_bit==NULL"); AssertFatal(uncoded_ber_bit, "uncoded_ber_bit==NULL");
sprintf(fname,"dlsch%d_rxF_r%d_cw%d_llr.m",eNB_id,round, cw_sic); sprintf(fname,"dlsch%d_rxF_r%d_cw%d_llr.m",eNB_id,round, TB+1);
sprintf(vname,"dl%d_r%d_cw%d_llr",eNB_id,round, cw_sic); sprintf(vname,"dl%d_r%d_cw%d_llr",eNB_id,round, TB+1);
write_output(fname,vname, PHY_vars_UE->lte_ue_pdsch_vars[0]->llr[cw_sic],coded_bits_per_codeword[cw_sic],1,0); write_output(fname,vname, PHY_vars_UE->lte_ue_pdsch_vars[0]->llr[TB+1],coded_bits_per_codeword[TB+1],1,0);
sprintf(fname,"dlsch_cw%d_e.m", cw_sic); sprintf(fname,"dlsch_cw%d_e.m", TB+1);
sprintf(vname,"dlschcw%d_e", cw_sic); sprintf(vname,"dlschcw%d_e", TB+1);
write_output(fname, vname,PHY_vars_eNB->dlsch_eNB[0][cw_sic]->harq_processes[0]->e,coded_bits_per_codeword[cw_sic],1,4); write_output(fname, vname,PHY_vars_eNB->dlsch_eNB[0][TB+1]->harq_processes[0]->e,coded_bits_per_codeword[TB+1],1,4);
uncoded_ber=0; uncoded_ber=0;
printf("trials=%d\n", trials); printf("trials=%d\n", trials);
for (i=0;i<coded_bits_per_codeword[cw_sic];i++) for (i=0;i<coded_bits_per_codeword[TB+1];i++)
if (PHY_vars_eNB->dlsch_eNB[0][cw_sic]->harq_processes[0]->e[i] != (PHY_vars_UE->lte_ue_pdsch_vars[0]->llr[cw_sic][i]<0)) { if (PHY_vars_eNB->dlsch_eNB[0][TB+1]->harq_processes[0]->e[i] != (PHY_vars_UE->lte_ue_pdsch_vars[0]->llr[PHY_vars_UE->dlsch_ue[0][TB+1]->harq_processes[PHY_vars_UE->dlsch_ue[0][TB+1]->current_harq_pid]->codeword][i]<0)) {
uncoded_ber_bit[i] = 1; uncoded_ber_bit[i] = 1;
uncoded_ber++; uncoded_ber++;
} }
else else
uncoded_ber_bit[i] = 0; uncoded_ber_bit[i] = 0;
uncoded_ber/=coded_bits_per_codeword[cw_sic]; uncoded_ber/=coded_bits_per_codeword[TB+1];
avg_ber += uncoded_ber; avg_ber += uncoded_ber;
sprintf(fname,"cw%d_uncoded_ber_bit.m", cw_sic); sprintf(fname,"cw%d_uncoded_ber_bit.m", TB+1);
sprintf(vname,"uncoded_ber_bit_cw%d", cw_sic); sprintf(vname,"uncoded_ber_bit_cw%d", TB+1);
write_output(fname, vname,uncoded_ber_bit,coded_bits_per_codeword[cw_sic],1,0); write_output(fname, vname,uncoded_ber_bit,coded_bits_per_codeword[TB+1],1,0);
printf("cw %d, uncoded ber %f\n",cw_sic,uncoded_ber); printf("cw %d, uncoded ber %f\n",TB+1,uncoded_ber);
free(uncoded_ber_bit); free(uncoded_ber_bit);
uncoded_ber_bit = NULL; uncoded_ber_bit = NULL;
} }
...@@ -3826,129 +3860,124 @@ n(tikz_fname,"w"); ...@@ -3826,129 +3860,124 @@ n(tikz_fname,"w");
start_meas(&PHY_vars_UE->dlsch_unscrambling_stats); start_meas(&PHY_vars_UE->dlsch_unscrambling_stats);
dlsch_unscrambling(&PHY_vars_UE->lte_frame_parms, dlsch_unscrambling(&PHY_vars_UE->lte_frame_parms,
0, 0,
PHY_vars_UE->dlsch_ue[0][cw_sic], PHY_vars_UE->dlsch_ue[0][TB+1],
coded_bits_per_codeword[cw_sic], coded_bits_per_codeword[TB+1],
PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->llr[cw_sic], PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->llr[PHY_vars_UE->dlsch_ue[0][TB+1]->harq_processes[PHY_vars_UE->dlsch_ue[0][TB+1]->current_harq_pid]->codeword],
cw_sic, TB+1,
subframe<<1); subframe<<1);
stop_meas(&PHY_vars_UE->dlsch_unscrambling_stats); stop_meas(&PHY_vars_UE->dlsch_unscrambling_stats);
start_meas(&PHY_vars_UE->dlsch_decoding_stats); start_meas(&PHY_vars_UE->dlsch_decoding_stats);
ret[1] = dlsch_decoding(PHY_vars_UE, ret[1] = dlsch_decoding(PHY_vars_UE,
PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->llr[cw_sic], PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->llr[PHY_vars_UE->dlsch_ue[0][TB+1]->harq_processes[PHY_vars_UE->dlsch_ue[0][TB+1]->current_harq_pid]->codeword],
&PHY_vars_UE->lte_frame_parms, &PHY_vars_UE->lte_frame_parms,
PHY_vars_UE->dlsch_ue[0][cw_sic], PHY_vars_UE->dlsch_ue[0][TB+1],
PHY_vars_UE->dlsch_ue[0][cw_sic]->harq_processes[PHY_vars_UE->dlsch_ue[0][cw_sic]->current_harq_pid], PHY_vars_UE->dlsch_ue[0][TB+1]->harq_processes[PHY_vars_UE->dlsch_ue[0][TB+1]->current_harq_pid],
subframe, subframe,
PHY_vars_UE->dlsch_ue[0][cw_sic]->current_harq_pid, PHY_vars_UE->dlsch_ue[0][TB+1]->current_harq_pid,
1,llr8_flag); 1,llr8_flag);
stop_meas(&PHY_vars_UE->dlsch_decoding_stats); stop_meas(&PHY_vars_UE->dlsch_decoding_stats);
// printf("retr cw 1 = %d\n", ret[1]); //printf("ret TB 1 = %d round %d \n", ret[1], round);
if (ret[1] <= PHY_vars_UE->dlsch_ue[0][cw_sic]->max_turbo_iterations ) { if (ret[TB+1] <= PHY_vars_UE->dlsch_ue[0][TB+1]->max_turbo_iterations ) {
avg_iter[1] += ret[1]; avg_iter[TB+1] += ret[TB+1];
iter_trials[1]++; iter_trials[TB+1]++;
if (n_frames==1) { if (n_frames==1) {
printf("cw sic %d, round %d: No DLSCH errors found, uncoded ber %f\n",cw_sic,round,uncoded_ber); printf("cw sic %d, round %d: No DLSCH errors found, uncoded ber %f\n",TB+1,round,uncoded_ber);
#ifdef PRINT_BYTES #ifdef PRINT_BYTES
for (s=0;s<PHY_vars_UE->dlsch_ue[0][cw_sic]->harq_processes[0]->C;s++) { for (s=0;s<PHY_vars_UE->dlsch_ue[0][TB+1]->harq_processes[0]->C;s++) {
if (s<PHY_vars_UE->dlsch_ue[0][cw_sic]->harq_processes[0]->Cminus) if (s<PHY_vars_UE->dlsch_ue[0][TB+1]->harq_processes[0]->Cminus)
Kr = PHY_vars_UE->dlsch_ue[0][cw_sic]->harq_processes[0]->Kminus; Kr = PHY_vars_UE->dlsch_ue[0][TB+1]->harq_processes[0]->Kminus;
else else
Kr = PHY_vars_UE->dlsch_ue[0][cw_sic]->harq_processes[0]->Kplus; Kr = PHY_vars_UE->dlsch_ue[0][TB+1]->harq_processes[0]->Kplus;
Kr_bytes = Kr>>3; Kr_bytes = Kr>>3;
printf("Decoded_output (Segment %d):\n",s); printf("Decoded_output (Segment %d):\n",s);
for (i=0;i<Kr_bytes;i++) for (i=0;i<Kr_bytes;i++)
printf("%d : %x (%x)\n",i,PHY_vars_UE->dlsch_ue[0][cw_sic]->harq_processes[0]->c[s][i], printf("%d : %x (%x)\n",i,PHY_vars_UE->dlsch_ue[0][TB+1]->harq_processes[0]->c[s][i],
PHY_vars_UE->dlsch_ue[0][cw_sic]->harq_processes[0]->c[s][i]^PHY_vars_eNB->dlsch_eNB[0][cw_sic]->harq_processes[0]->c[s][i]); PHY_vars_UE->dlsch_ue[0][TB+1]->harq_processes[0]->c[s][i]^PHY_vars_eNB->dlsch_eNB[0][TB+1]->harq_processes[0]->c[s][i]);
} }
#endif #endif
} }
} else{
} errs[TB+1][round]++;
else {
errs[cw_sic][round]++;
// exit(0); // exit(0);
if (cw_sic==1) { avg_iter[TB+1] += ret[TB+1]-1;
avg_iter[1] += ret[1]-1; iter_trials[TB+1]++;
iter_trials[1]++;
}
if (n_frames==2) { if (n_frames==1) {
//if ((n_frames==1) || (SNR>=30)) { //if ((n_frames==1) || (SNR>=30)) {
printf("cw sic %d, round %d: DLSCH errors found, uncoded ber %f\n",cw_sic,round,uncoded_ber); printf("cw sic %d, round %d: DLSCH errors found, uncoded ber %f\n",TB+1,round,uncoded_ber);
#ifdef PRINT_BYTES #ifdef PRINT_BYTES
for (s=0;s<PHY_vars_UE->dlsch_ue[0][cw_sic]->harq_processes[0]->C;s++) { for (s=0;s<PHY_vars_UE->dlsch_ue[0][TB+1]->harq_processes[0]->C;s++) {
if (s<PHY_vars_UE->dlsch_ue[0][cw_sic]->harq_processes[0]->Cminus) if (s<PHY_vars_UE->dlsch_ue[0][TB+1]->harq_processes[0]->Cminus)
Kr = PHY_vars_UE->dlsch_ue[0][cw_sic]->harq_processes[0]->Kminus; Kr = PHY_vars_UE->dlsch_ue[0][TB+1]->harq_processes[0]->Kminus;
else else
Kr = PHY_vars_UE->dlsch_ue[0][cw_sic]->harq_processes[0]->Kplus; Kr = PHY_vars_UE->dlsch_ue[0][TB+1]->harq_processes[0]->Kplus;
Kr_bytes = Kr>>3; Kr_bytes = Kr>>3;
printf("Decoded_output (Segment %d):\n",s); printf("Decoded_output (Segment %d):\n",s);
for (i=0;i<Kr_bytes;i++) for (i=0;i<Kr_bytes;i++)
printf("%d : %x (%x)\n",i,PHY_vars_UE->dlsch_ue[0][cw_sic]->harq_processes[0]->c[s][i], printf("%d : %x (%x)\n",i,PHY_vars_UE->dlsch_ue[0][TB+1]->harq_processes[0]->c[s][i],
PHY_vars_UE->dlsch_ue[0][cw_sic]->harq_processes[0]->c[s][i]^PHY_vars_eNB->dlsch_eNB[0][cw_sic]->harq_processes[0]->c[s][i]); PHY_vars_UE->dlsch_ue[0][TB+1]->harq_processes[0]->c[s][i]^PHY_vars_eNB->dlsch_eNB[0][TB+1]->harq_processes[0]->c[s][i]);
} }
#endif #endif
} //n_frames==1 } //n_frames==1
// exit(0); // exit(0);
} //if (ret > PHY_vars_UE->dlsch_ue[0][cw_sic]->max_turbo_iterations ) } //if (ret > PHY_vars_UE->dlsch_ue[0][TB+1]->max_turbo_iterations )
} //for (int cw_1=cw_to_decode_interf_free; cw_1<cw_to_decode_interf_free+1;cw_1++) }//if SIC
} else {
} //if SIC errs[TB][round]++;
} //if (ret <= PHY_vars_UE->dlsch_ue[0][cw_non_sic]->max_turbo_iterations ) /*if (cw_non_sic==0) {
else {
errs[cw_non_sic][round]++;
if (cw_non_sic==0) {
avg_iter[0] += ret[0]-1; avg_iter[0] += ret[0]-1;
iter_trials[0]++; iter_trials[0]++;
} }*/
if (rx_type==rx_SIC_dual_stream) { if ((PHY_vars_UE->dlsch_ue[eNB_id][0]->harq_processes[PHY_vars_UE->dlsch_ue[eNB_id][0]->current_harq_pid]->mimo_mode >=DUALSTREAM_UNIFORM_PRECODING1) &&
errs[1][round]++; (PHY_vars_UE->dlsch_ue[eNB_id][0]->harq_processes[PHY_vars_UE->dlsch_ue[eNB_id][0]->current_harq_pid]->mimo_mode <=DUALSTREAM_PUSCH_PRECODING) &&
(rx_type==rx_SIC_dual_stream)) {
errs[TB+1][round]++;
} }
if (cw_non_sic==1) { /*if (cw_non_sic==1) {
avg_iter[1] += ret[1]-1; avg_iter[1] += ret[1]-1;
iter_trials[1]++; iter_trials[1]++;
} }*/
if (n_frames==1) { if (n_frames==1) {
//if ((n_frames==1) || (SNR>=30)) { //if ((n_frames==1) || (SNR>=30)) {
printf("cw %d, round %d: DLSCH errors found, uncoded ber %f\n",cw_non_sic,round,uncoded_ber); printf("cw %d, round %d: DLSCH errors found, uncoded ber %f\n",TB,round,uncoded_ber);
#ifdef PRINT_BYTES #ifdef PRINT_BYTES
for (s=0;s<PHY_vars_UE->dlsch_ue[0][cw_non_sic]->harq_processes[0]->C;s++) { for (s=0;s<PHY_vars_UE->dlsch_ue[0][TB]->harq_processes[0]->C;s++) {
if (s<PHY_vars_UE->dlsch_ue[0][cw_non_sic]->harq_processes[0]->Cminus) if (s<PHY_vars_UE->dlsch_ue[0][TB]->harq_processes[0]->Cminus)
Kr = PHY_vars_UE->dlsch_ue[0][cw_non_sic]->harq_processes[0]->Kminus; Kr = PHY_vars_UE->dlsch_ue[0][TB]->harq_processes[0]->Kminus;
else else
Kr = PHY_vars_UE->dlsch_ue[0][cw_non_sic]->harq_processes[0]->Kplus; Kr = PHY_vars_UE->dlsch_ue[0][TB]->harq_processes[0]->Kplus;
Kr_bytes = Kr>>3; Kr_bytes = Kr>>3;
printf("Decoded_output (Segment %d):\n",s); printf("Decoded_output (Segment %d):\n",s);
for (i=0;i<Kr_bytes;i++) for (i=0;i<Kr_bytes;i++)
printf("%d : %x (%x)\n",i,PHY_vars_UE->dlsch_ue[0][cw_non_sic]->harq_processes[0]->c[s][i], printf("%d : %x (%x)\n",i,PHY_vars_UE->dlsch_ue[0][TB]->harq_processes[0]->c[s][i],
PHY_vars_UE->dlsch_ue[0][cw_non_sic]->harq_processes[0]->c[s][i]^PHY_vars_eNB->dlsch_eNB[0][cw_non_sic]->harq_processes[0]->c[s][i]); PHY_vars_UE->dlsch_ue[0][TB]->harq_processes[0]->c[s][i]^PHY_vars_eNB->dlsch_eNB[0][TB]->harq_processes[0]->c[s][i]);
} }
#endif #endif
} }
} }
TB++; // to terminate the loop over TB
} }
stop_meas(&PHY_vars_UE->phy_proc_rx); stop_meas(&PHY_vars_UE->phy_proc_rx);
...@@ -4043,6 +4072,7 @@ n(tikz_fname,"w"); ...@@ -4043,6 +4072,7 @@ n(tikz_fname,"w");
if ((transmission_mode != 3 && transmission_mode !=4 ) && ret[0] > PHY_vars_UE->dlsch_ue[0][0]->max_turbo_iterations){ if ((transmission_mode != 3 && transmission_mode !=4 ) && ret[0] > PHY_vars_UE->dlsch_ue[0][0]->max_turbo_iterations){
//printf("flag 1 \n");
round++; round++;
} }
...@@ -4052,6 +4082,8 @@ n(tikz_fname,"w"); ...@@ -4052,6 +4082,8 @@ n(tikz_fname,"w");
round++; round++;
resend_cw0_cw1=1; //resend both cws resend_cw0_cw1=1; //resend both cws
resend_cw1=0; resend_cw1=0;
TB0_active=1;
//printf("flag 2 \n");
} }
...@@ -4059,12 +4091,15 @@ n(tikz_fname,"w"); ...@@ -4059,12 +4091,15 @@ n(tikz_fname,"w");
resend_one[round]++; resend_one[round]++;
round++; round++;
resend_cw0_cw1=0; resend_cw0_cw1=0;
resend_cw1=1; //resend only cw1, alamouti TB0_active=0;
//PHY_vars_UE->PHY_measurements.rank[eNB_id]=0;
// printf("\n DLSIM TB0 disactivated\n");
//printf("flag 3 \n");
} }
} }
//} //round
if(transmission_mode != 3 && transmission_mode !=4 ){ if(transmission_mode != 3 && transmission_mode !=4 ){
if ((errs[0][0]>=n_frames/10) && (trials>(n_frames/2)) ) if ((errs[0][0]>=n_frames/10) && (trials>(n_frames/2)) )
...@@ -4123,8 +4158,8 @@ n(tikz_fname,"w"); ...@@ -4123,8 +4158,8 @@ n(tikz_fname,"w");
} //trials } //trials
printf("both failed round 0 = %d, both failed round 1 = %d, both failed round 2 = %d, both failed round 3 = %d\n", resend_both[0], resend_both[1], resend_both[2], resend_both[3]); printf("\n both failed round 0 = %d, both failed round 1 = %d, both failed round 2 = %d, both failed round 3 = %d\n", resend_both[0], resend_both[1], resend_both[2], resend_both[3]);
printf("one failed round 0 = %d, one failed round 1 = %d, one failed round 2 = %d, one failed round 3 = %d\n", resend_one[0], resend_one[1], resend_one[2], resend_one[3]); printf(" one failed round 0 = %d, one failed round 1 = %d, one failed round 2 = %d, one failed round 3 = %d\n", resend_one[0], resend_one[1], resend_one[2], resend_one[3]);
// round_trials[0]: number of code word : goodput the protocol // round_trials[0]: number of code word : goodput the protocol
double table_tx[time_vector_tx.size]; double table_tx[time_vector_tx.size];
...@@ -4221,6 +4256,65 @@ n(tikz_fname,"w"); ...@@ -4221,6 +4256,65 @@ n(tikz_fname,"w");
((double)(round_trials[1][0])/((double)round_trials[1][0] + round_trials[1][1] + round_trials[1][2] + round_trials[1][3])); ((double)(round_trials[1][0])/((double)round_trials[1][0] + round_trials[1][1] + round_trials[1][2] + round_trials[1][3]));
} }
/*
Here we compute throughput per cw based on the formula
T=P_suc[r1]R(mcs) + sum[r=2 ..r=4] (P_(suc r, fail r-1)*R/r).
The non-constr formula should not be used, when there are some errors on the last round,
meaning when not all the packages are finally decoded.
*/
if (transmission_mode == 3 || transmission_mode == 4) {
// FOR CW0
thr_cw0[0] = rate[0]*get_Qm(PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->mcs)*(1-((double)errs[0][0]/(double)round_trials[0][0]));
thr_cw0[1] = (rate[0]*get_Qm(PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->mcs)/2)*(((double)errs[0][0] - (double)errs[0][1])/(double)round_trials[0][0]);
thr_cw0[2] = (rate[0]*get_Qm(PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->mcs)/3)*(((double)errs[0][1] - (double)errs[0][2])/(double)round_trials[0][0]);
thr_cw0[3] = (rate[0]*get_Qm(PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->mcs)/4)*(((double)errs[0][2] - (double)errs[0][3])/(double)round_trials[0][0]);
thr_cw0_tot = (double)thr_cw0[0]+(double)thr_cw0[1]+(double)thr_cw0[2]+(double)thr_cw0[3];
printf("\n Throughput cw0 sum = %f \n", thr_cw0_tot);
printf("round_trials = %d, errs[0][0] = %d, round_trials[0][1] = %d, errs[0][1] = %d, round_trials[0][2] = %d, errs[0][2] = %d, \
round_trials[0][3] = %d, errs[0][3] = %d \n", round_trials[0][0], errs[0][0],round_trials[0][1], errs[0][1], round_trials[0][2], \
errs[0][2], round_trials[0][3], errs[0][3]);
thr_cw1[0] = rate[0]*get_Qm(PHY_vars_eNB->dlsch_eNB[0][1]->harq_processes[0]->mcs)*(1-((double)errs[1][0]/(double)round_trials[1][0]));
thr_cw1[1] = (rate[0]*get_Qm(PHY_vars_eNB->dlsch_eNB[0][1]->harq_processes[0]->mcs)/2)*(((double)errs[1][0] - (double)errs[1][1])/(double)round_trials[1][0]);
thr_cw1[2] = (rate[0]*get_Qm(PHY_vars_eNB->dlsch_eNB[0][1]->harq_processes[0]->mcs)/3)*(((double)errs[1][1] - (double)errs[1][2])/(double)round_trials[1][0]);
thr_cw1[3] = (rate[0]*get_Qm(PHY_vars_eNB->dlsch_eNB[0][1]->harq_processes[0]->mcs)/4)*(((double)errs[1][2] - (double)errs[1][3])/(double)round_trials[1][0]);
thr_cw1_tot = (double)thr_cw1[0]+(double)thr_cw1[1]+(double)thr_cw1[2]+(double)thr_cw1[3];
printf("Throughput cw1 sum = %f \n", thr_cw1_tot);
printf("Throughput cw1 round 0 = %f \n", thr_cw1[0]);
printf("Throughput cw1 round 1 = %f \n", thr_cw1[1]);
printf("Throughput cw1 round 2 = %f \n", thr_cw1[2]);
printf("Throughput cw1 round 3 = %f \n", thr_cw1[3]);
printf("round_trials[1][0] = %d, errs[1][0] = %d, round_trials[1][1] = %d, errs[1][1] = %d, round_trials[1][2] = %d, errs[1][2] = %d, \
round_trials[1][3] = %d, errs[1][3] = %d \n", round_trials[1][0], errs[1][0], round_trials[1][1], errs[1][1], round_trials[1][2], \
errs[1][2], round_trials[1][3], errs[1][3]);
}
#if 0
thr_cw0_tm4_nonconst = rate[0]*get_Qm(PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->mcs)* \
((double)(round_trials[0][0]-dci_errors)/((double)round_trials[0][0] + round_trials[0][1] + round_trials[0][2] + round_trials[0][3]));
printf("Throughput cw0 noncnstr = %f \n", thr_cw0_tm4_nonconst);
#endif
//FOR CW1
/*thr_cw1[0] = rate[1]*get_Qm(PHY_vars_eNB->dlsch_eNB[0][1]->harq_processes[0]->mcs)*(1-((double)errs[0][0]/(double)round_trials[0][0])) \
*(1-((double)errs[1][0]/(double)round_trials[1][0]));
printf("thr cw1 round 0 = %f\n", thr_cw1[0]);
thr_cw1[1]=(rate[1]*get_Qm(PHY_vars_eNB->dlsch_eNB[0][1]->harq_processes[0]->mcs)/2)*\
(((double)errs[1][0]-(double)errs[1][1])*((double)round_trials[0][0] - (double)errs[0][1])/((double)round_trials[0][0]*(double)round_trials[1][0]));
printf("thr cw1 round 1 = %f\n", thr_cw1[1]);
thr_cw1[2] = (rate[0]*get_Qm(PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->mcs)/3)*\
((double)errs[1][1]-(double)errs[1][2])*((double)round_trials[0][0]-(double)errs[0][2])/((double)round_trials[0][0]*(double)round_trials[1][0]);
printf("thr cw1 round 2 = %f\n", thr_cw1[2]);
thr_cw1[3] = (rate[0]*get_Qm(PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->mcs)/4)*\
((double)errs[1][2]-(double)errs[1][3])*((double)round_trials[0][0] - (double)errs[0][3])/((double)round_trials[0][0]*(double)round_trials[1][0]);
resid_errs=
printf("thr cw1 round 3 = %f\n", thr_cw1[3]);
thr_cw1_tot =thr_cw1[0]+thr_cw1[1]+thr_cw1[2]+thr_cw1[3];
printf("Throughput cw1 sum = %f \n", thr_cw1_tot);
printf("round_trials = %d, errs[1][0] = %d, round_trials[1][1] = %d, errs[1][1] = %d, round_trials[1][2] = %d, errs[1][2] = %d, \
round_trials[1][3] = %d, errs[1][3] = %d \n", round_trials[1][0], errs[1][0],round_trials[1][1], errs[1][1], round_trials[1][2], \
errs[1][2], round_trials[1][3], errs[1][3]);
}*/
printf("\n**********************SNR = %f dB (tx_lev %f, sigma2_dB %f)**************************\n", printf("\n**********************SNR = %f dB (tx_lev %f, sigma2_dB %f)**************************\n",
...@@ -4262,15 +4356,20 @@ n(tikz_fname,"w"); ...@@ -4262,15 +4356,20 @@ n(tikz_fname,"w");
4.0*(round_trials[0][3]-errs[0][3]))/((double)round_trials[0][0])/(double)PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->TBS, 4.0*(round_trials[0][3]-errs[0][3]))/((double)round_trials[0][0])/(double)PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->TBS,
(1.0*(round_trials[0][0]-errs[0][0])+2.0*(round_trials[0][1]-errs[0][1])+3.0*(round_trials[0][2]-errs[0][2]) (1.0*(round_trials[0][0]-errs[0][0])+2.0*(round_trials[0][1]-errs[0][1])+3.0*(round_trials[0][2]-errs[0][2])
+4.0*(round_trials[0][3]-errs[0][3]))/((double)round_trials[0][0]), +4.0*(round_trials[0][3]-errs[0][3]))/((double)round_trials[0][0]),
rate[0]*get_Qm(PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->mcs)*(1-((double)errs[0][0]/(double)round_trials[0][0])), thr_cw0_tot,
rate[1]*get_Qm(PHY_vars_eNB->dlsch_eNB[0][1]->harq_processes[0]->mcs)*(1-((double)errs[1][0]/(double)round_trials[0][1])), thr_cw1_tot,
rate[0]*get_Qm(PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->mcs)*(1-((double)errs[0][0]/(double)round_trials[0][0]))+ thr_cw0_tot + thr_cw1_tot,
rate[1]*get_Qm(PHY_vars_eNB->dlsch_eNB[0][1]->harq_processes[0]->mcs)*(1-((double)errs[1][0]/(double)round_trials[0][1])),
rate[0], rate[0],
rate[1]); rate[1]);
if (print_perf==1) { if (print_perf==1) {
printf("eNB TX function statistics (per 1ms subframe)\n\n"); printf("eNB TX function statistics (per 1ms subframe)\n\n");
std_phy_proc_tx = sqrt((double)PHY_vars_eNB->phy_proc_tx.diff_square/pow(cpu_freq_GHz,2)/pow(1000, std_phy_proc_tx = sqrt((double)PHY_vars_eNB->phy_proc_tx.diff_square/pow(cpu_freq_GHz,2)/pow(1000,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment