This example demonstrates how to measure the Physical Downlink Shared Channel (PDSCH) throughput performance using LTE Toolbox™ for the following non-codebook based precoding transmission modes (TM):

TM7: non-codebook based precoding for single layer (Port 5)

TM8: non-codebook based precoding for up to two layers (dual layer Port 7-8, or single antenna port, port 7 or 8)

TM9 and TM10: non-codebook based precoding for up to eight layers Port 7-14 or single antenna port, port 7 or 8

FDD and TDD duplexing schemes are supported. The example also shows how to parameterize and customize the settings for the different transmission modes. It also supports the use of Parallel Computing Toolbox™ to reduce effective simulation time.

Since non-codebook based TMs are considered, the precoding (beamforming) matrix must be calculated. This is achieved using a singular value decomposition (SVD) approach. Perfect knowledge of the channel is assumed.

For each of the considered SNR points, operating on a subframe by subframe basis:

The precoding (beamforming) matrix is calculated from a perfect channel estimate.

A populated resource grid is generated and OFDM modulated to create the waveform to transmit.

The throughput performance of the PDSCH is determined using the block CRC result at the output of the channel decoder.

A parfor loop can be used instead of the for loop for the SNR calculation. This is indicated within the example. The parfor statement is part of the Parallel Computing Toolbox and executes the SNR loops in parallel to reduce the total simulation time.

Simulation Configuration

The example is executed for a simulation length of NFrames = 2 frames for a number of SNR points. A large number of NFrames should be used to produce meaningful throughput results. SNRIn can be an array of values or a scalar. Some TMs and certain modulation schemes are more robust to noise and channel impairments than others, therefore different values of SNR may have to be used for different parameter sets.

NFrames = 2; % Number of frames
SNRIn = [-4 1]; % SNR range in dB

A set of common parameters for all TMs is initially specified, these include the bandwidth, the desired code rate, the modulation scheme and the allocated set of resource blocks. Not specifying an RMC number ensures that all downlink subframes are scheduled. If RMC is specified (e.g. 'R.0'), the subframe scheduling is as defined in TS 36.101 [ 1 ].

The variable txMode selects the TM via a switch statement. For each TM, the required parameters are specified. This example does not perform DCI format decoding, so the DCIFormat field is not strictly necessary. However, since the DCI format is closely linked to the TM, it is included for completeness.

For the purpose of this example, TM9 and TM10 are the same, except for the DCI format, however, they are separated in the switch statement for completeness.

Once the basic set of parameters have been specified, a call to lteRMCDL is needed to fully populate the downlink parameter structure enb.

The size of the precoding matrix W (beamforming matrix) is NLayers -by- ntxants. The number of transmit antennas is taken from W in subsequent toolbox function calls. The number of receive antennas is specified later on as part of the propagation channel.

Call lteRMCDL to generate the default eNodeB parameters not specified in simulationParameters. These will be required later to generate the waveform using lteRMCDLTool.

enb = lteRMCDL(simulationParameters);

The output enb structure contains, amongst other fields, the transport block sizes and redundancy version sequence for each codeword subframe within a frame. These are used later in the simulation.

trBlkSizes = enb.PDSCH.TrBlkSizes;
rvSequence = enb.PDSCH.RVSeq;

The number of codewords, ncw, is the number of entries in the enb.PDSCH.Modulation field.

ncw = length(string(enb.PDSCH.Modulation));

Print a summary of some of the more relevant simulation parameters. Confirm the parameter settings align with expected values. The reported code rate displayed can be useful to detect problems when manually specifying the transport block sizes. Typical values are 1/3, 1/2 and 3/4.

Display Simulation Information

The variable displaySimulationInformation controls the display of simulation information such as the HARQ process ID used for each subframe. In case of CRC error, the value of the index to the RV sequence is also displayed.

displaySimulationInformation = true;

Processing Chain

To determine the throughput at each SNR point, the subframe by subframe PDSCH processing chain includes:

Calculating the Precoding Matrix - A perfect channel estimate is used to calculate the precoding matrix. The calculation process differs slightly between FDD and TDD. A detailed explanation of this step is provided in the next section.

