From 07019a5bd6318ac7b6f271ea2f852b42b3618624 Mon Sep 17 00:00:00 2001 From: Andre Puschmann Date: Fri, 10 Sep 2021 16:00:39 +0200 Subject: [PATCH] nr: refactor DL/UL frequency deriviation * add separate DL/UL freq point a in NR carrier struct * use freqInfoDL/freqInfoUL to get freq point a * simplify carrier tuning logic --- lib/include/srsran/common/band_helper.h | 31 +++++++++++------ lib/include/srsran/phy/common/phy_common_nr.h | 3 +- lib/src/asn1/rrc_nr_utils.cc | 12 ++++--- lib/src/common/band_helper.cc | 34 ++++++++----------- lib/src/common/phy_cfg_nr_default.cc | 28 +++++++-------- lib/src/common/test/band_helper_test.cc | 8 ++--- lib/src/phy/ch_estimation/test/csi_rs_test.c | 3 +- .../phy/ch_estimation/test/dmrs_pdsch_test.c | 3 +- lib/src/phy/phch/test/pdcch_nr_test.c | 3 +- lib/src/phy/phch/test/pdsch_nr_test.c | 3 +- lib/src/phy/phch/test/pucch_nr_test.c | 3 +- lib/src/phy/phch/test/pusch_nr_test.c | 3 +- lib/src/phy/phch/test/sch_nr_test.c | 3 +- lib/src/phy/ue/test/ue_dl_nr_file_test.c | 3 +- lib/test/phy/phy_dl_nr_test.c | 3 +- srsue/src/phy/nr/cc_worker.cc | 2 +- srsue/src/phy/nr/worker_pool.cc | 2 +- srsue/src/phy/phy.cc | 20 +++++------ srsue/src/stack/rrc/rrc_nr.cc | 27 ++++++++------- 19 files changed, 105 insertions(+), 89 deletions(-) diff --git a/lib/include/srsran/common/band_helper.h b/lib/include/srsran/common/band_helper.h index 3053ed9bc..7729dc34d 100644 --- a/lib/include/srsran/common/band_helper.h +++ b/lib/include/srsran/common/band_helper.h @@ -69,20 +69,10 @@ public: * For unparied spectrum (TDD) the function returns the same ARFCN. * * @param dl_arfcn The DL ARFCN - * @return uint32_t + * @return uint32_t the UL ARFCN */ uint32_t get_ul_arfcn_from_dl_arfcn(uint32_t dl_arfcn) const; - /** - * @brief Compute the DL and UL center frequency for a NR carrier - * - * Results are stored inside the carrier struct. - * - * @param carrier Reference to a carrier struct including PRB, abs. frequency point A and carrier offset. - * @return int SRSRAN_SUCESS The center frequency - */ - int get_center_freq_from_abs_freq_point_a(srsran_carrier_nr_t& carrier); - /** * @brief Selects the SSB pattern case according to the band number and subcarrier spacing * @remark Described by TS 38.101-1 Table 5.4.3.3-1: Applicable SS raster entries per operating band @@ -99,6 +89,22 @@ public: */ srsran_duplex_mode_t get_duplex_mode(uint16_t band) const; + /** + * @brief Compute the DL center frequency for a NR carrier + * + * @param carrier Const Reference to a carrier struct including PRB, abs. frequency point A and carrier offset. + * @return double Frequency in Hz + */ + double get_dl_center_freq(const srsran_carrier_nr_t& carrier); + + /** + * @brief Compute the UL center frequency for a NR carrier + * + * @param carrier Const Reference to a carrier struct including PRB, abs. frequency point A and carrier offset. + * @return double Frequency in Hz + */ + double get_ul_center_freq(const srsran_carrier_nr_t& carrier); + class sync_raster_t { protected: @@ -130,6 +136,9 @@ public: sync_raster_t get_sync_raster(uint16_t band, srsran_subcarrier_spacing_t scs) const; private: + // internal helper + double get_center_freq_from_abs_freq_point_a(uint32_t nof_prb, uint32_t freq_point_a_arfcn); + // Elements of TS 38.101-1 Table 5.2-1: NR operating bands in FR1 struct nr_operating_band { uint16_t band; diff --git a/lib/include/srsran/phy/common/phy_common_nr.h b/lib/include/srsran/phy/common/phy_common_nr.h index 7cd174c82..5f50e650f 100644 --- a/lib/include/srsran/phy/common/phy_common_nr.h +++ b/lib/include/srsran/phy/common/phy_common_nr.h @@ -363,7 +363,8 @@ typedef enum SRSRAN_API { typedef struct SRSRAN_API { uint32_t pci; uint32_t absolute_frequency_ssb; - uint32_t absolute_frequency_point_a; + uint32_t dl_absolute_frequency_point_a; + uint32_t ul_absolute_frequency_point_a; uint32_t offset_to_carrier; ///< Offset between point A and the lowest subcarrier of the lowest RB srsran_subcarrier_spacing_t scs; uint32_t nof_prb; ///< @brief See TS 38.101-1 Table 5.3.2-1 for more details diff --git a/lib/src/asn1/rrc_nr_utils.cc b/lib/src/asn1/rrc_nr_utils.cc index 7b44e9fba..32c386a74 100644 --- a/lib/src/asn1/rrc_nr_utils.cc +++ b/lib/src/asn1/rrc_nr_utils.cc @@ -1349,11 +1349,13 @@ bool make_phy_carrier_cfg(const freq_info_dl_s& asn1_freq_info_dl, srsran_carrie } // As the carrier structure requires parameters from different objects, set fields separately - out_carrier_nr->absolute_frequency_ssb = absolute_frequency_ssb; - out_carrier_nr->absolute_frequency_point_a = asn1_freq_info_dl.absolute_freq_point_a; - out_carrier_nr->offset_to_carrier = asn1_freq_info_dl.scs_specific_carrier_list[0].offset_to_carrier; - out_carrier_nr->nof_prb = asn1_freq_info_dl.scs_specific_carrier_list[0].carrier_bw; - out_carrier_nr->scs = scs; + out_carrier_nr->absolute_frequency_ssb = absolute_frequency_ssb; + out_carrier_nr->dl_absolute_frequency_point_a = asn1_freq_info_dl.absolute_freq_point_a; + out_carrier_nr->ul_absolute_frequency_point_a = + out_carrier_nr->dl_absolute_frequency_point_a; // needs to be updated for FDD + out_carrier_nr->offset_to_carrier = asn1_freq_info_dl.scs_specific_carrier_list[0].offset_to_carrier; + out_carrier_nr->nof_prb = asn1_freq_info_dl.scs_specific_carrier_list[0].carrier_bw; + out_carrier_nr->scs = scs; return true; } diff --git a/lib/src/common/band_helper.cc b/lib/src/common/band_helper.cc index 8bfe06c0e..ec31770a1 100644 --- a/lib/src/common/band_helper.cc +++ b/lib/src/common/band_helper.cc @@ -109,28 +109,24 @@ uint32_t srsran_band_helper::get_ul_arfcn_from_dl_arfcn(uint32_t dl_arfcn) const return 0; } -int srsran_band_helper::get_center_freq_from_abs_freq_point_a(srsran_carrier_nr_t& carrier) +double srsran_band_helper::get_dl_center_freq(const srsran_carrier_nr_t& carrier) +{ + return get_center_freq_from_abs_freq_point_a(carrier.nof_prb, carrier.dl_absolute_frequency_point_a); +} + +double srsran_band_helper::get_ul_center_freq(const srsran_carrier_nr_t& carrier) +{ + return get_center_freq_from_abs_freq_point_a(carrier.nof_prb, carrier.ul_absolute_frequency_point_a); +} + +double srsran_band_helper::get_center_freq_from_abs_freq_point_a(uint32_t nof_prb, uint32_t freq_point_a_arfcn) { // for FR1 unit of resources blocks for freq calc is always 180kHz regardless for actual SCS of carrier // TODO: add offset_to_carrier - double abs_freq_point_a_freq = nr_arfcn_to_freq(carrier.absolute_frequency_point_a); - carrier.dl_center_freq = - abs_freq_point_a_freq + - (carrier.nof_prb / 2 * SRSRAN_SUBC_SPACING_NR(srsran_subcarrier_spacing_t::srsran_subcarrier_spacing_15kHz) * - SRSRAN_NRE); - - // UL depends on duplex - if (get_duplex_mode(get_band_from_dl_arfcn(carrier.absolute_frequency_point_a)) == SRSRAN_DUPLEX_MODE_TDD) { - // TDD case - carrier.ul_center_freq = carrier.dl_center_freq; - } else { - // FDD case - uint32_t dl_arfcn = freq_to_nr_arfcn(carrier.dl_center_freq); - uint32_t ul_arfcn = get_ul_arfcn_from_dl_arfcn(dl_arfcn); - carrier.ul_center_freq = nr_arfcn_to_freq(ul_arfcn); - } - - return SRSRAN_SUCCESS; + double abs_freq_point_a_freq = nr_arfcn_to_freq(freq_point_a_arfcn); + return abs_freq_point_a_freq + + (nof_prb / 2 * SRSRAN_SUBC_SPACING_NR(srsran_subcarrier_spacing_t::srsran_subcarrier_spacing_15kHz) * + SRSRAN_NRE); } srsran_ssb_patern_t srsran_band_helper::get_ssb_pattern(uint16_t band, srsran_subcarrier_spacing_t scs) const diff --git a/lib/src/common/phy_cfg_nr_default.cc b/lib/src/common/phy_cfg_nr_default.cc index 034c0c5d1..370e5ca57 100644 --- a/lib/src/common/phy_cfg_nr_default.cc +++ b/lib/src/common/phy_cfg_nr_default.cc @@ -66,24 +66,24 @@ phy_cfg_nr_default_t::reference_cfg_t::reference_cfg_t(const std::string& args) void phy_cfg_nr_default_t::make_carrier_custom_10MHz(srsran_carrier_nr_t& carrier) { - carrier.nof_prb = 52; - carrier.max_mimo_layers = 1; - carrier.pci = 500; - carrier.absolute_frequency_point_a = 633928; - carrier.absolute_frequency_ssb = 634176; - carrier.offset_to_carrier = 0; - carrier.scs = srsran_subcarrier_spacing_15kHz; + carrier.nof_prb = 52; + carrier.max_mimo_layers = 1; + carrier.pci = 500; + carrier.dl_absolute_frequency_point_a = 633928; + carrier.absolute_frequency_ssb = 634176; + carrier.offset_to_carrier = 0; + carrier.scs = srsran_subcarrier_spacing_15kHz; } void phy_cfg_nr_default_t::make_carrier_custom_20MHz(srsran_carrier_nr_t& carrier) { - carrier.nof_prb = 106; - carrier.max_mimo_layers = 1; - carrier.pci = 500; - carrier.absolute_frequency_point_a = 633928; - carrier.absolute_frequency_ssb = 634176; - carrier.offset_to_carrier = 0; - carrier.scs = srsran_subcarrier_spacing_15kHz; + carrier.nof_prb = 106; + carrier.max_mimo_layers = 1; + carrier.pci = 500; + carrier.dl_absolute_frequency_point_a = 633928; + carrier.absolute_frequency_ssb = 634176; + carrier.offset_to_carrier = 0; + carrier.scs = srsran_subcarrier_spacing_15kHz; } void phy_cfg_nr_default_t::make_tdd_custom_6_4(srsran_tdd_config_nr_t& tdd) diff --git a/lib/src/common/test/band_helper_test.cc b/lib/src/common/test/band_helper_test.cc index a5c8165cd..d8ef68335 100644 --- a/lib/src/common/test/band_helper_test.cc +++ b/lib/src/common/test/band_helper_test.cc @@ -42,11 +42,11 @@ int bands_test_nr() // check actual freqs for FDD carrier (example values are for 52 PRB) srsran_carrier_nr_t carrier = {}; - carrier.absolute_frequency_point_a = 175364; + carrier.dl_absolute_frequency_point_a = 175364; + carrier.ul_absolute_frequency_point_a = 166364; carrier.nof_prb = 52; - TESTASSERT(bands.get_center_freq_from_abs_freq_point_a(carrier) == SRSRAN_SUCCESS); - TESTASSERT(carrier.dl_center_freq == 881.5e6); - TESTASSERT(carrier.ul_center_freq == 836.5e6); + TESTASSERT(bands.get_dl_center_freq(carrier) == 881.5e6); + TESTASSERT(bands.get_ul_center_freq(carrier) == 836.5e6); // b3 TESTASSERT(bands.nr_arfcn_to_freq(342000) == 1710.0e6); diff --git a/lib/src/phy/ch_estimation/test/csi_rs_test.c b/lib/src/phy/ch_estimation/test/csi_rs_test.c index cdd89f66c..e47514412 100644 --- a/lib/src/phy/ch_estimation/test/csi_rs_test.c +++ b/lib/src/phy/ch_estimation/test/csi_rs_test.c @@ -20,7 +20,8 @@ static srsran_carrier_nr_t carrier = { 1, // pci 0, // absolute_frequency_ssb - 0, // absolute_frequency_point_a + 0, // dl_absolute_frequency_point_a + 0, // ul_absolute_frequency_point_a 0, // offset_to_carrier srsran_subcarrier_spacing_15kHz, // scs 50, // nof_prb diff --git a/lib/src/phy/ch_estimation/test/dmrs_pdsch_test.c b/lib/src/phy/ch_estimation/test/dmrs_pdsch_test.c index 4a8b55b83..bc46780d3 100644 --- a/lib/src/phy/ch_estimation/test/dmrs_pdsch_test.c +++ b/lib/src/phy/ch_estimation/test/dmrs_pdsch_test.c @@ -23,7 +23,8 @@ static srsran_carrier_nr_t carrier = { 1, // pci 0, // absolute_frequency_ssb - 0, // absolute_frequency_point_a + 0, // dl_absolute_frequency_point_a + 0, // ul_absolute_frequency_point_a 0, // offset_to_carrier srsran_subcarrier_spacing_15kHz, // scs 50, // nof_prb diff --git a/lib/src/phy/phch/test/pdcch_nr_test.c b/lib/src/phy/phch/test/pdcch_nr_test.c index 52a799d2f..c5c212fad 100644 --- a/lib/src/phy/phch/test/pdcch_nr_test.c +++ b/lib/src/phy/phch/test/pdcch_nr_test.c @@ -18,7 +18,8 @@ static srsran_carrier_nr_t carrier = { 1, // pci 0, // absolute_frequency_ssb - 0, // absolute_frequency_point_a + 0, // dl_absolute_frequency_point_a + 0, // ul_absolute_frequency_point_a 0, // offset_to_carrier srsran_subcarrier_spacing_15kHz, // scs 50, // nof_prb diff --git a/lib/src/phy/phch/test/pdsch_nr_test.c b/lib/src/phy/phch/test/pdsch_nr_test.c index f353cf3f8..0ca921d49 100644 --- a/lib/src/phy/phch/test/pdsch_nr_test.c +++ b/lib/src/phy/phch/test/pdsch_nr_test.c @@ -23,7 +23,8 @@ static srsran_carrier_nr_t carrier = { 1, // pci 0, // absolute_frequency_ssb - 0, // absolute_frequency_point_a + 0, // dl_absolute_frequency_point_a + 0, // ul_absolute_frequency_point_a 0, // offset_to_carrier srsran_subcarrier_spacing_15kHz, // scs SRSRAN_MAX_PRB_NR, // nof_prb diff --git a/lib/src/phy/phch/test/pucch_nr_test.c b/lib/src/phy/phch/test/pucch_nr_test.c index 067c3b8ad..8a660d830 100644 --- a/lib/src/phy/phch/test/pucch_nr_test.c +++ b/lib/src/phy/phch/test/pucch_nr_test.c @@ -25,7 +25,8 @@ static srsran_carrier_nr_t carrier = { 1, // pci 0, // absolute_frequency_ssb - 0, // absolute_frequency_point_a + 0, // dl_absolute_frequency_point_a + 0, // ul_absolute_frequency_point_a 0, // offset_to_carrier srsran_subcarrier_spacing_15kHz, // scs 6, // nof_prb diff --git a/lib/src/phy/phch/test/pusch_nr_test.c b/lib/src/phy/phch/test/pusch_nr_test.c index fbffeefaa..b4f363269 100644 --- a/lib/src/phy/phch/test/pusch_nr_test.c +++ b/lib/src/phy/phch/test/pusch_nr_test.c @@ -22,7 +22,8 @@ static srsran_carrier_nr_t carrier = { 1, // pci 0, // absolute_frequency_ssb - 0, // absolute_frequency_point_a + 0, // dl_absolute_frequency_point_a + 0, // ul_absolute_frequency_point_a 0, // offset_to_carrier srsran_subcarrier_spacing_15kHz, // scs SRSRAN_MAX_PRB_NR, // nof_prb diff --git a/lib/src/phy/phch/test/sch_nr_test.c b/lib/src/phy/phch/test/sch_nr_test.c index 2e633febd..b2c1cc865 100644 --- a/lib/src/phy/phch/test/sch_nr_test.c +++ b/lib/src/phy/phch/test/sch_nr_test.c @@ -21,7 +21,8 @@ static srsran_carrier_nr_t carrier = { 1, // pci 0, // absolute_frequency_ssb - 0, // absolute_frequency_point_a + 0, // dl_absolute_frequency_point_a + 0, // ul_absolute_frequency_point_a 0, // offset_to_carrier srsran_subcarrier_spacing_15kHz, // scs SRSRAN_MAX_PRB_NR, // nof_prb diff --git a/lib/src/phy/ue/test/ue_dl_nr_file_test.c b/lib/src/phy/ue/test/ue_dl_nr_file_test.c index a3a58a2e2..45ca71d7a 100644 --- a/lib/src/phy/ue/test/ue_dl_nr_file_test.c +++ b/lib/src/phy/ue/test/ue_dl_nr_file_test.c @@ -19,7 +19,8 @@ static srsran_carrier_nr_t carrier = { 501, // pci 0, // absolute_frequency_ssb - 0, // absolute_frequency_point_a + 0, // dl_absolute_frequency_point_a + 0, // ul_absolute_frequency_point_a 0, // offset_to_carrier srsran_subcarrier_spacing_15kHz, // scs 52, // nof_prb diff --git a/lib/test/phy/phy_dl_nr_test.c b/lib/test/phy/phy_dl_nr_test.c index 528721d95..6855fcb15 100644 --- a/lib/test/phy/phy_dl_nr_test.c +++ b/lib/test/phy/phy_dl_nr_test.c @@ -22,7 +22,8 @@ static srsran_carrier_nr_t carrier = { 501, // pci 0, // absolute_frequency_ssb - 0, // absolute_frequency_point_a + 0, // dl_absolute_frequency_point_a + 0, // ul_absolute_frequency_point_a 0, // offset_to_carrier srsran_subcarrier_spacing_15kHz, // scs 52, // nof_prb diff --git a/srsue/src/phy/nr/cc_worker.cc b/srsue/src/phy/nr/cc_worker.cc index 5718639ab..74210d093 100644 --- a/srsue/src/phy/nr/cc_worker.cc +++ b/srsue/src/phy/nr/cc_worker.cc @@ -85,7 +85,7 @@ bool cc_worker::update_cfg() } double abs_freq_point_a_freq = - srsran::srsran_band_helper().nr_arfcn_to_freq(phy.cfg.carrier.absolute_frequency_point_a); + srsran::srsran_band_helper().nr_arfcn_to_freq(phy.cfg.carrier.dl_absolute_frequency_point_a); double abs_freq_ssb_freq = srsran::srsran_band_helper().nr_arfcn_to_freq(phy.cfg.carrier.absolute_frequency_ssb); double carrier_center_freq = diff --git a/srsue/src/phy/nr/worker_pool.cc b/srsue/src/phy/nr/worker_pool.cc index 1e6543636..00a2fb446 100644 --- a/srsue/src/phy/nr/worker_pool.cc +++ b/srsue/src/phy/nr/worker_pool.cc @@ -136,7 +136,7 @@ bool worker_pool::set_config(const srsran::phy_cfg_nr_t& cfg) phy_state.cfg = cfg; logger.info( - "Setting new PHY configuration ARFCN=%d, PCI=%d", cfg.carrier.absolute_frequency_point_a, cfg.carrier.pci); + "Setting new PHY configuration ARFCN=%d, PCI=%d", cfg.carrier.dl_absolute_frequency_point_a, cfg.carrier.pci); // Set carrier information info_metrics_t info = {}; diff --git a/srsue/src/phy/phy.cc b/srsue/src/phy/phy.cc index 288df38f2..ede466fd1 100644 --- a/srsue/src/phy/phy.cc +++ b/srsue/src/phy/phy.cc @@ -649,20 +649,16 @@ void phy::set_earfcn(std::vector earfcns) bool phy::set_config(const srsran::phy_cfg_nr_t& cfg) { - // Derive actual RF frequencies for NR carrier - double abs_freq_point_a_freq = srsran::srsran_band_helper().nr_arfcn_to_freq(cfg.carrier.absolute_frequency_point_a); - - // for FR1 unit of resources blocks for freq calc is always 180kHz regardless for actual SCS of carrier - // TODO: add offset_to_carrier - double carrier_center_freq = - abs_freq_point_a_freq + - (cfg.carrier.nof_prb / 2 * SRSRAN_SUBC_SPACING_NR(srsran_subcarrier_spacing_t::srsran_subcarrier_spacing_15kHz) * - SRSRAN_NRE); + srsran::srsran_band_helper band_helper; + double dl_freq_hz = band_helper.get_dl_center_freq(cfg.carrier); + double ul_freq_hz = band_helper.get_ul_center_freq(cfg.carrier); + // tune radio for (uint32_t i = 0; i < common.args->nof_nr_carriers; i++) { - logger_phy.info("Tuning channel %d to %.2f GHz", i + common.args->nof_lte_carriers, carrier_center_freq / 1e6); - radio->set_rx_freq(i + common.args->nof_lte_carriers, carrier_center_freq); - radio->set_tx_freq(i + common.args->nof_lte_carriers, carrier_center_freq); + logger_phy.info("Tuning Rx channel %d to %.2f GHz", i + common.args->nof_lte_carriers, dl_freq_hz / 1e6); + radio->set_rx_freq(i + common.args->nof_lte_carriers, dl_freq_hz); + logger_phy.info("Tuning Tx channel %d to %.2f GHz", i + common.args->nof_lte_carriers, ul_freq_hz / 1e6); + radio->set_tx_freq(i + common.args->nof_lte_carriers, ul_freq_hz); } return nr_workers.set_config(cfg); diff --git a/srsue/src/stack/rrc/rrc_nr.cc b/srsue/src/stack/rrc/rrc_nr.cc index d2e5ac402..636534793 100644 --- a/srsue/src/stack/rrc/rrc_nr.cc +++ b/srsue/src/stack/rrc/rrc_nr.cc @@ -773,16 +773,16 @@ bool rrc_nr::apply_csi_meas_cfg(const asn1::rrc_nr::csi_meas_cfg_s& csi_meas_cfg bool rrc_nr::apply_dl_common_cfg(const asn1::rrc_nr::dl_cfg_common_s& dl_cfg_common) { - if (dl_cfg_common.init_dl_bwp_present) { - if (dl_cfg_common.freq_info_dl_present) { - if (make_phy_carrier_cfg(dl_cfg_common.freq_info_dl, &phy_cfg.carrier) == false) { - logger.warning("Warning while making carrier phy config"); - return false; - } - } else { - logger.warning("Option freq_info_dl not present"); + if (dl_cfg_common.freq_info_dl_present) { + if (make_phy_carrier_cfg(dl_cfg_common.freq_info_dl, &phy_cfg.carrier) == false) { + logger.warning("Warning while making carrier phy config"); return false; } + } else { + logger.warning("Option freq_info_dl not present, S-UL not supported."); + return false; + } + if (dl_cfg_common.init_dl_bwp_present) { if (dl_cfg_common.init_dl_bwp.pdsch_cfg_common_present) { if (dl_cfg_common.init_dl_bwp.pdsch_cfg_common.type() == asn1::rrc_nr::setup_release_c::types_opts::setup) { @@ -790,13 +790,12 @@ bool rrc_nr::apply_dl_common_cfg(const asn1::rrc_nr::dl_cfg_common_s& dl_cfg_com // Load CORESET Zero if (pdcch_cfg_common.ctrl_res_set_zero_present) { - srsran::srsran_band_helper band_helper; - // Get band number - uint16_t band = band_helper.get_band_from_dl_arfcn(phy_cfg.carrier.absolute_frequency_point_a); + srsran::srsran_band_helper band_helper; + uint16_t band = band_helper.get_band_from_dl_arfcn(phy_cfg.carrier.dl_absolute_frequency_point_a); // Get pointA and SSB absolute frequencies - double pointA_abs_freq_Hz = band_helper.nr_arfcn_to_freq(phy_cfg.carrier.absolute_frequency_point_a); + double pointA_abs_freq_Hz = band_helper.nr_arfcn_to_freq(phy_cfg.carrier.dl_absolute_frequency_point_a); double ssb_abs_freq_Hz = band_helper.nr_arfcn_to_freq(phy_cfg.carrier.absolute_frequency_ssb); // Calculate integer SSB to pointA frequency offset in Hz @@ -914,6 +913,10 @@ bool rrc_nr::apply_dl_common_cfg(const asn1::rrc_nr::dl_cfg_common_s& dl_cfg_com bool rrc_nr::apply_ul_common_cfg(const asn1::rrc_nr::ul_cfg_common_s& ul_cfg_common) { + if (ul_cfg_common.freq_info_ul_present && ul_cfg_common.freq_info_ul.absolute_freq_point_a_present) { + // Update UL frequency point if provided + phy_cfg.carrier.ul_absolute_frequency_point_a = ul_cfg_common.freq_info_ul.absolute_freq_point_a; + } if (ul_cfg_common.init_ul_bwp_present) { if (ul_cfg_common.init_ul_bwp.rach_cfg_common_present) { if (ul_cfg_common.init_ul_bwp.rach_cfg_common.type() == setup_release_c::types_opts::setup) {