This example describes the blind search decoding of the physical downlink control channel (PDCCH) instance for 5G New Radio communications system. Building on the tutorial Modeling Downlink Control Information, it introduces the concept of a control resource set (CORESET), its generic specification and shows how a PDCCH instance is mapped to one of several possible candidates. At the receiver, the example performs a blind search over the same set of candidates to recover the transmitted control information.

System Parameters

Set system parameters corresponding to the bandwidth part, CORESET and PDCCH instances respectively.

rng(111);                            % Set RNG state for repeatability

NcellID = 0;                         % Cell identity

% Bandwidth part (BWP) configuration
bwp = [];
bwp.SubcarrierSpacing = 30;          % BWP Subcarrier spacing
bwp.NRB = 48;                        % Size of BWP in resource blocks
bwp.CyclicPrefix = 'normal';         % BWP cyclic prefix

% CORESET configuration
coreset = [];
coreset.AllocatedPRB = [1 1 1 0 1];        % frequencyDomainResources, each bit is 6RB
coreset.Duration = 1;                      % Symbol duration (1,2,3)
coreset.CCEREGMapping = 'nonInterleaved';  % Mapping: 'interleaved' or 'nonInterleaved'
coreset.REGBundleSize = 2;                 % L (2,6) or (3,6)
coreset.InterleaverSize = 3;               % R (2,3,6)
coreset.ShiftIndex = NcellID;              % default to NcellID, 0...274
coreset.PDCCHDMRSScramblingID = NcellID;   % default to NcellID, 0...65535

% Search Space configuration: multiple within a slot
ss = [];
ss.AllocatedSymbols = [0,4,8];    % first symbol of each monitoring occasion in slot, 0-based
ss.AllocatedSlots = 0;            % first slot, 0-based
ss.AllocatedPeriod = 1;           % over slots

% PDCCH instance configuration
pdcch = [];
pdcch.NumCCE = 4;                 % Number of CCE in PDCCH, in 6REG units (or AggregationLevel:1,2,4,8,16)
pdcch.AllocatedSearchSpace = 2;   % 0-based for now, scalar only, index into AllocatedSymbols
pdcch.RNTI = 0;                   % RNTI
pdcch.DataBlkSize = 64;           % DCI payload size
pdcch.BWP = bwp;                  % Associated bandwidth part
pdcch.CORESET = coreset;          % Associated CORESET
pdcch.SearchSpaces = ss;          % Associated SearchSpace

This example assumes single slot processing, using a single bandwidth part with a single PDCCH transmission for an associated CORESET. It supports both interleaved and non-interleaved CCE-to-REG mapping with no resource block offsets with respect to the bandwidth part and CORESET. Refer to the 5G NR Downlink Carrier Waveform Generation example for details on other parameters described therein.

PDCCH Bit Capacity

The bit capacity for a PDCCH instance is determined based on the number of Control Channel Elements (CCE) configured for the PDCCH. A CCE consists of six resource element groups (REGs) where a resource-element group equals one resource block (RB) during one OFDM symbol.

% Number of bits for PDCCH resources and possible candidates
[E,candidates] = hPDCCHSpace(pdcch,ss);

Based on the specified monitoring opportunity for the first symbol of each CORESET in a slot (ss.AllocatedSymbols), the corresponding physical resource block (PRB) allocation (coreset.AllocatedPRB) and symbol duration (coreset.Duration), all possible candidates are determined for the PDCCH instance over the whole bandwidth part. Each of the candidates represent the possible resource element indices for the PDCCH symbols within the slot. The PDCCH DM-RS resource element indices are excluded from these sets.

DCI Encoding

The DCI message bits based on a downlink format are encoded using the nrDCIEncode function, which includes the stages of CRC attachment, polar encoding and rate matching. The codeword is rate-matched to the PDCCH bit capacity E.

K = pdcch.DataBlkSize;               % Number of DCI message bits
dciBits = randi([0 1],K,1,'int8');

