Module 2 — Cell Search

SSS Detection —
Finding N¹_ID

With symbol timing from PSS (t = 4523), the UE can now locate SSB symbol 2 exactly. The Secondary Synchronization Signal lives there. Correlating against 336 Gold sequences gives N¹_ID — the second and final component needed to compute the full Physical Cell ID.

TS 38.211 §7.4.2.3 TS 38.211 §7.4.2.1

What is SSS?

The Secondary Synchronization Signal (SSS) is a 127-element Gold sequence transmitted in the center 127 subcarriers of SSB symbol 2. While PSS uses a single m-sequence cyclically shifted (3 possibilities), SSS uses the product of two m-sequences to generate 336 distinct sequences — one per possible N¹_ID value.

Because the UE already has accurate symbol timing from PSS, it does not need to slide a template across the buffer. Instead, it directly extracts symbol 2, runs an FFT, and correlates in the frequency domain against all 336 SSS sequences. Whichever gives the strongest correlation identifies N¹_ID.

The sequence d(n) used for the secondary synchronisation signal is defined by

    d(n) = [1 − 2x₀((n+m₀) mod 127)] · [1 − 2x₁((n+m₁) mod 127)]

where m₀ = 15·⌊N¹_ID / 112⌋ + 5·N²_ID    and    m₁ = N¹_ID mod 112
3GPP TS 38.211, Section 7.4.2.3, Equation 7.4.2.3-1
336
SSS sequences
N¹_ID ∈ {0, 1, ..., 335}
Symbol 2
SSB position
Center 127 of 240 subcarriers
Gold
sequence type
Product of two m-sequences x₀, x₁
1008
total PCIs
336 × 3 = 1008 unique cell IDs

SSS sequence generation

SSS uses two different m-sequences, x₀ and x₁, with different feedback polynomials. Their element-wise product creates the Gold sequence. The shifts m₀ and m₁ depend on both N¹_ID and N²_ID — so SSS encodes N¹_ID while also incorporating N²_ID (already known from PSS) into its structure.

SSS generation — two m-sequences TS 38.211 §7.4.2.3
x₀ and x₁ recurrences
x₀(i+7) = (x₀(i+4) + x₀(i)) mod 2  ← same as PSS m-sequence
x₁(i+7) = (x₁(i+1) + x₁(i)) mod 2  ← different polynomial

Both initialized with: x(0..6) = [1,0,0,0,0,0,0]

// Shifts for our example: N¹_ID=147, N²_ID=1
m₀ = 15 × ⌊147/112⌋ + 5 × 1 = 15×1 + 5 = 20
m₁ = 147 mod 112 = 35

// Gold sequence: element-wise product
d(n) = [1−2·x₀((n+20) mod 127)] × [1−2·x₁((n+35) mod 127)]

// First 4 values (N¹_ID=147, N²_ID=1):
d(0) = [1−2·x₀(20)] × [1−2·x₁(35)] = [1−2·1] × [1−2·0] = −1×+1 = −1
d(1) = [1−2·x₀(21)] × [1−2·x₁(36)] = [1−2·0] × [1−2·1] = +1×−1 = −1
d(2) = [1−2·x₀(22)] × [1−2·x₁(37)] = [1−2·0] × [1−2·0] = +1×+1 = +1
d(3) = [1−2·x₀(23)] × [1−2·x₁(38)] = [1−2·1] × [1−2·1] = −1×−1 = +1

How the UE finds SSS

Since timing is already known from PSS, the UE jumps directly to SSB symbol 2. It removes the cyclic prefix (144 samples), runs an FFT on the 2048 useful samples, and extracts the 127 center subcarriers. Then it correlates against all 336 pre-computed SSS sequences.

1
Jump to SSB symbol 2
SSS starts at sample 4523 + 2×2192 = 8907. Skip CP (samples 8907–9050). Useful part: samples 9051–11098 (2048 samples).
Symbol 2 extraction
t_SSS  = 4523 + 2×2192 = 8907  ← SSS symbol start
CP     = samples 8907..9050     ← discard (144 samples)
Useful = samples 9051..11098    ← 2048 samples → FFT input
2
FFT → extract 127 SSS subcarriers
2048-point FFT gives 2048 frequency bins. SSS occupies bins 56–182 (127 bins in center, same as PSS). Extract these into SSS_received[0..126].
3
Correlate against all 336 SSS sequences
For each candidate N¹_ID from 0 to 335, compute the correlation magnitude. The correct one gives a large peak; all others give noise-level values.
SSS correlation — selected results
corr(N¹_ID=0)   = 0.41
corr(N¹_ID=1)   = 0.88
...
corr(N¹_ID=146) = 2.31
corr(N¹_ID=147) = 72.4  ← PEAK
corr(N¹_ID=148) = 1.95
...
corr(N¹_ID=335) = 0.67

→ N¹_ID = 147
SSS correlation output — all 336 candidates Our example: N¹_ID = 147
SSS complete — UE now knows:
N¹_ID  → 147 (index of SSS correlation peak)
N²_ID  → 1 (from PSS, section 2.3)
PCI    → 3 × 147 + 1 = 442 (next section)