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.
This commit is contained in:
File diff suppressed because it is too large
Load Diff
Regular → Executable
+4
@@ -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 {
|
|||||||
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,
|
|||||||
|
|
||||||
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,
|
|||||||
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,
|
|||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
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,
|
|||||||
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,
|
|||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef DEBUG_DLSCH_MODULATION
|
if (dlsch0_harq != NULL){
|
||||||
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]);
|
#ifdef DEBUG_DLSCH_MODULATION
|
||||||
#endif
|
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
|
||||||
|
} 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;
|
||||||
@@ -414,7 +446,7 @@ int allocate_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms,
|
|||||||
((int16_t *)&txdataF[0][tti_offset])[1]+=(int16_t)(((int32_t)amp*qam16_table[qam16_table_offset_im])>>15);
|
((int16_t *)&txdataF[0][tti_offset])[1]+=(int16_t)(((int32_t)amp*qam16_table[qam16_table_offset_im])>>15);
|
||||||
|
|
||||||
//((int16_t *)&txdataF[0][tti_offset])[0]+=(qam_table_s0[qam16_table_offset_re]*ONE_OVER_SQRT2_Q15)>>15;
|
//((int16_t *)&txdataF[0][tti_offset])[0]+=(qam_table_s0[qam16_table_offset_re]*ONE_OVER_SQRT2_Q15)>>15;
|
||||||
//((int16_t *)&txdataF[0][tti_offset])[1]+=(qam_table_s0[qam16_table_offset_im]*ONE_OVER_SQRT2_Q15)>>15;
|
//((int16_t *)&txdataF[0][tti_offset])[1]+=(qam_table_s0[qam16_table_offset_im]*ONE_OVER_SQRT2_Q15)>>15;
|
||||||
|
|
||||||
// Antenna 1 position n Real part -> -x1*
|
// Antenna 1 position n Real part -> -x1*
|
||||||
|
|
||||||
@@ -439,8 +471,8 @@ int allocate_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms,
|
|||||||
((int16_t *)&txdataF[1][tti_offset])[0]+=-(int16_t)(((int32_t)amp*qam16_table[qam16_table_offset_re])>>15);
|
((int16_t *)&txdataF[1][tti_offset])[0]+=-(int16_t)(((int32_t)amp*qam16_table[qam16_table_offset_re])>>15);
|
||||||
((int16_t *)&txdataF[1][tti_offset])[1]+=(int16_t)(((int32_t)amp*qam16_table[qam16_table_offset_im])>>15);
|
((int16_t *)&txdataF[1][tti_offset])[1]+=(int16_t)(((int32_t)amp*qam16_table[qam16_table_offset_im])>>15);
|
||||||
|
|
||||||
//((int16_t *)&txdataF[1][tti_offset])[0]+=-qam_table_s0[qam16_table_offset_re];
|
//((int16_t *)&txdataF[1][tti_offset])[0]+=-qam_table_s0[qam16_table_offset_re];
|
||||||
//((int16_t *)&txdataF[1][tti_offset])[1]+=qam_table_s0[qam16_table_offset_im];
|
//((int16_t *)&txdataF[1][tti_offset])[1]+=qam_table_s0[qam16_table_offset_im];
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -471,8 +503,8 @@ int allocate_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms,
|
|||||||
|
|
||||||
//((int16_t *)&txdataF[0][tti_offset])[0]+=(int16_t)(((int32_t)amp*qam64_table[qam64_table_offset_re])>>15);
|
//((int16_t *)&txdataF[0][tti_offset])[0]+=(int16_t)(((int32_t)amp*qam64_table[qam64_table_offset_re])>>15);
|
||||||
//((int16_t *)&txdataF[0][tti_offset])[1]+=(int16_t)(((int32_t)amp*qam64_table[qam64_table_offset_im])>>15);
|
//((int16_t *)&txdataF[0][tti_offset])[1]+=(int16_t)(((int32_t)amp*qam64_table[qam64_table_offset_im])>>15);
|
||||||
((int16_t *)&txdataF[0][tti_offset])[0]+=(qam_table_s0[qam64_table_offset_re]*ONE_OVER_SQRT2_Q15)>>15;
|
((int16_t *)&txdataF[0][tti_offset])[0]+=(qam_table_s0[qam64_table_offset_re]*ONE_OVER_SQRT2_Q15)>>15;
|
||||||
((int16_t *)&txdataF[0][tti_offset])[1]+=(qam_table_s0[qam64_table_offset_im]*ONE_OVER_SQRT2_Q15)>>15;
|
((int16_t *)&txdataF[0][tti_offset])[1]+=(qam_table_s0[qam64_table_offset_im]*ONE_OVER_SQRT2_Q15)>>15;
|
||||||
|
|
||||||
// Antenna 1 => -x1*
|
// Antenna 1 => -x1*
|
||||||
qam64_table_offset_re = 0;
|
qam64_table_offset_re = 0;
|
||||||
@@ -498,12 +530,12 @@ int allocate_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms,
|
|||||||
|
|
||||||
//((int16_t *)&txdataF[1][tti_offset])[0]+=-(int16_t)(((int32_t)amp*qam64_table[qam64_table_offset_re])>>15);
|
//((int16_t *)&txdataF[1][tti_offset])[0]+=-(int16_t)(((int32_t)amp*qam64_table[qam64_table_offset_re])>>15);
|
||||||
//((int16_t *)&txdataF[1][tti_offset])[1]+=(int16_t)(((int32_t)amp*qam64_table[qam64_table_offset_im])>>15);
|
//((int16_t *)&txdataF[1][tti_offset])[1]+=(int16_t)(((int32_t)amp*qam64_table[qam64_table_offset_im])>>15);
|
||||||
((int16_t *)&txdataF[1][tti_offset])[0]+=-qam_table_s0[qam64_table_offset_re];
|
((int16_t *)&txdataF[1][tti_offset])[0]+=-qam_table_s0[qam64_table_offset_re];
|
||||||
((int16_t *)&txdataF[1][tti_offset])[1]+=qam_table_s0[qam64_table_offset_im];
|
((int16_t *)&txdataF[1][tti_offset])[1]+=qam_table_s0[qam64_table_offset_im];
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
// fill in the rest of the ALAMOUTI precoding
|
// fill in the rest of the ALAMOUTI precoding
|
||||||
if (is_not_pilot(pilots,re + 1,frame_parms->nushift,use2ndpilots)==1) {
|
if (is_not_pilot(pilots,re + 1,frame_parms->nushift,use2ndpilots)==1) {
|
||||||
((int16_t *)&txdataF[0][tti_offset+1])[0] += -((int16_t *)&txdataF[1][tti_offset])[0]; //x1
|
((int16_t *)&txdataF[0][tti_offset+1])[0] += -((int16_t *)&txdataF[1][tti_offset])[0]; //x1
|
||||||
((int16_t *)&txdataF[0][tti_offset+1])[1] += ((int16_t *)&txdataF[1][tti_offset])[1];
|
((int16_t *)&txdataF[0][tti_offset+1])[1] += ((int16_t *)&txdataF[1][tti_offset])[1];
|
||||||
@@ -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,
|
|||||||
{
|
{
|
||||||
|
|
||||||
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);
|
||||||
|
|||||||
+329
-230
@@ -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)
|
|||||||
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");
|
|||||||
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,13 +2195,20 @@ 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;
|
||||||
|
|
||||||
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");
|
|||||||
((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");
|
|||||||
((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");
|
|||||||
((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");
|
|||||||
((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");
|
|||||||
((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");
|
|||||||
((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");
|
|||||||
((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");
|
|||||||
((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;
|
||||||
@@ -2725,9 +2748,8 @@ n(tikz_fname,"w");
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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,
|
||||||
@@ -2742,33 +2764,36 @@ n(tikz_fname,"w");
|
|||||||
exit(-1);
|
exit(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
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");
|
|||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//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");
|
|||||||
|
|
||||||
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");
|
|||||||
&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");
|
|||||||
}
|
}
|
||||||
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");
|
|||||||
|
|
||||||
// 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");
|
|||||||
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");
|
|||||||
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");
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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 (cw_non_sic=0; cw_non_sic<cw_to_decode_interf; cw_non_sic++){ // may be we ll have to swap CW
|
for (TB=0; TB<Kmimo; TB++){ // may be we ll have to swap CW
|
||||||
|
|
||||||
PHY_vars_UE->dlsch_ue[0][cw_non_sic]->rnti = (common_flag==0) ? n_rnti: SI_RNTI;
|
if (PHY_vars_UE->dlsch_ue[0][TB] == NULL)
|
||||||
coded_bits_per_codeword[cw_non_sic] = get_G(&PHY_vars_eNB->lte_frame_parms,
|
continue;
|
||||||
PHY_vars_eNB->dlsch_eNB[0][cw_non_sic]->harq_processes[0]->nb_rb,
|
|
||||||
PHY_vars_eNB->dlsch_eNB[0][cw_non_sic]->harq_processes[0]->rb_alloc,
|
PHY_vars_UE->dlsch_ue[0][TB]->rnti = (common_flag==0) ? n_rnti: SI_RNTI;
|
||||||
get_Qm(PHY_vars_eNB->dlsch_eNB[0][cw_non_sic]->harq_processes[0]->mcs),
|
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]->Nl,
|
PHY_vars_eNB->dlsch_eNB[0][TB]->harq_processes[0]->nb_rb,
|
||||||
|
PHY_vars_eNB->dlsch_eNB[0][TB]->harq_processes[0]->rb_alloc,
|
||||||
|
get_Qm(PHY_vars_eNB->dlsch_eNB[0][TB]->harq_processes[0]->mcs),
|
||||||
|
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");
|
|||||||
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");
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
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");
|
|||||||
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");
|
|||||||
&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");
|
|||||||
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");
|
|||||||
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");
|
|||||||
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 {
|
||||||
|
|
||||||
|
errs[TB][round]++;
|
||||||
|
|
||||||
|
|
||||||
} //if SIC
|
/*if (cw_non_sic==0) {
|
||||||
|
|
||||||
|
|
||||||
} //if (ret <= PHY_vars_UE->dlsch_ue[0][cw_non_sic]->max_turbo_iterations )
|
|
||||||
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 ((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) &&
|
||||||
|
(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 (rx_type==rx_SIC_dual_stream) {
|
/*if (cw_non_sic==1) {
|
||||||
errs[1][round]++;
|
|
||||||
}
|
|
||||||
|
|
||||||
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");
|
|||||||
|
|
||||||
|
|
||||||
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");
|
|||||||
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");
|
|||||||
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");
|
|||||||
|
|
||||||
|
|
||||||
} //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");
|
|||||||
((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");
|
|||||||
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,
|
||||||
|
|||||||
Reference in New Issue
Block a user