fix RSRP computation at UE (let the higher layers compute the index)
This commit is contained in:
@@ -88,8 +88,6 @@ static inline const char *rnti_types(nr_rnti_type_t rr)
|
|||||||
#define NR_NUMBER_OF_SYMBOLS_PER_SLOT_EXTENDED_CP 12
|
#define NR_NUMBER_OF_SYMBOLS_PER_SLOT_EXTENDED_CP 12
|
||||||
#define NR_MAX_NB_LAYERS 4 // 8
|
#define NR_MAX_NB_LAYERS 4 // 8
|
||||||
|
|
||||||
#define BOUNDED_EVAL(a, b, c) (min(c, max(a, b)))
|
|
||||||
|
|
||||||
// Since the IQ samples are represented by SQ15 R+I (see https://en.wikipedia.org/wiki/Q_(number_format)) we need to compensate when
|
// Since the IQ samples are represented by SQ15 R+I (see https://en.wikipedia.org/wiki/Q_(number_format)) we need to compensate when
|
||||||
// calcualting signal energy. Instead of shifting each sample right by 15, we can normalize the result in dB scale once its
|
// calcualting signal energy. Instead of shifting each sample right by 15, we can normalize the result in dB scale once its
|
||||||
// calcualted. Signal energy is calculated using RMS^2, where each sample is squared before taking the average of the sum, therefore
|
// calcualted. Signal energy is calculated using RMS^2, where each sample is squared before taking the average of the sum, therefore
|
||||||
|
|||||||
@@ -236,11 +236,10 @@ void nr_ue_ssb_rsrp_measurements(PHY_VARS_NR_UE *ue,
|
|||||||
.gNB_index = proc->gNB_id,
|
.gNB_index = proc->gNB_id,
|
||||||
.meas_type = NFAPI_NR_SS_MEAS,
|
.meas_type = NFAPI_NR_SS_MEAS,
|
||||||
.Nid_cell = ue->frame_parms.Nid_cell,
|
.Nid_cell = ue->frame_parms.Nid_cell,
|
||||||
|
.rsrp_dBm = ue->measurements.ssb_rsrp_dBm[ssb_index],
|
||||||
.ssb_index = ssb_index,
|
.ssb_index = ssb_index,
|
||||||
.is_neighboring_cell = false,
|
.is_neighboring_cell = false,
|
||||||
};
|
};
|
||||||
int ssb_rsrp_dBm = ue->measurements.ssb_rsrp_dBm[ssb_index];
|
|
||||||
l1_measurements.rsrp_dBm = BOUNDED_EVAL(16, ssb_rsrp_dBm + 157, 113); // TS 38.133 - Table 10.1.6.1-1
|
|
||||||
nr_downlink_indication_t dl_indication = {0};
|
nr_downlink_indication_t dl_indication = {0};
|
||||||
fapi_nr_rx_indication_t rx_ind = {0};
|
fapi_nr_rx_indication_t rx_ind = {0};
|
||||||
nr_fill_dl_indication(&dl_indication, NULL, &rx_ind, proc, ue, NULL);
|
nr_fill_dl_indication(&dl_indication, NULL, &rx_ind, proc, ue, NULL);
|
||||||
|
|||||||
@@ -987,7 +987,7 @@ void nr_ue_csi_rs_procedures(PHY_VARS_NR_UE *ue,
|
|||||||
.meas_type = NFAPI_NR_CSI_MEAS,
|
.meas_type = NFAPI_NR_CSI_MEAS,
|
||||||
.Nid_cell = frame_parms->Nid_cell,
|
.Nid_cell = frame_parms->Nid_cell,
|
||||||
.is_neighboring_cell = false,
|
.is_neighboring_cell = false,
|
||||||
.rsrp_dBm = BOUNDED_EVAL(16, rsrp_dBm + 157, 113), // TS 38.133 - Table 10.1.6.1-1
|
.rsrp_dBm = rsrp_dBm,
|
||||||
.rank_indicator = rank_indicator,
|
.rank_indicator = rank_indicator,
|
||||||
.i1 = *i1,
|
.i1 = *i1,
|
||||||
.i2 = *i2,
|
.i2 = *i2,
|
||||||
|
|||||||
@@ -184,6 +184,6 @@ void nr_mac_rrc_meas_ind_ue(module_id_t module_id,
|
|||||||
uint16_t Nid_cell,
|
uint16_t Nid_cell,
|
||||||
bool csi_meas,
|
bool csi_meas,
|
||||||
bool is_neighboring_cell,
|
bool is_neighboring_cell,
|
||||||
uint8_t rsrp_dBm)
|
int rsrp_dBm)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -146,7 +146,7 @@ typedef struct NRRrcMacSBcchDataInd_s {
|
|||||||
|
|
||||||
typedef struct NRRrcMacMeasDataInd_s {
|
typedef struct NRRrcMacMeasDataInd_s {
|
||||||
uint8_t gnb_index;
|
uint8_t gnb_index;
|
||||||
uint8_t rsrp_dBm;
|
int rsrp_dBm;
|
||||||
uint16_t Nid_cell;
|
uint16_t Nid_cell;
|
||||||
bool is_csi_meas;
|
bool is_csi_meas;
|
||||||
bool is_neighboring_cell;
|
bool is_neighboring_cell;
|
||||||
|
|||||||
@@ -139,7 +139,6 @@ static csi_payload_t get_csirs_RSRP_payload(NR_UE_MAC_INST_t *mac,
|
|||||||
struct NR_CSI_ReportConfig *csi_reportconfig,
|
struct NR_CSI_ReportConfig *csi_reportconfig,
|
||||||
NR_CSI_ResourceConfigId_t csi_ResourceConfigId,
|
NR_CSI_ResourceConfigId_t csi_ResourceConfigId,
|
||||||
const NR_CSI_MeasConfig_t *csi_MeasConfig);
|
const NR_CSI_MeasConfig_t *csi_MeasConfig);
|
||||||
static uint8_t get_rsrp_index(int rsrp);
|
|
||||||
|
|
||||||
static uint8_t get_rsrp_diff_index(int best_rsrp, int current_rsrp);
|
static uint8_t get_rsrp_diff_index(int best_rsrp, int current_rsrp);
|
||||||
|
|
||||||
@@ -2917,6 +2916,18 @@ static int compare_ssb_rsrp(const void *a, const void *b)
|
|||||||
return mb->ssb_rsrp_dBm - ma->ssb_rsrp_dBm;
|
return mb->ssb_rsrp_dBm - ma->ssb_rsrp_dBm;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// returns index from RSRP
|
||||||
|
// according to Table 10.1.6.1-1 in 38.133
|
||||||
|
static uint8_t get_rsrp_index(int rsrp)
|
||||||
|
{
|
||||||
|
int index = rsrp + 157;
|
||||||
|
if (rsrp > -44)
|
||||||
|
index = 113;
|
||||||
|
if (rsrp < -140)
|
||||||
|
index = 16;
|
||||||
|
return index;
|
||||||
|
}
|
||||||
|
|
||||||
static csi_payload_t get_ssb_rsrp_payload(NR_UE_MAC_INST_t *mac,
|
static csi_payload_t get_ssb_rsrp_payload(NR_UE_MAC_INST_t *mac,
|
||||||
struct NR_CSI_ReportConfig *csi_reportconfig,
|
struct NR_CSI_ReportConfig *csi_reportconfig,
|
||||||
NR_CSI_ResourceConfigId_t csi_ResourceConfigId,
|
NR_CSI_ResourceConfigId_t csi_ResourceConfigId,
|
||||||
@@ -3126,15 +3137,14 @@ static csi_payload_t get_csirs_RSRP_payload(NR_UE_MAC_INST_t *mac,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Improvements will be needed to cri_ssbri_bitlen>0
|
// TODO: Improvements will be needed to cri_ssbri_bitlen>0
|
||||||
temp_payload = reverse_bits(mac->l1_measurements.rsrp_dBm, n_bits); // rsrp_dBm as in TS 38.133 - Table 10.1.6.1-1
|
temp_payload = get_rsrp_index(mac->l1_measurements.rsrp_dBm);
|
||||||
|
temp_payload = reverse_bits(temp_payload, n_bits);
|
||||||
|
|
||||||
LOG_D(NR_MAC, "cri_ssbri_bitlen = %d\n", cri_ssbri_bitlen);
|
LOG_D(NR_MAC, "cri_ssbri_bitlen = %d\n", cri_ssbri_bitlen);
|
||||||
LOG_D(NR_MAC, "rsrp_bitlen = %d\n", rsrp_bitlen);
|
LOG_D(NR_MAC, "rsrp_bitlen = %d\n", rsrp_bitlen);
|
||||||
LOG_D(NR_MAC, "diff_rsrp_bitlen = %d\n", diff_rsrp_bitlen);
|
LOG_D(NR_MAC, "diff_rsrp_bitlen = %d\n", diff_rsrp_bitlen);
|
||||||
|
|
||||||
LOG_D(NR_MAC, "n_bits = %d\n", n_bits);
|
LOG_D(NR_MAC, "n_bits = %d\n", n_bits);
|
||||||
LOG_D(NR_MAC, "csi_part1_payload = 0x%lx\n", temp_payload);
|
LOG_D(NR_MAC, "csi_part1_payload = 0x%lx\n", temp_payload);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3145,20 +3155,6 @@ static csi_payload_t get_csirs_RSRP_payload(NR_UE_MAC_INST_t *mac,
|
|||||||
return csi;
|
return csi;
|
||||||
}
|
}
|
||||||
|
|
||||||
// returns index from RSRP
|
|
||||||
// according to Table 10.1.6.1-1 in 38.133
|
|
||||||
|
|
||||||
static uint8_t get_rsrp_index(int rsrp)
|
|
||||||
{
|
|
||||||
int index = rsrp + 157;
|
|
||||||
if (rsrp>-44)
|
|
||||||
index = 113;
|
|
||||||
if (rsrp<-140)
|
|
||||||
index = 16;
|
|
||||||
|
|
||||||
return index;
|
|
||||||
}
|
|
||||||
|
|
||||||
// returns index from differential RSRP
|
// returns index from differential RSRP
|
||||||
// according to Table 10.1.6.1-2 in 38.133
|
// according to Table 10.1.6.1-2 in 38.133
|
||||||
static uint8_t get_rsrp_diff_index(int best_rsrp, int current_rsrp)
|
static uint8_t get_rsrp_diff_index(int best_rsrp, int current_rsrp)
|
||||||
|
|||||||
@@ -37,7 +37,7 @@
|
|||||||
|
|
||||||
typedef uint32_t channel_t;
|
typedef uint32_t channel_t;
|
||||||
|
|
||||||
void nr_mac_rrc_meas_ind_ue(module_id_t module_id, uint32_t gNB_index, uint16_t Nid_cell, bool csi_meas, bool is_neighboring_cell, uint8_t rsrp_dBm)
|
void nr_mac_rrc_meas_ind_ue(module_id_t module_id, uint32_t gNB_index, uint16_t Nid_cell, bool csi_meas, bool is_neighboring_cell, int rsrp_dBm)
|
||||||
{
|
{
|
||||||
MessageDef *message_p = itti_alloc_new_message(TASK_MAC_UE, 0, NR_RRC_MAC_MEAS_DATA_IND);
|
MessageDef *message_p = itti_alloc_new_message(TASK_MAC_UE, 0, NR_RRC_MAC_MEAS_DATA_IND);
|
||||||
NR_RRC_MAC_MEAS_DATA_IND(message_p).gnb_index = gNB_index;
|
NR_RRC_MAC_MEAS_DATA_IND(message_p).gnb_index = gNB_index;
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ void nr_mac_rrc_meas_ind_ue(module_id_t module_id,
|
|||||||
uint16_t Nid_cell,
|
uint16_t Nid_cell,
|
||||||
bool csi_meas,
|
bool csi_meas,
|
||||||
bool is_neighboring_cell,
|
bool is_neighboring_cell,
|
||||||
uint8_t rsrp_dBm);
|
int rsrp_dBm);
|
||||||
void nr_mac_rrc_inactivity_timer_ind(const module_id_t mod_id);
|
void nr_mac_rrc_inactivity_timer_ind(const module_id_t mod_id);
|
||||||
void nr_mac_rrc_msg3_ind(const module_id_t mod_id, const int rnti, bool prepare_payload);
|
void nr_mac_rrc_msg3_ind(const module_id_t mod_id, const int rnti, bool prepare_payload);
|
||||||
void nr_ue_rrc_timer_trigger(int instance, int frame, int gnb_id);
|
void nr_ue_rrc_timer_trigger(int instance, int frame, int gnb_id);
|
||||||
|
|||||||
@@ -2589,14 +2589,14 @@ void *rrc_nrue(void *notUsed)
|
|||||||
NR_RRC_MAC_MEAS_DATA_IND(msg_p).is_neighboring_cell? "Neighboring cell" : "Active cell",
|
NR_RRC_MAC_MEAS_DATA_IND(msg_p).is_neighboring_cell? "Neighboring cell" : "Active cell",
|
||||||
NR_RRC_MAC_MEAS_DATA_IND(msg_p).Nid_cell,
|
NR_RRC_MAC_MEAS_DATA_IND(msg_p).Nid_cell,
|
||||||
NR_RRC_MAC_MEAS_DATA_IND(msg_p).is_csi_meas ? "CSI meas" : "SSB meas",
|
NR_RRC_MAC_MEAS_DATA_IND(msg_p).is_csi_meas ? "CSI meas" : "SSB meas",
|
||||||
NR_RRC_MAC_MEAS_DATA_IND(msg_p).rsrp_dBm - 157);
|
NR_RRC_MAC_MEAS_DATA_IND(msg_p).rsrp_dBm);
|
||||||
|
|
||||||
rrcPerNB_t *rrcNB = rrc->perNB + NR_RRC_MAC_MEAS_DATA_IND(msg_p).gnb_index;
|
rrcPerNB_t *rrcNB = rrc->perNB + NR_RRC_MAC_MEAS_DATA_IND(msg_p).gnb_index;
|
||||||
nr_ue_meas_filtering(rrcNB,
|
nr_ue_meas_filtering(rrcNB,
|
||||||
NR_RRC_MAC_MEAS_DATA_IND(msg_p).is_neighboring_cell,
|
NR_RRC_MAC_MEAS_DATA_IND(msg_p).is_neighboring_cell,
|
||||||
NR_RRC_MAC_MEAS_DATA_IND(msg_p).Nid_cell,
|
NR_RRC_MAC_MEAS_DATA_IND(msg_p).Nid_cell,
|
||||||
NR_RRC_MAC_MEAS_DATA_IND(msg_p).is_csi_meas,
|
NR_RRC_MAC_MEAS_DATA_IND(msg_p).is_csi_meas,
|
||||||
NR_RRC_MAC_MEAS_DATA_IND(msg_p).rsrp_dBm - 157);
|
NR_RRC_MAC_MEAS_DATA_IND(msg_p).rsrp_dBm);
|
||||||
nr_ue_check_meas_report(rrc, NR_RRC_MAC_MEAS_DATA_IND(msg_p).gnb_index);
|
nr_ue_check_meas_report(rrc, NR_RRC_MAC_MEAS_DATA_IND(msg_p).gnb_index);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user