NRRG tool update to 3GPP R17 (2022-12)
How to calculate N_CRB_SSB and k_SSB based on NRRG grid settings?
Subroutine #1: convert ARFCN to F_FREQ
// convert ARFCN to F_REF(MHz) (refer to 38.104 vh80)
// Table 5.4.2.1-1: NR-ARFCN parameters for the global frequency raster
func arfcn2Fref(arfcn int, maxFreq int) float64 {
if maxFreq < 3000 {
return float64(arfcn) * 0.005
} else if maxFreq < 24250 {
return 3000 + 0.015 * (float64(arfcn) - 600000)
} else {
return 24250.08 + 0.06 * (float64(arfcn) - 2016667)
}
}
Subroutine #2: convert GSCN to SS_FREQ
// convert GSCN to SS_REF(MHz) (refer to 38.104 vh80)
// Table 5.4.3.1-1: GSCN parameters for the global frequency raster
func gscn2Ssref(gscn int, maxFreq int) float64 {
if maxFreq < 3000 {
N := math.Floor((float64(gscn) + 1.5) / 3)
M := math.Mod(float64(gscn) + 1.5, 3) * 2
ssRef := 1.2 * N + 0.05 * M
fmt.Printf("GSCN=%v, N=%v, M=%v, SS_REF=%vMHz\n", gscn, N, M, ssRef)
return ssRef
} else if maxFreq < 24250 {
N := gscn - 7499
return 3000 + 1.44 * float64(N)
} else {
N := gscn - 22256
return 24250.08 + 17.28 * float64(N)
}
}
Determine SCS of N_CRB_SSB and SCS of k_SSB:
var kSsbScs, nCrbSsbScs float64
if flags.gridsetting._freqRange == "FR1" {
kSsbScs = 15
nCrbSsbScs = 15
} else if flags.gridsetting._freqRange == "FR2-1" {
kSsbScs = float64(rmsiScsInt)
nCrbSsbScs = 60
} else {
kSsbScs = float64(ssbScsInt)
nCrbSsbScs = 60
}
Calculate N_CRB_SSB and k_SSB
nCrbSsb := math.Floor((ssFreqSc0Rb0 - dlFreqPointA) / (12 * nCrbSsbScs / 1000))
kSsb := (ssFreqSc0Rb0 - dlFreqPointA - 12 * nCrbSsbScs / 1000 * float64(nCrbSsb)) / (kSsbScs / 1000)