MATLAB Examples

Effect of Inter-Cell Interference on PDSCH Throughput

This example demonstrates the effect of inter-cell interference on PDSCH throughput. A serving cell and two interfering eNodeBs are considered. The conditions specified in TS 36.101, Section [ 1 ] are used.



This example measures the effect of inter-cell interference on PDSCH throughput. Three eNodeBs are setup, one is the serving cell, while the other two are interfering cells. The serving cell uses RMC R.46 in TDD mode. The parameters for the serving and interfering cells including power levels and noise levels are described in TS 36.101, Section [ 1 ]. The achieved throughput for a UE in the serving cell is measured and plotted, hence analyzing the effect of inter-cell interference on performance.

Simulation Settings

The default simulation length is set to 10 frames to keep the simulation time low. A large number of NFrames should be used to produce meaningful throughput results.

NFrames = 10;   % Number of frames

The signal, interferers and noise power levels are specified in the test (TS 36.101, Section [ 1 ]) using the following parameters: SINR, dominant interferer proportion (DIP) and noise power spectral density.

SINR = -1.4;    % SINR value in dB
DIP2 = -1.73;   % DIP in dB for cell 2
DIP3 = -8.66;   % DIP in dB for cell 3

Noc = -98; % dBm/15kHz average power spectral density

The DIP characterizes each of the interfering cells and is defined as:

$DIP2 = Ior2/(Ior2 + Ior3 + Noc)$

$DIP3 = Ior3/(Ior2 + Ior3 + Noc)$

where $Ior2$ and $Io3$ are the average received power spectral density from cells 2 and 3. $Noc$ is the average power spectral density of a white noise source (average power per resource element normalized to the subcarrier spacing).

Serving eNodeB Configuration

The test considered uses reference channel R.46 in TDD mode. The parameters associated with this reference channel are specified in (TS 36.101, Table A. [ 1 ]). The structure enb1 characterizes the serving cell.

% Set the random number generator seed

% Cell 1 eNodeB configuration according to R.46
enb1 = struct;
enb1.NDLRB = 50;
enb1.CellRefP = 2;
enb1.NCellID = 0;
enb1.CyclicPrefix = 'Normal';
enb1.CFI = 2;
enb1.PHICHDuration = 'Normal';
enb1.Ng = 'Sixth';
enb1.NFrame = 0;
enb1.TotSubframes = 1;
enb1.Windowing = 0;
enb1.DuplexMode = 'TDD';
enb1.SSC = 4;
enb1.TDDConfig = 1;

% PDSCH configuration substructure
enb1.PDSCH.TxScheme = 'TxDiversity'; % PDSCH transmission mode 2
enb1.PDSCH.Modulation = {'QPSK'};
enb1.PDSCH.NLayers = 2;
enb1.PDSCH.Rho = -3;
enb1.PDSCH.RNTI = 1;
enb1.PDSCH.RVSeq = [0 1 2 3];
enb1.PDSCH.RV = 0;
enb1.PDSCH.NHARQProcesses = 7;
enb1.PDSCH.NTurboDecIts = 5;
enb1.PDSCH.PRBSet = (0:49)';
% Table A., TS 36.101
enb1.PDSCH.TrBlkSizes = [5160 3880 0 0 5160 0 3880 0 0 5160];
% Table A., TS 36.101
enb1.PDSCH.CodedTrBlkSizes = [12528 10656 0 0 13200 0 10656 0 0 13200];
enb1.PDSCH.CSIMode = 'PUCCH 1-0';
enb1.PDSCH.PMIMode = 'Wideband';
enb1.PDSCH.CSI = 'On';

% PDSCH OCNG configuration
enb1.OCNGPDSCHEnable = 'On';             % Enable OCNG fill
enb1.OCNGPDSCHPower = -3;                % OCNG power same as PDSCH Rho
enb1.OCNGPDSCH.RNTI = 0;                 % Virtual UE RNTI
enb1.OCNGPDSCH.Modulation = 'QPSK';      % OCNG symbol modulation
enb1.OCNGPDSCH.TxScheme = 'TxDiversity'; % OCNG transmission mode 2

Interfering eNodeBs Configurations

