diff --git a/common/utils/nr/nr_common.c b/common/utils/nr/nr_common.c index 4c60d21e4e..1baf99d1f2 100644 --- a/common/utils/nr/nr_common.c +++ b/common/utils/nr/nr_common.c @@ -706,3 +706,27 @@ void SLIV2SL(int SLIV,int *S,int *L) { } } +int get_ssb_subcarrier_offset(uint32_t absoluteFrequencySSB, uint32_t absoluteFrequencyPointA) +{ + uint32_t absolute_diff = (absoluteFrequencySSB - absoluteFrequencyPointA); + const int scaling_5khz = absoluteFrequencyPointA < 600000 ? 3 : 1; + return ((absolute_diff / scaling_5khz) % 24); +} + +uint32_t get_ssb_offset_to_pointA(uint32_t absoluteFrequencySSB, + uint32_t absoluteFrequencyPointA, + int ssbSubcarrierSpacing, + int frequency_range) +{ + uint32_t absolute_diff = (absoluteFrequencySSB - absoluteFrequencyPointA); + const int scaling_5khz = absoluteFrequencyPointA < 600000 ? 3 : 1; + int sco = get_ssb_subcarrier_offset(absoluteFrequencySSB, absoluteFrequencyPointA); + const int scs_scaling = frequency_range == FR2 ? 1 << (ssbSubcarrierSpacing - 2) : 1 << ssbSubcarrierSpacing; + const int scaled_abs_diff = absolute_diff / scaling_5khz; + const int ssb_offset_point_a = + (scaled_abs_diff - sco) / 12 + - 10 * scs_scaling; // absoluteFrequencySSB is the central frequency of SSB which is made by 20RBs in total + AssertFatal(ssb_offset_point_a % scs_scaling == 0, "PRB offset %d can create frequency offset\n", ssb_offset_point_a); + AssertFatal(sco % scs_scaling == 0, "ssb offset %d can create frequency offset\n", sco); + return ssb_offset_point_a; +} diff --git a/common/utils/nr/nr_common.h b/common/utils/nr/nr_common.h index 9f258ea448..28bff637bb 100644 --- a/common/utils/nr/nr_common.h +++ b/common/utils/nr/nr_common.h @@ -101,7 +101,11 @@ void get_samplerate_and_bw(int mu, unsigned int *samples_per_frame, double *tx_bw, double *rx_bw); - +uint32_t get_ssb_offset_to_pointA(uint32_t absoluteFrequencySSB, + uint32_t absoluteFrequencyPointA, + int ssbSubcarrierSpacing, + int frequency_range); +int get_ssb_subcarrier_offset(uint32_t absoluteFrequencySSB, uint32_t absoluteFrequencyPointA); #define CEILIDIV(a,b) ((a+b-1)/b) #define ROUNDIDIV(a,b) (((a<<1)+b)/(b<<1)) diff --git a/openair2/LAYER2/NR_MAC_gNB/config.c b/openair2/LAYER2/NR_MAC_gNB/config.c index 8da2d12c55..1a72fa951d 100644 --- a/openair2/LAYER2/NR_MAC_gNB/config.c +++ b/openair2/LAYER2/NR_MAC_gNB/config.c @@ -352,7 +352,8 @@ void config_common(gNB_MAC_INST *nrmac, int pdsch_AntennaPorts, int pusch_Antenn // SSB Table Configuration - cfg->ssb_table.ssb_offset_point_a.value = get_ssb_offset_to_pointA(*scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencySSB, + cfg->ssb_table.ssb_offset_point_a.value = + get_ssb_offset_to_pointA(*scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencySSB, scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA, *scc->ssbSubcarrierSpacing, frequency_range); @@ -361,7 +362,8 @@ void config_common(gNB_MAC_INST *nrmac, int pdsch_AntennaPorts, int pusch_Antenn cfg->ssb_table.ssb_period.value = *scc->ssb_periodicityServingCell; cfg->ssb_table.ssb_period.tl.tag = NFAPI_NR_CONFIG_SSB_PERIOD_TAG; cfg->num_tlv++; - cfg->ssb_table.ssb_subcarrier_offset.value = get_ssb_subcarrier_offset(*scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencySSB, + cfg->ssb_table.ssb_subcarrier_offset.value = + get_ssb_subcarrier_offset(*scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencySSB, scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA); cfg->ssb_table.ssb_subcarrier_offset.tl.tag = NFAPI_NR_CONFIG_SSB_SUBCARRIER_OFFSET_TAG; cfg->num_tlv++; diff --git a/openair2/RRC/NR/nr_rrc_config.c b/openair2/RRC/NR/nr_rrc_config.c index af5431fb33..6626fc2240 100644 --- a/openair2/RRC/NR/nr_rrc_config.c +++ b/openair2/RRC/NR/nr_rrc_config.c @@ -1642,8 +1642,6 @@ NR_BCCH_BCH_Message_t *get_new_MIB_NR(const NR_ServingCellConfigCommon_t *scc) mib->message.choice.mib->spare.bits_unused = 7; // This makes a spare of 1 bits AssertFatal(scc->ssbSubcarrierSpacing != NULL, "scc->ssbSubcarrierSpacing is null\n"); - int band = *scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0]; - frequency_range_t frequency_range = band < 100 ? FR1 : FR2; int ssb_subcarrier_offset = 31; // default value for NSA if (get_softmodem_params()->sa) { ssb_subcarrier_offset = get_ssb_subcarrier_offset(*scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencySSB,