mirror of https://github.com/PentHertz/srsLTE.git
extended resource allocation for NR
This commit is contained in:
parent
766a43225d
commit
9a320baf37
|
@ -155,6 +155,18 @@ typedef enum SRSLTE_API {
|
||||||
srslte_dci_format_nr_2_3 ///< @brief Transmission of a group of TPC commands for SRS transmissions by one or more UEs
|
srslte_dci_format_nr_2_3 ///< @brief Transmission of a group of TPC commands for SRS transmissions by one or more UEs
|
||||||
} srslte_dci_format_nr_t;
|
} srslte_dci_format_nr_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Overhead configuration provided by higher layers
|
||||||
|
* @remark Described in TS 38.331 V15.10.0 PDSCH-ServingCellConfig
|
||||||
|
* @remark Described in TS 38.331 V15.10.0 PUSCH-ServingCellConfig
|
||||||
|
*/
|
||||||
|
typedef enum SRSLTE_API {
|
||||||
|
srslte_xoverhead_0 = 0,
|
||||||
|
srslte_xoverhead_6,
|
||||||
|
srslte_xoverhead_12,
|
||||||
|
srslte_xoverhead_18
|
||||||
|
} srslte_xoverhead_t;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief NR carrier parameters. It is a combination of fixed cell and bandwidth-part (BWP)
|
* @brief NR carrier parameters. It is a combination of fixed cell and bandwidth-part (BWP)
|
||||||
*/
|
*/
|
||||||
|
@ -236,6 +248,15 @@ typedef struct SRSLTE_API {
|
||||||
uint32_t n_cce;
|
uint32_t n_cce;
|
||||||
} srslte_pdcch_cfg_nr_t;
|
} srslte_pdcch_cfg_nr_t;
|
||||||
|
|
||||||
|
typedef struct SRSLTE_API {
|
||||||
|
uint32_t max_mimo_layers; ///< @brief DL: Indicates the maximum number of MIMO layers to be used for PDSCH in all BWPs
|
||||||
|
///< of this serving cell. (see TS 38.212 [17], clause 5.4.2.1). UL: Indicates the maximum
|
||||||
|
///< MIMO layer to be used for PUSCH in all BWPs of the normal UL of this serving cell (see
|
||||||
|
///< TS 38.212 [17], clause 5.4.2.1)
|
||||||
|
srslte_xoverhead_t xoverhead; ///< Accounts for overhead from CSI-RS, CORESET, etc. If the field is absent, the UE
|
||||||
|
///< applies value xOh0 (see TS 38.214 [19], clause 5.1.3.2).
|
||||||
|
} srslte_serving_cell_cfg_t;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Calculates the bandwidth of a given CORESET in physical resource blocks (PRB) . This function uses the
|
* @brief Calculates the bandwidth of a given CORESET in physical resource blocks (PRB) . This function uses the
|
||||||
* frequency domain resources bit-map for counting the number of PRB.
|
* frequency domain resources bit-map for counting the number of PRB.
|
||||||
|
|
|
@ -32,7 +32,6 @@
|
||||||
|
|
||||||
#include "srslte/phy/common/phy_common_nr.h"
|
#include "srslte/phy/common/phy_common_nr.h"
|
||||||
#include "srslte/phy/fec/softbuffer.h"
|
#include "srslte/phy/fec/softbuffer.h"
|
||||||
#include "srslte/phy/phch/ra.h"
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief PDSCH DMRS type
|
* @brief PDSCH DMRS type
|
||||||
|
@ -151,6 +150,10 @@ typedef struct SRSLTE_API {
|
||||||
srslte_pdsch_dmrs_cfg_t dmrs_cfg_typeA;
|
srslte_pdsch_dmrs_cfg_t dmrs_cfg_typeA;
|
||||||
srslte_pdsch_dmrs_cfg_t dmrs_cfg_typeB;
|
srslte_pdsch_dmrs_cfg_t dmrs_cfg_typeB;
|
||||||
srslte_mcs_table_t mcs_table;
|
srslte_mcs_table_t mcs_table;
|
||||||
|
|
||||||
|
/// Parameters provided by PDSCH-ServingCellConfig
|
||||||
|
srslte_serving_cell_cfg_t serving_cell_cfg;
|
||||||
|
|
||||||
} srslte_pdsch_cfg_nr_t;
|
} srslte_pdsch_cfg_nr_t;
|
||||||
|
|
||||||
#endif // SRSLTE_PDSCH_CFG_NR_H
|
#endif // SRSLTE_PDSCH_CFG_NR_H
|
||||||
|
|
|
@ -43,7 +43,9 @@
|
||||||
|
|
||||||
typedef struct SRSLTE_API {
|
typedef struct SRSLTE_API {
|
||||||
srslte_mod_t mod;
|
srslte_mod_t mod;
|
||||||
int tbs;
|
uint32_t N_L; ///< the number of transmission layers that the transport block is mapped onto
|
||||||
|
int tbs; ///< Payload size, TS 38.212 refers to it as A
|
||||||
|
double R; ///< Target LDPC rate
|
||||||
int rv;
|
int rv;
|
||||||
uint32_t nof_bits;
|
uint32_t nof_bits;
|
||||||
uint32_t cw_idx;
|
uint32_t cw_idx;
|
||||||
|
@ -51,9 +53,27 @@ typedef struct SRSLTE_API {
|
||||||
|
|
||||||
// this is for debugging and metrics purposes
|
// this is for debugging and metrics purposes
|
||||||
uint32_t mcs_idx;
|
uint32_t mcs_idx;
|
||||||
|
|
||||||
|
/// Soft-buffers pointers
|
||||||
|
union {
|
||||||
|
srslte_softbuffer_tx_t* tx;
|
||||||
|
srslte_softbuffer_rx_t* rx;
|
||||||
|
} softbuffer;
|
||||||
} srslte_ra_tb_nr_t;
|
} srslte_ra_tb_nr_t;
|
||||||
|
|
||||||
SRSLTE_API int
|
/**
|
||||||
srslte_ra_nr_tbs(const srslte_pdsch_cfg_nr_t* pdsch_cfg, const srslte_pdsch_grant_nr_t* grant, uint32_t mcs_idx);
|
* @brief Calculates shared channel TBS
|
||||||
|
* @param N_re Number of resource elements
|
||||||
|
* @param S TB scaling, used in rare occasions. Set to 1, 0, NAN or INF if unused.
|
||||||
|
* @param R Target Rate
|
||||||
|
* @param Qm Modulation level
|
||||||
|
* @param nof_layers Number of layers
|
||||||
|
* @return The transport block size
|
||||||
|
*/
|
||||||
|
SRSLTE_API uint32_t srslte_ra_nr_tbs(uint32_t N_re, double S, double R, uint32_t Qm, uint32_t nof_layers);
|
||||||
|
|
||||||
|
SRSLTE_API int srslte_ra_nr_fill_tb(const srslte_pdsch_cfg_nr_t* pdsch_cfg,
|
||||||
|
const srslte_pdsch_grant_nr_t* grant,
|
||||||
|
uint32_t mcs_idx,
|
||||||
|
srslte_ra_tb_nr_t* tb);
|
||||||
#endif // SRSLTE_RA_NR_H
|
#endif // SRSLTE_RA_NR_H
|
||||||
|
|
|
@ -222,6 +222,20 @@ static int ra_nr_determine_N_re(const srslte_pdsch_cfg_nr_t* pdsch_cfg, const sr
|
||||||
|
|
||||||
// the overhead configured by higher layer parameter xOverhead in PDSCH-ServingCellConfig
|
// the overhead configured by higher layer parameter xOverhead in PDSCH-ServingCellConfig
|
||||||
uint32_t n_prb_oh = 0;
|
uint32_t n_prb_oh = 0;
|
||||||
|
switch (pdsch_cfg->serving_cell_cfg.xoverhead) {
|
||||||
|
case srslte_xoverhead_0:
|
||||||
|
n_prb_oh = 0;
|
||||||
|
break;
|
||||||
|
case srslte_xoverhead_6:
|
||||||
|
n_prb_oh = 6;
|
||||||
|
break;
|
||||||
|
case srslte_xoverhead_12:
|
||||||
|
n_prb_oh = 12;
|
||||||
|
break;
|
||||||
|
case srslte_xoverhead_18:
|
||||||
|
n_prb_oh = 18;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
// Compute total number of n_re used for PDSCH
|
// Compute total number of n_re used for PDSCH
|
||||||
uint32_t n_re_prime = SRSLTE_NRE * n_sh_symb - n_prb_dmrs - n_prb_oh;
|
uint32_t n_re_prime = SRSLTE_NRE * n_sh_symb - n_prb_dmrs - n_prb_oh;
|
||||||
|
@ -291,7 +305,27 @@ static double ra_nr_get_scaling(uint32_t tb_scaling_field)
|
||||||
return NAN;
|
return NAN;
|
||||||
}
|
}
|
||||||
|
|
||||||
int srslte_ra_nr_tbs(const srslte_pdsch_cfg_nr_t* pdsch_cfg, const srslte_pdsch_grant_nr_t* grant, uint32_t mcs_idx)
|
uint32_t srslte_ra_nr_tbs(uint32_t N_re, double S, double R, uint32_t Qm, uint32_t nof_layers)
|
||||||
|
{
|
||||||
|
if (!isnormal(S)) {
|
||||||
|
S = 1.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2) Intermediate number of information bits (N info ) is obtained by N inf o = N RE · R · Q m · υ .
|
||||||
|
uint32_t n_info = (uint32_t)(N_re * S * R * Qm * nof_layers);
|
||||||
|
|
||||||
|
// 3) When n_info ≤ 3824
|
||||||
|
if (n_info <= 3824) {
|
||||||
|
return ra_nr_tbs_from_n_info3(n_info);
|
||||||
|
}
|
||||||
|
// 4) When n_info > 3824
|
||||||
|
return ra_nr_tbs_from_n_info4(n_info, R);
|
||||||
|
}
|
||||||
|
|
||||||
|
int srslte_ra_nr_fill_tb(const srslte_pdsch_cfg_nr_t* pdsch_cfg,
|
||||||
|
const srslte_pdsch_grant_nr_t* grant,
|
||||||
|
uint32_t mcs_idx,
|
||||||
|
srslte_ra_tb_nr_t* tb)
|
||||||
{
|
{
|
||||||
// Get target Rate
|
// Get target Rate
|
||||||
double R =
|
double R =
|
||||||
|
@ -330,19 +364,16 @@ int srslte_ra_nr_tbs(const srslte_pdsch_cfg_nr_t* pdsch_cfg, const srslte_pdsch_
|
||||||
}
|
}
|
||||||
|
|
||||||
// 1) The UE shall first determine the number of REs (N RE ) within the slot.
|
// 1) The UE shall first determine the number of REs (N RE ) within the slot.
|
||||||
int n_re = ra_nr_determine_N_re(pdsch_cfg, grant);
|
int N_re = ra_nr_determine_N_re(pdsch_cfg, grant);
|
||||||
if (n_re < SRSLTE_SUCCESS) {
|
if (N_re < SRSLTE_SUCCESS) {
|
||||||
return SRSLTE_ERROR;
|
return SRSLTE_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 2) Intermediate number of information bits (N info ) is obtained by N inf o = N RE · R · Q m · υ .
|
// Steps 2,3,4
|
||||||
uint32_t n_info = (uint32_t)(n_re * S * R * Qm * grant->nof_layers);
|
tb->tbs = (int)srslte_ra_nr_tbs(N_re, S, R, Qm, grant->nof_layers);
|
||||||
|
tb->R = R;
|
||||||
|
tb->mod = m;
|
||||||
|
tb->nof_bits = N_re * Qm * grant->nof_layers;
|
||||||
|
|
||||||
// 3) When n_info ≤ 3824
|
return SRSLTE_SUCCESS;
|
||||||
if (n_info <= 3824) {
|
|
||||||
return (int)ra_nr_tbs_from_n_info3(n_info);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 4) When n_info > 3824
|
|
||||||
return (int)ra_nr_tbs_from_n_info4(n_info, R);
|
|
||||||
}
|
}
|
Loading…
Reference in New Issue