The two interfering cells are characterized by the structures enb2 and enb3. These have the same field values as the serving cell (enb1) with the following exceptions:

  • Cell Id takes the values 1 and 2 for enb2 and enb3 respectively
  • The PDSCH modulation scheme is specified by the transmission mode 3 (TM3) interference model (TS 36.101, B.5.2 [ 1 ]). This value changes on a subframe by subframe basis and is modified in the main processing loop
% Cell2
enb2 = enb1;
enb2.NCellID = 1;
enb2.OCNGPDSCHEnable = 'Off';

% Cell 3
enb3 = enb1;
enb3.NCellID = 2;
enb3.OCNGPDSCHEnable = 'Off';

Propagation Channel and Channel Estimator Configurations

This section sets up the parameters for three propagation channels

  • Serving cell to UE
  • First interfering cell to UE
  • Second interfering cell to UE

As specified in (TS 36.101, Table [ 1]) EVA70 channel conditions are used.

% eNodeB1 to UE propagation channel
channel1 = struct;                    % Channel config structure
channel1.Seed = 20;                   % Random channel seed
channel1.NRxAnts = 2;                 % 2 receive antennas
channel1.DelayProfile ='EVA';         % Delay profile
channel1.DopplerFreq = 70;            % Doppler frequency
channel1.MIMOCorrelation = 'Low';     % Multi-antenna correlation
channel1.NTerms = 16;                 % Oscillators used in fading model
channel1.ModelType = 'GMEDS';         % Rayleigh fading model type
channel1.InitPhase = 'Random';        % Random initial phases
channel1.NormalizePathGains = 'On';   % Normalize delay profile power
channel1.NormalizeTxAnts = 'On';      % Normalize for transmit antennas
% The channel sampling rate depends on the FFT size used in the OFDM
% modulator. This can be obtained using the function lteOFDMInfo.
ofdmInfo = lteOFDMInfo(enb1);
channel1.SamplingRate = ofdmInfo.SamplingRate;

% eNodeB2 (interference) to UE propagation channel
channel2 = channel1;
channel2.Seed = 122;                  % Random channel seed

% eNodeB3 (interference) to UE propagation channel
channel3 = channel1;
channel3.Seed = 36;                   % Random channel seed

The channel estimator configuration structure is defined below. The frequency and time averaging window sizes are chosen to span a relatively large number of resource elements. This is to average as much noise and interference as possible. Note that too large an averaging window in time and/or frequency will cause loss of information due to averaging out the channel variations. This produces an increasingly imperfect channel estimate which can affect the performance of the equalizer.

cec = struct;                        % Channel estimation config structure
cec.PilotAverage = 'UserDefined';    % Type of pilot symbol averaging
cec.FreqWindow = 31;                 % Frequency window size
cec.TimeWindow = 23;                 % Time window size
cec.InterpType = 'Cubic';            % 2D interpolation type
cec.InterpWindow = 'Centered';       % Interpolation window type
cec.InterpWinSize = 1;               % Interpolation window size

Signal, Interference and Noise Power Levels

From the SINR, DIP and Noc values we can calculate the scaling factors to apply to the signals from the serving and interfering cells, as well as the noise level.

The function hENBscalingFactors.m calculates the scaling factors K1, K2 and K3 to apply to the channel filtered waveforms from the three cells considered. The scaling factor No to apply to the white Gaussian noise is also calculated. This values ensure we meet the SINR and DIP values required.

% Channel noise setup
nocLin = 10.^(Noc/10)*(1e-3); % linear  in Watts
% Take into account FFT (OFDM) scaling
No = sqrt(nocLin/(2*double(ofdmInfo.Nfft)));

% Signal and interference amplitude scaling factors calculation. These
% ensure the SINR and DIP values specified are met
[K1, K2, K3] = hENBscalingFactors(DIP2, DIP3, Noc, SINR, enb1, enb2, enb3);

Main Loop Initialization

Before the main processing loop we need to set up the HARQ processes and initialize intermediate variables. A HARQ process ID sequence corresponding to the configuration is output by the lteRMCDLTool function. A HARQ process (with IDs 1 to 7) is associated to each subframe that has data scheduled. A value of 0 in the sequence indicates that data is not transmitted in the corresponding subframe. This can be because it is an uplink subframe or because no data is scheduled in a downlink subframe (i.e. subframe 5 in this example).

