REG → bundle → CCE → PDCCH
A REG is one RB in one symbol (12 REs: 9 for control, 3 for PDCCH DM-RS). Six REGs make a CCE. A PDCCH occupies 1/2/4/8/16 CCEs depending on the aggregation level — more CCEs = more coding redundancy = more robust, but fewer simultaneous PDCCHs.
REG
1 RB × 1 symbol = 12 REs. Three carry DM-RS (subcarriers 1, 5, 9), nine carry control bits.
REG bundle
L = 2/3/6 contiguous REGs share a precoder. Bundles are the unit the interleaver scatters across the band.
CCE
6 REGs. PDCCH = AL × CCEs. The UE blindly decodes candidate CCE sets in its search space.
The 45-bit resource bitmap
frequencyDomainResources is a 45-bit field; each bit enables a group of 6 RBs within the BWP. Click groups to build the CORESET's frequency footprint. Combined with the duration, that fixes how many REGs — and therefore CCEs — you have.
The CORESET grid & its REGs
Frequency (RBs) across, time (duration symbols) down. Each cell is a REG; the small dots are its 3 DM-RS REs. This is the canvas the PDCCH is painted onto.
Interleaved vs non-interleaved
Non-interleaved: a CCE's 6 REGs are contiguous — simple, localised. Interleaved: REG bundles are scattered across the whole CORESET by the block interleaver (bundle size L, interleaver size R, shift nshift) for frequency diversity. Watch the bundles fly to their interleaved positions.
Aggregation level & PDCCH candidates
A higher aggregation level spends more CCEs on one PDCCH — lower code rate, longer reach (cell-edge), but it consumes capacity. The UE monitors a set of candidates per level and blindly decodes each against its RNTI.
Blind decoding in action
The UE doesn't know which candidate carries its DCI, so it tries them all — descrambling each by its RNTI and checking the CRC. Press play and watch the sweep find the hit.