Release 12 Sidelink PSCCH and PSSCH Throughput
This example shows how to perform a Block Error Ratio (BLER) simulation of the 3GPP Release 12 sidelink control and shared channels in frequency-selective fading and Additive White Gaussian Noise (AWGN) using LTE Toolbox™.
Introduction
3GPP Release 12 introduced the sidelink device-to-device communications for public safety in LTE. This example generates multiple Release 12 Physical Sidelink Control Channel (PSCCH) periods containing coded PSCCH and Physical Sidelink Shared Channel (PSSCH) transmissions. The resulting PSCCH period waveforms are then passed through a frequency-selective fading channel with AWGN, and the control channel and shared channel Block Error Ratios (BLERs) are calculated for a range of SNRs. The average number of transmission instances of the control and shared channels required for successful decoding at each SNR are also calculated. For information on how to model Release 14 V2X sidelink, check the following example: Release 14 V2X Sidelink PSCCH and PSSCH Throughput.
Number of PSCCH Periods to Simulate
The example is executed for a simulation length of 5 PSCCH periods to keep the simulation time low. A large number of periods, nPeriods
, should be used to produce statistically meaningful results.
nPeriods = 5;
Fading Channel Configuration
A frequency-selective fading channel is configured according to TS 36.101 Table 12.2.1-1 [ 1 ]. An EVA delay profile with a Doppler frequency of 70Hz and 2 receiver antennas with low correlation is used. The channel seed is specified so that each execution of this example will use the same fading process realization. The Rayleigh fading model uses random phase initialization and the output is normalized so that the average power is unity.
channel.DelayProfile = 'EVA'; channel.DopplerFreq = 70.0; channel.NRxAnts = 2; channel.MIMOCorrelation = 'Low'; channel.Seed = 1; channel.ModelType = 'GMEDS'; channel.NTerms = 16; channel.NormalizeTxAnts = 'On'; channel.NormalizePathGains = 'On'; channel.InitPhase = 'Random';
SNR Configuration
Configure a range of SNR points, intended to cover both high and low BLER operating conditions.
SNRIn = [-10.0 -5.0 0.0 5.0];
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 the estimate, otherwise an imperfect estimation based on the values of received Demodulation Reference Signals (DRS) is obtained. If perfectChanEstimator
is set to false
, a configuration structure cec
is needed to parameterize the channel estimator.
% Perfect channel estimator flag
perfectChanEstimator = false;
The practical channel estimation configuration for the PSCCH and PSSCH channel estimators is defined below. A pilot averaging time window of 15 resource elements is used for both PSCCH and PSSCH, to ensure that the noise on the Demodulation Reference Signals (DRS) occurring in both slots is averaged. This averaging prioritizes pilot SNR improvement over accurate estimation of the channel time variation, which is reasonable as even at 70Hz Doppler frequency, the channel variation across a subframe is limited. A pilot averaging frequency window of 23 resource elements ensures that the noise on every DRS resource element across frequency is averaged for the PSCCH. This averaging prioritizes pilot SNR improvement over accurate estimation of the channel frequency selectivity, which is reasonable for the PSCCH as it is always QPSK modulated (so accuracy of channel estimation is not so critical) and it only occupies one resource block (the channel has limited frequency selectivity over this frequency span). For the PSSCH, this pilot averaging frequency window averages over roughly 2 resource blocks (10 resource blocks are allocated for the PSSCH for the parameters used in this example). Note that depending on the channel delay profile and Doppler frequency, the operating SNR, and the PSSCH modulation order and number of allocated resource blocks, different channel estimation parameters may give better performance for the PSSCH.
cec.PilotAverage = 'UserDefined'; cec.TimeWindow = 15; cec.FreqWindow = 23; cec.InterpType = 'linear';
Configure BLER measurements
The logical variables measureBLERForSCI
and measureBLERForSLSCH
allow the BLER measurements and all related receiver processing to be disabled for the SCI and SL-SCH respectively. This allows the simulation to be configured to measure BLER for only one of the channels. Disabling the receiver processing for the other channel improves the execution speed.
measureBLERForSCI = true; measureBLERForSLSCH = true;
Create PSCCH Period Configuration
The class PSCCHPeriod
represents the physical structure of a PSCCH period. See LTE Sidelink Resource Pools and PSCCH Period and PSCCHPeriod
for more information.
period = PSCCHPeriod;
Resource Pool Configuration
A resource pool configuration for the transmission of D2D sidelink communication consists of a large number of parameters which the UE receives via Radio Resource Control (RRC) messages [ 3 ]. Alternatively, in the case of a UE operating out of network coverage, these parameters are pre-configured within the UE. In this simulation, reference resource pool configuration #1-FDD from TS 36.101 Annex A.7.2.1-1 [ 1 ] is used. These parameters can be set using the PSCCHPeriod.defaultConfig
function by specifying the reference resource pool configuration number and bandwidth.
% Configure the PSCCH period parameters for reference pool #1-FDD, 5MHz period.Config = PSCCHPeriod.defaultConfig(1,'5MHz'); % Set the control and data channel cyclic prefix length period.Config.sc_CP_Len_r12 = 'Normal'; period.Config.data_CP_Len_r12 = 'Normal';
Display Simulation Information
The variable displaySimulationInformation
controls the display of simulation information such as the PSCCH resources used for each period, and whether or not SCI and SL-SCH decoding were successful.
displaySimulationInformation = true;
Display PSCCH Period
In order to illustrate the control and shared resource pools, the period.displayPeriod
function is called which creates a plot showing the locations of the synchronization transmission (light blue), control resource pool (dark blue) and shared resource pool (yellow) within the PSCCH period.
if (displaySimulationInformation) figure; period.displayPeriod; drawnow; end
Create Sidelink Control Information (SCI) Message
A Sidelink Control Information (SCI) message sciMessage
is created according to sidelink reference measurement channel CC.3 FDD defined in TS 36.101 [ 1 ] Annex A.6.4 and CD.1 FDD defined in Annex A.6.5 as follows:
The Transport Block Size for CD.1 FDD (872), used for the shared channel transmission in this example, is assigned to the variable
TBS
.The number of allocated resource blocks for CD.1 FDD (10) is assigned to the variable
NPRB
, which will be used to ensure that the resource allocation for the shared channel contains the correct number of resource blocks. Note that the code rate for the SL-SCH is a function of the PSSCH bit capacity (arising fromNPRB
and the modulation order) and the transport block sizeTBS
.The number of resource blocks
NSLRB
in the UE-specific settings structureue
is set equal to that configured in the PSCCH period,period.Config.NSLRB
.Frequency hopping is enabled by setting
sciMessage.FreqHopping
to 1.The SCI message
sciMessage
is then created using thelteSCI
function. Enabling the frequency hopping in the SCI message structure prior to callinglteSCI
ensures that theHoppingBits
field ofsciMessage.Allocation
is created.The
HoppingBits
field is set to 1, which in conjunction with theNSLRB
value configures Type 2 hopping as described in TS 36.213 Section 8.4 [ 2 ].The
TimeResourcePattern
is set as defined in TS 36.101 Table A.6.4-1 [ 1 ].The
ModCoding
field is set to the value corresponding to the Transport Block SizeTBS
.The
NSAID
field is set to an arbitrary 8-bit value (a value in the range from 0 to 255), representing the least significant 8 bits of the ProSe Layer-2 Group ID. TS 36.101 Table A.6.5-1 [ 1 ] states that the Group destination ID is "as set by higher layers". The value used is recorded in the variableexpectedNSAID
and is the only part of the SCI message content that the UE is aware of prior to reception (the UE obtains it from higher layer signaling). In this example, the NSAID value stored inexpectedNSAID
will be used by the receiver, and the receiver will not accesssciMessage
at all.
% Number of allocated resource blocks (NPRB) and Transport Block Size (TBS) % for RMC CD.1 FDD, TS 36.101 Table A.6.5-1 NPRB = 10; TBS = 872; % Create UE configuration and SCI message with frequency hopping enabled ue.NSLRB = period.Config.NSLRB; sciMessage.FreqHopping = 1; sciMessage.SCIFormat = 'Format0'; sciMessage = lteSCI(ue,sciMessage); % Set the hopping bits for Type 2 hopping and the time resource pattern for % RMC CC.3 FDD, TS 36.101 Table A.6.4-1 sciMessage.Allocation.HoppingBits = 1; sciMessage.TimeResourcePattern = 8; % Set the PSSCH MCS according to the TBS ITBSs = lteMCS(0:28,'PUSCH'); sciMessage.ModCoding = find(lteTBS(NPRB,ITBSs)==TBS,1,'first') - 1; % Set NSAID value, would be assigned by higher layers sciMessage.NSAID = 117; % Store NSAID value in 'expectedNSAID' so that the receiver won't have to % access 'sciMessage' at all expectedNSAID = sciMessage.NSAID;
Create Set of Valid Resource Indicator Values
The set of Resource Indicator Values RIVset
with the correct allocation size of 10 PRBs (given by RMC CD.1 FDD) are created. The period.getAllowedRIV
function returns a vector of RIV values (RIVset
) and a corresponding matrix of resource allocations (range
) where each row contains the allocation length and starting resource block for each RIV. The RIVset
vector is reduced to just the entries which have an allocation length equal to NPRB
by performing logical indexing.
[RIVset,range] = period.getAllowedRIV(sciMessage); RIVset = RIVset(range(:,1) == NPRB);
Display the PSCCH Period Including PSSCH Resources Selected by SCI Message
An example of the actual PSCCH and PSSCH subframes and resource blocks for transmission will be plotted. The SCI message is configured with the first PSCCH resource value PSCCHResource=0
and the first PSSCH RIV value Allocation.RIV = RIVset(1)
. The period.displayPeriod
function is called, passing in the SCI message, and the sets of PSCCH and PSSCH subframes and resource blocks that will actually be used for transmission are plotted. The subframes and resource blocks are colored green, and are a subset of the overall control and shared resource pool, shown in blue and yellow respectively. See the LTE Sidelink Resource Pools and PSCCH Period example for more information. In accordance with the definition in TS 36.101 Table 12.2.1-1 [ 1 ], the RIV value transmitted in the SCI message (which determines the PSSCH transmission resources within the pool) will be selected randomly (uniformly) from the set RIVset
, for each PSCCH period. Similarly, the PSCCH resource value (which determines the PSCCH transmission resources within the pool) will be selected randomly (uniformly) across its valid range from 0 to NumPSCCHReource-1
, for each PSCCH period.
% Select the first PSCCH and PSSCH resource sciMessage.PSCCHResource = 0; sciMessage.Allocation.RIV = RIVset(1); % Display the subframes and resource blocks for transmission if (displaySimulationInformation) figure; period.displayPeriod(sciMessage); drawnow; end
Select Receiver Behavior When SCI Decoding Fails
The logical variable sciAssumed
controls the simulation behavior in terms of the effect the control channel decoding has on the shared channel decoding. If sciAssumed
is true, the receiver will assume that the SCI message was correctly decoded when attempting shared channel reception. This allows the performance of the shared channel reception to be measured independently from the performance of the control channel reception. If sciAssumed
is false, a control channel decoding failure implies a shared channel decoding failure. Note that if the BLER measurement for the SCI is disabled above (measureBLERForSCI=false
), and the BLER measurement for the SL-SCH is enabled (measureBLERForSLSCH=true
), the receiver will assume that the SCI message was correctly decoded when measuring SL-SCH BLER regardless of the setting of sciAssumed
here.
sciAssumed = true;
Create Variables to Record Simulated Performance
The performance of the receiver is recorded in the matrices controlErrors
and sharedErrors
. Each matrix has a row for each SNR point and a column for each PSCCH period simulated. The elements will be set to 1 for SNR points/PSCCH periods where the respective channel combination (PSCCH and SCI or PSSCH and SL-SCH) fails to decode successfully. Additionally, vectors controlRxs
and sharedRxs
record the number of transmission instances that were combined before successful decoding in each period. Note that the number of transmission instances is 2 for the control channel and 4 for the shared channel. The vectors controlRxs
and sharedRxs
are initialized with these maximum values, which will be the values returned in periods where the control and shared channel decoding fail.
controlErrors = zeros(length(SNRIn),nPeriods); sharedErrors = zeros(length(SNRIn),nPeriods); controlRxs = ones(length(SNRIn),nPeriods) * 2; sharedRxs = ones(length(SNRIn),nPeriods) * 4;
Processing
For each PSCCH period, the following operations are performed:
Update the PSCCH period number: The field
NPSCCHPeriod
of the period configuration is updated to match the currently transmitted period. This field is used in conjunction with the Sidelink Control (SC) periodsc_Period_r12
and offset indicatorsc_TF_ResourceConfig_r12.offsetIndicator_r12
to determine the Direct Frame Number (DFN) and subframe number for each subframe in the waveform.
Choose a random PSCCH resource: For a sidelink UE in transmission mode 2 (e.g. out-of-coverage), the PSCCH resource
PSCCHResource
must be chosen randomly according to a uniform distribution between 0 andperiod.NumPSCCHReource-1
. The PSCCH resource will select a random pair of subframes and Physical Resource Blocks (PRBs) in the PSCCH resource pool in which to transmit the two transmission instances of the SCI message. ThePSCCHResource
is added to the SCI message structure in order to pass it into theperiod.generateWaveform
function. Note that for an in-coverage UE (i.e. operating in transmission mode 1), the control information is given by a DCI format 5 message sent by the eNodeB, which includes aPSCCHResource
chosen by the eNodeB.
Choose a random PSSCH resource: As given by the definition in TS 36.101 Table 12.2.1-1 [ 1 ], the Resource Indicator Value (RIV) transmitted in the SCI message will be selected randomly (uniformly) from the set
RIVset
, the RIVs whose number of allocated PRBs matches the configured RMC CD.1 FDD.
Generate PSCCH period waveform: The PSCCH period waveform is generated by the
PSCCHPeriod.generateWaveform
function using its configuration parameters and the content of the SCI message passed in, plus thePSCCHResource
field added to the message in the previous step.
Apply frequency-selective fading: The PSCCH period waveform is passed through a frequency-selective fading channel using the EVA delay profile with a Doppler frequency of 70Hz and 2 receiver antennas with low correlation, as described in TS 36.101 Table 12.2.1-1 [ 1 ].
Add AWGN: AWGN is added to achieve the specified SNR per resource element.
Receive the control and shared channels: The receiver processing consists of PSCCH demodulation, SCI decoding, PSSCH demodulation and SL-SCH decoding. These steps are described in more detail below.
Note that the "Add AWGN" and "Receive control and shared channels" steps are repeated for each SNR point using the same faded waveform.
The receiver performs the following steps:
Synchronize and SC-FDMA demodulate each subframe in the PSCCH subframe pool: Before attempting PSCCH demodulation and SCI decoding for each PSCCH resource, every subframe in the PSCCH subframe pool is SC-FDMA demodulated. For each subframe, the appropriate subframe of the waveform is synchronized using
lteSLFrameOffsetPSCCH
. The PSCCH resource used in the transmitter is unknown, therefore the PRB used by the PSCCH in the subframe is unknown, so the synchronization is performed for each PRB in the PSCCH resource block pool and the timing offset for the correlation with the strongest peak is used. The synchronized waveform is then SC-FDMA demodulated usinglteSLSCFDMADemodulate
. Since the number of subframes in the PSCCH pool is likely to be small compared to the total number of PSCCH resource values (with multiple PSCCH resource values corresponding to the same subframe in the pool), it is more efficient to cache the SC-FDMA demodulated subframes and use the resulting resource grids indicated by the PSCCH subframe resources for a given PSCCH resource value. Therefore, the waveform is SC-FDMA demodulated outside of the PSCCH resource value loop. Note that the approach of choosing the timing offset corresponding to the PRB with the strongest correlation peak assumes that only one PSCCH is being transmitted. A more robust (but more expensive) approach would be to perform timing synchronization and SC-FDMA demodulation for each PSCCH resource.
For each PSCCH resource value until the SCI is decoded:
Get the PSCCH resources: Within a period, the PSCCH is transmitted twice for a configured PSCCH resource
pscchResource
. Theperiod.getPSCCHResources
function provides the two subframes that carry PSCCH and corresponding PRBs allocated to PSCCH within those subframes. The subframe numbers are used to extract the appropriate subframes from the PSCCH period waveform, and the PRBs are used to configure the PSCCH resource extraction within those subframes. Note that the PSCCH will not be transmitted in synchronization subframes.
For each PSCCH transmission instance for the current PSCCH resource value:
Perform PSCCH channel estimation: PSCCH channel estimation is performed using
lteSLChannelEstimatePSCCH
or the local functionperfectChannelEstimate
depending on the value ofperfectChanEstimator
. The channel estimator also produces an estimate of the noise power which can be used for MMSE equalization.
Extract the PSCCH symbols and channel estimate: The received PSCCH symbols are extracted from the subframe resource grid and the corresponding channel estimates are extracted using
lteExtractResources
and the indices provided byltePSCCHIndices
.
Perform PSCCH equalization: The PSCCH symbols are MMSE equalized using
lteEqualizeMMSE
with the channel estimate and noise estimate obtained above.
Perform PSCCH demodulation: The equalized PSCCH symbols are demodulated using
ltePSCCHDecode
. This function performs the inversion of the transmitter modulation steps (SC-FDMA transform deprecoding, QPSK symbol demodulation and descrambling).
Perform SCI decoding: SCI decoding is attempted using
lteSCIDecode
. The number of original information bits in the SCI message is given bylteSCIInfo
. If the decoded CRC is zero, the decoded message bits are converted into the corresponding message structure usinglteSCI
. TheNSAID
message field, which is the eight LSBs of the group destination ID, is compared with the expected NSAID value. If they are equal, the SCI decoding is considered successful and the PSCCH resource value loop is terminated. The number of required transmission instances (1 or 2) is recorded incontrolRxs
.
The behavior of the shared channel decoding with respect to a failed SCI decoding is controlled by the variable sciAssumed
. If sciAssumed
is false, the failed SCI decoding immediately implies a failure to decode the SL-SCH and no further processing takes place for the current PSCCH period. If sciAssumed
is true, the transmitted SCI message is assumed to be known to the receiver and will be used in place of the received SCI message. If sciAssumed
is true or if SCI decoding was successful, the receiver proceeds with SL-SCH decoding. Note that if SCI BLER measurement is disabled but SL-SCH BLER measurement is enabled then the transmitted SCI message is assumed to be known to the receiver.
The PSSCH / SL-SCH is transmitted four times, using HARQ where four redundancy versions (RV) with the sequence [0 2 3 1] are transmitted. There is no HARQ feedback as the sidelink communication transmissions are for a group of UEs (not for an individual receiving UE).
For each PSSCH transmission instance until the SL-SCH is decoded:
Get the PSSCH resources: The
period.getPSSCHResources
function provides a vector of the subframes within the period that carry PSSCH and a matrix containing the PRB sets allocated to PSSCH within those subframes for the PSSCH configuration given by the decoded SCI message. This is similar to the resources described above for the PSCCH, with the difference being that the PSSCH can be sent on multiple PRBs but the PSCCH is only sent on a single PRB. As with the PSCCH, the subframe numbers are used to extract the appropriate subframes from the PSCCH period waveform, and the PRBs are used to configure the PSSCH resource extraction within those subframes. Additionally,period.getPSSCHResources
returns a vector of PSCCH subframe numbers, which are the subframe numbers within the PSSCH resource pool for which this PSSCH is transmitted. These values are used to configure the descrambling of the PSSCH in each subframe. Since the PSCCH is not transmitted in synchronization subframes, any PSCCH subframes that correspond to synchronization subframes are configured to be skipped, by removing them from the vectorssf
andprb
. Prior to skipping any synchronization subframes, the redundancy version indicesIRV
for SL-SCH decoding are calculated for each resource. These indices must be computed prior to the skipping of any synchronization subframes because the index sequence is related solely to the position of the PSSCH subframes within the subframe pool.
Synchronize and SC-FDMA demodulate subframe carrying PSSCH: The appropriate subframe of the waveform is synchronized using
lteSLFrameOffsetPSSCH
. The synchronized waveform is SC-FDMA demodulated usinglteSLSCFDMADemodulate
. Note that unlike the timing synchronization and SC-FDMA demodulation for the PSCCH, the synchronization and demodulation for the PSSCH is carried out for each transmission instance (whereas for the PSCCH, all subframes in the PSCCH resource pool were demodulated first). The reason is that unlike the PSCCH, the PSSCH transmission instances occur in distinct subframes and those subframes are likely to be a small subset of the overall PSSCH subframe pool. Therefore, it is efficient to only synchronize and SC-FDMA demodulate the subframes corresponding to a PSSCH transmission instance.
Perform PSSCH channel estimation: PSSCH channel estimation is performed using
lteSLChannelEstimatePSSCH
or the local functionperfectChannelEstimate
depending on the value ofperfectChanEstimator
. The channel estimator also produces an estimate of the noise power which can be used for MMSE equalization.
Extract the PSSCH symbols and channel estimate: The received PSSCH symbols are extracted from the subframe resource grid and the corresponding channel estimates are extracted using
lteExtractResources
and the indices provided byltePSSCHIndices
.
Perform PSSCH equalization: The PSSCH symbols are MMSE equalized using
lteEqualizeMMSE
with the channel estimate and noise estimate obtained above.
Perform PSSCH demodulation: The equalized PSSCH symbols are demodulated using
ltePSSCHDecode
. This function performs the inversion of the transmitter modulation steps (SC-FDMA transform deprecoding, QPSK or 16QAM symbol demodulation and descrambling).
Perform SL-SCH decoding: The received redundancy versions are combined and decoded using
lteSLSCHDecode
. If the SL-SCH CRC is zero, the HARQ combining loop is terminated and the SL-SCH decoding is successful. The number of required redundancy versions (from 1 to 4) is recorded insharedRxs
.
% If SCI BLER is not being measured, 'sciAssumed' must be set so that the % receiver can assume knowledge of the SCI if (~measureBLERForSCI) sciAssumed = true; end rng('default'); % Repeat for each PSCCH period p = 1; while (p<=nPeriods) % Update PSCCH period number period.Config.NPSCCHPeriod = p - 1; % Choose a random PSCCH resource sciMessage.PSCCHResource = randi([0 period.NumPSCCHResource-1]); % Choose a random PSSCH resource sciMessage.Allocation.RIV = RIVset(randi(length(RIVset))); if (displaySimulationInformation) fprintf('\nSimulating PSCCH period %d of %d\n',p,nPeriods); fprintf('Randomly selected PSCCH resource = %d\n',sciMessage.PSCCHResource); fprintf('Randomly selected PSSCH RIV = %d\n',sciMessage.Allocation.RIV); end % Generate PSCCH period waveform txWaveform = period.generateWaveform(sciMessage); % Set the sampling rate and init time for frequency-selective fading ue.CyclicPrefixSL = period.Config.sc_CP_Len_r12; info = lteSLSCFDMAInfo(ue); channel.SamplingRate = info.SamplingRate; channel.InitTime = (p-1)*period.Config.sc_Period_r12*0.001; periodInitTime = channel.InitTime; % Cache the period init time % Apply frequency-selective fading [fadedWaveform, fadingInfo] = lteFadingChannel(channel,txWaveform); % For each SNR point, add AWGN and receive control and shared channels for i = 1:length(SNRIn) if (displaySimulationInformation && (measureBLERForSCI || measureBLERForSLSCH)) fprintf('Receiving at %gdB SNR\n',SNRIn(i)); end % Add AWGN SNR = 10^(SNRIn(i)/20); N = 1/(SNR*sqrt(double(info.Nfft)))/sqrt(2.0); noise = N*complex(randn(size(fadedWaveform)), randn(size(fadedWaveform))); rxWaveform = fadedWaveform + noise; % Create PSCCH receiver configuration pscch.SidelinkMode = 'D2D'; pscch.NSLRB = period.Config.NSLRB; pscch.CyclicPrefixSL = period.Config.sc_CP_Len_r12; % Establish the number of time-domain samples 'Nt' per subframe and % number of SC-FDMA symbols 'L' per subframe pscchGridInfo = lteSLSCFDMAInfo(pscch); Nt = pscchGridInfo.SamplingRate * 1e-3; L = numel(pscchGridInfo.CyclicPrefixLengths); % If SCI BLER measurement is configured: sciDecoded = false; if (measureBLERForSCI) % Synchronize and extract each subframe of the PSCCH subframe % pool from the received waveform and perform SC-FDMA % demodulation. The timing offset used is the offset % corresponding to the strongest correlation peak when % correlating with the PSCCH DRS for each PRB in the PSCCH % subframe pool nSubframes = period.Config.sc_Period_r12; pscchPoolGrid = repmat(lteSLResourceGrid(pscch),1,nSubframes,size(rxWaveform,2)); offsetpool = []; % Variable to store the offset for each PSCCH subframe for l = period.PSCCHSubframePool if(perfectChanEstimator) offset = hPerfectTimingEstimate(fadingInfo); else subframeWaveform = rxWaveform(l*Nt + (1:Nt),:); bestCorr = 0.0; for prb = period.PSCCHResourceBlockPool.' pscch.PRBSet = prb; [thisoffset,thiscorr] = lteSLFrameOffsetPSCCH(pscch,subframeWaveform); % Find the best correlation across all antennas and % store the corresponding offset maxCorr = max(thiscorr(:)); if maxCorr > bestCorr bestCorr = maxCorr; offset = max(0,thisoffset); % No negative offset end end end subframe = lteSLSCFDMADemodulate(pscch,rxWaveform(l*Nt + offset + (1:Nt),:)); pscchPoolGrid(:,l*L + (1:L),:) = subframe; offsetpool = [offsetpool offset]; %#ok<AGROW> end % Repeat for each PSCCH resource until the SCI is decoded pscchResource = 0; while (pscchResource < period.NumPSCCHResource && ~sciDecoded) % Get the PSCCH subframes 'sf' and PRB allocations 'prb' % for the current PSCCH resource [sf,prb] = period.getPSCCHResources(pscchResource); % Remove any resources that overlap with synchronization % subframes. PSCCH will not be transmitted in these % subframes [~,syncIndex] = intersect(sf,period.SyncSubframes); sf(syncIndex) = []; prb(syncIndex) = []; % Repeat for each PSCCH transmission instance until the SCI % is decoded tx = 1; while (tx <= min(length(sf),2) && ~sciDecoded) % Configure the PSCCH receiver for the PRB allocation pscch.PRBSet = prb(:,tx); % Select the appropriate subframe resource grid from % the PSCCH subframe pool subframe = pscchPoolGrid(:,sf(tx)*L + (1:L),:); % Perform channel estimation if(perfectChanEstimator) % Update the init time to correspond to the current % subframe channel.InitTime = periodInitTime + (sf(tx)*Nt/channel.SamplingRate); [hest,nest] = perfectChannelEstimate(pscch,channel,noise,offsetpool(tx)); else [hest,nest] = lteSLChannelEstimatePSCCH(pscch,cec,subframe); end % Extract the received PSCCH symbols and the % corresponding channel estimate, and perform % equalization [pscchIndices,pscchIndicesInfo] = ltePSCCHIndices(pscch); [pscchRx,pscchHest] = lteExtractResources(pscchIndices,subframe,hest); pscchSymbols = lteEqualizeMMSE(pscchRx,pscchHest,nest); % If we are receiving the first PSCCH transmission % instance, reset the receiver buffer if (tx==1) codedSciBits = zeros(pscchIndicesInfo.G,1); end % Demodulate the PSCCH and add the result into the % receiver buffer codedSciBits = codedSciBits + ltePSCCHDecode(pscchSymbols); % Decode the SCI message. If successful (CRC=0), check % the NSAID field of the decoded message against the % transmitted message sciInfo = lteSCIInfo(pscch); [sciBits,sciCRC] = lteSCIDecode(sciInfo.Format0,codedSciBits); if (sciCRC==0) sciMessageRx = lteSCI(pscch,sciBits); if (sciMessageRx.NSAID==expectedNSAID) sciDecoded = true; controlRxs(i,p) = tx; if (displaySimulationInformation) fprintf(' SCI decoded, transmissions combined = %d\n',tx); end else if (displaySimulationInformation) fprintf(' SCI decoded, but NSAID value (%d) did not match expected value (%d)\n',sciMessageRx.NSAID,expectedNSAID); end end end % Increment the PSCCH transmission instance index tx = tx + 1; end % Increment the PSCCH resource number pscchResource = pscchResource + 1; end end % If SCI decoding failed and the SCI is assumed for SL-SCH % decoding, set the decoded SCI message equal to the transmitted % SCI message if (~sciDecoded) if (displaySimulationInformation && measureBLERForSCI) fprintf(' SCI decoding failed\n'); end if (sciAssumed) sciMessageRx = sciMessage; end end % If SL-SCH BLER measurement is configured and if the SCI was % successfully decoded or if SCI decoding success is assumed, % perform PSSCH reception and SL-SCH decoding slschDecoded = false; if (measureBLERForSLSCH && (sciDecoded || sciAssumed)) % Create PSSCH receiver configuration pssch.SidelinkMode = 'D2D'; pssch.NSLRB = period.Config.NSLRB; pssch.CyclicPrefixSL = period.Config.data_CP_Len_r12; pssch.NTurboDecIts = 5; % Establish the number of time-domain samples 'Nt' per subframe psschGridInfo = lteSLSCFDMAInfo(pssch); Nt = psschGridInfo.SamplingRate * 1e-3; % Get the PSSCH subframes 'sf', PRB allocations 'prb' and PSSCH % subframe numbers 'nsf' for the configuration given by the % decoded SCI message. 'sf' are the subframe numbers within the % SC period, 'nsf' are the subframe numbers within the PSSCH % subframe pool [sf,prb,nsf] = period.getPSSCHResources(sciMessageRx); % Create the redundancy version index sequence (IRV) % corresponding to the PSSCH transmission instances. This must % be computed "up front" prior to the removal of any % synchronization subframes in the next step, otherwise the RV % sequence is lost IRV = 0:length(sf)-1; % Remove any resources that overlap with synchronization % subframes. PSSCH will not be transmitted in these subframes [~,syncIndex] = intersect(sf,period.SyncSubframes); sf(syncIndex) = []; prb(:,syncIndex) = []; nsf(syncIndex) = []; IRV(syncIndex) = []; % Configure the PSSCH receiver NSAID value and modulation from % the decoded SCI message, and establish the SL-SCH transport % block size (TBS) pssch.NSAID = sciMessageRx.NSAID; [ITBS,modulation] = lteMCS(sciMessageRx.ModCoding,'PUSCH'); if (strcmpi(modulation,'64QAM')) modulation = '16QAM'; end pssch.Modulation = modulation; NPRB = max(size(prb,1),1); TBS = lteTBS(NPRB,ITBS); % Repeat for each PSSCH transmission instance until the SL-SCH % is decoded tx = 1; slschDecState = []; rvsequence = [0 2 3 1]; while (tx <= min(length(sf),4) && ~slschDecoded) % Configure the PSSCH receiver for the PSSCH subframe % number, PRB allocation and redundancy version (RV). If % the RV index is zero (corresponding to the first PSSCH % transmission instance in a block of 4 transmissions), % reset the receiver buffer pssch.NSubframePSSCH = nsf(tx); pssch.PRBSet = prb(:,tx); pssch.RV = rvsequence(mod(IRV(tx),4)+1); if (IRV(tx)==0) slschDecState = []; end % Perform timing synchronization, extract the appropriate % subframe of the received waveform, and perform SC-FDMA % demodulation if(perfectChanEstimator) offset = hPerfectTimingEstimate(fadingInfo); else offset = lteSLFrameOffsetPSSCH(pssch,rxWaveform(sf(tx)*Nt + (1:Nt),:)); offset = max(0,offset); % No negative offset end subframeWaveform = rxWaveform(sf(tx)*Nt + offset + (1:Nt),:); subframe = lteSLSCFDMADemodulate(pssch,subframeWaveform); % Perform channel estimation, extract the received PSSCH % symbols and the corresponding channel estimate, and % perform equalization if(perfectChanEstimator) % Update the init time to correspond to the current % subframe channel.InitTime = periodInitTime + (sf(tx)*Nt/channel.SamplingRate); [hest,nest] = perfectChannelEstimate(pssch,channel,noise,offset); else [hest,nest] = lteSLChannelEstimatePSSCH(pssch,cec,subframe); end psschIndices = ltePSSCHIndices(pssch); [psschRx,psschHest] = lteExtractResources(psschIndices,subframe,hest); psschSymbols = lteEqualizeMMSE(psschRx,psschHest,nest); % Demodulate the PSSCH codedSlschBits = ltePSSCHDecode(pssch,psschSymbols); % Decode the SL-SCH including soft combining into the % receiver buffer and check the CRC [~,slschCRC,slschDecState] = lteSLSCHDecode(pssch,TBS,codedSlschBits,slschDecState); if (slschCRC==0) slschDecoded = true; sharedRxs(i,p) = tx; if (displaySimulationInformation) fprintf(' SL-SCH decoded, transmissions combined = %d\n',tx); end end % Increment the PSSCH transmission instance index tx = tx + 1; end end % Record control and shared channel errors controlErrors(i,p) = ~sciDecoded; sharedErrors(i,p) = ~slschDecoded; if (displaySimulationInformation && ~slschDecoded && measureBLERForSLSCH) fprintf(' SL-SCH decoding failed\n'); end end % Update the PSCCH period number p = p + 1; end
Simulating PSCCH period 1 of 5 Randomly selected PSCCH resource = 19 Randomly selected PSSCH RIV = 239 Receiving at -10dB SNR SCI decoding failed SL-SCH decoding failed Receiving at -5dB SNR SCI decoded, transmissions combined = 2 SL-SCH decoded, transmissions combined = 2 Receiving at 0dB SNR SCI decoded, transmissions combined = 1 SL-SCH decoded, transmissions combined = 1 Receiving at 5dB SNR SCI decoded, transmissions combined = 1 SL-SCH decoded, transmissions combined = 1 Simulating PSCCH period 2 of 5 Randomly selected PSCCH resource = 12 Randomly selected PSSCH RIV = 238 Receiving at -10dB SNR SCI decoding failed SL-SCH decoded, transmissions combined = 4 Receiving at -5dB SNR SCI decoding failed SL-SCH decoded, transmissions combined = 2 Receiving at 0dB SNR SCI decoded, transmissions combined = 1 SL-SCH decoded, transmissions combined = 1 Receiving at 5dB SNR SCI decoded, transmissions combined = 1 SL-SCH decoded, transmissions combined = 1 Simulating PSCCH period 3 of 5 Randomly selected PSCCH resource = 10 Randomly selected PSSCH RIV = 226 Receiving at -10dB SNR SCI decoding failed SL-SCH decoded, transmissions combined = 4 Receiving at -5dB SNR SCI decoded, transmissions combined = 2 SL-SCH decoded, transmissions combined = 1 Receiving at 0dB SNR SCI decoded, transmissions combined = 1 SL-SCH decoded, transmissions combined = 1 Receiving at 5dB SNR SCI decoded, transmissions combined = 1 SL-SCH decoded, transmissions combined = 1 Simulating PSCCH period 4 of 5 Randomly selected PSCCH resource = 1 Randomly selected PSSCH RIV = 237 Receiving at -10dB SNR SCI decoded, transmissions combined = 1 SL-SCH decoding failed Receiving at -5dB SNR SCI decoded, transmissions combined = 1 SL-SCH decoded, transmissions combined = 2 Receiving at 0dB SNR SCI decoded, transmissions combined = 1 SL-SCH decoded, transmissions combined = 1 Receiving at 5dB SNR SCI decoded, transmissions combined = 1 SL-SCH decoded, transmissions combined = 1 Simulating PSCCH period 5 of 5 Randomly selected PSCCH resource = 15 Randomly selected PSSCH RIV = 237 Receiving at -10dB SNR SCI decoding failed SL-SCH decoding failed Receiving at -5dB SNR SCI decoding failed SL-SCH decoded, transmissions combined = 3 Receiving at 0dB SNR SCI decoded, transmissions combined = 1 SL-SCH decoded, transmissions combined = 2 Receiving at 5dB SNR SCI decoded, transmissions combined = 1 SL-SCH decoded, transmissions combined = 1
Calculate Control Channel and Shared Channel BLER
The overall BLER for the control channel (PSCCH and SCI) and shared channel (PSSCH and SL-SCH) are computed by averaging the controlErrors
and sharedErrors
matrices along their second dimension i.e. averaging each row, to produce vectors controlBLER
and sharedBLER
containing the BLER values for each SNR point tested. Similarly, controlRxs
and sharedRxs
are averaged to produce vectors controlRxsAvg
and sharedRxsAvg
containing the average number of transmission instances that needed to be combined for successful reception.
if (measureBLERForSCI) controlBLER = 100*mean(controlErrors,2); controlRxsAvg = mean(controlRxs,2); else controlBLER = []; controlRxsAvg = []; end if (measureBLERForSLSCH) sharedBLER = 100*mean(sharedErrors,2); sharedRxsAvg = mean(sharedRxs,2); else sharedBLER = []; sharedRxsAvg = []; end
Plot Results
Finally the test results are plotted. The BLER for the control channel and shared channel are plotted for each SNR point. The average number of transmission instances that need to be combined for successful reception for each SNR are also plotted. Note that the number of transmission instances is 2 for the control channel and 4 for the shared channel.
if (measureBLERForSCI || measureBLERForSLSCH) plotResults(channel,SNRIn,controlBLER,sharedBLER,controlRxsAvg,sharedRxsAvg); end
Since the generated plots were obtained with a low number of PSCCH periods the results shown are not representative. A 1000 PSCCH period simulation with practical channel estimation including additional SNR points produced the results shown below.
Appendix
This example uses the helper function:
Selected Bibliography
3GPP TS 36.101 "User Equipment (UE) radio transmission and reception"
3GPP TS 36.213 "Physical layer procedures"
3GPP TS 36.331 "Radio Resource Control (RRC) Protocol specification"
Local Functions
The following local functions are used in this example:
perfectChannelEstimate
: perfect channel estimationplotResults
: plot the results of the example
% Calculate the perfect channel estimate and the noise estimate function [hest,nest] = perfectChannelEstimate(rxConfig,channel,noise,frameOffset) % Use the uplink perfect channel estimator to calculate % the sidelink estimate as both use SC-FDMA rxConfig.NTxAnts = 1; rxConfig.NULRB = rxConfig.NSLRB; rxConfig.CyclicPrefixUL = rxConfig.CyclicPrefixSL; rxConfig.TotSubframes = 1; hest = lteULPerfectChannelEstimate(rxConfig,channel,frameOffset); noiseGrid = lteSLSCFDMADemodulate(rxConfig,noise(1+frameOffset:end,:)); nest = var(noiseGrid(:)); end function plotResults(channel,SNRIn,controlBLER,sharedBLER,controlRxsAvg,sharedRxsAvg) fadingDescription = sprintf('%s%s',channel.DelayProfile,num2str(channel.DopplerFreq)); figure; hold on; legends = {}; if (~isempty(controlBLER)) plot(SNRIn,controlBLER,'ro-'); legends = [legends 'PSCCH/SCI']; end if (~isempty(sharedBLER)) plot(SNRIn,sharedBLER,'bx-'); legends = [legends 'PSSCH/SL-SCH']; end legend(legends); title(sprintf('Sidelink BLER (%%) in %s fading and AWGN',fadingDescription)); ylabel('BLER (%)'); xlabel('SNR (dB)'); axis([SNRIn(1)-1 SNRIn(end)+1 -10 110]); grid on figure; hold on; if (~isempty(controlBLER)) plot(SNRIn,controlRxsAvg,'ro-'); end if (~isempty(sharedBLER)) plot(SNRIn,sharedRxsAvg,'bx-'); end legend(legends); title(sprintf('Average number of sidelink transmissions\ncombined in %s fading and AWGN',fadingDescription)); ylabel('Average number of transmissions'); xlabel('SNR (dB)'); axis([SNRIn(1)-1 SNRIn(end)+1 0.75 4.25]) grid on end