fixes in DLSCH RB extraction

Signed-off-by: Francesco Mani <email@francescomani.it>
This commit is contained in:
Francesco Mani
2026-06-02 16:32:49 +02:00
parent 6df92d1356
commit 91665cf51c

View File

@@ -238,8 +238,8 @@ static void nr_dlsch_extract_rbs(uint32_t rxdataF_sz,
uint32_t csi_res_odd = (csi_res_bitmap >> 16) & 0xfff; uint32_t csi_res_odd = (csi_res_bitmap >> 16) & 0xfff;
AssertFatal((dmrs_rb_bitmap & csi_res_even) == 0, "DMRS RE overlapping with CSI RE, it shouldn't happen\n"); AssertFatal((dmrs_rb_bitmap & csi_res_even) == 0, "DMRS RE overlapping with CSI RE, it shouldn't happen\n");
AssertFatal((dmrs_rb_bitmap & csi_res_odd) == 0, "DMRS RE overlapping with CSI RE, it shouldn't happen\n"); AssertFatal((dmrs_rb_bitmap & csi_res_odd) == 0, "DMRS RE overlapping with CSI RE, it shouldn't happen\n");
uint32_t dmrs_csi_overlap_even = csi_res_even + dmrs_rb_bitmap; uint32_t dmrs_csi_overlap_even = csi_res_even | dmrs_rb_bitmap;
uint32_t dmrs_csi_overlap_odd = csi_res_odd + dmrs_rb_bitmap; uint32_t dmrs_csi_overlap_odd = csi_res_odd | dmrs_rb_bitmap;
int8_t validDmrsEst; int8_t validDmrsEst;
if (chest_time_type == 0) if (chest_time_type == 0)
validDmrsEst = get_valid_dmrs_idx_for_channel_est(dlsch_config->dlDmrsSymbPos, symbol); validDmrsEst = get_valid_dmrs_idx_for_channel_est(dlsch_config->dlDmrsSymbPos, symbol);
@@ -248,16 +248,17 @@ static void nr_dlsch_extract_rbs(uint32_t rxdataF_sz,
int pos = 0; int pos = 0;
int block_start, block_end; int block_start, block_end;
int offset = 0;
while (find_next_rb_block(freq_alloc->bitmap, dlsch_config->BWPSize, &pos, &block_start, &block_end)) { while (find_next_rb_block(freq_alloc->bitmap, dlsch_config->BWPSize, &pos, &block_start, &block_end)) {
int start_rb = block_start + dlsch_config->BWPStart; int start_rb = block_start + dlsch_config->BWPStart;
int nb_rb = block_end - block_start + 1; int nb_rb = block_end - block_start + 1;
const int start_re = (fp->first_carrier_offset + start_rb * NR_NB_SC_PER_RB) % fp->ofdm_symbol_size; const int start_re = (fp->first_carrier_offset + start_rb * NR_NB_SC_PER_RB) % fp->ofdm_symbol_size;
for (int aarx = 0; aarx < fp->nb_antennas_rx; aarx++) { for (int aarx = 0; aarx < fp->nb_antennas_rx; aarx++) {
c16_t *rxF_ext = rxdataF_ext[aarx]; c16_t *rxF_ext = rxdataF_ext[aarx] + offset;
c16_t *rxF = &rxdataF[aarx][symbol * fp->ofdm_symbol_size]; c16_t *rxF = &rxdataF[aarx][symbol * fp->ofdm_symbol_size];
for (int l = 0; l < Nl; l++) { for (int l = 0; l < Nl; l++) {
int32_t *dl_ch0 = &dl_ch_estimates[(l * fp->nb_antennas_rx) + aarx][validDmrsEst * fp->ofdm_symbol_size]; int32_t *dl_ch0 = &dl_ch_estimates[(l * fp->nb_antennas_rx) + aarx][validDmrsEst * fp->ofdm_symbol_size];
int32_t *dl_ch0_ext = dl_ch_estimates_ext[(l * fp->nb_antennas_rx) + aarx]; int32_t *dl_ch0_ext = dl_ch_estimates_ext[(l * fp->nb_antennas_rx) + aarx] + offset;
if (pilots == 0 && csi_res_bitmap == 0) { // data symbol only if (pilots == 0 && csi_res_bitmap == 0) { // data symbol only
if (l == 0) { if (l == 0) {
if (start_re + nb_rb * NR_NB_SC_PER_RB <= fp->ofdm_symbol_size) { if (start_re + nb_rb * NR_NB_SC_PER_RB <= fp->ofdm_symbol_size) {
@@ -292,6 +293,7 @@ static void nr_dlsch_extract_rbs(uint32_t rxdataF_sz,
} }
} }
} }
offset += nb_rb * NR_NB_SC_PER_RB;
} }
} }