Symbol based PDCCH processing
1. Refactor PDCCH PHY functions to take rxdataF of one OFDM symbol and produce LLR for each search space. The modified functions take rxdataF in a different format than that produced by nr_slot_fep(). So for now a memcpy is used to change the array structure. Once nr_slot_fep() is modified, this memcpy will no longer be needed and will be removed. 2. Modify DCI functions to decode DCI in the last PDCCH symbol and inidcate to MAC once. 3. Fix PDCCH monitoring for start symbol > 0. 4. Fix multiple PDCCH monitoring within slot. Co-authored-by: Sakthivel Velumani <mail@sakthi.me>
This commit is contained in:
co-authored by
Sakthivel Velumani
parent
07ce1ed145
commit
ece9d51db3
@@ -805,17 +805,12 @@ void nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue,
|
||||
uint16_t BWPStart,
|
||||
int32_t pdcch_est_size,
|
||||
c16_t pdcch_dl_ch_estimates[][pdcch_est_size],
|
||||
c16_t rxdataF[][ue->frame_parms.samples_per_slot_wCP])
|
||||
c16_t rxdataF[ue->frame_parms.nb_antennas_rx][ue->frame_parms.ofdm_symbol_size])
|
||||
{
|
||||
int slot = proc->nr_slot_rx;
|
||||
unsigned char aarx;
|
||||
unsigned short k;
|
||||
unsigned int pilot_cnt;
|
||||
int ch_offset,symbol_offset;
|
||||
|
||||
ch_offset = ue->frame_parms.ofdm_symbol_size*symbol;
|
||||
|
||||
symbol_offset = ue->frame_parms.ofdm_symbol_size*symbol;
|
||||
|
||||
int nb_rb_coreset=0;
|
||||
int coreset_start_rb=0;
|
||||
@@ -830,8 +825,7 @@ void nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue,
|
||||
unsigned short coreset_start_subcarrier = first_carrier_offset+(BWPStart + coreset_start_rb)*12;
|
||||
|
||||
#ifdef DEBUG_PDCCH
|
||||
printf("PDCCH Channel Estimation : ch_offset %d, OFDM size %d, Ncp=%d, slot=%d, symbol %d\n",
|
||||
ch_offset,
|
||||
printf("PDCCH Channel Estimation : OFDM size %d, Ncp=%d, slot=%d, symbol %d\n",
|
||||
ue->frame_parms.ofdm_symbol_size,
|
||||
ue->frame_parms.Ncp,
|
||||
slot,
|
||||
@@ -858,8 +852,8 @@ void nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue,
|
||||
|
||||
k = coreset_start_subcarrier;
|
||||
c16_t *pil = &pilot[dmrs_ref * 3];
|
||||
c16_t *rxF = &rxdataF[aarx][symbol_offset + k + 1];
|
||||
c16_t *dl_ch = &pdcch_dl_ch_estimates[aarx][ch_offset];
|
||||
c16_t *rxF = &rxdataF[aarx][k + 1];
|
||||
c16_t *dl_ch = &pdcch_dl_ch_estimates[aarx][0];
|
||||
|
||||
memset(dl_ch, 0, sizeof(c16_t) * ue->frame_parms.ofdm_symbol_size);
|
||||
|
||||
@@ -879,29 +873,29 @@ void nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue,
|
||||
|
||||
if (k >= ue->frame_parms.ofdm_symbol_size) {
|
||||
k -= ue->frame_parms.ofdm_symbol_size;
|
||||
rxF = &rxdataF[aarx][(symbol_offset + k + 1)];
|
||||
rxF = &rxdataF[aarx][k + 1];
|
||||
}
|
||||
multadd_real_vector_complex_scalar(fm, c16mulShift(*pil++, *rxF, 15), dl_ch, 16);
|
||||
k = (k + 4) % ue->frame_parms.ofdm_symbol_size;
|
||||
rxF = (c16_t *)&rxdataF[aarx][(symbol_offset + k + 1)];
|
||||
rxF = (c16_t *)&rxdataF[aarx][k + 1)];
|
||||
|
||||
multadd_real_vector_complex_scalar(fr, c16mulShift(*pil++, *rxF, 15), dl_ch, 16);
|
||||
dl_ch += 12;
|
||||
k = (k + 4) % ue->frame_parms.ofdm_symbol_size;
|
||||
rxF = (c16_t *)&rxdataF[aarx][(symbol_offset + k + 1)];
|
||||
rxF = (c16_t *)&rxdataF[aarx][k + 1];
|
||||
|
||||
for (pilot_cnt=3; pilot_cnt<(3*nb_rb_coreset); pilot_cnt += 3) {
|
||||
multadd_real_vector_complex_scalar(fl, c16mulShift(*pil++, *rxF, 15), dl_ch, 16);
|
||||
k = (k + 4) % ue->frame_parms.ofdm_symbol_size;
|
||||
rxF = (c16_t *)&rxdataF[aarx][(symbol_offset + k + 1)];
|
||||
rxF = (c16_t *)&rxdataF[aarx][k + 1];
|
||||
|
||||
multadd_real_vector_complex_scalar(fm, c16mulShift(*pil++, *rxF, 15), dl_ch, 16);
|
||||
k = (k + 4) % ue->frame_parms.ofdm_symbol_size;
|
||||
rxF = (c16_t *)&rxdataF[aarx][(symbol_offset + k + 1)];
|
||||
rxF = (c16_t *)&rxdataF[aarx][k + 1];
|
||||
multadd_real_vector_complex_scalar(fr, c16mulShift(*pil++, *rxF, 15), dl_ch, 16);
|
||||
dl_ch += 12;
|
||||
k = (k + 4) % ue->frame_parms.ofdm_symbol_size;
|
||||
rxF = (c16_t *)&rxdataF[aarx][(symbol_offset + k + 1)];
|
||||
rxF = (c16_t *)&rxdataF[aarx][k + 1];
|
||||
}
|
||||
#else //ELSE CH_INTERP
|
||||
c32_t ch_sum = {0, 0};
|
||||
@@ -915,7 +909,7 @@ void nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue,
|
||||
ch_sum.r += ch.r;
|
||||
ch_sum.i += ch.i;
|
||||
k = (k + 4) % ue->frame_parms.ofdm_symbol_size;
|
||||
rxF = (c16_t *)&rxdataF[aarx][(symbol_offset + k + 1)];
|
||||
rxF = (c16_t *)&rxdataF[aarx][k + 1];
|
||||
|
||||
if (pilot_cnt % 3 == 2) {
|
||||
ch.r = ch_sum.r / 3;
|
||||
|
||||
@@ -52,7 +52,7 @@ void nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue,
|
||||
uint16_t BWPStart,
|
||||
int32_t pdcch_est_size,
|
||||
c16_t pdcch_dl_ch_estimates[][pdcch_est_size],
|
||||
c16_t rxdataF[][ue->frame_parms.samples_per_slot_wCP]);
|
||||
c16_t rxdataF[ue->frame_parms.nb_antennas_rx][ue->frame_parms.ofdm_symbol_size]);
|
||||
|
||||
c32_t nr_pbch_dmrs_correlation(const NR_DL_FRAME_PARMS *fp,
|
||||
const UE_nr_rxtx_proc_t *proc,
|
||||
|
||||
Reference in New Issue
Block a user