Fix FR2 SSB start subcarrier and SSB frequency at gNB
for FR2 offsetToPointA is expressed in terms of 60 kHz SCS and k_SSB expressed in terms of the subcarrier spacing provided by the higher-layer parameter subCarrierSpacingCommon
This commit is contained in:
@@ -70,13 +70,25 @@ void nr_common_signal_procedures (PHY_VARS_gNB *gNB,int frame,int slot,nfapi_nr_
|
|||||||
int ssb_start_symbol_abs = nr_get_ssb_start_symbol(fp,ssb_index); // computing the starting symbol for current ssb
|
int ssb_start_symbol_abs = nr_get_ssb_start_symbol(fp,ssb_index); // computing the starting symbol for current ssb
|
||||||
ssb_start_symbol = ssb_start_symbol_abs % fp->symbols_per_slot; // start symbol wrt slot
|
ssb_start_symbol = ssb_start_symbol_abs % fp->symbols_per_slot; // start symbol wrt slot
|
||||||
|
|
||||||
// setting the first subcarrier
|
// Setting the first subcarrier
|
||||||
|
// 3GPP TS 38.211 sections 7.4.3.1 and 4.4.4.2
|
||||||
|
// for FR1 offsetToPointA and k_SSB are expressed in terms of 15 kHz SCS
|
||||||
|
// for FR2 offsetToPointA is expressed in terms of 60 kHz SCS and k_SSB expressed in terms of the subcarrier spacing provided
|
||||||
|
// by the higher-layer parameter subCarrierSpacingCommon
|
||||||
const int scs = cfg->ssb_config.scs_common.value;
|
const int scs = cfg->ssb_config.scs_common.value;
|
||||||
const int prb_offset = (fp->freq_range == nr_FR1) ? ssb_pdu.ssb_pdu_rel15.ssbOffsetPointA>>scs : ssb_pdu.ssb_pdu_rel15.ssbOffsetPointA>>(scs-2);
|
const int prb_offset = (fp->freq_range == nr_FR1) ? ssb_pdu.ssb_pdu_rel15.ssbOffsetPointA >> scs
|
||||||
const int sc_offset = (fp->freq_range == nr_FR1) ? ssb_pdu.ssb_pdu_rel15.SsbSubcarrierOffset >> scs
|
: ssb_pdu.ssb_pdu_rel15.ssbOffsetPointA >> (scs - 2);
|
||||||
: ssb_pdu.ssb_pdu_rel15.SsbSubcarrierOffset >> (scs - 2);
|
const int sc_offset =
|
||||||
|
(fp->freq_range == nr_FR1) ? ssb_pdu.ssb_pdu_rel15.SsbSubcarrierOffset >> scs : ssb_pdu.ssb_pdu_rel15.SsbSubcarrierOffset;
|
||||||
fp->ssb_start_subcarrier = (12 * prb_offset + sc_offset);
|
fp->ssb_start_subcarrier = (12 * prb_offset + sc_offset);
|
||||||
LOG_D(PHY, "SSB first subcarrier %d (%d,%d)\n", fp->ssb_start_subcarrier, prb_offset, sc_offset);
|
LOG_D(PHY,
|
||||||
|
"ssbOffsetPointA %d SSB SsbSubcarrierOffset %d prb_offset %d sc_offset %d scs %d ssb_start_subcarrier %d\n",
|
||||||
|
ssb_pdu.ssb_pdu_rel15.ssbOffsetPointA,
|
||||||
|
ssb_pdu.ssb_pdu_rel15.SsbSubcarrierOffset,
|
||||||
|
prb_offset,
|
||||||
|
sc_offset,
|
||||||
|
scs,
|
||||||
|
fp->ssb_start_subcarrier);
|
||||||
|
|
||||||
LOG_D(PHY,"SS TX: frame %d, slot %d, start_symbol %d\n",frame,slot, ssb_start_symbol);
|
LOG_D(PHY,"SS TX: frame %d, slot %d, start_symbol %d\n",frame,slot, ssb_start_symbol);
|
||||||
nr_generate_pss(&txdataF[0][txdataF_offset], gNB->TX_AMP, ssb_start_symbol, cfg, fp);
|
nr_generate_pss(&txdataF[0][txdataF_offset], gNB->TX_AMP, ssb_start_symbol, cfg, fp);
|
||||||
|
|||||||
@@ -197,21 +197,21 @@ static int get_ssb_arfcn(const f1ap_served_cell_info_t *cell_info, const NR_MIB_
|
|||||||
uint32_t dl_arfcn = get_dl_arfcn(cell_info);
|
uint32_t dl_arfcn = get_dl_arfcn(cell_info);
|
||||||
int scs = get_ssb_scs(cell_info);
|
int scs = get_ssb_scs(cell_info);
|
||||||
int band = get_dl_band(cell_info);
|
int band = get_dl_band(cell_info);
|
||||||
|
uint64_t freqpointa = from_nrarfcn(band, scs, dl_arfcn);
|
||||||
|
uint64_t freqssb = 0;
|
||||||
|
// 3GPP TS 38.211 sections 7.4.3.1 and 4.4.4.2
|
||||||
|
// for FR1 offsetToPointA and k_SSB are expressed in terms of 15 kHz SCS
|
||||||
|
// for FR2 offsetToPointA is expressed in terms of 60 kHz SCS and k_SSB expressed in terms of the subcarrier spacing provided
|
||||||
|
// by the higher-layer parameter subCarrierSpacingCommon
|
||||||
// FR1 includes frequency bands from 410 MHz (ARFCN 82000) to 7125 MHz (ARFCN 875000)
|
// FR1 includes frequency bands from 410 MHz (ARFCN 82000) to 7125 MHz (ARFCN 875000)
|
||||||
// FR2 includes frequency bands from 24.25 GHz (ARFCN 2016667) to 71.0 GHz (ARFCN 2795832)
|
// FR2 includes frequency bands from 24.25 GHz (ARFCN 2016667) to 71.0 GHz (ARFCN 2795832)
|
||||||
uint64_t scaling = 0;
|
|
||||||
if (dl_arfcn >= 82000 && dl_arfcn < 875000)
|
if (dl_arfcn >= 82000 && dl_arfcn < 875000)
|
||||||
scaling = 1;
|
freqssb = freqpointa + 15000 * (offsetToPointA * 12 + kssb) + 10ll * 12 * (1 << scs) * 15000;
|
||||||
else if (dl_arfcn >= 2016667 && dl_arfcn < 2795832)
|
else if (dl_arfcn >= 2016667 && dl_arfcn < 2795832)
|
||||||
scaling = 4;
|
freqssb = freqpointa + 60000 * offsetToPointA * 12 + (1 << scs) * 15000 * (kssb + 10ll * 12);
|
||||||
else
|
else
|
||||||
AssertFatal(false, "Invalid absoluteFrequencyPointA: %d\n", dl_arfcn);
|
AssertFatal(false, "Invalid absoluteFrequencyPointA: %d\n", dl_arfcn);
|
||||||
|
|
||||||
|
|
||||||
uint64_t freqpointa = from_nrarfcn(band, scs, dl_arfcn);
|
|
||||||
// offsetToPointA and kSSB are both on 15kHz SCS for FR1 and 60kHz SCS for FR2 (see 38.211 sections 7.4.3.1 and 4.4.4.2)
|
|
||||||
// SSB uses the SCS of the cell and is 20 RBs wide, so use 10
|
|
||||||
uint64_t freqssb = freqpointa + scaling * 15000 * (offsetToPointA * 12 + kssb) + 10ll * 12 * (1 << scs) * 15000;
|
|
||||||
int bw_index = get_supported_band_index(scs, band, get_dl_bw(cell_info));
|
int bw_index = get_supported_band_index(scs, band, get_dl_bw(cell_info));
|
||||||
int band_size_hz = get_supported_bw_mhz(band > 256 ? FR2 : FR1, bw_index) * 1000 * 1000;
|
int band_size_hz = get_supported_bw_mhz(band > 256 ? FR2 : FR1, bw_index) * 1000 * 1000;
|
||||||
uint32_t ssb_arfcn = to_nrarfcn(band, freqssb, scs, band_size_hz);
|
uint32_t ssb_arfcn = to_nrarfcn(band, freqssb, scs, band_size_hz);
|
||||||
|
|||||||
Reference in New Issue
Block a user