NR UE: further simplify and optimize the usage of the PDCCH LLR array
The initial version of this patch was provided by "Laurent THOMAS <laurent.thomas@open-cells.com>"
This commit is contained in:
@@ -70,11 +70,10 @@
|
|||||||
// after removing the 3 DMRS RE, the RB contains 9 RE with PDCCH
|
// after removing the 3 DMRS RE, the RB contains 9 RE with PDCCH
|
||||||
#define RE_PER_RB_OUT_DMRS 9
|
#define RE_PER_RB_OUT_DMRS 9
|
||||||
|
|
||||||
static void nr_pdcch_demapping_deinterleaving(c16_t *llr,
|
static void nr_pdcch_demapping_deinterleaving(uint32_t coreset_nbr_rb,
|
||||||
|
c16_t llr[][coreset_nbr_rb * RE_PER_RB_OUT_DMRS],
|
||||||
c16_t *e_rx,
|
c16_t *e_rx,
|
||||||
uint8_t coreset_time_dur,
|
uint8_t coreset_time_dur,
|
||||||
uint8_t start_symbol,
|
|
||||||
uint32_t coreset_nbr_rb,
|
|
||||||
uint8_t reg_bundle_size_L,
|
uint8_t reg_bundle_size_L,
|
||||||
uint8_t coreset_interleaver_size_R,
|
uint8_t coreset_interleaver_size_R,
|
||||||
uint8_t n_shift,
|
uint8_t n_shift,
|
||||||
@@ -168,15 +167,14 @@ static void nr_pdcch_demapping_deinterleaving(c16_t *llr,
|
|||||||
}
|
}
|
||||||
|
|
||||||
int rb_count = 0;
|
int rb_count = 0;
|
||||||
const int data_sc = RE_PER_RB_OUT_DMRS; // 9 sub-carriers with data per PRB
|
|
||||||
for (int c_id = 0; c_id < number_of_candidates; c_id++) {
|
for (int c_id = 0; c_id < number_of_candidates; c_id++) {
|
||||||
for (int symbol_idx = start_symbol; symbol_idx < start_symbol + coreset_time_dur; symbol_idx++) {
|
for (int symbol_idx = 0; symbol_idx < coreset_time_dur; symbol_idx++) {
|
||||||
for (int cce_count = 0; cce_count < L[c_id]; cce_count++) {
|
for (int cce_count = 0; cce_count < L[c_id]; cce_count++) {
|
||||||
for (int k = 0; k < NR_NB_REG_PER_CCE / reg_bundle_size_L; k++) { // loop over REG bundles
|
for (int k = 0; k < NR_NB_REG_PER_CCE / reg_bundle_size_L; k++) { // loop over REG bundles
|
||||||
int f = f_bundle_j_list_ord[c_id][k + NR_NB_REG_PER_CCE * cce_count / reg_bundle_size_L];
|
int f = f_bundle_j_list_ord[c_id][k + NR_NB_REG_PER_CCE * cce_count / reg_bundle_size_L];
|
||||||
c16_t *in = llr + (f * B_rb + symbol_idx * coreset_nbr_rb) * data_sc;
|
c16_t *in = llr[symbol_idx] + f * B_rb * RE_PER_RB_OUT_DMRS;
|
||||||
// loop over the RBs of the bundle
|
// loop over the RBs of the bundle
|
||||||
memcpy(e_rx + data_sc * rb_count, in, B_rb * data_sc * sizeof(*e_rx));
|
memcpy(e_rx + RE_PER_RB_OUT_DMRS * rb_count, in, B_rb * RE_PER_RB_OUT_DMRS * sizeof(*e_rx));
|
||||||
rb_count += B_rb;
|
rb_count += B_rb;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -347,18 +345,18 @@ void nr_rx_pdcch(PHY_VARS_NR_UE *ue,
|
|||||||
get_coreset_rballoc(rel15->coreset.frequency_domain_resource,&n_rb,&rb_offset);
|
get_coreset_rballoc(rel15->coreset.frequency_domain_resource,&n_rb,&rb_offset);
|
||||||
const int antRx = frame_parms->nb_antennas_rx;
|
const int antRx = frame_parms->nb_antennas_rx;
|
||||||
|
|
||||||
// Pointer to llrs, 4-bit resolution.
|
// Pointer to llrs
|
||||||
int32_t llr_size = (rel15->coreset.duration + rel15->coreset.StartSymbolIndex) * n_rb * RE_PER_RB_OUT_DMRS;
|
const int symb_size = n_rb * RE_PER_RB_OUT_DMRS;
|
||||||
c16_t llr[llr_size];
|
c16_t llr[rel15->coreset.duration][symb_size];
|
||||||
|
|
||||||
LOG_D(NR_PHY_DCI,
|
LOG_D(NR_PHY_DCI,
|
||||||
"pdcch coreset: freq %x, n_rb %d, rb_offset %d\n",
|
"pdcch coreset: freq %x, n_rb %d, rb_offset %d\n",
|
||||||
rel15->coreset.frequency_domain_resource[0],
|
rel15->coreset.frequency_domain_resource[0],
|
||||||
n_rb,
|
n_rb,
|
||||||
rb_offset);
|
rb_offset);
|
||||||
for (int s = rel15->coreset.StartSymbolIndex; s < rel15->coreset.StartSymbolIndex + rel15->coreset.duration; s++) {
|
for (int s = 0; s < rel15->coreset.duration; s++) {
|
||||||
LOG_D(NR_PHY_DCI, "in nr_pdcch_extract_rbs_single(rxdataF -> rxdataF_ext || dl_ch_estimates -> dl_ch_estimates_ext)\n");
|
LOG_D(NR_PHY_DCI, "in nr_pdcch_extract_rbs_single(rxdataF -> rxdataF_ext || dl_ch_estimates -> dl_ch_estimates_ext)\n");
|
||||||
const int arraySz = ceil_mod(n_rb * RE_PER_RB_OUT_DMRS, 32);
|
const int arraySz = ceil_mod(symb_size, 32);
|
||||||
__attribute__((aligned(32))) c16_t rxdataF_ext[antRx][arraySz];
|
__attribute__((aligned(32))) c16_t rxdataF_ext[antRx][arraySz];
|
||||||
__attribute__((aligned(32))) c16_t pdcch_dl_ch_estimates_ext[antRx][arraySz];
|
__attribute__((aligned(32))) c16_t pdcch_dl_ch_estimates_ext[antRx][arraySz];
|
||||||
nr_pdcch_extract_rbs_single(ue->frame_parms.samples_per_slot_wCP,
|
nr_pdcch_extract_rbs_single(ue->frame_parms.samples_per_slot_wCP,
|
||||||
@@ -369,7 +367,7 @@ void nr_rx_pdcch(PHY_VARS_NR_UE *ue,
|
|||||||
arraySz,
|
arraySz,
|
||||||
rxdataF_ext,
|
rxdataF_ext,
|
||||||
pdcch_dl_ch_estimates_ext,
|
pdcch_dl_ch_estimates_ext,
|
||||||
s,
|
rel15->coreset.StartSymbolIndex + s,
|
||||||
frame_parms,
|
frame_parms,
|
||||||
rel15->coreset.frequency_domain_resource,
|
rel15->coreset.frequency_domain_resource,
|
||||||
rel15->BWPStart);
|
rel15->BWPStart);
|
||||||
@@ -396,20 +394,19 @@ void nr_rx_pdcch(PHY_VARS_NR_UE *ue,
|
|||||||
antRx,
|
antRx,
|
||||||
log2_maxh); // log2_maxh+I0_shift
|
log2_maxh); // log2_maxh+I0_shift
|
||||||
|
|
||||||
UEscopeCopy(ue, pdcchRxdataF_comp, rxdataF_comp, sizeof(struct complex16), antRx, n_rb * RE_PER_RB_OUT_DMRS, 0);
|
UEscopeCopy(ue, pdcchRxdataF_comp, rxdataF_comp, sizeof(struct complex16), antRx, symb_size, 0);
|
||||||
|
|
||||||
if (antRx > 1)
|
if (antRx > 1)
|
||||||
nr_pdcch_detection_mrc(arraySz, rxdataF_comp);
|
nr_pdcch_detection_mrc(arraySz, rxdataF_comp);
|
||||||
|
|
||||||
nr_pdcch_llr(n_rb * RE_PER_RB_OUT_DMRS, rxdataF_comp[0], llr + s * n_rb * RE_PER_RB_OUT_DMRS);
|
nr_pdcch_llr(symb_size, rxdataF_comp[0], llr[s]);
|
||||||
}
|
}
|
||||||
UEscopeCopy(ue, pdcchLlr, llr, sizeof(c16_t), 1, llr_size, 0);
|
UEscopeCopy(ue, pdcchLlr, llr, sizeof(c16_t), 1, rel15->coreset.duration * symb_size, 0);
|
||||||
|
|
||||||
nr_pdcch_demapping_deinterleaving(llr,
|
nr_pdcch_demapping_deinterleaving(n_rb,
|
||||||
|
llr,
|
||||||
pdcch_e_rx,
|
pdcch_e_rx,
|
||||||
rel15->coreset.duration,
|
rel15->coreset.duration,
|
||||||
rel15->coreset.StartSymbolIndex,
|
|
||||||
n_rb,
|
|
||||||
rel15->coreset.RegBundleSize,
|
rel15->coreset.RegBundleSize,
|
||||||
rel15->coreset.InterleaverSize,
|
rel15->coreset.InterleaverSize,
|
||||||
rel15->coreset.ShiftIndex,
|
rel15->coreset.ShiftIndex,
|
||||||
|
|||||||
Reference in New Issue
Block a user