From 5b91612812a0f97d2300b9efc2078f8813f45cce Mon Sep 17 00:00:00 2001 From: francescomani Date: Fri, 12 May 2023 15:57:23 +0200 Subject: [PATCH 1/2] printing gNB MIMO stats only when reported --- openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c | 3 +++ openair2/LAYER2/NR_MAC_gNB/main.c | 17 +++++++++-------- openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h | 5 +---- 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c index e1716458d2..709835ab48 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c @@ -821,6 +821,7 @@ static void extract_pucch_csi_report(NR_CSI_MeasConfig_t *csi_MeasConfig, evaluate_rsrp_report(UE,sched_ctrl,csi_report_id,payload,&cumul_bits,reportQuantity_type); break; case NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_CQI: + sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.print_report = true; cri_bitlen = csi_report->csi_meas_bitlen.cri_bitlen; if(cri_bitlen) evaluate_cri_report(payload,cri_bitlen,cumul_bits,sched_ctrl); @@ -834,6 +835,7 @@ static void extract_pucch_csi_report(NR_CSI_MeasConfig_t *csi_MeasConfig, evaluate_cqi_report(payload,csi_report,cumul_bits,r_index,UE,cqi_table); break; case NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_PMI_CQI: + sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.print_report = true; cri_bitlen = csi_report->csi_meas_bitlen.cri_bitlen; if(cri_bitlen) evaluate_cri_report(payload,cri_bitlen,cumul_bits,sched_ctrl); @@ -850,6 +852,7 @@ static void extract_pucch_csi_report(NR_CSI_MeasConfig_t *csi_MeasConfig, evaluate_cqi_report(payload,csi_report,cumul_bits,r_index,UE,cqi_table); break; case NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_LI_PMI_CQI: + sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.print_report = true; cri_bitlen = csi_report->csi_meas_bitlen.cri_bitlen; if(cri_bitlen) evaluate_cri_report(payload,cri_bitlen,cumul_bits,sched_ctrl); diff --git a/openair2/LAYER2/NR_MAC_gNB/main.c b/openair2/LAYER2/NR_MAC_gNB/main.c index d7cd8e1b4b..c64c975f0e 100644 --- a/openair2/LAYER2/NR_MAC_gNB/main.c +++ b/openair2/LAYER2/NR_MAC_gNB/main.c @@ -109,14 +109,15 @@ size_t dump_mac_stats(gNB_MAC_INST *gNB, char *output, size_t strlen, bool reset avg_rsrp, stats->num_rsrp_meas); - output += snprintf(output, - end - output, - "UE %04x: CQI %d, RI %d, PMI (%d,%d)\n", - UE->rnti, - sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.wb_cqi_1tb, - sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.ri+1, - sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.pmi_x1, - sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.pmi_x2); + if(sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.print_report) + output += snprintf(output, + end - output, + "UE %04x: CQI %d, RI %d, PMI (%d,%d)\n", + UE->rnti, + sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.wb_cqi_1tb, + sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.ri+1, + sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.pmi_x1, + sched_ctrl->CSI_report.cri_ri_li_pmi_cqi_report.pmi_x2); if (stats->srs_stats[0] != '\0') { output += snprintf(output, end - output, "UE %04x: %s\n", UE->rnti, stats->srs_stats); diff --git a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h index 5f25713650..dfeaf5f89c 100644 --- a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h +++ b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h @@ -467,10 +467,6 @@ typedef struct NR_bler_stats { */ #define MAX_NR_OF_REPORTED_RS 4 -typedef enum NR_CSI_Report_Config { - CSI_Report_PR_cri_ri_li_pmi_cqi_report, - CSI_Report_PR_ssb_cri_report -} NR_CSI_Report_Config_PR; struct CRI_RI_LI_PMI_CQI { uint8_t cri; uint8_t ri; @@ -481,6 +477,7 @@ struct CRI_RI_LI_PMI_CQI { uint8_t wb_cqi_2tb; uint8_t cqi_table; uint8_t csi_report_id; + bool print_report; }; typedef struct CRI_SSB_RSRP { From 1a123cfe6a2336686cabc68dcf4681704d9c7f3c Mon Sep 17 00:00:00 2001 From: francescomani Date: Mon, 15 May 2023 15:27:50 +0200 Subject: [PATCH 2/2] improvements in scheduling reception of CSI-RS and logging --- .../nfapi/public_inc/fapi_nr_ue_interface.h | 1 + openair1/PHY/NR_UE_TRANSPORT/csi_rx.c | 122 +++++++++++------- openair1/SCHED_NR_UE/defs.h | 2 +- openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c | 117 +++++++++++++---- 4 files changed, 173 insertions(+), 69 deletions(-) diff --git a/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h b/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h index 95ae91b4d4..a425d6b0f5 100644 --- a/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h +++ b/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h @@ -503,6 +503,7 @@ typedef struct { uint16_t scramb_id; // ScramblingID of the CSI-RS [3GPP TS 38.214, sec 5.2.2.3.1], Value: 0->1023 uint8_t power_control_offset; // Ratio of PDSCH EPRE to NZP CSI-RSEPRE [3GPP TS 38.214, sec 5.2.2.3.1], Value: 0->23 representing -8 to 15 dB in 1dB steps; 255: L1 is configured with ProfileSSS uint8_t power_control_offset_ss; // Ratio of NZP CSI-RS EPRE to SSB/PBCH block EPRE [3GPP TS 38.214, sec 5.2.2.3.1], Values: 0: -3dB; 1: 0dB; 2: 3dB; 3: 6dB; 255: L1 is configured with ProfileSSS + uint8_t measurement_bitmap; // bit 0 RSRP, bit 1 RI, bit 2 LI, bit 3 PMI, bit 4 CQI, bit 5 i1 } fapi_nr_dl_config_csirs_pdu_rel15_t; diff --git a/openair1/PHY/NR_UE_TRANSPORT/csi_rx.c b/openair1/PHY/NR_UE_TRANSPORT/csi_rx.c index 02f087b2ef..b38184f453 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/csi_rx.c +++ b/openair1/PHY/NR_UE_TRANSPORT/csi_rx.c @@ -834,11 +834,12 @@ int nr_ue_csi_im_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, c16_t r return 0; } -int nr_ue_csi_rs_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, c16_t rxdataF[][ue->frame_parms.samples_per_slot_wCP]) { +void nr_ue_csi_rs_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, c16_t rxdataF[][ue->frame_parms.samples_per_slot_wCP]) +{ int gNB_id = proc->gNB_id; if(!ue->csirs_vars[gNB_id]->active) { - return -1; + return; } const fapi_nr_dl_config_csirs_pdu_rel15_t *csirs_config_pdu = (fapi_nr_dl_config_csirs_pdu_rel15_t*)&ue->csirs_vars[gNB_id]->csirs_config_pdu; @@ -860,6 +861,11 @@ int nr_ue_csi_rs_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, c16_t r LOG_I(NR_PHY, "csirs_config_pdu->power_control_offset_ss = %i\n", csirs_config_pdu->power_control_offset_ss); #endif + if(csirs_config_pdu->measurement_bitmap == 0) { + LOG_E(NR_PHY, "Handling of CSI-RS for tracking not handled yet at PHY\n"); + return; + } + const NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms; int32_t csi_rs_received_signal[frame_parms->nb_antennas_rx][frame_parms->samples_per_slot_wCP]; uint8_t N_cdm_groups = 0; @@ -920,53 +926,77 @@ int nr_ue_csi_rs_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, c16_t r &rsrp_dBm, rxdataF); - nr_csi_rs_channel_estimation(ue, - proc, - csirs_config_pdu, - ue->nr_csi_info, - (const int32_t **) ue->nr_csi_info->csi_rs_generated_signal, - csi_rs_received_signal, - N_cdm_groups, - CDM_group_size, - k_prime, - l_prime, - N_ports, - j_cdm, - k_overline, - l_overline, - mem_offset, - csi_rs_ls_estimated_channel, - csi_rs_estimated_channel_freq, - &log2_re, - &log2_maxh, - &noise_power); - nr_csi_rs_ri_estimation(ue, - csirs_config_pdu, - ue->nr_csi_info, - N_ports, - mem_offset, - csi_rs_estimated_channel_freq, - log2_maxh, - &rank_indicator); + // if we need to measure only RSRP no need to do channel estimation + if (csirs_config_pdu->measurement_bitmap > 1) + nr_csi_rs_channel_estimation(ue, + proc, + csirs_config_pdu, + ue->nr_csi_info, + (const int32_t **) ue->nr_csi_info->csi_rs_generated_signal, + csi_rs_received_signal, + N_cdm_groups, + CDM_group_size, + k_prime, + l_prime, + N_ports, + j_cdm, + k_overline, + l_overline, + mem_offset, + csi_rs_ls_estimated_channel, + csi_rs_estimated_channel_freq, + &log2_re, + &log2_maxh, + &noise_power); - nr_csi_rs_pmi_estimation(ue, - csirs_config_pdu, - ue->nr_csi_info, - N_ports, - mem_offset, - csi_rs_estimated_channel_freq, - ue->nr_csi_info->csi_im_meas_computed ? ue->nr_csi_info->interference_plus_noise_power : noise_power, - rank_indicator, - log2_re, - i1, - i2, - &precoded_sinr_dB); + // bit 1 in bitmap to indicate RI measurment + if (csirs_config_pdu->measurement_bitmap & 2) { + nr_csi_rs_ri_estimation(ue, + csirs_config_pdu, + ue->nr_csi_info, + N_ports, + mem_offset, + csi_rs_estimated_channel_freq, + log2_maxh, + &rank_indicator); + } - nr_csi_rs_cqi_estimation(precoded_sinr_dB, &cqi); + // bit 3 in bitmap to indicate RI measurment + if (csirs_config_pdu->measurement_bitmap & 8) { + nr_csi_rs_pmi_estimation(ue, + csirs_config_pdu, + ue->nr_csi_info, + N_ports, + mem_offset, + csi_rs_estimated_channel_freq, + ue->nr_csi_info->csi_im_meas_computed ? ue->nr_csi_info->interference_plus_noise_power : noise_power, + rank_indicator, + log2_re, + i1, + i2, + &precoded_sinr_dB); - LOG_I(NR_PHY, "RSRP = %i dBm, RI = %i, i1 = %i.%i.%i, i2 = %i, SINR = %i dB, CQI = %i\n", - rsrp_dBm, rank_indicator+1, i1[0], i1[1], i1[2], i2[0], precoded_sinr_dB, cqi); + // bit 4 in bitmap to indicate RI measurment + if(csirs_config_pdu->measurement_bitmap & 16) + nr_csi_rs_cqi_estimation(precoded_sinr_dB, &cqi); + } + + switch (csirs_config_pdu->measurement_bitmap) { + case 1 : + LOG_I(NR_PHY, "RSRP = %i dBm\n", rsrp_dBm); + break; + case 26 : + LOG_I(NR_PHY, "RI = %i i1 = %i.%i.%i, i2 = %i, SINR = %i dB, CQI = %i\n", + rank_indicator + 1, i1[0], i1[1], i1[2], i2[0], precoded_sinr_dB, cqi); + break; + case 27 : + LOG_I(NR_PHY, "RSRP = %i dBm, RI = %i i1 = %i.%i.%i, i2 = %i, SINR = %i dB, CQI = %i\n", + rsrp_dBm, rank_indicator + 1, i1[0], i1[1], i1[2], i2[0], precoded_sinr_dB, cqi); + break; + default : + AssertFatal(false, "Not supported measurement configuration\n"); + } // Send CSI measurements to MAC fapi_nr_csirs_measurements_t csirs_measurements; @@ -983,5 +1013,5 @@ int nr_ue_csi_rs_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, c16_t r if (ue->if_inst && ue->if_inst->dl_indication) ue->if_inst->dl_indication(&dl_indication); - return 0; + return; } diff --git a/openair1/SCHED_NR_UE/defs.h b/openair1/SCHED_NR_UE/defs.h index f075a4a621..679cb771f9 100644 --- a/openair1/SCHED_NR_UE/defs.h +++ b/openair1/SCHED_NR_UE/defs.h @@ -189,7 +189,7 @@ int nr_ue_pdcch_procedures(PHY_VARS_NR_UE *ue, int nr_ue_csi_im_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, c16_t rxdataF[][ue->frame_parms.samples_per_slot_wCP]); -int nr_ue_csi_rs_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, c16_t rxdataF[][ue->frame_parms.samples_per_slot_wCP]); +void nr_ue_csi_rs_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, c16_t rxdataF[][ue->frame_parms.samples_per_slot_wCP]); #endif diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c index 49eb8416f1..74ebc17565 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c @@ -2283,6 +2283,90 @@ void nr_schedule_csi_for_im(NR_UE_MAC_INST_t *mac, int frame, int slot) { } } +NR_CSI_ResourceConfigId_t find_CSI_resourceconfig(NR_CSI_MeasConfig_t *csi_measconfig, + NR_BWP_Id_t dl_bwp_id, + NR_NZP_CSI_RS_ResourceId_t csi_id) +{ + bool found = false; + for (int csi_list = 0; csi_list < csi_measconfig->csi_ResourceConfigToAddModList->list.count; csi_list++) { + NR_CSI_ResourceConfig_t *csires = csi_measconfig->csi_ResourceConfigToAddModList->list.array[csi_list]; + if(csires->bwp_Id != dl_bwp_id) + continue; + struct NR_CSI_ResourceConfig__csi_RS_ResourceSetList *resset = &csires->csi_RS_ResourceSetList; + if(resset->present != NR_CSI_ResourceConfig__csi_RS_ResourceSetList_PR_nzp_CSI_RS_SSB) + continue; + if(!resset->choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList) + continue; + for(int i = 0; i < resset->choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList->list.count; i++) { + NR_NZP_CSI_RS_ResourceSetId_t *res_id = resset->choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList->list.array[i]; + AssertFatal(res_id, "NR_NZP_CSI_RS_ResourceSetId shouldn't be NULL\n"); + struct NR_CSI_MeasConfig__nzp_CSI_RS_ResourceSetToAddModList *res_list = csi_measconfig->nzp_CSI_RS_ResourceSetToAddModList; + AssertFatal(res_list, "nzp_CSI_RS_ResourceSetToAddModList shouldn't be NULL\n"); + for (int j = 0; j < res_list->list.count; j++) { + NR_NZP_CSI_RS_ResourceSet_t *csi_res = res_list->list.array[j]; + if(*res_id != csi_res->nzp_CSI_ResourceSetId) + continue; + for (int k = 0; k < csi_res->nzp_CSI_RS_Resources.list.count; k++) { + AssertFatal(csi_res->nzp_CSI_RS_Resources.list.array[k], + "NZP_CSI_RS_ResourceId shoulan't be NULL\n"); + if (csi_id == *csi_res->nzp_CSI_RS_Resources.list.array[k]) { + found = true; + break; + } + } + if (found && csi_res->trs_Info) + // CRI-RS for Tracking (not implemented yet) + // in this case we there is no associated CSI report + // therefore to signal this we return a value higher than + // maxNrofCSI-ResourceConfigurations + return NR_maxNrofCSI_ResourceConfigurations + 1; + else if (found) + return csires->csi_ResourceConfigId; + } + } + } + return -1; // not found any CSI-resource in current DL BWP associated with this CSI-RS ID +} + +uint8_t set_csirs_measurement_bitmap(NR_CSI_MeasConfig_t *csi_measconfig, + NR_CSI_ResourceConfigId_t csi_res_id) +{ + uint8_t meas_bitmap = 0; + if (csi_res_id > NR_maxNrofCSI_ResourceConfigurations) + return meas_bitmap; // CSI-RS for tracking + for(int i = 0; i < csi_measconfig->csi_ReportConfigToAddModList->list.count; i++) { + struct NR_CSI_ReportConfig *report_config = csi_measconfig->csi_ReportConfigToAddModList->list.array[i]; + if(report_config->resourcesForChannelMeasurement != csi_res_id) + continue; + // bit 0 RSRP bit 1 RI bit 2 LI bit 3 PMI bit 4 CQI bit 5 i1 + switch (report_config->reportQuantity.present) { + case NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_PMI_CQI : + meas_bitmap += (1 << 1) + (1 << 3) + (1 << 4); + break; + case NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_i1 : + meas_bitmap += (1 << 1) + (1 << 5); + break; + case NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_i1_CQI : + meas_bitmap += (1 << 1) + (1 << 4) + (1 << 5); + break; + case NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_CQI : + meas_bitmap += (1 << 1) + (1 << 4); + break; + case NR_CSI_ReportConfig__reportQuantity_PR_cri_RSRP : + meas_bitmap += 1; + break; + case NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_LI_PMI_CQI : + meas_bitmap += (1 << 1) + (1 << 2) + (1 << 3) + (1 << 4); + break; + default : + AssertFatal(false, "Unexpected measurement report type %d\n", + report_config->reportQuantity.present); + } + } + AssertFatal(meas_bitmap > 0, "Expected to have at least 1 measurement configured for CSI-RS\n"); + return meas_bitmap; +} + void nr_schedule_csirs_reception(NR_UE_MAC_INST_t *mac, int frame, int slot) { NR_UE_UL_BWP_t *current_UL_BWP = &mac->current_UL_BWP; @@ -2296,8 +2380,6 @@ void nr_schedule_csirs_reception(NR_UE_MAC_INST_t *mac, int frame, int slot) { return; fapi_nr_dl_config_request_t *dl_config = get_dl_config_request(mac, slot); - NR_NZP_CSI_RS_Resource_t *nzpcsi; - int period, offset; NR_UE_DL_BWP_t *current_DL_BWP = &mac->current_DL_BWP; NR_BWP_Id_t dl_bwp_id = current_DL_BWP->bwp_id; @@ -2305,30 +2387,21 @@ void nr_schedule_csirs_reception(NR_UE_MAC_INST_t *mac, int frame, int slot) { uint16_t bwp_size = current_DL_BWP->BWPSize; uint16_t bwp_start = current_DL_BWP->BWPStart; - // looking for the correct CSI-RS resource in current BWP - NR_NZP_CSI_RS_ResourceSetId_t *nzp = NULL; - for (int csi_list=0; csi_listcsi_ResourceConfigToAddModList->list.count; csi_list++) { - NR_CSI_ResourceConfig_t *csires = csi_measconfig->csi_ResourceConfigToAddModList->list.array[csi_list]; - if(csires->bwp_Id == dl_bwp_id && - csires->csi_RS_ResourceSetList.present == NR_CSI_ResourceConfig__csi_RS_ResourceSetList_PR_nzp_CSI_RS_SSB && - csires->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList) { - nzp = csires->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList->list.array[0]; - } - } - - if (nzp == NULL) - return; // no resource associated to current BWP - for (int id = 0; id < csi_measconfig->nzp_CSI_RS_ResourceToAddModList->list.count; id++){ - nzpcsi = csi_measconfig->nzp_CSI_RS_ResourceToAddModList->list.array[id]; - // reception of CSI-RS only for current BWP - if (nzpcsi->nzp_CSI_RS_ResourceId != *nzp) + NR_NZP_CSI_RS_Resource_t *nzpcsi = csi_measconfig->nzp_CSI_RS_ResourceToAddModList->list.array[id]; + int period, offset; + csi_period_offset(NULL, nzpcsi->periodicityAndOffset, &period, &offset); + if((frame * nr_slots_per_frame[mu] + slot-offset) % period != 0) continue; - csi_period_offset(NULL,nzpcsi->periodicityAndOffset,&period,&offset); - if((frame*nr_slots_per_frame[mu]+slot-offset)%period != 0) + NR_CSI_ResourceConfigId_t csi_res_id = find_CSI_resourceconfig(csi_measconfig, + dl_bwp_id, + nzpcsi->nzp_CSI_RS_ResourceId); + // do not schedule reseption of this CSI-RS if not associated with current BWP + if(csi_res_id < 0) continue; - LOG_D(MAC,"Scheduling reception of CSI-RS in frame %d slot %d\n",frame,slot); + LOG_D(MAC,"Scheduling reception of CSI-RS in frame %d slot %d\n", frame, slot); fapi_nr_dl_config_csirs_pdu_rel15_t *csirs_config_pdu = &dl_config->dl_config_list[dl_config->number_pdus].csirs_config_pdu.csirs_config_rel15; + csirs_config_pdu->measurement_bitmap = set_csirs_measurement_bitmap(csi_measconfig, csi_res_id); NR_CSI_RS_ResourceMapping_t resourceMapping = nzpcsi->resourceMapping; csirs_config_pdu->subcarrier_spacing = mu; csirs_config_pdu->cyclic_prefix = current_DL_BWP->cyclicprefix ? *current_DL_BWP->cyclicprefix : 0;