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.

Specify the cell-wide settings as fields in the structure enb. Many of the functions used in this example require a subset of these settings.

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';

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 these 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 by calling the lteDCI function. You can map this generated message to the PDCCH.

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

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

Set up the PDCCH configuration structure. The channel coding stages require these parameters:

  • 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. You can calculate the total number of resources available for PDCCH by using the ltePDCCHInfo function.

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 by calling the ltePDCCHSpace function. 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 ltePDCCH function, which is used to generate complex-modulated symbols, interprets these locations as unused and will only consider those containing 1s and 0s.

To generate the PDCCH symbols, use the ltePDCCH function. 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

To generate PDCCH mapping indices, use the ltePDCCHIndices function. 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.

  • Create an empty resource grid with the lteDLResourceGrid function.

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

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

See Also

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

Related Topics