% Initialize state of all HARQ processes
harqProcesses = hInitHARQProcesses(enb1, enb1.PDSCH.NHARQProcesses);
% Initialize HARQ process IDs to 1 as the first non-zero transport block
% will always be transmitted using the first HARQ process. This will be
% updated with the full sequence output by lteRMCDLTool after the first
% call to the function
harqProcessSequence = 1;

% Set up variables for the main loop
lastOffset = 0;       % Initialize overall frame timing offset
frameOffset = 0;      % Initialize frame timing offset
blkCRC = [];          % Block CRC for all considered subframes
bitTput = [];         % Number of successfully received bits per subframe
txedTrBlkSizes = [];  % Number of transmitted bits per subframe
% Vector of total number of bits transmitted calculated for each subframe
runningMaxThPut = [];
% Vector storing the number of successfully received bits calculated for
% each subframe
runningSimThPut = [];

% Obtain the number of transmit antennas.
dims = lteDLResourceGridSize(enb1);
P = dims(3);

Main Loop

The main loop iterates over the specified number of subframes. Since this is a TDD scenario only downlink subframes are considered. Of these, the code below checks if the downlink subframe is carrying any data.

For each downlink subframe with data the following operations are performed:

  • Check the HARQ processes and determine whether to send a new packet or if a retransmission is required
  • Generate downlink waveforms from serving cell and interfering cells
  • Filter waveforms with propagation channels and add white Gaussian noise
  • Synchronize and OFDM demodulate the signal from the serving cell
  • Estimate the propagation channel for the serving cell
  • Equalize and decode the PDSCH
  • Decode the DL-SCH
  • Determine throughput performance using the block CRC obtained
fprintf('\nSimulating %d frame(s)\n',NFrames);