Updating Current HARQ Process - The HARQ process either carries new transport data or a retransmission of previously sent transport data depending upon the Acknowledgment (ACK) or Negative Acknowledgment (NACK) based on CRC results. All this is handled by the HARQ scheduler, hHARQScheduling.m. The PDSCH data is updated based on the HARQ state.

Creating Transmit Waveform - Pass the data generated by the HARQ process to lteRMCDLTool to produce an OFDM modulated waveform, containing the physical channels and signals.

Performing Synchronization and OFDM Demodulation - Offset the received symbols to account for a combination of implementation delay and channel delay spread. OFDM demodulate the symbols.

Performing Channel Estimation - Estimate the channel response and noise level. Use these estimates to decode the PDSCH.

Decoding the PDSCH - Obtain an estimate of the received codewords using ltePDSCHDecode to demodulate and descramble the recovered PDSCH symbols for all transmit and receive antenna pairs.

Decoding the Downlink Shared Channel (DL-SCH) and Storing the Block CRC Error for a HARQ Process - Pass the vector of decoded soft bits to lteDLSCHDecode, which decodes the codeword and returns the block CRC error used to determine the throughput of the system. The contents of the new soft buffer, harqProc(harqID).decState, is available at the output of this function to be used when decoding the next subframe.

Precoding Matrix Calculation

Since non-codebook based TMs are modeled, the precoding (beamforming) matrix must be computed, which is based on the channel estimate. For simplicity, perfect knowledge of the channel is assumed.

The figure shows the timing associated with the channel estimation, precoding matrix W calculation and precoding operation for both FDD and TDD modes.

For TDD (uplink-downlink configuration 1 frame structure), the channel is estimated in the last UL subframe before a DL subframe. This channel estimate is used to calculate the precoding matrix W. All subsequent DL subframes (including special subframes) until the next UL subframe are precoded with this matrix W.

For FDD, there is a delay of one subframe between the calculation of the precoding matrix W and the subframe where it is used. For example, the precoding matrix used in subframe n has been calculated with the channel estimate obtained in subframe n-1, as shown in the figure.

The process depicted shows how a single channel matrix estimate, H, is obtained from the whole set of allocated resource blocks by averaging over time and frequency. Using this channel estimate, H, a precoding matrix, W, is obtained via singular value decomposition.

Note that for an allocation of a single resource block, the precoding matrix W will usually be well matched to the channel conditions, with little deviation from the optimal precoding. But as the allocation size increases, the precoding matrix takes into account the average of the channel conditions over the whole allocation. This averaging causes a deviation from the optimal precoding matrix. Therefore, you can expect a degradation in performance as the size of the resource allocation increases.

Processing Loop

The 'for' loop for SNR points processing is included below. To enable the use of parallel computing for increased speed use 'parfor' instead of 'for' in the loop. This requires the Parallel Computing Toolbox. If this is not installed 'parfor' will default to the normal 'for' statement. If 'parfor' is used, it is recommended that the variable displaySimulationInformation above is set to false, otherwise the simulation information displays for each SNR point will overlap.

RV Sequence Index Plots

The code below generates plots with the value of the indices to the elements in the RV sequence for the simulated subframes. This provides an idea of the retransmissions required. The reason for plotting the indices instead of the RV values is that the latter may not be organized in ascending order. For example, in some cases the RV sequence can be [0, 2, 3, 1]. Plotting these values as they are used will not provide a clear idea of the number of retransmissions needed.

When transmitting a new transport block, the first element of the RV sequence is used, and a value of 1 is shown for that subframe. This is the case at the beginning of the simulation. If a retransmission is required, the next element in the RV sequence is selected and the index is increased. A value of 2 will be plotted for the subframe where the retransmission takes place. If further retransmissions are required, the index value will increase further. The plots do not show any value in subframe 5 of consecutive frames. This is because no data is transmitted in those subframes for the setup used in this example.

hPlotRVSequence(SNRIn,allRvSeqIdxHistory,NFrames);

Throughput Results

The throughput results are displayed in the MATLAB® command window after each SNR point is completed. They are also captured in output arrays simThroughput and maxThroughput. simThroughput stores the measured throughput in number of bits for all simulated SNR points. maxThroughput stores the maximum possible throughput in number of bits for each simulated SNR point.