Added RI (CQI periodic reporting) send condition function

This commit is contained in:
Xavier Arteaga 2017-08-28 14:12:56 +02:00
parent 0b83ff7d68
commit cedc32fbb0
2 changed files with 91 additions and 37 deletions

View File

@ -45,7 +45,8 @@
typedef struct {
bool configured;
uint32_t pmi_idx;
bool simul_cqi_ack;
uint32_t ri_idx;
bool simul_cqi_ack;
bool format_is_subband;
uint32_t subband_size;
} srslte_cqi_periodic_cfg_t;
@ -137,7 +138,11 @@ SRSLTE_API int srslte_cqi_format2_subband_unpack(uint8_t buff[SRSLTE_CQI_MAX_BIT
srslte_cqi_format2_subband_t *msg);
SRSLTE_API bool srslte_cqi_send(uint32_t I_cqi_pmi,
uint32_t tti);
uint32_t tti);
SRSLTE_API bool srslte_ri_send(uint32_t I_cqi_pmi,
uint32_t I_ri,
uint32_t tti);
SRSLTE_API uint8_t srslte_cqi_from_snr(float snr);

View File

@ -159,46 +159,54 @@ int srslte_cqi_size(srslte_cqi_value_t *value) {
return -1;
}
static bool srslte_cqi_get_N(uint32_t I_cqi_pmi, uint32_t *N_p, uint32_t *N_offset) {
if (I_cqi_pmi <= 1) {
*N_p = 2;
*N_offset = I_cqi_pmi;
} else if (I_cqi_pmi <= 6) {
*N_p = 5;
*N_offset = I_cqi_pmi - 2;
} else if (I_cqi_pmi <= 16) {
*N_p = 10;
*N_offset = I_cqi_pmi - 7;
} else if (I_cqi_pmi <= 36) {
*N_p = 20;
*N_offset = I_cqi_pmi - 17;
} else if (I_cqi_pmi <= 76) {
*N_p = 40;
*N_offset = I_cqi_pmi - 37;
} else if (I_cqi_pmi <= 156) {
*N_p = 80;
*N_offset = I_cqi_pmi - 77;
} else if (I_cqi_pmi <= 316) {
*N_p = 160;
*N_offset = I_cqi_pmi - 157;
} else if (I_cqi_pmi == 317) {
return false;
} else if (I_cqi_pmi <= 349) {
*N_p = 32;
*N_offset = I_cqi_pmi - 318;
} else if (I_cqi_pmi <= 413) {
*N_p = 64;
*N_offset = I_cqi_pmi - 350;
} else if (I_cqi_pmi <= 541) {
*N_p = 128;
*N_offset = I_cqi_pmi - 414;
} else if (I_cqi_pmi <= 1023) {
return false;
}
return true;
}
bool srslte_cqi_send(uint32_t I_cqi_pmi, uint32_t tti) {
uint32_t N_p = 0;
uint32_t N_offset = 0;
if (I_cqi_pmi <= 1) {
N_p = 2;
N_offset = I_cqi_pmi;
} else if (I_cqi_pmi <= 6) {
N_p = 5;
N_offset = I_cqi_pmi - 2;
} else if (I_cqi_pmi <= 16) {
N_p = 10;
N_offset = I_cqi_pmi - 7;
} else if (I_cqi_pmi <= 36) {
N_p = 20;
N_offset = I_cqi_pmi - 17;
} else if (I_cqi_pmi <= 76) {
N_p = 40;
N_offset = I_cqi_pmi - 37;
} else if (I_cqi_pmi <= 156) {
N_p = 80;
N_offset = I_cqi_pmi - 77;
} else if (I_cqi_pmi <= 316) {
N_p = 160;
N_offset = I_cqi_pmi - 157;
} else if (I_cqi_pmi == 317) {
return false;
} else if (I_cqi_pmi <= 349) {
N_p = 32;
N_offset = I_cqi_pmi - 318;
} else if (I_cqi_pmi <= 413) {
N_p = 64;
N_offset = I_cqi_pmi - 350;
} else if (I_cqi_pmi <= 541) {
N_p = 128;
N_offset = I_cqi_pmi - 414;
} else if (I_cqi_pmi <= 1023) {
return false;
if (!srslte_cqi_get_N(I_cqi_pmi, &N_p, &N_offset)) {
return false;
}
if (N_p) {
if ((tti-N_offset)%N_p == 0) {
return true;
@ -207,6 +215,47 @@ bool srslte_cqi_send(uint32_t I_cqi_pmi, uint32_t tti) {
return false;
}
bool srslte_ri_send(uint32_t I_cqi_pmi, uint32_t I_ri, uint32_t tti) {
uint32_t M_ri = 0;
uint32_t N_offset_ri = 0;
uint32_t N_p = 0;
uint32_t N_offset_p = 0;
if (!srslte_cqi_get_N(I_cqi_pmi, &N_p, &N_offset_p)) {
return false;
}
if (I_ri <= 160) {
M_ri = 1;
N_offset_ri = I_ri;
} else if (I_ri <= 161) {
M_ri = 2;
N_offset_ri = I_ri - 161;
} else if (I_ri <= 322) {
M_ri = 4;
N_offset_ri = I_ri - 322;
} else if (I_ri <= 483) {
M_ri = 8;
N_offset_ri = I_ri - 483;
} else if (I_ri <= 644) {
M_ri = 16;
N_offset_ri = I_ri - 644;
} else if (I_ri <= 805) {
M_ri = 32;
N_offset_ri = I_ri - 805;
} else if (I_ri <= 966) {
return false;
}
if (M_ri) {
if ((tti - N_offset_p + N_offset_ri) % (N_p * M_ri) == 0) {
return true;
}
}
return false;
}
// CQI-to-Spectral Efficiency: 36.213 Table 7.2.3-1 */
static float cqi_to_coderate[16] = {0, 0.1523, 0.2344, 0.3770, 0.6016, 0.8770, 1.1758, 1.4766, 1.9141, 2.4063, 2.7305, 3.3223, 3.9023, 4.5234, 5.1152, 5.5547};