This example shows how to model the control region used in an LTE downlink subframe and its channel structure.
It demonstrates how to 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
.
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; % Set up the DCI message structure
dci.DCIFormat = 'Format1A'; % DCI format
dci.Allocation.RIV = 26; % resource indication value (RIV) dci.DuplexMode = 'FDD'; dci.NTxAnts = 1;
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. The capacity of the control region depends on the bandwidth, the CFI, the number of antenna ports and the HICH groups.
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;
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 thepdcchIndices
index locations of thesubframe
resource grid.
subframe = lteDLResourceGrid(enb); subframe(pdcchIndices) = pdcchSymbols;
Reference,
1. MathWorks