In any cellular communication system (2G, 3G, 4G, 5G), there are specific procedure called Cell Search. Even though the detailed mechanism varies a little bit depending on each specific Cellular Technology, the basic concept and purpose is same. They are same in 5G/NR as well.
- Why this is harder than it sounds
- What the UE knows after each step
- The steps in detail
- When cell search fails : where to look
- Matlab Reference on Cell Search
38.300 - 5.2.5.3 defined 5G/NR as follows.
I think this is well phrased definition that shows both overal defintion that can be applied to every cellular technology and NR specific technology. As I highlighted with different color, the first sentence is the definition of celllar technology for every technology and the second sentence is the definition that are specific for NR.
It is worth slowing down on those two sentences, because between them they contain the entire problem.
The
Time synchronization - where does a symbol start, where does a slot start, where does a radio frame start. Without this the UE cannot even run an FFT, because it does not know where to put the window.Frequency synchronization - the UE's own oscillator is not exactly on the network's frequency, and any residual offset destroys the orthogonality between subcarriers. This has to be corrected before anything can be demodulated.Cell ID - which of the 1008 physical cell identities this is. Almost every reference signal in NR is scrambled by the PCI, so until the UE knows it, nothing else in the cell can be descrambled.
The
Why this is harder than it sounds
Before the steps, it is worth being honest about the starting position, because it explains why the procedure is shaped the way it is.
A UE that has just been switched on in an unknown place knows
So cell search is a
- PSS is a short, fixed sequence with only 3 possibilities, so it can be found by brute force correlation with no timing knowledge at all.
- The SSB always uses the same 20 resource blocks and 4 symbols regardless of the cell's real bandwidth, so the UE does not need to know the bandwidth to receive it.
- MIB is tiny - 23 bits - because it has to survive being sent before the UE knows almost anything.
- MIB does not contain SIB1. It contains just enough to find the
scheduling of SIB1, and SIB1 then carries the real configuration.
Every one of those is a consequence of the same rule : you can only use what you already have.
Based on this definition, NR Cell Search procedure can be broken down to several steps as follows : (Even though it may seem simple process, this is very complicated process if you go in detail. First, try to understand overall procedure as described below and then follow through the linked pages for further details for each of the steps).
- i) UE tunes to a specific frequency (How UE select this specific freuqency to tune to ?) [detail]
- ii) UE tries to detect SSB and decode PSS, SSS. If UE fails at this step, it goes to step i) and passes at this step, go to next [detail]
- iii) Once UE successfully detect PSS/SSS, UE tries to decode PBCH. [detail]
- iv) Once UE successfully detect PBCH, it decode MIB [detail]
- v) Based on MIB.pdcch-ConfigSIB1, find the location of CORESET0 (CORESET for PDCCH/DCI for SIB1 transmission) and SearchSpace information. This CORESET0 finding is done by predefined parameters as described here. [detail]
- vi) Blind decode DCI 1_0 in the SearchSpace. [detail]
- vii) Based on the contents of the DCI 1_0. (
NOTE : In order to interpret the DCI 1_0 for SI RNTI, UE need to have some additional table like TimeDomainResourceAllocation which is usually configured in RRC message (e.g, SIB1, RRCConfiguration etc). But this step is before decoding any RRC message. It implies that UE should know of TimeDomainResourceAllocation from predefined tables in 3GPP. Refer to [NOTE 1] in SI-RNTI DCI 1_0 for further details ) [detail] - viii) Detect and decode PDSCH carrying SIB1. [detail]
- ix) decode SIB1 and other SIBs (if SIB1 carries information on other SIBs). [detail]
- x) Once the SIB1 is decoded, UE can figure out various other fundamental information like channel bandwidth, center frequency of the channel etc as shown here. [detail]
What the UE knows after each step
This is the table I wish I had when I first read this procedure. Cell search is a ladder, and the only way to make sense of any single step is to know what the UE was holding when it started that step and what it is holding when it finishes. Read the middle column downwards and you can watch a UE go from knowing nothing to being ready to camp.
| Step | What the UE now knows | What it still cannot do |
|---|---|---|
start |
Nothing at all. Not the frequency, bandwidth, SCS, PCI or timing |
Anything |
i) |
A candidate frequency to point the receiver at - a GSCN entry, not an arbitrary frequency |
Does not yet know whether there is a cell there |
ii) |
Symbol and half-frame timing, coarse then fine frequency offset, and the full |
Does not know the SFN, the SSB index, or where the CORESET is. Cannot descramble anything that needs SFN |
iii) |
The SSB index (which beam this is) and the half-frame bit, both carried by the PBCH DMRS. Full frame timing now falls out |
Has the PBCH bits but has not yet interpreted them |
iv) |
MIB : |
Still does not know the channel bandwidth or the centre frequency of the carrier |
v) |
Where CORESET#0 sits in time and frequency, and which slots and symbols to monitor for Type0-PDCCH |
Does not know when SIB1 is actually being sent - only where to look for the announcement |
vi) vii) |
A DCI 1_0 scrambled with SI-RNTI, giving the resource allocation and MCS for the SIB1 PDSCH |
Has the pointer, not the content |
viii) ix) |
SIB1 : cell selection thresholds, PLMN and cell identity, RACH configuration, the full carrier layout |
- |
x) |
offsetToPointA and carrierBandwidth give |
Cell search is complete. The UE can now evaluate the cell for camping and start random access |
The steps in detail
i) UE tunes to a specific frequency
The question in your own step list -
NR carriers can be placed on the
The way out is the phrase from 38.300 quoted above :
Frequency range SSB frequency position GSCN --------------------- -------------------------------------------- ----------------- 0 - 3000 MHz N x 1200 kHz + M x 50 kHz 3N + (M-3)/2 N = 1..2499, M = 1, 3, 5 (M = 3 default) 3000 - 24250 MHz 3000 MHz + N x1.44 MHz , N = 0..14756 7499 + N 24250 - 100000 MHz 24250.08 MHz + N x17.28 MHz , N = 0..4383 22256 + N
Look at the size of those steps against the channel raster and the point becomes obvious :
| Channel raster | Synchronization raster | |
|---|---|---|
Spacing (FR1 above 3 GHz) |
15 kHz |
1.44 MHz |
Spacing (FR2) |
60 or 100 kHz |
17.28 MHz |
Roughly how many points to test |
tens of thousands |
hundreds, and after band filtering often a handful |
The synchronization raster is about a hundred times coarser than the channel raster in FR1, and that ratio is the difference between a cell search that finishes and one that does not. On top of this, 38.104 lists the
And in practice the UE almost never does the full scan at all. 38.304 - 5.2.3 describes two quite different ways of arriving at a cell :
Initial Cell Selection - the UE scans all RF channels in the bands it supports, with no prior knowledge, and this is where the GSCN really earns its keep.Cell Selection using stored information - the UE already has a list of candidate frequencies and goes straight to them.
The second one is what happens almost every time, and the interesting detail is that the specification is deliberately vague about
| Source of candidate frequencies | Notes |
|---|---|
Band and frequency lists written into non-volatile memory by the manufacturer, usually as part of a per-operator carrier configuration bundle. This is normally the |
|
Kept by the UE across power cycles. The reason a phone switched on in your own home finds the network almost instantly |
|
Operator controlled PLMN lists with access technology, plus whatever the last registration left behind |
|
Neighbour lists from earlier measurement configuration, or an explicit redirection - for example being redirected to NR at the end of an LTE connection |
|
The fallback when everything above fails. This is Initial Cell Selection, and it is the slow path |
One consequence that catches people out : because the SSB sits on the sync raster and the carrier sits on the channel raster,
ii) Detect SSB, decode PSS and SSS
The SSB is a fixed block of
subcarrier -> 0 48 56 182 192 239
| | | | | |
symbol 0 ...................[==================PSS===================] ...................
symbol 1 [=====================================PBCH=====================================]
symbol 2 [=====PBCH=====] ...[==================SSS===================] ...[=====PBCH=====]
symbol 3 [=====================================PBCH=====================================]
PSS / SSS : 127 subcarriers each, in the middle
PBCH : 432 data REs + 144 DMRS REs = 576 REs over symbols 1, 2, 3
. . . . : reserved, set to zero (subcarriers 48-55 and 183-191)
When the peak is found, the UE gets three things at once :
PCI = 3 x N_ID(1) + N_ID(2) N_ID(1) : 0 .. 335 from SSS N_ID(2) : 0 .. 2 from PSS ----------------------------------- PCI : 0 .. 1007 = 336 x 3
Splitting the identity across two signals is not an accident. It means the expensive blind search only ever has 3 hypotheses, and the 336-way part is a cheap test once timing is already known.
| Case | SCS | First symbols of each SSB in a half frame | Where used |
|---|---|---|---|
A |
15 kHz |
{2, 8} + 14n |
FR1. n = 0,1 below 3 GHz ; n = 0,1,2,3 above |
B |
30 kHz |
{4, 8, 16, 20} + 28n |
FR1. n = 0 below 3 GHz ; n = 0,1 above |
C |
30 kHz |
{2, 8} + 14n |
FR1. n = 0,1 below 3 GHz ; n = 0,1,2,3 above |
D |
120 kHz |
{4, 8, 16, 20} + 28n |
FR2 |
E |
240 kHz |
{8, 12, 16, 20, 32, 36, 40, 44} + 56n |
FR2 |
The number of SSBs in a burst,
iii) Decode PBCH
PBCH occupies the remaining REs of the SSB - 432 data resource elements carrying 864 QPSK-coded bits, plus 144 DMRS resource elements interleaved among them, one RE in every four.
Two things about PBCH DMRS are worth understanding properly, because 38.300 went out of its way to mention it in the definition.
| Lmax | SSB index bits from DMRS | Remaining bits from PBCH payload |
|---|---|---|
4 (below 3 GHz) |
2 bits |
none |
8 (3 - 6 GHz) |
3 bits |
none |
64 (FR2) |
3 LSBs |
3 MSBs |
Once the UE has the SSB index and the half frame bit, it knows where it is inside the 10 ms radio frame, not merely inside a symbol. Combined with the SFN that arrives in the next step, that gives it complete frame timing.
MIB content23 bits BCCH-BCH-Message wrapper + 1 bit -> 24 PBCH extra timing bits + 8 bits ->32 bits (4 LSBs of SFN, half frame bit, and 3 bits used for the SSB index MSBs in FR2 or k_SSB in FR1) CRC + 24 bits -> 56 bits | polar coding, rate matched v864 bits -> QPSK -> 432 REs
56 information bits stretched over 864 coded bits is a code rate of about 1/15. That is an enormous amount of protection, and it is deliberate : PBCH has to be decodable by a UE that has no idea whether it is even pointed at a real cell, at the very edge of coverage, with no chance to ask for a retransmission.
On top of that, the same MIB content is repeated across the SSBs of an 80 ms window with different scrambling, so a UE that cannot decode one SSB can
iv) Decode MIB
23 bits, and every one of them is doing work. There is no padding in MIB and nothing optional :
| Field | Bits | What it is for |
|---|---|---|
6 |
The 6 MSBs of the SFN. The 4 LSBs came from the PBCH extra bits in step iii), so together they give the full 10 bit SFN and therefore absolute frame timing |
|
1 |
The SCS to use for SIB1, Msg2/4 and paging. One bit is enough because it only has to choose between two values per frequency range |
|
4 |
How far the SSB is offset from the common resource block grid. This is the first hint of the answer to "where is the carrier relative to the SSB". A value above the valid range is also the way a cell says "there is no SIB1 here" |
|
1 |
Whether PDSCH/PUSCH DMRS starts at symbol 2 or 3. Needed before the first PDSCH can be demodulated in step viii) |
|
8 |
4 bits controlResourceSetZero + 4 bits searchSpaceZero. The whole of step v) comes out of these 8 bits |
|
1 |
If barred, the UE stops here and does not even look for SIB1 |
|
1 |
Whether the UE may reselect to another cell on the same frequency when this one is barred |
|
1 |
Reserved |
v) Find CORESET#0 and SearchSpace#0 from pdcch-ConfigSIB1
This is the cleverest step in the whole procedure, and it is worth saying why in plain terms.
A CORESET normally needs a full configuration - which resource blocks, how many symbols, what mapping, what precoder granularity, plus a search space telling the UE which slots and symbols to monitor and how many candidates to try. In a running connection all of that comes from RRC. But here the UE has no RRC configuration at all, and the entire budget available is
The trick is that the 8 bits are not a configuration, they are an
pdcch-ConfigSIB1 =controlResourceSetZero (4 bits) +searchSpaceZero (4 bits) | | v v 38.213 Tables 13-1 .. 13-10 38.213 Tables 13-11 .. 13-15 indexed also by SSB SCS, PDCCH SCS, -> O, M, first symbol index, and the band's minimum channel BW number of search space sets | vSSB / CORESET multiplexing pattern (1, 2 or 3)N_RB 24, 48 or 96 resource blocksN_symb 1, 2 or 3 symbolsoffset in RBs, from the SSB to the start of CORESET#0
So 4 bits buy a complete CORESET description, because the 16 possible descriptions were agreed in advance and written into the specification. The same applies to the 4 bits of searchSpaceZero, which produce the monitoring occasions.
Two details are worth holding on to :
- The CORESET#0 position is expressed as an
offset from the SSB , not as an absolute frequency. It has to be, because at this point the UE still has no idea where the carrier begins. Everything is relative to the one thing it has actually found. - The
multiplexing pattern says how the SSB and CORESET#0 are arranged relative to each other. Pattern 1 has them in different time occasions (the usual FR1 arrangement) ; patterns 2 and 3 place them in the same or overlapping symbols and are used in FR2, where a beam sweep makes time multiplexing expensive.
vi) Blind decode DCI 1_0 in the SearchSpace
The UE now monitors the Type0-PDCCH common search space it just derived, and tries to decode a DCI scrambled with
"Blind decode" means the UE does not know where in the CORESET the DCI is, or how large it is, so it tries every allowed combination and lets the CRC decide. For Type0-PDCCH the candidate set is deliberately small :
Aggregation level Number of candidates
----------------- --------------------
4 4
8 2
16 1
----
7 attempts per monitoring occasion
Notice that the low aggregation levels 1 and 2 are not used at all. Every candidate is large, which means heavily coded, which means robust - the same reasoning as the very low code rate of PBCH. A UE doing initial access may be at the edge of the cell, and this PDCCH has to reach it.
The CRC of a correctly decoded DCI is masked with the RNTI, so "the CRC passed after unmasking with 0xFFFF" is simultaneously the proof that the decode was correct and that this DCI is for system information rather than for some other UE.
vii) Interpret the contents of the DCI 1_0
The DCI 1_0 for SI-RNTI is a compact message whose only job is to point at the SIB1 transmission :
| Field | Meaning |
|---|---|
Which resource blocks the SIB1 PDSCH occupies, sized relative to CORESET#0 rather than to the carrier |
|
4 bits, indexing a default table - this is the point your NOTE below is about |
|
Whether interleaving is applied |
|
5 bits. QPSK only in practice for SIB1 |
|
Which RV of the SIB1 transport block this is, so repetitions can be combined |
|
Whether this is SIB1 or another SI message |
Your NOTE above puts a finger on exactly the right problem, and it is worth restating as the general rule, because it is the theme of this entire page :
The time domain resource assignment field is a 4 bit index. In a connected UE it indexes pdsch-TimeDomainAllocationList, which arrives by RRC signalling. Here there is no RRC signalling yet, so it indexes a
viii) Detect and decode PDSCH carrying SIB1
A normal PDSCH reception, but with every parameter sourced from somewhere unusual : the DMRS position from MIB's dmrs-TypeA-Position, the SCS from MIB's subCarrierSpacingCommon, the resource allocation from the DCI, and the scrambling from the PCI and SI-RNTI rather than from a C-RNTI.
There is no HARQ feedback here. The UE does not have an uplink configuration yet, so it cannot acknowledge anything. If the decode fails there is nothing to report - the UE simply waits for the next repetition. SIB1 is sent with a period of 160 ms, with repetitions inside that window, so a failed attempt costs time rather than the whole procedure.
ix) Decode SIB1 and other SIBs
SIB1 is the first real RRC message the UE has ever seen, and it is large compared with everything before it. The parts that matter most at this moment :
| Element of SIB1 | Why the UE needs it now |
|---|---|
q-RxLevMin and friends - the thresholds that decide whether this cell is good enough to camp on at all |
|
PLMN list, TAC and cell identity. This is where the UE finds out whose network it has found |
|
The carrier layout - offsetToPointA, carrierBandwidth, the TDD pattern - which is what step x) is built on |
|
Inside servingCellConfigCommonSIB. Where and how to send a preamble - the first thing the UE will do after cell search |
|
Which other SIBs exist, and whether they are broadcast periodically or must be requested on demand |
x) Work out the channel bandwidth and centre frequency
This is the step that closes the loop opened in step i). The UE found an SSB on the synchronization raster with no idea where the carrier was. Now it can place it.
The anchor is
frequency ------------------------------------------------------------------------------>Point A |<--------- offsetToPointA (RBs) ---------->| | |<--- k_SSB --->| | | | | | |[=== SSB, 20 RB ===] | |<============================== carrierBandwidth (RBs) ===============================>|[================================= the actual carrier ==================================] offsetToPointA from SIB1 : Point A to the start of the SSB's RB gridk_SSB from MIB : fine offset, in subcarriers, SSB vs the RB gridcarrierBandwidth from SIB1 : how wide the carrier really is (drawn with offsetToCarrier = 0, so the carrier starts at Point A)
The two offsets do different jobs and it is easy to confuse them.
With Point A and carrierBandwidth in hand, the channel bandwidth and centre frequency are simple arithmetic, and the UE finally has the picture it has been assembling for the whole procedure. Cell search is complete, and the UE can decide whether to camp and then begin random access.
When cell search fails : where to look
Because each step depends only on the ones before it, a failure tells you a lot about where the problem is. The useful question is always "what was the last step that succeeded?".
| Symptom | Most likely cause | Where to look |
|---|---|---|
No PSS peak anywhere |
Nothing is being transmitted, the frequency is not on the sync raster, or the search is simply not covering this GSCN |
gNB SSB frequency vs the band's GSCN list |
PSS found but SSS never decodes |
Large frequency offset, or the wrong SCS assumption so the FFT window is wrong |
Reference clock, SSB Case / SCS setting |
PCI detected but PBCH fails |
Poor SNR, or an SSB pattern mismatch so the UE is combining the wrong symbols |
SSB Case A-E vs band and SCS |
MIB decodes but the UE stops there |
cellBarred is set, or kSSB is out of range meaning "no SIB1 on this SSB" |
MIB cellBarred, ssb-SubcarrierOffset |
MIB decodes but no PDCCH is ever found |
pdcch-ConfigSIB1 points at a CORESET#0 that does not fit in the carrier, or the wrong table row was used for the band's minimum channel bandwidth |
controlResourceSetZero, searchSpaceZero |
PDCCH found but the SIB1 PDSCH fails |
Wrong default time domain allocation table, which usually means the multiplexing pattern was resolved incorrectly in step v) |
SSB/CORESET multiplexing pattern |
SIB1 decodes but the UE will not camp |
Not a cell search problem at all. The cell is found correctly but fails cell selection or PLMN checks |
cellSelectionInfo, PLMN list |
Matlab Reference on Cell Search
Reference
[1]
- 3GPP TS 38.300 - 5.2.5.3 Cell search
- 3GPP TS 38.104 - 5.4.3 Synchronization raster (GSCN)
- 3GPP TS 38.211 - 7.4.2 Synchronization signals, 7.4.3 SS/PBCH block
- 3GPP TS 38.212 - 7.1 Broadcast channel
- 3GPP TS 38.213 - 4.1 Cell search, 13 CORESET#0 and SearchSpace#0 tables
- 3GPP TS 38.331 - MIB, SIB1