% Main for loop: for all subframes
for subframeNo = 0:(NFrames*10-1)

    % Reinitialize channel seed for each subframe to increase variability
    channel1.Seed = 1+subframeNo;
    channel2.Seed = 1+subframeNo+(NFrames*10);
    channel3.Seed = 1+subframeNo+2*(NFrames*10);

    % Update subframe number
    enb1.NSubframe = subframeNo;
    enb2.NSubframe = subframeNo;
    enb3.NSubframe = subframeNo;

    duplexInfo = lteDuplexingInfo(enb1);

    if duplexInfo.NSymbolsDL ~= 0 % target only downlink subframes

        % 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 a non-zero 'harqID'), perform transmission and
        % reception. Otherwise, continue to the next subframe.
        if harqID == 0

        % Update HARQ process: reset for successful transmission or set to
        % retransmit: This effectively gets the ACK/NACK
        harqProcesses(harqID) = hTxDiversityHARQScheduling( ...

        % Update the RV value and RVSeq for correct waveform generation
        enb1.PDSCH.RV = harqProcesses(harqID).rvSeq ...
        enb1.PDSCH.RVSeq = harqProcesses(harqID).rvSeq ...

        % Serving cell payload
        dlschTransportBlk = {harqProcesses(harqID).dlschTransportBlk};

        % Create transmit waveform and get the HARQ scheduling ID sequence
        % from 'enbOut' structure output which also contains the waveform
        % configuration and OFDM modulation parameters
        [txWaveform1,~,enbOut] = lteRMCDLTool(enb1,dlschTransportBlk);

        % Add 25 sample padding. This is to cover the range of delays
        % expected from channel modeling (a combination of implementation
        % delay and channel delay spread)
        txWaveform1 =  [txWaveform1; zeros(25, P)]; %#ok<AGROW>

        % Get the HARQ ID sequence from 'enbOut' for HARQ processing
        harqProcessSequence = enbOut.PDSCH.HARQProcessSequence;

        % Generate interferer model as per as per TS 36.101, B.5.2. The
        % function hTM3InterfModel generates the interferer transmit
        % signal. It internally sets transmission and modulation
        % schemes and generates the required payload bits.
        txWaveform2 = [hTM3InterfModel(enb2); zeros(25,P)];
        txWaveform3 = [hTM3InterfModel(enb3); zeros(25,P)];

        % Channel time for the present subframe
        channel1.InitTime = subframeNo/1000;
        channel2.InitTime = channel1.InitTime;
        channel3.InitTime = channel1.InitTime;

        % Filter the transmitted waveforms
        rxWaveform1 = lteFadingChannel(channel1,txWaveform1);
        rxWaveform2 = lteFadingChannel(channel2,txWaveform2);
        rxWaveform3 = lteFadingChannel(channel3,txWaveform3);

        % Noise generation
        noise = No*complex(randn(size(rxWaveform1)),...

        % Add AWGN to the received time domain waveform and scale for
        % required power
        rxWaveform = K1*rxWaveform1 + K2*rxWaveform2 + ...
                     K3*rxWaveform3 + noise;

        % Receiver
        % Perform synchronization
        % An offset within the range of delays expected from the
        % channel modeling (a combination of implementation delay and
        % channel delay spread) indicates success
        if (mod(subframeNo,10)==0)
            frameOffset = lteDLFrameOffset(enb1,rxWaveform);
            if (frameOffset > 25)
                frameOffset = lastOffset;
            lastOffset = frameOffset;
        rxWaveform = rxWaveform(1+frameOffset:end,:);

        % Scale rxWaveform by 1/K1 to avoid numerical issues with
        % channel decoding stages
        rxWaveform = (1/K1)*rxWaveform;

        % Perform OFDM demodulation on the received data to obtain
        % the resource grid
        rxSubframe = lteOFDMDemodulate(enb1,rxWaveform);

        % Channel estimation
        [estChannelGrid,noiseEst] = lteDLChannelEstimate(enb1,cec, ...

        % Perform equalization, deprecoding, layer demapping,
        % demodulation and descrambling on the received data using the
        % channel estimate.

        % Get PDSCH indices
        [pdschIndices,~] = ...
            ltePDSCHIndices(enb1, enb1.PDSCH, enb1.PDSCH.PRBSet);

        % Get PDSCH resource elements. 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^(-enb1.PDSCH.Rho/20)), estChannelGrid);

        % Decode PDSCH
        [dlschBits,~] = ltePDSCHDecode(enb1, enb1.PDSCH,...
            pdschRx, pdschHest, noiseEst);

        % Decode downlink shared channel (DL-SCH)
        [decbits,harqProcesses(harqID).crc,harqProcesses(harqID).decState] = ...
            lteDLSCHDecode(enb1,enb1.PDSCH,harqProcesses(harqID).trBlkSize, ...

        % Store values to calculate throughput
        blkCRC = [blkCRC harqProcesses(harqID).crc]; %#ok<AGROW>
        bitTput = [bitTput harqProcesses(harqID).trBlkSize.*(1- ...
            harqProcesses(harqID).crc)]; %#ok<AGROW>
        runningSimThPut = [runningSimThPut sum(bitTput,2)]; %#ok<AGROW>
        txedTrBlkSizes = [txedTrBlkSizes harqProcesses(harqID).trBlkSize]; %#ok<AGROW>
        runningMaxThPut = [runningMaxThPut sum(txedTrBlkSizes,2)]; %#ok<AGROW>

Simulating 10 frame(s)


This section calculates the achieved throughput. A figure with the running measured throughput for all simulated subframes is also provided.

maxThroughput = sum(txedTrBlkSizes); % Maximum possible throughput
simThroughput = sum(bitTput,2);      % Simulated throughput

% Display achieved throughput percentage
disp(['Achieved throughput ' num2str(simThroughput*100/maxThroughput) '%'])

% Plot running throughput
ylabel('Throughput (%)');
xlabel('Simulated subframe');
Achieved throughput 45.5594%

This simulation should be run for more than 10 frames to ensure the throughput results reach steady sate. The following plot shows the throughput result when simulating 1,000 frames. Different channel seeds were used for each subframe to increase variability. The final throughput measured is around 48%. The subframe number in the x-axis refers to subframes where downlink data is transmitted.


This example uses the following helper functions:

Selected Bibliography

  1. 3GPP TS 36.101 "User Equipment (UE) radio transmission and reception"