PDSCH Throughput Conformance Test for Single Antenna (TM1), Transmit Diversity (TM2), Open Loop (TM3) and Closed Loop (TM4/6) Spatial Multiplexing
This example demonstrates how to measure the Physical Downlink Shared Channel (PDSCH) throughput performance using LTE Toolbox™ for the following transmission modes (TM):
TM1: Single antenna (Port 0)
TM2: Transmit diversity
TM3: Open loop codebook based precoding: Cyclic Delay Diversity (CDD)
TM4: Closed loop codebook based spatial multiplexing
TM6: Single layer closed loop codebook based spatial multiplexing
The example also shows how to parameterize and customize the settings for the different TMs. It also supports the use of Parallel Computing Toolbox™ to reduce effective simulation time.
Introduction
This example measures the throughput for a number of SNR points. The provided code can operate under a number of transmission modes: TM1, TM2, TM3, TM4 and TM6. For information on how to model TM7, TM8, TM9 and TM10 check the following example: PDSCH Throughput for Non-Codebook Based Precoding Schemes: Port 5 (TM7), Port 7 or 8 or Port 7-8 (TM8), Port 7-14 (TM9 and TM10)
The example works on a subframe by subframe basis. For each of the considered SNR points a populated resource grid is generated and OFDM modulated to create a transmit waveform. The generated waveform is passed through a noisy fading channel. The following operations are then performed by the receiver: channel estimation, equalization, demodulation and decoding. The throughput performance of the PDSCH is determined using the block CRC result at the output of the channel decoder.
Precoder Matrix Indication (PMI) feedback is implemented for the TMs requiring the feedback of a precoding matrix (TM4 and TM6).
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 loop in parallel to reduce the total simulation time.
Simulation Configuration
The example is executed for a simulation length of 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 = [10.3 12.3 14.3]; % SNR range in dB
eNodeB Configuration
This section selects the TM of interest and sets the eNodeB parameters. The TM is selected using the variable txMode
, which can take the values TM1, TM2, TM3, TM4 and TM6.
txMode = 'TM4'; % TM1, TM2, TM3, TM4, TM6
For simplicity all TMs modeled in this example have a bandwidth of 50 resource blocks with a full allocation and a code rate of 0.5. 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 where subframe 5 is not scheduled in most cases.
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.
simulationParameters = []; % clear simulationParameters simulationParameters.NDLRB = 50; simulationParameters.PDSCH.TargetCodeRate = 0.5; simulationParameters.PDSCH.PRBSet = (0:49)'; switch txMode % Single antenna (Port0) mode (TM1) case 'TM1' fprintf('\nTM1 - Single antenna (port 0)\n'); simulationParameters.PDSCH.TxScheme = 'Port0'; simulationParameters.PDSCH.DCIFormat = 'Format1'; simulationParameters.CellRefP = 1; simulationParameters.PDSCH.Modulation = {'16QAM'}; % Transmit diversity mode (TM2) case 'TM2' fprintf('\nTM2 - Transmit diversity\n'); simulationParameters.PDSCH.TxScheme = 'TxDiversity'; simulationParameters.PDSCH.DCIFormat = 'Format1'; simulationParameters.CellRefP = 2; simulationParameters.PDSCH.Modulation = {'16QAM'}; simulationParameters.PDSCH.NLayers = 2; % CDD mode (TM3) case 'TM3' fprintf('\nTM3 - CDD\n'); simulationParameters.PDSCH.TxScheme = 'CDD'; simulationParameters.PDSCH.DCIFormat = 'Format2A'; simulationParameters.CellRefP = 2; simulationParameters.PDSCH.Modulation = {'16QAM', '16QAM'}; simulationParameters.PDSCH.NLayers = 2; % Spatial multiplexing mode (TM4) case 'TM4' fprintf('\nTM4 - Codebook based spatial multiplexing\n'); simulationParameters.CellRefP = 2; simulationParameters.PDSCH.Modulation = {'16QAM', '16QAM'}; simulationParameters.PDSCH.DCIFormat = 'Format2'; simulationParameters.PDSCH.TxScheme = 'SpatialMux'; simulationParameters.PDSCH.NLayers = 2; % No codebook restriction simulationParameters.PDSCH.CodebookSubset = ''; % Single layer spatial multiplexing mode (TM6) case 'TM6' fprintf(... '\nTM6 - Codebook based spatial multiplexing with single layer\n'); simulationParameters.CellRefP = 4; simulationParameters.PDSCH.Modulation = {'QPSK'}; simulationParameters.PDSCH.DCIFormat = 'Format2'; simulationParameters.PDSCH.TxScheme = 'SpatialMux'; simulationParameters.PDSCH.NLayers = 1; % No codebook restriction simulationParameters.PDSCH.CodebookSubset = ''; otherwise error('Transmission mode should be one of TM1, TM2, TM3, TM4 or TM6.') end % Set other simulationParameters fields applying to all TMs simulationParameters.TotSubframes = 1; % Generate one subframe at a time simulationParameters.PDSCH.CSI = 'On'; % Soft bits are weighted by CSI
TM4 - Codebook based spatial multiplexing
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, among other fields, the transport block sizes and redundancy version sequence for each codeword subframe within a frame. These will be used later in the simulation.
rvSequence = enb.PDSCH.RVSeq; trBlkSizes = enb.PDSCH.TrBlkSizes;
The number of codewords, ncw
, is the number of entries in the enb.PDSCH.Modulation
field.
ncw = length(string(enb.PDSCH.Modulation));
Set the PMI delay for the closed-loop TMs (TM4 and TM6). This is the delay between a PMI being passed from UE to eNodeB as defined in TS 36.101, Table 8.2.1.4.2-1.
pmiDelay = 8;
Next we print a summary of some of the more relevant simulation parameters. Check these values to make sure they are as expected. The code rate displayed can be useful to detect problems if manually specifying the transport block sizes. Typical values are 1/3, 1/2 and 3/4.
hDisplayENBParameterSummary(enb, txMode);
-- Parameter summary: -------------------------------------------- Duplexing mode: FDD Transmission mode: TM4 Transmission scheme: SpatialMux Number of downlink resource blocks: 50 Number of allocated resource blocks: 50 Cell-specific reference signal ports: 2 Number of transmit antennas: 2 Transmission layers: 2 Number of codewords: 2 Modulation codeword 1: 16QAM Transport block sizes codeword 1: 11448 11448 11448 11448 11448 11448 11448 11448 11448 11448 Code rate codeword 1: 0.515 0.48 0.48 0.48 0.48 0.4918 0.48 0.48 0.48 0.48 Modulation codeword 2: 16QAM Transport block sizes codeword 2: 11448 11448 11448 11448 11448 11448 11448 11448 11448 11448 Code rate codeword 2: 0.515 0.48 0.48 0.48 0.48 0.4918 0.48 0.48 0.48 0.48 ------------------------------------------------------------------
Propagation Channel Model Configuration
The structure channel
contains the channel model configuration parameters.
channel.Seed = 6; % Channel seed channel.NRxAnts = 2; % 2 receive antennas channel.DelayProfile = 'EPA'; % Delay profile channel.DopplerFreq = 5; % Doppler frequency channel.MIMOCorrelation = 'Low'; % Multi-antenna correlation channel.NTerms = 16; % Oscillators used in fading model channel.ModelType = 'GMEDS'; % Rayleigh fading model type channel.InitPhase = 'Random'; % Random initial phases channel.NormalizePathGains = 'On'; % Normalize delay profile power channel.NormalizeTxAnts = 'On'; % Normalize for transmit antennas
The sampling rate for the channel model is set using the value returned from lteOFDMInfo
.
ofdmInfo = lteOFDMInfo(enb); channel.SamplingRate = ofdmInfo.SamplingRate; % Maximum channel delay (multipath and channel filtering) channel.InitTime = 0; [~,chInfo] = lteFadingChannel(channel,0); % get channel info maxChDelay = ceil(max(chInfo.PathSampleDelays)) + chInfo.ChannelFilterDelay;
Channel Estimator Configuration
The variable perfectChanEstimator
controls channel estimator behavior. Valid values are true
or false
. When set to true
a perfect channel response is used as estimate, otherwise an imperfect estimation based on the values of received pilot signals is obtained.
% Perfect channel estimator flag
perfectChanEstimator = false;
If perfectChanEstimator
is set to false a configuration structure cec
is needed to parameterize the channel estimator. The channel changes slowly in time and frequency, therefore a large averaging window is used in order to average the noise out.
% Configure channel estimator cec.PilotAverage = 'UserDefined'; % Type of pilot symbol averaging cec.FreqWindow = 41; % Frequency window size in REs cec.TimeWindow = 27; % Time window size in REs cec.InterpType = 'Cubic'; % 2D interpolation type cec.InterpWindow = 'Centered'; % Interpolation window type cec.InterpWinSize = 1; % Interpolation window size
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 Loop
To determine the throughput at each SNR point, the PDSCH data is analyzed on a subframe by subframe basis using the following steps:
Update 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
. The PDSCH data is updated based on the HARQ state.
Set PMI. This step is only applicable to TM4 and TM6 (closed loop spatial multiplexing and single layer closed loop spatial multiplexing). A PMI is taken sequentially from a set of PMIs,
txPMIs
, each subframe and used by the eNodeB to select a precoding matrix. The PMI recommended by the UE is used by the eNodeB for data transmission. There is a delay ofpmiDelay
subframes between the UE recommending the PMI and the eNodeB using it to select a precoding matrix. Initially a set ofpmiDelay
random PMIs is used.
Create Transmit Waveform. The data generated by the HARQ process is passed to
lteRMCDLTool
which produces an OFDM modulated waveform, containing the physical channels and signals.
Noisy Channel Modeling. The waveform is passed through a fading channel and noise (AWGN) is added.
Perform Synchronization and OFDM Demodulation. The received symbols are offset to account for a combination of implementation delay and channel delay spread. The symbols are then OFDM demodulated.
Perform Channel Estimation. The channel response and noise levels are estimated. These estimates are used to decode the PDSCH.
Decode the PDSCH. The recovered PDSCH symbols for all transmit and receive antenna pairs, along with a noise estimate, are demodulated and descrambled by
ltePDSCHDecode
to obtain an estimate of the received codewords.
Decode the Downlink Shared Channel (DL-SCH) and Store the Block CRC Error for a HARQ Process. The vector of decoded soft bits is passed to
lteDLSCHDecode
; this 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.
Update PMI. A PMI is selected and fed back to the eNodeB for future use. This step is only applicable to TM4 and TM6 (close loop spatial multiplexing and single layer closed loop spatial multiplexing).
% The number of transmit antennas P is obtained from the resource grid % dimensions. 'dims' is M-by-N-by-P where M is the number of subcarriers, N % is the number of symbols and P is the number of transmit antennas. dims = lteDLResourceGridSize(enb); P = dims(3); % Initialize variables used in the simulation and analysis % Array to store the maximum throughput for all SNR points maxThroughput = zeros(length(SNRIn),1); % Array to store the simulation throughput for all SNR points simThroughput = zeros(length(SNRIn),1); % Get the HARQ ID sequence for HARQ processing. This is a list of indices % for HARQ process scheduling. [~,~,enbOut] = lteRMCDLTool(enb, []); harqProcessSequence = enbOut.PDSCH.HARQProcessSequence; % Temporary variables 'enb_init', 'channel_init' and % 'harqProcessSequence_init' are used to optimize parallel processing (only % if running the example with Parallel Computing Toolbox) enb_init = enb; channel_init = channel; harqProcessSequence_init = harqProcessSequence; legendString = ['Throughput: ' char(enb.PDSCH.TxScheme)]; allRvSeqPtrHistory = cell(1,numel(SNRIn)); nFFT = ofdmInfo.Nfft; for snrIdx = 1:numel(SNRIn) % parfor snrIdx = 1:numel(SNRIn) % To enable the use of parallel computing for increased speed comment out % the 'for' statement above and uncomment the 'parfor' statement below. % This needs 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. % Set the random number generator seed depending to the loop variable % to ensure independent random streams rng(snrIdx,'combRecursive'); SNRdB = SNRIn(snrIdx); fprintf('\nSimulating at %g dB SNR for %d Frame(s)\n' ,SNRdB, NFrames); % Initialize variables used in the simulation and analysis offsets = 0; % Initialize frame offset value offset = 0; % Initialize frame offset value for radio frame blkCRC = []; % Block CRC for all considered subframes bitTput = []; % Number of successfully received bits per subframe txedTrBlkSizes = []; % Number of transmitted bits per subframe enb = enb_init; % Initialize RMC configuration channel = channel_init; % Initialize channel configuration harqProcessSequence = harqProcessSequence_init; % Initialize HARQ process sequence pmiIdx = 0; % PMI index in delay queue % The variable harqPtrTable stores the history of the value of the % pointer to the RV sequence values for all the HARQ processes. % Pre-allocate with NaNs as some subframes do not have data rvSeqPtrHistory = NaN(ncw, NFrames*10); % Initialize state of all HARQ processes harqProcesses = hNewHARQProcess(enb); % Use random PMIs for the first 'pmiDelay' subframes until feedback is % available from the UE; note that PMI feedback is only applicable for % spatial multiplexing TMs (TM4 and TM6), but the code here is required % for complete initialization of variables in the SNR loop when using % the Parallel Computing Toolbox. pmidims = ltePMIInfo(enb,enb.PDSCH); txPMIs = randi([0 pmidims.MaxPMI], pmidims.NSubbands, pmiDelay); for subframeNo = 0:(NFrames*10-1) % Update subframe number enb.NSubframe = subframeNo; % Get HARQ process ID for the subframe from HARQ process sequence harqID = harqProcessSequence(mod(subframeNo, length(harqProcessSequence))+1); % If there is a transport block scheduled in the current subframe % (indicated by non-zero 'harqID'), perform transmission and % reception. Otherwise continue to the next subframe if harqID == 0 continue; end % Update current HARQ process harqProcesses(harqID) = hHARQScheduling( ... harqProcesses(harqID), subframeNo, rvSequence); % Extract the current subframe transport block size(s) trBlk = trBlkSizes(:, mod(subframeNo, 10)+1).'; % Display run time information if displaySimulationInformation disp(' '); disp(['Subframe: ' num2str(subframeNo)... '. HARQ process ID: ' num2str(harqID)]); end % Update RV sequence pointer table rvSeqPtrHistory(:,subframeNo+1) = ... harqProcesses(harqID).txConfig.RVIdx.'; % Update the PDSCH transmission config with HARQ process state enb.PDSCH = harqProcesses(harqID).txConfig; data = harqProcesses(harqID).data; % Set the PMI to the appropriate value in the delay queue if strcmpi(enb.PDSCH.TxScheme,'SpatialMux') pmiIdx = mod(subframeNo, pmiDelay); % PMI index in delay queue enb.PDSCH.PMISet = txPMIs(:, pmiIdx+1); % Set PMI end % Generate transmit waveform txWaveform = lteRMCDLTool(enb, data); % Add maxChDelay sample padding. This is to cover the range of % delays expected from channel modeling (a combination of % implementation delay and channel delay spread) txWaveform = [txWaveform; zeros(maxChDelay, P)]; %#ok<AGROW> % Get the HARQ ID sequence from 'enbOut' for HARQ processing harqProcessSequence = enbOut.PDSCH.HARQProcessSequence; % Initialize channel time for each subframe channel.InitTime = subframeNo/1000; % Pass data through channel model rxWaveform = lteFadingChannel(channel, txWaveform); % Calculate noise gain including compensation for downlink power % allocation SNR = 10^((SNRdB-enb.PDSCH.Rho)/20); % Normalize noise power to take account of sampling rate, which is % a function of the IFFT size used in OFDM modulation, and the % number of antennas N0 = 1/(sqrt(2.0*enb.CellRefP*double(nFFT))*SNR); % Create additive white Gaussian noise noise = N0*complex(randn(size(rxWaveform)), ... randn(size(rxWaveform))); % Add AWGN to the received time domain waveform rxWaveform = rxWaveform + noise; % Once every frame, on subframe 0, calculate a new synchronization % offset if (mod(subframeNo,10) == 0) offset = lteDLFrameOffset(enb, rxWaveform); if (offset > maxChDelay) offset = offsets(end); end offsets = [offsets offset]; %#ok end % Synchronize the received waveform rxWaveform = rxWaveform(1+offset:end, :); % Perform OFDM demodulation on the received data to recreate the % resource grid rxSubframe = lteOFDMDemodulate(enb, rxWaveform); % Channel estimation if(perfectChanEstimator) estChannelGrid = lteDLPerfectChannelEstimate(enb, channel, offset); %#ok noiseGrid = lteOFDMDemodulate(enb, noise(1+offset:end ,:)); noiseEst = var(noiseGrid(:)); else [estChannelGrid, noiseEst] = lteDLChannelEstimate( ... enb, enb.PDSCH, cec, rxSubframe); end % Get PDSCH indices pdschIndices = ltePDSCHIndices(enb, enb.PDSCH, enb.PDSCH.PRBSet); % Get PDSCH resource elements from the received subframe. Scale the % received subframe by the PDSCH power factor Rho. The PDSCH is % scaled by this amount, while the cell reference symbols used for % channel estimation (used in the PDSCH decoding stage) are not. [pdschRx, pdschHest] = lteExtractResources(pdschIndices, ... rxSubframe*(10^(-enb.PDSCH.Rho/20)), estChannelGrid); % Decode PDSCH dlschBits = ltePDSCHDecode(... enb, enb.PDSCH, pdschRx, pdschHest, noiseEst); % Decode the DL-SCH [decbits, harqProcesses(harqID).blkerr,harqProcesses(harqID).decState] = ... lteDLSCHDecode(enb, enb.PDSCH, trBlk, dlschBits, ... harqProcesses(harqID).decState); % Display block errors if displaySimulationInformation if any(harqProcesses(harqID).blkerr) disp(['Block error. RV index: ' num2str(harqProcesses(harqID).txConfig.RVIdx)... ', CRC: ' num2str(harqProcesses(harqID).blkerr)]) else disp(['No error. RV index: ' num2str(harqProcesses(harqID).txConfig.RVIdx)... ', CRC: ' num2str(harqProcesses(harqID).blkerr)]) end end % Store values to calculate throughput % Only for subframes with data if any(trBlk) blkCRC = [blkCRC harqProcesses(harqID).blkerr]; %#ok<AGROW> bitTput = [bitTput trBlk.*(1- ... harqProcesses(harqID).blkerr)]; %#ok<AGROW> txedTrBlkSizes = [txedTrBlkSizes trBlk]; %#ok<AGROW> end % Provide PMI feedback to the eNodeB if strcmpi(enb.PDSCH.TxScheme,'SpatialMux') PMI = ltePMISelect(enb, enb.PDSCH, estChannelGrid, noiseEst); txPMIs(:, pmiIdx+1) = PMI; end end % Calculate maximum and simulated throughput maxThroughput(snrIdx) = sum(txedTrBlkSizes); % Max possible throughput simThroughput(snrIdx) = sum(bitTput,2); % Simulated throughput % Display the results dynamically in the command window fprintf([['\nThroughput(Mbps) for ', num2str(NFrames) ' Frame(s) '],... '= %.4f\n'], 1e-6*simThroughput(snrIdx)/(NFrames*10e-3)); fprintf(['Throughput(%%) for ', num2str(NFrames) ' Frame(s) = %.4f\n'],... simThroughput(snrIdx)*100/maxThroughput(snrIdx)); allRvSeqPtrHistory{snrIdx} = rvSeqPtrHistory; end % Plot the RV sequence for all HARQ processes hPlotRVSequence(SNRIn,allRvSeqPtrHistory,NFrames);
Simulating at 10.3 dB SNR for 2 Frame(s) Subframe: 0. HARQ process ID: 1 Block error. RV index: 1 1, CRC: 1 1 Subframe: 1. HARQ process ID: 2 Block error. RV index: 1 1, CRC: 1 1 Subframe: 2. HARQ process ID: 3 Block error. RV index: 1 1, CRC: 1 1 Subframe: 3. HARQ process ID: 4 Block error. RV index: 1 1, CRC: 0 1 Subframe: 4. HARQ process ID: 5 Block error. RV index: 1 1, CRC: 0 1 Subframe: 5. HARQ process ID: 6 Block error. RV index: 1 1, CRC: 1 1 Subframe: 6. HARQ process ID: 7 Block error. RV index: 1 1, CRC: 1 1 Subframe: 7. HARQ process ID: 8 Block error. RV index: 1 1, CRC: 1 1 Subframe: 8. HARQ process ID: 1 Block error. RV index: 2 2, CRC: 0 1 Subframe: 9. HARQ process ID: 2 Block error. RV index: 2 2, CRC: 0 1 Subframe: 10. HARQ process ID: 3 Block error. RV index: 2 2, CRC: 0 1 Subframe: 11. HARQ process ID: 4 Block error. RV index: 1 2, CRC: 0 1 Subframe: 12. HARQ process ID: 5 Block error. RV index: 1 2, CRC: 0 1 Subframe: 13. HARQ process ID: 6 Block error. RV index: 2 2, CRC: 0 1 Subframe: 14. HARQ process ID: 7 Block error. RV index: 2 2, CRC: 0 1 Subframe: 15. HARQ process ID: 8 Block error. RV index: 2 2, CRC: 0 1 Subframe: 16. HARQ process ID: 1 No error. RV index: 1 3, CRC: 0 0 Subframe: 17. HARQ process ID: 2 No error. RV index: 1 3, CRC: 0 0 Subframe: 18. HARQ process ID: 3 No error. RV index: 1 3, CRC: 0 0 Subframe: 19. HARQ process ID: 4 Block error. RV index: 1 3, CRC: 0 1 Throughput(Mbps) for 2 Frame(s) = 9.7308 Throughput(%) for 2 Frame(s) = 42.5000 Simulating at 12.3 dB SNR for 2 Frame(s) Subframe: 0. HARQ process ID: 1 Block error. RV index: 1 1, CRC: 1 1 Subframe: 1. HARQ process ID: 2 Block error. RV index: 1 1, CRC: 0 1 Subframe: 2. HARQ process ID: 3 Block error. RV index: 1 1, CRC: 0 1 Subframe: 3. HARQ process ID: 4 Block error. RV index: 1 1, CRC: 0 1 Subframe: 4. HARQ process ID: 5 Block error. RV index: 1 1, CRC: 0 1 Subframe: 5. HARQ process ID: 6 Block error. RV index: 1 1, CRC: 0 1 Subframe: 6. HARQ process ID: 7 Block error. RV index: 1 1, CRC: 0 1 Subframe: 7. HARQ process ID: 8 Block error. RV index: 1 1, CRC: 0 1 Subframe: 8. HARQ process ID: 1 Block error. RV index: 2 2, CRC: 0 1 Subframe: 9. HARQ process ID: 2 Block error. RV index: 1 2, CRC: 0 1 Subframe: 10. HARQ process ID: 3 Block error. RV index: 1 2, CRC: 0 1 Subframe: 11. HARQ process ID: 4 Block error. RV index: 1 2, CRC: 0 1 Subframe: 12. HARQ process ID: 5 Block error. RV index: 1 2, CRC: 0 1 Subframe: 13. HARQ process ID: 6 Block error. RV index: 1 2, CRC: 0 1 Subframe: 14. HARQ process ID: 7 No error. RV index: 1 2, CRC: 0 0 Subframe: 15. HARQ process ID: 8 No error. RV index: 1 2, CRC: 0 0 Subframe: 16. HARQ process ID: 1 No error. RV index: 1 3, CRC: 0 0 Subframe: 17. HARQ process ID: 2 No error. RV index: 1 3, CRC: 0 0 Subframe: 18. HARQ process ID: 3 No error. RV index: 1 3, CRC: 0 0 Subframe: 19. HARQ process ID: 4 No error. RV index: 1 3, CRC: 0 0 Throughput(Mbps) for 2 Frame(s) = 14.3100 Throughput(%) for 2 Frame(s) = 62.5000 Simulating at 14.3 dB SNR for 2 Frame(s) Subframe: 0. HARQ process ID: 1 Block error. RV index: 1 1, CRC: 0 1 Subframe: 1. HARQ process ID: 2 Block error. RV index: 1 1, CRC: 0 1 Subframe: 2. HARQ process ID: 3 Block error. RV index: 1 1, CRC: 0 1 Subframe: 3. HARQ process ID: 4 Block error. RV index: 1 1, CRC: 0 1 Subframe: 4. HARQ process ID: 5 Block error. RV index: 1 1, CRC: 0 1 Subframe: 5. HARQ process ID: 6 Block error. RV index: 1 1, CRC: 0 1 Subframe: 6. HARQ process ID: 7 Block error. RV index: 1 1, CRC: 0 1 Subframe: 7. HARQ process ID: 8 Block error. RV index: 1 1, CRC: 0 1 Subframe: 8. HARQ process ID: 1 No error. RV index: 1 2, CRC: 0 0 Subframe: 9. HARQ process ID: 2 No error. RV index: 1 2, CRC: 0 0 Subframe: 10. HARQ process ID: 3 No error. RV index: 1 2, CRC: 0 0 Subframe: 11. HARQ process ID: 4 No error. RV index: 1 2, CRC: 0 0 Subframe: 12. HARQ process ID: 5 No error. RV index: 1 2, CRC: 0 0 Subframe: 13. HARQ process ID: 6 No error. RV index: 1 2, CRC: 0 0 Subframe: 14. HARQ process ID: 7 No error. RV index: 1 2, CRC: 0 0 Subframe: 15. HARQ process ID: 8 No error. RV index: 1 2, CRC: 0 0 Subframe: 16. HARQ process ID: 1 Block error. RV index: 1 1, CRC: 0 1 Subframe: 17. HARQ process ID: 2 Block error. RV index: 1 1, CRC: 0 1 Subframe: 18. HARQ process ID: 3 Block error. RV index: 1 1, CRC: 0 1 Subframe: 19. HARQ process ID: 4 Block error. RV index: 1 1, CRC: 0 1 Throughput(Mbps) for 2 Frame(s) = 16.0272 Throughput(%) for 2 Frame(s) = 70.0000
RV Sequence Pointer Plots
The code above also generates plots with the value of the pointers to the elements in the RV sequence for the simulated subframes. This provides an idea of the retransmissions required. We plot the pointers and note the RV values used in case these are not 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. In the plots above 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 pointer is increased. A value of 2 will be plotted for the subframe where the retransmission takes place. If further retransmissions are required, the pointer value will increase further. Note that the plots do not show any value in subframe 5 of consecutive frames. This is because no data is transmitted in those subframes.
The figure shown below was obtained simulating 10 frames. Note how in some cases up to 3 retransmissions are required.
Throughput Results
The throughput results for the simulation are displayed in the MATLAB® command window after each SNR point is completed. They are also captured in simThroughput
and maxThroughput
. simThroughput
is an array with 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.
% Plot throughput figure plot(SNRIn, simThroughput*100./maxThroughput,'*-.'); xlabel('SNR (dB)'); ylabel('Throughput (%)'); title('Throughput vs. SNR') legend(legendString,'Location','NorthWest'); grid on;
The generated plot has been obtained with a low number of frames, therefore the results shown are not representative. A longer simulation obtained with 1000 frames produced the results shown below.
Appendix
This example uses these helper functions.
Selected Bibliography
3GPP TS 36.101 "User Equipment (UE) radio transmission and reception"