Commit d1fdbfed authored by Cedric Roux's avatar Cedric Roux

fix power estimation

Some computation has been fixed in PUCCH reception.

SNR has been fixed, uses measurement instead of
a fixed value for the noise.

normalized_rx_power and target_rx_power have been removed,
replaced by snr and target_snr. All the files using those
variables have been updated.
parent 23a804ec
...@@ -81,8 +81,8 @@ ...@@ -81,8 +81,8 @@
{"total_num_pdus", &(macuestatptr->total_num_pdus),TELNET_VARTYPE_INT32,0},\ {"total_num_pdus", &(macuestatptr->total_num_pdus),TELNET_VARTYPE_INT32,0},\
{"overhead_bytes", &(macuestatptr->overhead_bytes),TELNET_VARTYPE_INT64,0},\ {"overhead_bytes", &(macuestatptr->overhead_bytes),TELNET_VARTYPE_INT64,0},\
{"crnti", &(macuestatptr->crnti),TELNET_VARTYPE_INT16,0},\ {"crnti", &(macuestatptr->crnti),TELNET_VARTYPE_INT16,0},\
{"normalized_rx_power", &(macuestatptr->normalized_rx_power),TELNET_VARTYPE_INT32,0},\ {"snr", &(macuestatptr->snr),TELNET_VARTYPE_INT32,0},\
{"target_rx_power", &(macuestatptr->target_rx_power),TELNET_VARTYPE_INT32,0},\ {"target_snr ", &(macuestatptr->target_snr),TELNET_VARTYPE_INT32,0},\
{"ulsch_mcs1", &(macuestatptr->ulsch_mcs1),TELNET_VARTYPE_INT8,0},\ {"ulsch_mcs1", &(macuestatptr->ulsch_mcs1),TELNET_VARTYPE_INT8,0},\
{"ulsch_mcs2", &(macuestatptr->ulsch_mcs2),TELNET_VARTYPE_INT8,0},\ {"ulsch_mcs2", &(macuestatptr->ulsch_mcs2),TELNET_VARTYPE_INT8,0},\
{"rbs_used_rx", &(macuestatptr->rbs_used_rx),TELNET_VARTYPE_INT32,0},\ {"rbs_used_rx", &(macuestatptr->rbs_used_rx),TELNET_VARTYPE_INT32,0},\
......
...@@ -1063,7 +1063,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *eNB, ...@@ -1063,7 +1063,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *eNB,
#endif #endif
} }
for (l2=0,l=(nsymb>>1); l<(nsymb-1); l++,l2++) { for (l2=0,l=(nsymb>>1); l < nsymb; l++,l2++) {
stat_re += (((rxcomp[aa][off]*(int32_t)cfo[l2<<1])>>15) - ((rxcomp[aa][1+off]*(int32_t)cfo[1+(l2<<1)])>>15))/nsymb; stat_re += (((rxcomp[aa][off]*(int32_t)cfo[l2<<1])>>15) - ((rxcomp[aa][1+off]*(int32_t)cfo[1+(l2<<1)])>>15))/nsymb;
stat_im += (((rxcomp[aa][off]*(int32_t)cfo[1+(l2<<1)])>>15) + ((rxcomp[aa][1+off]*(int32_t)cfo[(l2<<1)])>>15))/nsymb; stat_im += (((rxcomp[aa][off]*(int32_t)cfo[1+(l2<<1)])>>15) + ((rxcomp[aa][1+off]*(int32_t)cfo[(l2<<1)])>>15))/nsymb;
off+=2; off+=2;
...@@ -1092,7 +1092,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *eNB, ...@@ -1092,7 +1092,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *eNB,
// stat_max *= nsymb; // normalize to energy per symbol // stat_max *= nsymb; // normalize to energy per symbol
// stat_max /= (frame_parms->N_RB_UL*12); // // stat_max /= (frame_parms->N_RB_UL*12); //
stat_max /= (nsymb*12); stat_max /= 12;
#ifdef DEBUG_PUCCH_RX #ifdef DEBUG_PUCCH_RX
printf("[eNB] PUCCH: stat %d, stat_max %d, phase_max %d\n", stat,stat_max,phase_max); printf("[eNB] PUCCH: stat %d, stat_max %d, phase_max %d\n", stat,stat_max,phase_max);
...@@ -1181,7 +1181,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *eNB, ...@@ -1181,7 +1181,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *eNB,
stat_ref_re=0; stat_ref_re=0;
stat_ref_im=0; stat_ref_im=0;
for (l2=0,l=(nsymb>>1); l<(nsymb-1); l++,l2++) { for (l2=0,l=(nsymb>>1); l< nsymb; l++,l2++) {
if ((l2<2) || ((l2>(nsymb>>1) - 3)) ) { // data symbols if ((l2<2) || ((l2>(nsymb>>1) - 3)) ) { // data symbols
stat_re += ((rxcomp[aa][off]*(int32_t)cfo[l2<<1])>>15) - ((rxcomp[aa][1+off]*(int32_t)cfo[1+(l2<<1)])>>15); stat_re += ((rxcomp[aa][off]*(int32_t)cfo[l2<<1])>>15) - ((rxcomp[aa][1+off]*(int32_t)cfo[1+(l2<<1)])>>15);
stat_im += ((rxcomp[aa][off]*(int32_t)cfo[1+(l2<<1)])>>15) + ((rxcomp[aa][1+off]*(int32_t)cfo[(l2<<1)])>>15); stat_im += ((rxcomp[aa][off]*(int32_t)cfo[1+(l2<<1)])>>15) + ((rxcomp[aa][1+off]*(int32_t)cfo[(l2<<1)])>>15);
......
...@@ -597,7 +597,7 @@ void fill_sr_indication(PHY_VARS_eNB *eNB,uint16_t rnti,int frame,int subframe,u ...@@ -597,7 +597,7 @@ void fill_sr_indication(PHY_VARS_eNB *eNB,uint16_t rnti,int frame,int subframe,u
// pdu->rx_ue_information.handle = handle; // pdu->rx_ue_information.handle = handle;
pdu->rx_ue_information.tl.tag = NFAPI_RX_UE_INFORMATION_TAG; pdu->rx_ue_information.tl.tag = NFAPI_RX_UE_INFORMATION_TAG;
pdu->rx_ue_information.rnti = rnti; pdu->rx_ue_information.rnti = rnti;
int SNRtimes10 = dB_fixed_times10(stat) - 300;//(10*eNB->measurements.n0_power_dB[0]); int SNRtimes10 = dB_fixed_times10(stat) - 10 * eNB->measurements.n0_subband_power_dB[0][0];
pdu->ul_cqi_information.tl.tag = NFAPI_UL_CQI_INFORMATION_TAG; pdu->ul_cqi_information.tl.tag = NFAPI_UL_CQI_INFORMATION_TAG;
if (SNRtimes10 < -640) pdu->ul_cqi_information.ul_cqi=0; if (SNRtimes10 < -640) pdu->ul_cqi_information.ul_cqi=0;
...@@ -1459,7 +1459,7 @@ void fill_rx_indication(PHY_VARS_eNB *eNB,int UE_id,int frame,int subframe) { ...@@ -1459,7 +1459,7 @@ void fill_rx_indication(PHY_VARS_eNB *eNB,int UE_id,int frame,int subframe) {
pdu->rx_indication_rel8.timing_advance = timing_advance_update; pdu->rx_indication_rel8.timing_advance = timing_advance_update;
// estimate UL_CQI for MAC (from antenna port 0 only) // estimate UL_CQI for MAC (from antenna port 0 only)
int SNRtimes10 = dB_fixed_times10(eNB->pusch_vars[UE_id]->ulsch_power[0]) - 300;//(10*eNB->measurements.n0_power_dB[0]); int SNRtimes10 = dB_fixed_times10(eNB->pusch_vars[UE_id]->ulsch_power[0]) - 10 * eNB->measurements.n0_subband_power_dB[0][0];
if (SNRtimes10 < -640) if (SNRtimes10 < -640)
pdu->rx_indication_rel8.ul_cqi = 0; pdu->rx_indication_rel8.ul_cqi = 0;
...@@ -1765,7 +1765,7 @@ void fill_uci_harq_indication (PHY_VARS_eNB *eNB, LTE_eNB_UCI *uci, int frame, i ...@@ -1765,7 +1765,7 @@ void fill_uci_harq_indication (PHY_VARS_eNB *eNB, LTE_eNB_UCI *uci, int frame, i
pdu->rx_ue_information.rnti = uci->rnti; pdu->rx_ue_information.rnti = uci->rnti;
// estimate UL_CQI for MAC (from antenna port 0 only) // estimate UL_CQI for MAC (from antenna port 0 only)
pdu->ul_cqi_information.tl.tag = NFAPI_UL_CQI_INFORMATION_TAG; pdu->ul_cqi_information.tl.tag = NFAPI_UL_CQI_INFORMATION_TAG;
int SNRtimes10 = dB_fixed_times10(uci->stat) - 300;//(10*eNB->measurements.n0_power_dB[0]); int SNRtimes10 = dB_fixed_times10(uci->stat) - 10 * eNB->measurements.n0_subband_power_dB[0][0];
if (SNRtimes10 < -100) if (SNRtimes10 < -100)
LOG_I (PHY, "uci->stat %d \n", uci->stat); LOG_I (PHY, "uci->stat %d \n", uci->stat);
......
...@@ -600,10 +600,10 @@ typedef struct { ...@@ -600,10 +600,10 @@ typedef struct {
uint32_t rbs_used_retx_rx; uint32_t rbs_used_retx_rx;
/// total rb used for a new uplink transmission /// total rb used for a new uplink transmission
uint32_t total_rbs_used_rx; uint32_t total_rbs_used_rx;
/// normalized rx power /// snr
int32_t normalized_rx_power; int32_t snr;
/// target rx power /// target snr
int32_t target_rx_power; int32_t target_snr;
/// num rx pdu /// num rx pdu
uint32_t num_pdu_rx[NB_RB_MAX]; uint32_t num_pdu_rx[NB_RB_MAX];
......
...@@ -488,7 +488,7 @@ schedule_ue_spec(module_id_t module_idP, ...@@ -488,7 +488,7 @@ schedule_ue_spec(module_id_t module_idP,
COMMON_channels_t *cc = eNB->common_channels; COMMON_channels_t *cc = eNB->common_channels;
UE_list_t *UE_list = &eNB->UE_list; UE_list_t *UE_list = &eNB->UE_list;
int continue_flag = 0; int continue_flag = 0;
int32_t normalized_rx_power, target_rx_power; int32_t snr, target_snr;
int tpc = 1; int tpc = 1;
UE_sched_ctrl_t *ue_sched_ctrl; UE_sched_ctrl_t *ue_sched_ctrl;
int mcs; int mcs;
...@@ -1477,11 +1477,11 @@ schedule_ue_spec(module_id_t module_idP, ...@@ -1477,11 +1477,11 @@ schedule_ue_spec(module_id_t module_idP,
} }
// do PUCCH power control // do PUCCH power control
// this is the normalized RX power // this is the snr
// unit is not dBm, it's special from nfapi // unit is not dBm, it's special from nfapi
// converting to dBm: ToDo: Noise power hard coded to 30 // converting to dBm
normalized_rx_power = (((5 * ue_sched_ctrl->pucch1_snr[CC_id]) - 640) / 10) + 30; snr = (5 * ue_sched_ctrl->pucch1_snr[CC_id] - 640) / 10;
target_rx_power= (eNB->puCch10xSnr / 10) + 30; target_snr = eNB->puCch10xSnr / 10;
// this assumes accumulated tpc // this assumes accumulated tpc
// make sure that we are only sending a tpc update once a frame, otherwise the control loop will freak out // make sure that we are only sending a tpc update once a frame, otherwise the control loop will freak out
int32_t framex10psubframe = ue_template->pucch_tpc_tx_frame * 10 + ue_template->pucch_tpc_tx_subframe; int32_t framex10psubframe = ue_template->pucch_tpc_tx_frame * 10 + ue_template->pucch_tpc_tx_subframe;
...@@ -1493,22 +1493,22 @@ schedule_ue_spec(module_id_t module_idP, ...@@ -1493,22 +1493,22 @@ schedule_ue_spec(module_id_t module_idP,
ue_template->pucch_tpc_tx_frame = frameP; ue_template->pucch_tpc_tx_frame = frameP;
ue_template->pucch_tpc_tx_subframe = subframeP; ue_template->pucch_tpc_tx_subframe = subframeP;
if (normalized_rx_power > (target_rx_power + 4)) { if (snr > target_snr + 4) {
tpc = 0; //-1 tpc = 0; //-1
} else if (normalized_rx_power < (target_rx_power - 4)) { } else if (snr < target_snr - 4) {
tpc = 2; //+1 tpc = 2; //+1
} else { } else {
tpc = 1; //0 tpc = 1; //0
} }
LOG_D(MAC, "[eNB %d] DLSCH scheduler: frame %d, subframe %d, harq_pid %d, tpc %d, normalized/target rx power %d/%d\n", LOG_D(MAC, "[eNB %d] DLSCH scheduler: frame %d, subframe %d, harq_pid %d, tpc %d, snr/target snr %d/%d\n",
module_idP, module_idP,
frameP, frameP,
subframeP, subframeP,
harq_pid, harq_pid,
tpc, tpc,
normalized_rx_power, snr,
target_rx_power); target_snr);
} // Po_PUCCH has been updated } // Po_PUCCH has been updated
else { else {
tpc = 1; //0 tpc = 1; //0
...@@ -1889,8 +1889,8 @@ schedule_ue_spec_br(module_id_t module_idP, ...@@ -1889,8 +1889,8 @@ schedule_ue_spec_br(module_id_t module_idP,
int round_DL = 0; int round_DL = 0;
int ta_update = 0; int ta_update = 0;
int32_t tpc = 1; int32_t tpc = 1;
int32_t normalized_rx_power = 0; int32_t snr = 0;
int32_t target_rx_power = 0; int32_t target_snr = 0;
uint16_t TBS = 0; uint16_t TBS = 0;
uint16_t j = 0; uint16_t j = 0;
uint16_t sdu_lengths[NB_RB_MAX]; uint16_t sdu_lengths[NB_RB_MAX];
...@@ -2368,10 +2368,10 @@ schedule_ue_spec_br(module_id_t module_idP, ...@@ -2368,10 +2368,10 @@ schedule_ue_spec_br(module_id_t module_idP,
T_INT(harq_pid), T_INT(harq_pid),
T_BUFFER(UE_list->DLSCH_pdu[CC_id][0][UE_id].payload[0], TBS)); T_BUFFER(UE_list->DLSCH_pdu[CC_id][0][UE_id].payload[0], TBS));
/* Do PUCCH power control */ /* Do PUCCH power control */
/* This is the normalized RX power */ /* This is the snr */
/* TODO: fix how we deal with power, unit is not dBm, it's special from nfapi */ /* unit is not dBm, it's special from nfapi, convert to dBm */
normalized_rx_power = (5 * ue_sched_ctl->pucch1_snr[CC_id]-640) / 10 + 30; snr = (5 * ue_sched_ctl->pucch1_snr[CC_id] - 640) / 10;
target_rx_power = mac->puCch10xSnr / 10 + 30; target_snr = mac->puCch10xSnr / 10;
/* This assumes accumulated tpc */ /* This assumes accumulated tpc */
/* Make sure that we are only sending a tpc update once a frame, otherwise the control loop will freak out */ /* Make sure that we are only sending a tpc update once a frame, otherwise the control loop will freak out */
int32_t framex10psubframe = UE_list->UE_template[CC_id][UE_id].pucch_tpc_tx_frame * 10 + UE_list->UE_template[CC_id][UE_id].pucch_tpc_tx_subframe; int32_t framex10psubframe = UE_list->UE_template[CC_id][UE_id].pucch_tpc_tx_frame * 10 + UE_list->UE_template[CC_id][UE_id].pucch_tpc_tx_subframe;
...@@ -2384,22 +2384,22 @@ schedule_ue_spec_br(module_id_t module_idP, ...@@ -2384,22 +2384,22 @@ schedule_ue_spec_br(module_id_t module_idP,
UE_list->UE_template[CC_id][UE_id].pucch_tpc_tx_frame = frameP; UE_list->UE_template[CC_id][UE_id].pucch_tpc_tx_frame = frameP;
UE_list->UE_template[CC_id][UE_id].pucch_tpc_tx_subframe = subframeP; UE_list->UE_template[CC_id][UE_id].pucch_tpc_tx_subframe = subframeP;
if (normalized_rx_power > (target_rx_power + 4)) { if (snr > target_snr + 4) {
tpc = 0; //-1 tpc = 0; //-1
} else if (normalized_rx_power<(target_rx_power - 4)) { } else if (snr < target_snr - 4) {
tpc = 2; //+1 tpc = 2; //+1
} else { } else {
tpc = 1; //0 tpc = 1; //0
} }
LOG_D(MAC,"[eNB %d] DLSCH scheduler: frame %d, subframe %d, harq_pid %d, tpc %d, normalized/target rx power %d/%d\n", LOG_D(MAC,"[eNB %d] DLSCH scheduler: frame %d, subframe %d, harq_pid %d, tpc %d, snr/target snr %d/%d\n",
module_idP, module_idP,
frameP, frameP,
subframeP, subframeP,
harq_pid, harq_pid,
tpc, tpc,
normalized_rx_power, snr,
target_rx_power); target_snr);
} else { // Po_PUCCH has been updated } else { // Po_PUCCH has been updated
tpc = 1; // 0 tpc = 1; // 0
} }
......
...@@ -825,7 +825,7 @@ schedule_ue_spec_fairRR(module_id_t module_idP, ...@@ -825,7 +825,7 @@ schedule_ue_spec_fairRR(module_id_t module_idP,
COMMON_channels_t *cc = eNB->common_channels; COMMON_channels_t *cc = eNB->common_channels;
UE_list_t *UE_list = &eNB->UE_list; UE_list_t *UE_list = &eNB->UE_list;
// int continue_flag = 0; // int continue_flag = 0;
int32_t normalized_rx_power, target_rx_power; int32_t snr, target_snr;
int32_t tpc = 1; int32_t tpc = 1;
static int32_t tpc_accumulated = 0; static int32_t tpc_accumulated = 0;
UE_sched_ctrl_t *ue_sched_ctl; UE_sched_ctrl_t *ue_sched_ctl;
...@@ -1720,11 +1720,11 @@ schedule_ue_spec_fairRR(module_id_t module_idP, ...@@ -1720,11 +1720,11 @@ schedule_ue_spec_fairRR(module_id_t module_idP,
} }
// do PUCCH power control // do PUCCH power control
// this is the normalized RX power // this is the snr
eNB_UE_stats = &UE_list->eNB_UE_stats[CC_id][UE_id]; eNB_UE_stats = &UE_list->eNB_UE_stats[CC_id][UE_id];
/* Unit is not dBm, it's special from nfapi */ /* Unit is not dBm, it's special from nfapi */
normalized_rx_power = (5*ue_sched_ctl->pucch1_snr[CC_id]-640)/10+30;//(+eNB->measurements.n0_power_dB[0]) snr = (5 * ue_sched_ctl->pucch1_snr[CC_id] - 640) / 10;
target_rx_power= eNB->puCch10xSnr/10 + 30;//(+eNB->measurements.n0_power_dB[0]) target_snr = eNB->puCch10xSnr / 10;
// this assumes accumulated tpc // this assumes accumulated tpc
// make sure that we are only sending a tpc update once a frame, otherwise the control loop will freak out // make sure that we are only sending a tpc update once a frame, otherwise the control loop will freak out
int32_t framex10psubframe = UE_list->UE_template[CC_id][UE_id].pucch_tpc_tx_frame*10+UE_list->UE_template[CC_id][UE_id].pucch_tpc_tx_subframe; int32_t framex10psubframe = UE_list->UE_template[CC_id][UE_id].pucch_tpc_tx_frame*10+UE_list->UE_template[CC_id][UE_id].pucch_tpc_tx_subframe;
...@@ -1736,19 +1736,19 @@ schedule_ue_spec_fairRR(module_id_t module_idP, ...@@ -1736,19 +1736,19 @@ schedule_ue_spec_fairRR(module_id_t module_idP,
UE_list->UE_template[CC_id][UE_id].pucch_tpc_tx_frame=frameP; UE_list->UE_template[CC_id][UE_id].pucch_tpc_tx_frame=frameP;
UE_list->UE_template[CC_id][UE_id].pucch_tpc_tx_subframe=subframeP; UE_list->UE_template[CC_id][UE_id].pucch_tpc_tx_subframe=subframeP;
if (normalized_rx_power>(target_rx_power+4)) { if (snr > target_snr + 4) {
tpc = 0; //-1 tpc = 0; //-1
tpc_accumulated--; tpc_accumulated--;
} else if (normalized_rx_power<(target_rx_power-4)) { } else if (snr < target_snr - 4) {
tpc = 2; //+1 tpc = 2; //+1
tpc_accumulated++; tpc_accumulated++;
} else { } else {
tpc = 1; //0 tpc = 1; //0
} }
LOG_D(MAC,"[eNB %d] DLSCH scheduler: frame %d, subframe %d, harq_pid %d, tpc %d, accumulated %d, normalized/target rx power %d/%d\n", LOG_D(MAC,"[eNB %d] DLSCH scheduler: frame %d, subframe %d, harq_pid %d, tpc %d, accumulated %d, snr/target snr %d/%d\n",
module_idP,frameP, subframeP,harq_pid,tpc, module_idP,frameP, subframeP,harq_pid,tpc,
tpc_accumulated,normalized_rx_power,target_rx_power); tpc_accumulated,snr,target_snr);
} // Po_PUCCH has been updated } // Po_PUCCH has been updated
else { else {
tpc = 1; //0 tpc = 1; //0
...@@ -2618,8 +2618,8 @@ void schedule_ulsch_rnti_fairRR(module_id_t module_idP, ...@@ -2618,8 +2618,8 @@ void schedule_ulsch_rnti_fairRR(module_id_t module_idP,
uint8_t status = 0; uint8_t status = 0;
uint8_t rb_table_index = -1; uint8_t rb_table_index = -1;
uint32_t cqi_req,cshift,ndi,tpc; uint32_t cqi_req,cshift,ndi,tpc;
int32_t normalized_rx_power; int32_t snr;
int32_t target_rx_power=-90; int32_t target_snr=0;
static int32_t tpc_accumulated=0; static int32_t tpc_accumulated=0;
int CC_id,ulsch_ue_num; int CC_id,ulsch_ue_num;
int N_RB_UL; int N_RB_UL;
...@@ -2782,8 +2782,8 @@ void schedule_ulsch_rnti_fairRR(module_id_t module_idP, ...@@ -2782,8 +2782,8 @@ void schedule_ulsch_rnti_fairRR(module_id_t module_idP,
//power control //power control
//compute the expected ULSCH RX power (for the stats) //compute the expected ULSCH RX power (for the stats)
// this is the normalized RX power and this should be constant (regardless of mcs // this is the normalized RX power and this should be constant (regardless of mcs
normalized_rx_power = (5*UE_sched_ctrl->pusch_snr[CC_id]-640)/10+30; //(+eNB->measurements.n0_power_dB[0]) snr = (5 * UE_sched_ctrl->pusch_snr[CC_id] - 640) / 10;
target_rx_power= eNB->puSch10xSnr/10 + 30; //(+eNB->measurements.n0_power_dB[0]) target_snr = eNB->puSch10xSnr / 10;
// this assumes accumulated tpc // this assumes accumulated tpc
// make sure that we are only sending a tpc update once a frame, otherwise the control loop will freak out // make sure that we are only sending a tpc update once a frame, otherwise the control loop will freak out
int32_t framex10psubframe = UE_template->pusch_tpc_tx_frame*10+UE_template->pusch_tpc_tx_subframe; int32_t framex10psubframe = UE_template->pusch_tpc_tx_frame*10+UE_template->pusch_tpc_tx_subframe;
...@@ -2793,10 +2793,10 @@ void schedule_ulsch_rnti_fairRR(module_id_t module_idP, ...@@ -2793,10 +2793,10 @@ void schedule_ulsch_rnti_fairRR(module_id_t module_idP,
UE_template->pusch_tpc_tx_frame=frameP; UE_template->pusch_tpc_tx_frame=frameP;
UE_template->pusch_tpc_tx_subframe=subframeP; UE_template->pusch_tpc_tx_subframe=subframeP;
if (normalized_rx_power>(target_rx_power+4)) { if (snr > target_snr + 4) {
tpc = 0; //-1 tpc = 0; //-1
tpc_accumulated--; tpc_accumulated--;
} else if (normalized_rx_power<(target_rx_power-4)) { } else if (snr < target_snr - 4) {
tpc = 2; //+1 tpc = 2; //+1
tpc_accumulated++; tpc_accumulated++;
} else { } else {
...@@ -2807,9 +2807,9 @@ void schedule_ulsch_rnti_fairRR(module_id_t module_idP, ...@@ -2807,9 +2807,9 @@ void schedule_ulsch_rnti_fairRR(module_id_t module_idP,
} }
if (tpc!=1) { if (tpc!=1) {
LOG_D(MAC,"[eNB %d] ULSCH scheduler: frame %d, subframe %d, harq_pid %d, tpc %d, accumulated %d, normalized/target rx power %d/%d\n", LOG_D(MAC,"[eNB %d] ULSCH scheduler: frame %d, subframe %d, harq_pid %d, tpc %d, accumulated %d, snr/target snr %d/%d\n",
module_idP,frameP,subframeP,harq_pid,tpc, module_idP,frameP,subframeP,harq_pid,tpc,
tpc_accumulated,normalized_rx_power,target_rx_power); tpc_accumulated,snr,target_snr);
} }
// new transmission // new transmission
...@@ -2822,8 +2822,8 @@ void schedule_ulsch_rnti_fairRR(module_id_t module_idP, ...@@ -2822,8 +2822,8 @@ void schedule_ulsch_rnti_fairRR(module_id_t module_idP,
UE_sched_ctrl->cqi_req_timer); UE_sched_ctrl->cqi_req_timer);
ndi = 1-UE_template->oldNDI_UL[harq_pid]; ndi = 1-UE_template->oldNDI_UL[harq_pid];
UE_template->oldNDI_UL[harq_pid]=ndi; UE_template->oldNDI_UL[harq_pid]=ndi;
UE_list->eNB_UE_stats[CC_id][UE_id].normalized_rx_power=normalized_rx_power; UE_list->eNB_UE_stats[CC_id][UE_id].snr = snr;
UE_list->eNB_UE_stats[CC_id][UE_id].target_rx_power=target_rx_power; UE_list->eNB_UE_stats[CC_id][UE_id].target_snr = target_snr;
UE_list->eNB_UE_stats[CC_id][UE_id].ulsch_mcs1=UE_template->pre_assigned_mcs_ul; UE_list->eNB_UE_stats[CC_id][UE_id].ulsch_mcs1=UE_template->pre_assigned_mcs_ul;
UE_template->mcs_UL[harq_pid] = UE_template->pre_assigned_mcs_ul;//cmin (UE_template->pre_assigned_mcs_ul, openair_daq_vars.target_ue_ul_mcs); // adjust, based on user-defined MCS UE_template->mcs_UL[harq_pid] = UE_template->pre_assigned_mcs_ul;//cmin (UE_template->pre_assigned_mcs_ul, openair_daq_vars.target_ue_ul_mcs); // adjust, based on user-defined MCS
...@@ -2998,8 +2998,8 @@ void schedule_ulsch_rnti_fairRR(module_id_t module_idP, ...@@ -2998,8 +2998,8 @@ void schedule_ulsch_rnti_fairRR(module_id_t module_idP,
T(T_ENB_MAC_UE_UL_SCHEDULE_RETRANSMISSION, T_INT(module_idP), T_INT(CC_id), T_INT(rnti), T_INT(frameP), T(T_ENB_MAC_UE_UL_SCHEDULE_RETRANSMISSION, T_INT(module_idP), T_INT(CC_id), T_INT(rnti), T_INT(frameP),
T_INT(subframeP), T_INT(harq_pid), T_INT(UE_template->mcs_UL[harq_pid]), T_INT(ulsch_ue_select[CC_id].list[ulsch_ue_num].start_rb), T_INT(ulsch_ue_select[CC_id].list[ulsch_ue_num].nb_rb), T_INT(subframeP), T_INT(harq_pid), T_INT(UE_template->mcs_UL[harq_pid]), T_INT(ulsch_ue_select[CC_id].list[ulsch_ue_num].start_rb), T_INT(ulsch_ue_select[CC_id].list[ulsch_ue_num].nb_rb),
T_INT(round)); T_INT(round));
UE_list->eNB_UE_stats[CC_id][UE_id].normalized_rx_power=normalized_rx_power; UE_list->eNB_UE_stats[CC_id][UE_id].snr = snr;
UE_list->eNB_UE_stats[CC_id][UE_id].target_rx_power=target_rx_power; UE_list->eNB_UE_stats[CC_id][UE_id].target_snr = target_snr;
uint8_t mcs_rv = 0; uint8_t mcs_rv = 0;
if(rvidx_tab[round&3]==1) { if(rvidx_tab[round&3]==1) {
......
...@@ -199,8 +199,8 @@ void schedule_ulsch_phy_test(module_id_t module_idP,frame_t frameP,sub_frame_t s ...@@ -199,8 +199,8 @@ void schedule_ulsch_phy_test(module_id_t module_idP,frame_t frameP,sub_frame_t s
uint8_t mcs = 20; uint8_t mcs = 20;
uint8_t harq_pid = 0; uint8_t harq_pid = 0;
uint32_t cqi_req = 0,cshift,ndi,tpc = 1; uint32_t cqi_req = 0,cshift,ndi,tpc = 1;
int32_t normalized_rx_power; int32_t snr;
int32_t target_rx_power= 178; int32_t target_snr = 10; /* TODO: target_rx_power was 178, what to put? is it meaningful? */
int CC_id = 0; int CC_id = 0;
int nb_rb = 24; int nb_rb = 24;
int N_RB_UL; int N_RB_UL;
...@@ -258,15 +258,15 @@ void schedule_ulsch_phy_test(module_id_t module_idP,frame_t frameP,sub_frame_t s ...@@ -258,15 +258,15 @@ void schedule_ulsch_phy_test(module_id_t module_idP,frame_t frameP,sub_frame_t s
//power control //power control
//compute the expected ULSCH RX power (for the stats) //compute the expected ULSCH RX power (for the stats)
// this is the normalized RX power and this should be constant (regardless of mcs // this is the snr and this should be constant (regardless of mcs)
normalized_rx_power = (5*UE_sched_ctrl->pusch_snr[CC_id]-640)/10+30; snr = (5 * UE_sched_ctrl->pusch_snr[CC_id] - 640) / 10;
// new transmission // new transmission
ndi = 1-UE_template->oldNDI_UL[harq_pid]; ndi = 1-UE_template->oldNDI_UL[harq_pid];
UE_template->oldNDI_UL[harq_pid]=ndi; UE_template->oldNDI_UL[harq_pid]=ndi;
UE_list->eNB_UE_stats[CC_id][UE_id].normalized_rx_power=normalized_rx_power; UE_list->eNB_UE_stats[CC_id][UE_id].snr = snr;
UE_list->eNB_UE_stats[CC_id][UE_id].target_rx_power=target_rx_power; UE_list->eNB_UE_stats[CC_id][UE_id].target_snr = target_snr;
UE_list->eNB_UE_stats[CC_id][UE_id].ulsch_mcs1 = mcs; UE_list->eNB_UE_stats[CC_id][UE_id].ulsch_mcs1 = mcs;
UE_template->mcs_UL[harq_pid] = mcs;//cmin (UE_template->pre_assigned_mcs_ul, openair_daq_vars.target_ue_ul_mcs); // adjust, based on user-defined MCS UE_template->mcs_UL[harq_pid] = mcs;//cmin (UE_template->pre_assigned_mcs_ul, openair_daq_vars.target_ue_ul_mcs); // adjust, based on user-defined MCS
UE_list->eNB_UE_stats[CC_id][UE_id].ulsch_mcs2 = mcs; UE_list->eNB_UE_stats[CC_id][UE_id].ulsch_mcs2 = mcs;
......
...@@ -1329,8 +1329,8 @@ schedule_ulsch_rnti(module_id_t module_idP, ...@@ -1329,8 +1329,8 @@ schedule_ulsch_rnti(module_id_t module_idP,
uint32_t cshift = 0; uint32_t cshift = 0;
uint32_t ndi = 0; uint32_t ndi = 0;
uint32_t tpc = 0; uint32_t tpc = 0;
int32_t normalized_rx_power = 0; int32_t snr = 0;
int32_t target_rx_power = 0; int32_t target_snr = 0;
int32_t framex10psubframe = 0; int32_t framex10psubframe = 0;
static int32_t tpc_accumulated = 0; static int32_t tpc_accumulated = 0;
int sched_frame = 0; int sched_frame = 0;
...@@ -1555,13 +1555,12 @@ schedule_ulsch_rnti(module_id_t module_idP, ...@@ -1555,13 +1555,12 @@ schedule_ulsch_rnti(module_id_t module_idP,
/* Power control */ /* Power control */
/* /*
* Compute the expected ULSCH RX power (for the stats) * Compute the expected ULSCH RX snr (for the stats)
* This is the normalized RX power and this should be constant (regardless of mcs) * This is the normalized RX snr and this should be constant (regardless of mcs)
* Is not in dBm, unit from nfapi, converting to dBm * Is not in dBm, unit from nfapi, converting to dBm
* ToDo: Noise power hard coded to 30
*/ */
normalized_rx_power = ((5 * UE_sched_ctrl_ptr->pusch_snr[CC_id] - 640) / 10) + 30; snr = (5 * UE_sched_ctrl_ptr->pusch_snr[CC_id] - 640) / 10;
target_rx_power = (mac->puSch10xSnr / 10) + 30; target_snr = mac->puSch10xSnr / 10;
/* /*
* This assumes accumulated tpc * This assumes accumulated tpc
...@@ -1575,10 +1574,10 @@ schedule_ulsch_rnti(module_id_t module_idP, ...@@ -1575,10 +1574,10 @@ schedule_ulsch_rnti(module_id_t module_idP,
UE_template_ptr->pusch_tpc_tx_frame = frameP; UE_template_ptr->pusch_tpc_tx_frame = frameP;
UE_template_ptr->pusch_tpc_tx_subframe = subframeP; UE_template_ptr->pusch_tpc_tx_subframe = subframeP;
if (normalized_rx_power > (target_rx_power + 4)) { if (snr > target_snr + 4) {
tpc = 0; // -1 tpc = 0; // -1
tpc_accumulated--; tpc_accumulated--;
} else if (normalized_rx_power < (target_rx_power - 4)) { } else if (snr < target_snr - 4) {
tpc = 2; // +1 tpc = 2; // +1
tpc_accumulated++; tpc_accumulated++;
} else { } else {
...@@ -1589,21 +1588,21 @@ schedule_ulsch_rnti(module_id_t module_idP, ...@@ -1589,21 +1588,21 @@ schedule_ulsch_rnti(module_id_t module_idP,
} }
if (tpc != 1) { if (tpc != 1) {
LOG_D(MAC, "[eNB %d] ULSCH scheduler: frame %d, subframe %d, harq_pid %d, tpc %d, accumulated %d, normalized/target rx power %d/%d\n", LOG_D(MAC, "[eNB %d] ULSCH scheduler: frame %d, subframe %d, harq_pid %d, tpc %d, accumulated %d, snr/target snr %d/%d\n",
module_idP, module_idP,
frameP, frameP,
subframeP, subframeP,
harq_pid, harq_pid,
tpc, tpc,
tpc_accumulated, tpc_accumulated,
normalized_rx_power, snr,
target_rx_power); target_snr);
} }
ndi = 1 - UE_template_ptr->oldNDI_UL[harq_pid]; // NDI: new data indicator ndi = 1 - UE_template_ptr->oldNDI_UL[harq_pid]; // NDI: new data indicator
UE_template_ptr->oldNDI_UL[harq_pid] = ndi; UE_template_ptr->oldNDI_UL[harq_pid] = ndi;
UE_list->eNB_UE_stats[CC_id][UE_id].normalized_rx_power = normalized_rx_power; UE_list->eNB_UE_stats[CC_id][UE_id].snr = snr;
UE_list->eNB_UE_stats[CC_id][UE_id].target_rx_power = target_rx_power; UE_list->eNB_UE_stats[CC_id][UE_id].target_snr = target_snr;
UE_template_ptr->mcs_UL[harq_pid] = cmin(UE_template_ptr->pre_assigned_mcs_ul, sli->ul[slice_idx].maxmcs); UE_template_ptr->mcs_UL[harq_pid] = cmin(UE_template_ptr->pre_assigned_mcs_ul, sli->ul[slice_idx].maxmcs);
UE_list->eNB_UE_stats[CC_id][UE_id].ulsch_mcs1= UE_template_ptr->mcs_UL[harq_pid]; UE_list->eNB_UE_stats[CC_id][UE_id].ulsch_mcs1= UE_template_ptr->mcs_UL[harq_pid];
...@@ -1941,8 +1940,8 @@ void schedule_ulsch_rnti_emtc(module_id_t module_idP, ...@@ -1941,8 +1940,8 @@ void schedule_ulsch_rnti_emtc(module_id_t module_idP,
uint8_t status = 0; uint8_t status = 0;
uint32_t cshift = 0; uint32_t cshift = 0;
uint32_t ndi = 0; uint32_t ndi = 0;
int32_t normalized_rx_power = 0; int32_t snr = 0;
int32_t target_rx_power = -90; int32_t target_snr = 0;
int n = 0; int n = 0;
int CC_id = 0; int CC_id = 0;
int N_RB_UL = 0; int N_RB_UL = 0;
...@@ -2050,10 +2049,10 @@ void schedule_ulsch_rnti_emtc(module_id_t module_idP, ...@@ -2050,10 +2049,10 @@ void schedule_ulsch_rnti_emtc(module_id_t module_idP,
UE_template->ul_SR = 0; UE_template->ul_SR = 0;
status = mac_eNB_get_rrc_status(module_idP,rnti); status = mac_eNB_get_rrc_status(module_idP,rnti);
cqi_req = 0; cqi_req = 0;
/* Power control: compute the expected ULSCH RX power (for the stats) */ /* Power control: compute the expected ULSCH RX snr (for the stats) */
/* This is the normalized RX power and this should be constant (regardless of mcs) */ /* This is the normalized snr and this should be constant (regardless of mcs) */
normalized_rx_power = UE_sched_ctrl->pusch_snr[CC_id]; snr = (5 * UE_sched_ctrl->pusch_snr[CC_id] - 640) / 10;
target_rx_power = 178; target_snr = eNB->puSch10xSnr / 10; /* TODO: target_rx_power was 178, what to put? */
/* This assumes accumulated tpc */ /* This assumes accumulated tpc */
/* Make sure that we are only sending a tpc update once a frame, otherwise the control loop will freak out */ /* Make sure that we are only sending a tpc update once a frame, otherwise the control loop will freak out */
int32_t framex10psubframe = UE_template->pusch_tpc_tx_frame * 10 + UE_template->pusch_tpc_tx_subframe; int32_t framex10psubframe = UE_template->pusch_tpc_tx_frame * 10 + UE_template->pusch_tpc_tx_subframe;
...@@ -2063,10 +2062,10 @@ void schedule_ulsch_rnti_emtc(module_id_t module_idP, ...@@ -2063,10 +2062,10 @@ void schedule_ulsch_rnti_emtc(module_id_t module_idP,
UE_template->pusch_tpc_tx_frame = frameP; UE_template->pusch_tpc_tx_frame = frameP;
UE_template->pusch_tpc_tx_subframe = subframeP; UE_template->pusch_tpc_tx_subframe = subframeP;
if (normalized_rx_power > (target_rx_power + 4)) { if (snr > target_snr + 4) {
tpc = 0; //-1 tpc = 0; //-1
UE_sched_ctrl->tpc_accumulated[CC_id]--; UE_sched_ctrl->tpc_accumulated[CC_id]--;
} else if (normalized_rx_power < (target_rx_power - 4)) { } else if (snr < target_snr - 4) {
tpc = 2; //+1 tpc = 2; //+1
UE_sched_ctrl->tpc_accumulated[CC_id]++; UE_sched_ctrl->tpc_accumulated[CC_id]++;
} else { } else {
...@@ -2077,15 +2076,15 @@ void schedule_ulsch_rnti_emtc(module_id_t module_idP, ...@@ -2077,15 +2076,15 @@ void schedule_ulsch_rnti_emtc(module_id_t module_idP,
} }
if (tpc != 1) { if (tpc != 1) {
LOG_D(MAC,"[eNB %d] ULSCH scheduler: frame %d, subframe %d, harq_pid %d, tpc %d, accumulated %d, normalized/target rx power %d/%d\n", LOG_D(MAC,"[eNB %d] ULSCH scheduler: frame %d, subframe %d, harq_pid %d, tpc %d, accumulated %d, snr/target snr %d/%d\n",
module_idP, module_idP,
frameP, frameP,
subframeP, subframeP,
harq_pid, harq_pid,
tpc, tpc,
UE_sched_ctrl->tpc_accumulated[CC_id], UE_sched_ctrl->tpc_accumulated[CC_id],
normalized_rx_power, snr,
target_rx_power); target_snr);
} }
/* New transmission */ /* New transmission */
...@@ -2094,8 +2093,8 @@ void schedule_ulsch_rnti_emtc(module_id_t module_idP, ...@@ -2094,8 +2093,8 @@ void schedule_ulsch_rnti_emtc(module_id_t module_idP,
UE_template->oldNDI_UL[harq_pid] = ndi; UE_template->oldNDI_UL[harq_pid] = ndi;
UE_template->mcs_UL[harq_pid] = 4; UE_template->mcs_UL[harq_pid] = 4;
UE_template->TBS_UL[harq_pid] = get_TBS_UL(UE_template->mcs_UL[harq_pid], 6); UE_template->TBS_UL[harq_pid] = get_TBS_UL(UE_template->mcs_UL[harq_pid], 6);
UE_list->eNB_UE_stats[CC_id][UE_id].normalized_rx_power = normalized_rx_power; UE_list->eNB_UE_stats[CC_id][UE_id].snr = snr;
UE_list->eNB_UE_stats[CC_id][UE_id].target_rx_power = target_rx_power; UE_list->eNB_UE_stats[CC_id][UE_id].target_snr = target_snr;
UE_list->eNB_UE_stats[CC_id][UE_id].ulsch_mcs1 = 4; UE_list->eNB_UE_stats[CC_id][UE_id].ulsch_mcs1 = 4;
UE_list->eNB_UE_stats[CC_id][UE_id].ulsch_mcs2 = UE_template->mcs_UL[harq_pid]; UE_list->eNB_UE_stats[CC_id][UE_id].ulsch_mcs2 = UE_template->mcs_UL[harq_pid];
UE_list->eNB_UE_stats[CC_id][UE_id].total_rbs_used_rx += 6; UE_list->eNB_UE_stats[CC_id][UE_id].total_rbs_used_rx += 6;
......
...@@ -754,10 +754,10 @@ typedef struct { ...@@ -754,10 +754,10 @@ typedef struct {
uint32_t rbs_used_retx_rx; uint32_t rbs_used_retx_rx;
/// total rb used for a new uplink transmission /// total rb used for a new uplink transmission
uint32_t total_rbs_used_rx; uint32_t total_rbs_used_rx;
/// normalized rx power /// snr
int32_t normalized_rx_power; int32_t snr;
/// target rx power /// target snr
int32_t target_rx_power; int32_t target_snr;
/// num rx pdu /// num rx pdu
uint32_t num_pdu_rx[NB_RB_MAX]; uint32_t num_pdu_rx[NB_RB_MAX];
......
...@@ -176,13 +176,13 @@ int dump_eNB_l2_stats(char *buffer, int length) { ...@@ -176,13 +176,13 @@ int dump_eNB_l2_stats(char *buffer, int length) {
UE_list->eNB_UE_stats[CC_id][UE_id].total_overhead_bytes, UE_list->eNB_UE_stats[CC_id][UE_id].total_overhead_bytes,
UE_list->eNB_UE_stats[CC_id][UE_id].avg_overhead_bytes UE_list->eNB_UE_stats[CC_id][UE_id].avg_overhead_bytes
); );
len += sprintf(&buffer[len],"[MAC] UE %d (ULSCH), Status %s, Failute timer %d, RNTI %x : rx power (normalized %d, target %d), MCS (pre %d, post %d), RB (rx %d, retx %d, total %d), Current TBS %d \n", len += sprintf(&buffer[len],"[MAC] UE %d (ULSCH), Status %s, Failute timer %d, RNTI %x : snr (%d, target %d), MCS (pre %d, post %d), RB (rx %d, retx %d, total %d), Current TBS %d \n",
UE_id, UE_id,
map_int_to_str(rrc_status_names, UE_list->eNB_UE_stats[CC_id][UE_id].rrc_status), map_int_to_str(rrc_status_names, UE_list->eNB_UE_stats[CC_id][UE_id].rrc_status),
UE_list->UE_sched_ctrl[UE_id].ul_failure_timer, UE_list->UE_sched_ctrl[UE_id].ul_failure_timer,
UE_list->eNB_UE_stats[CC_id][UE_id].crnti, UE_list->eNB_UE_stats[CC_id][UE_id].crnti,
UE_list->eNB_UE_stats[CC_id][UE_id].normalized_rx_power, UE_list->eNB_UE_stats[CC_id][UE_id].snr,
UE_list->eNB_UE_stats[CC_id][UE_id].target_rx_power, UE_list->eNB_UE_stats[CC_id][UE_id].target_snr,
UE_list->eNB_UE_stats[CC_id][UE_id].ulsch_mcs1, UE_list->eNB_UE_stats[CC_id][UE_id].ulsch_mcs1,
UE_list->eNB_UE_stats[CC_id][UE_id].ulsch_mcs2, UE_list->eNB_UE_stats[CC_id][UE_id].ulsch_mcs2,
UE_list->eNB_UE_stats[CC_id][UE_id].rbs_used_rx, UE_list->eNB_UE_stats[CC_id][UE_id].rbs_used_rx,
......
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