rnti = pdcch.RNTI;
dciCW = nrDCIEncode(dciBits,rnti,E);

PDCCH Symbol Generation and Mapping

The encoded DCI bits are mapped onto the physical downlink control channel (PDCCH) using the nrPDCCH function which generates the scrambled, QPSK-modulated symbols. The scrambling accounts for the user-specific parameters.

nID = pdcch.CORESET.PDCCHDMRSScramblingID;
sym = nrPDCCH(dciCW,nID,rnti);

For NR, the PDCCH symbols are then mapped to one of the candidates (resource element sets) within an OFDM grid which also has PDSCH, PBCH and other reference signal elements. These are followed by OFDM modulation and transmission over a channel. For simplicity, only the PDCCH symbols are mapped here to a candidate location within the grid.

numSCRB = 12;                        % Number of subcarriers in a RB
if strcmp(bwp.CyclicPrefix,'normal')
    symsPerSlot = 14;                    % For normal CP
    symsPerSlot = 12;                    % For extended CP
reGrid = zeros(numSCRB*bwp.NRB,symsPerSlot);
reGrid(candidates{pdcch.AllocatedSearchSpace+1}) = sym; % Specified candidate

For a resource grid spanning the whole bandwidth part and a single slot, the following figure shows the CORESET, monitoring instances and PDCCH instance for the selected example parameters.

Noise Addition

White Gaussian noise with specified level is added to the resource grid, accounting for the coding rate and QPSK modulation.

EbNo = 0;                            % in dB
bps = 2;                             % bits per symbol, 2 for QPSK
EsNo = EbNo + 10*log10(bps);
snrdB = EsNo + 10*log10(K/E);
noiseVar = 10.^(-snrdB/10);          % assumes unit signal power

rxGrid = awgn(reGrid,snrdB,'measured');

Blind PDCCH and DCI Decoding

As the UE does not have information about the detailed control channel structure, it needs to blindly decode the PDCCH received symbols. It does this by monitoring the set of PDCCH candidates for each slot, using the UE's RNTI to identify the right candidate.

The received symbols per candidate are demodulated with known user-specific parameters and channel noise variance using the nrPDCCHDecode function.

For an instance of the received PDCCH codeword, the nrDCIDecode function includes the stages of rate recovery, polar decoding and CRC decoding.

If the output mask matches the RNTI used for the PDCCH, the UE has successfully decoded the PDCCH and can process the decoded DCI message.

In this example, the receiver assumes knowledge of the DCI format (i.e. K is assumed known at the receiver). In practice, even this would be searched for in an outer loop over all supported formats with respective bit lengths per format.

listLen = 8;                         % polar decoding list length

% Loop over all candidates within a slot
numCandidates = size(candidates,1);
for cIdx = 1:numCandidates

    rxCW = nrPDCCHDecode(rxGrid(candidates{cIdx}),nID,rnti,noiseVar);

    [decDCIBits,decRNTI] = nrDCIDecode(rxCW,K,listLen);

    if isequal(decRNTI, rnti)
        disp(['Decoded candidate #' num2str(cIdx)])

if isequal(decDCIBits,dciBits)
    disp('Recovered DCI bits with no error');
    disp('Recovered DCI bits with errors');
Decoded candidate #3
Recovered DCI bits with no error

For the chosen system parameters, the decoded information matches the transmitted information bits.


This example uses the following helper function:

Selected References

  1. 3GPP TS 38.211. "NR; Physical channels and modulation (Release 15)." 3rd Generation Partnership Project; Technical Specification Group Radio Access Network.

  2. 3GPP TS 38.212. "NR; Multiplexing and channel coding (Release 15)." 3rd Generation Partnership Project; Technical Specification Group Radio Access Network.

  3. 3GPP TS 38.213. "NR; Physical layer procedures for control (Release 15)." 3rd Generation Partnership Project; Technical Specification Group Radio Access Network.

See Also