mirror of https://github.com/PentHertz/srsLTE.git
Added Power Allocation from HL in UE side
This commit is contained in:
parent
4ecd73c984
commit
58aac96a6e
|
@ -39,6 +39,13 @@
|
|||
#include "srslte/phy/fec/softbuffer.h"
|
||||
#include "srslte/phy/fec/cbsegm.h"
|
||||
|
||||
/* 3GPP 36.213 Table 5.2-1: The cell-specific ratio rho_B / rho_A for 1, 2, or 4 cell specific antenna ports */
|
||||
static const float pdsch_cfg_cell_specific_ratio_table[2][4] =
|
||||
{ /* One antenna port */ {1.0f / 1.0f, 4.0f / 5.0f, 3.0f / 5.0f, 2.0f / 5.0f},
|
||||
/* Two or more antenna port */ {5.0f / 4.0f, 1.0f / 1.0f, 3.0f / 4.0f, 1.0f / 2.0f}
|
||||
};
|
||||
|
||||
|
||||
typedef struct SRSLTE_API {
|
||||
srslte_cbsegm_t cb_segm[SRSLTE_MAX_CODEWORDS];
|
||||
srslte_ra_dl_grant_t grant;
|
||||
|
|
|
@ -308,10 +308,36 @@ void srslte_ue_dl_set_non_mbsfn_region(srslte_ue_dl_t *q,
|
|||
srslte_ofdm_set_non_mbsfn_region(&q->fft_mbsfn, non_mbsfn_region_length);
|
||||
}
|
||||
|
||||
void srslte_ue_dl_set_power_alloc (srslte_ue_dl_t *q, float rho_a, float rho_b) {
|
||||
void srslte_ue_dl_set_power_alloc(srslte_ue_dl_t *q, float rho_a, float rho_b) {
|
||||
if (q) {
|
||||
srslte_pdsch_set_power_allocation(&q->pdsch, rho_a);
|
||||
q->rho_b = rho_b;
|
||||
|
||||
uint32_t nof_symbols_slot = SRSLTE_CP_NSYMB(q->cell.cp);
|
||||
uint32_t nof_re_symbol = SRSLTE_NRE * q->cell.nof_prb;
|
||||
|
||||
/* Apply rho_b if required according to 3GPP 36.213 Table 5.2-2 */
|
||||
if (rho_b != 0.0f && rho_b != 1.0f) {
|
||||
float scaling = 1.0f / rho_b;
|
||||
for (uint32_t i = 0; i < q->nof_rx_antennas; i++) {
|
||||
for (uint32_t j = 0; j < 2; j++) {
|
||||
cf_t *ptr;
|
||||
ptr = q->sf_symbols_m[i] + nof_re_symbol * (j * nof_symbols_slot + 0);
|
||||
srslte_vec_sc_prod_cfc(ptr, scaling, ptr, nof_re_symbol);
|
||||
if (q->cell.cp == SRSLTE_CP_NORM) {
|
||||
ptr = q->sf_symbols_m[i] + nof_re_symbol * (j * nof_symbols_slot + 4);
|
||||
srslte_vec_sc_prod_cfc(ptr, scaling, ptr, nof_re_symbol);
|
||||
} else {
|
||||
ptr = q->sf_symbols_m[i] + nof_re_symbol * (j * nof_symbols_slot + 3);
|
||||
srslte_vec_sc_prod_cfc(ptr, scaling, ptr, nof_re_symbol);
|
||||
}
|
||||
if (q->cell.nof_ports == 4) {
|
||||
ptr = q->sf_symbols_m[i] + nof_re_symbol * (j * nof_symbols_slot + 1);
|
||||
srslte_vec_sc_prod_cfc(ptr, scaling, ptr, nof_re_symbol);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -601,11 +601,16 @@ int phch_worker::decode_pdsch(srslte_ra_dl_grant_t *grant, uint8_t *payload[SRSL
|
|||
valid_config = false;
|
||||
}
|
||||
|
||||
/* Set power allocation */
|
||||
/* Set power allocation according to 3GPP 36.213 clause 5.2 Downlink power allocation */
|
||||
float rho_a = 1.0f, rho_b = 1.0f;
|
||||
if (phy->config->dedicated.pdsch_cnfg_ded < LIBLTE_RRC_PDSCH_CONFIG_P_A_N_ITEMS) {
|
||||
float rho_a_db = liblte_rrc_pdsch_config_p_a_num[(int) phy->config->dedicated.pdsch_cnfg_ded];
|
||||
rho_a = powf(10.0f, rho_a_db / 20.0f) * sqrtf(2.0f);
|
||||
rho_a = powf(10.0f, rho_a_db / 20.0f) * ((cell.nof_ports == 1) ? 1.0f : sqrtf(2.0f));
|
||||
}
|
||||
if (phy->config->common.pdsch_cnfg.p_b < 4) {
|
||||
uint32_t idx0 = (cell.nof_ports == 1) ? 0 : 1;
|
||||
float cell_specific_ratio = pdsch_cfg_cell_specific_ratio_table[idx0][phy->config->common.pdsch_cnfg.p_b];
|
||||
rho_b = sqrtf(cell_specific_ratio);
|
||||
}
|
||||
srslte_ue_dl_set_power_alloc(&ue_dl, rho_a, rho_b);
|
||||
|
||||
|
|
Loading…
Reference in New Issue