Model DCI and PDCCH

This example shows how to model the control region used in an LTE downlink subframe and its channel structure. It demonstrates how you create a DCI message, encode it, create the PDCCH, and map it to a resource grid.

Set up the cell-wide settings. Create a structure and specify the cell-wide settings as its fields.

enb.NDLRB = 9;
enb.CyclicPrefix = 'Normal';
enb.PHICHDuration = 'Normal';
enb.CFI = 3;
enb.Ng = 'Sixth';
enb.CellRefP = 1;
enb.NCellID = 1;
enb.NSubframe = 0;
enb.DuplexMode = 'FDD';

Many of the functions used in this example require a subset of the preceding settings specified.

Set up the DCI message structure.

dci.NDLRB = enb.NDLRB;
dci.DCIFormat = 'Format1A';
dci.Allocation.RIV = 26;
dci.DuplexMode = 'FDD';
dci.NTxAnts = 1;

The DCI message contains the following parameters.

  • NDLRB — number of downlink resource blocks (RBs)

  • DCIFormat — DCI format, selected from those discussed in DCI Message Formats

  • Allocation.RIV — resource indication value (RIV)

  • DuplexMode — transmission frame structure type, 'FDD' for frame structure type 1 or 'TDD' for frame structure type 2

  • NTxAnts — number of transmit antennas

The RIV indicates the contiguous RB allocations for a UE. The UE uses the RIV to determine the first virtual RB and the length of contiguous allocation of RBs. In this example, an RIV setting of 26 corresponds to full bandwidth assignment.

Generate a DCI message. To do so, call the function lteDCI. You can map this generated message to the PDCCH.

[dciMessage,dciMessageBits] = lteDCI(enb,dci);

The function lteDCI returns a structure, dciMessage, and a vector containing the DCI message bits, dciMessageBits. Both outputs contain the same information, but are ideal for different purposes. The output structure is more readable, while the serialized DCI message is a more suitable format to send to the channel coding stage.

Set up the PDCCH configuration structure. The channel coding stages require the parameters shown in the following list.

  • number of downlink resource blocks (RBs)

  • UE-specific mask (16-bit C-RNTI value)

  • PDCCH format

pdcch.RNTI = 100;
pdcch.PDCCHFormat = 0;

Channel encode the DCI message bits. This process consists of the addition of a CRC attachment, convolutional coding, and rate matching according to the PDCCH format capacity.

codedDciBits = lteDCIEncode(pdcch,dciMessageBits);

The resulting vector, codedDciBits, has 72 elements.

Generate PDCCH bits. The encoded DCI messages are then assigned to CCEs, as discussed in Matching PDCCHs to CCE Positions. The capacity of the control region depends on the bandwidth, the CFI, the number of antenna ports and the HICH groups. The total number of resources available for PDCCH can be calculated using the function ltePDCCHInfo.

pdcchInfo = ltePDCCHInfo(enb);

This function returns a structure, pdcchInfo, which contains the resources available to the PDCCH in different units (one per field): bits, CCEs, REs and REGs.

The total number of bits available in the PDCCH region can be found in the field pdcchInfo.MTot. This allows a vector to be built with the appropriate number of elements.

pdcchBits = -1*ones(1,pdcchInfo.MTot);

Not all the available bits in the PDCCH region are necessarily used. Therefore, following the convention in the LTE Toolbox™ product, set unused bits to −1. Since all elements have been initialized in pdcchBits to −1, this indicates that initially all the bits are unused. Now elements of codedDciBits can be mapped to the appropriate locations in pdcchBits.

Calculate indices of candidate bits. To do so, call the function ltePDCCHSpace. Only a subset of all the bits in pdcchBits may be used, which are called the candidate bits.

candidates = ltePDCCHSpace(enb,pdcch,{'bits','1based'});

This function returns a two-column matrix. Each row contains an available candidate location for the cell-wide settings provided by enb and the PDCCH configuration structure pdcch. The first and second columns contain the indices of the first and last locations of each candidate. In this example, the indices are 1-based and refer to bits. Hence, they can be used to access locations in pdcchBits.

Use the first available candidate to map the coded DCI bits.

pdcchBits (candidates(1,1):candidates(1,2)) = codedDciBits;

The vector pdcchBits has 736 elements. The 72 bits of codedDciBits are mapped to the chosen candidate in pdcchBits. Therefore, out of 736 elements, 72 will take 0 and 1 values, while the rest remain set to −1. The function ltePDCCH, which is used to generate complex-modulated symbols, will interpret these locations as unused and will only consider those containing 1s and 0s.

Use ltePDCCH to generate PDCCH complex symbols. You can generate the PDCCH complex symbols from the set of bits used in pdcchBits, values not set to −1. The function performs the required scrambling, QPSK modulation, layer mapping, and precoding operations. Since there are two bits per QPSK symbol, 368 symbols are generated. The occupied bits result in 36 non-zero QPSK symbols.

pdcchSymbols = ltePDCCH(enb, pdcchBits);
size(pdcchSymbols)
ans = 1×2

   368     1

size(find(pdcchSymbols))
ans = 1×2

    36     1

Use ltePDCCHIndices to generate PDCCH mapping indices. You can use these indices to map the complex values in pdcchSymbols to the subframe resource grid.

pdcchIndices = ltePDCCHIndices(enb,{'1based'});
size(pdcchIndices)
ans = 1×2

   368     1

This function returns a column vector. The rows contain the 1-based indices in linear form for mapping the PDCCH symbols to the subframe resource grid.

Map the PDCCH to the resource grid. You can easily map the complex PDCCH symbols to the resource grid for each antenna port.

  • Use lteDLResourceGrid to create an empty resource grid.

  • Map the pdcchSymbols to the pdcchIndices index locations of the subframe resource grid.

subframe = lteDLResourceGrid(enb);
subframe(pdcchIndices) = pdcchSymbols;

See Also

| | | | | | | | | | | | | | | | | | | | |

Related Topics