LTE System Toolbox

Release 10 Downlink Carrier Aggregation Waveform Generation

This examples shows how multiple downlink carriers can be generated and aggregated using the LTE System Toolbox™.


This example models an LTE Release 10 Carrier Aggregation (CA) Band Class C case with a 10 MHz (NDLRB = 50) carrier as the first component carrier and a 20 MHz (NDLRB = 100) carrier as the second component carrier.

To generate an aggregated downlink waveform an eNodeB is configured for each component carrier. The component carrier parameters are calculated and used to generate a modulated waveform for each eNodeB configuration. To allow the combination of modulated waveforms they must be resampled to a common sampling rate. The modulated component carriers are then combined to create an aggregated waveform.

eNodeB Configuration

A vector NDLRB specifies the number of resource blocks for each component carrier and the number of component carriers. NDLRB can be of any length and values of NDLRB must be in the range 6...110. For values 6, 15, 25, 50, 75 and 100, the standardized bandwidths associated with these NDLRB will be assumed; for other values a bandwidth value is calculated which gives a similar proportion of occupied bandwidth to the standard bandwidths. Note that not all NDLRB inputs are valid LTE Release 10 Carrier Aggregation (CA) cases, for details see TS36.101 Section 5.6A [ 1 ].

A set (cell array) of eNodeB configurations enb is created, for the component carrier bandwidths configured in the NDLRB vector using lteRMCDLlteRMCDL. The Configurations are derived from Reference Measurement Channel (RMC) R.5 which describes a 3 MHz bandwidth PDSCH transmission using 64-QAM modulation; the configuration is updated to utilize the value present in the NDLRB vector for that particular component carrier.

% Configure the number of subframes to generate
numSubframes = 10;

% Configure the set of NDLRB values to describe the carriers to be
% aggregated
NDLRB = [50 100];

% Establish the number of component carriers
numCC = length(NDLRB);

% Create transmission for each component carrier
enb = cell(1,numCC);
for i = 1:numCC
    enb{i} = lteRMCDL('R.5');
    enb{i}.NDLRB = NDLRB(i);
    enb{i}.Bandwidth = hNRBToBandwidth(NDLRB(i));
    enb{i}.TotSubframes = numSubframes;
    enb{i}.PDSCH.PRBSet = (0:enb{i}.NDLRB-1).';
    enb{i}.NCellID = 10;

Carrier Aggregation Parameter Calculation

To perform carrier aggregation the frequency parameters described in TS36.101, Sections 5.6 and 5.7 [ 1 ] are calculated. This results in two variables:

  • F_c is a vector containing the center frequency of each component carrier

  • BW_channel_CA is the aggregated channel bandwidth of all component carriers

Two iterations of a loop are used to calculate the frequency parameters. The first iteration calculates the parameters based on the center frequency of the low carrier at baseband (0 Hz). The second iteration recalculates with the center of the aggregated carriers shifted to baseband (0 Hz).

if (numCC>1)

    F_c = zeros(1,numCC);
    BW_GB = zeros(1,numCC-1);
    F_offset = zeros(1,numCC);
    F_edge = zeros(1,numCC);
    spacing = zeros(1,numCC-1);

    for i = 1:2

        % Set center frequency of low carrier to 0 MHz
        if (i==1)
            F_c(1) = 0;
            disp(' ');

        fprintf('F_c_low: %1.3f MHz\n',F_c(1));

        % Calculate parameters for aggregated carriers
        for k = 2:numCC

            if (i==1)
                %  Calculate nominal guard band, TS36.101 5.6A-1
                BW_GB(k-1) = 0.05*max(enb{k-1}.Bandwidth,enb{k}.Bandwidth);
                fprintf('BW_GB: %0.3f MHz\n',BW_GB(k-1));

                % Calculate lower frequency offset, TS36.101 5.6A
                F_offset(k-1) = 0.18*NDLRB(k-1)/2 + BW_GB(k-1);
                fprintf('F_offset_low: %0.3f MHz\n',F_offset(k-1));

            % Calculate lower bandwidth edge, TS36.101 5.6A
            F_edge(k-1) = F_c(k-1) - F_offset(k-1);
            fprintf('F_edge_low: %0.3f MHz\n',F_edge(k-1));

            if (i==1)
                % Calculate component carrier spacing, TS36.101 5.7.1A
                spacing(k-1) = hCarrierAggregationChannelSpacing( ...
                    enb{k-1}.Bandwidth, enb{k}.Bandwidth);

                fprintf('spacing: %0.3f MHz\n',spacing(k-1));

            % Not normative
            F_c(k) = F_c(k-1) + spacing(k-1);
            fprintf('F_c_high: %0.3f MHz\n',F_c(k));

            if (i==1)
                % Calculate upper frequency offset, TS36.101 5.6A
                F_offset(k) = 0.18*NDLRB(k)/2 + BW_GB(k-1);
                fprintf('F_offset_high: %0.3f MHz\n',F_offset(k));

            % Calculate upper bandwidth edge, TS36.101 5.6A
            F_edge(k) = F_c(k) + F_offset(k);
            fprintf('F_edge_high: %0.3f MHz\n',F_edge(k));


        if (i==1)
            % Calculate aggregated channel bandwidth, TS36.101 5.6A
            BW_channel_CA = F_edge(end) - F_edge(1);
            fprintf('BW_channel_CA: %0.3f MHz\n',BW_channel_CA);

            shift = -BW_channel_CA/2 - F_edge(1);
            fprintf(['Shift to center baseband' ...
                        ' transmission: %0.3f MHz\n'],shift);
            F_c(1) = F_c(1) + shift;


    % Display edge parameters
    for i = 1:numCC
        fprintf('\nComponent Carrier %d:\n',i);
        fprintf('   Lower band edge: %0.3f MHz\n', ...
        fprintf('   Upper band edge: %0.3f MHz\n', ...


    BW_channel_CA = enb{1}.Bandwidth;
    F_c(1) = 0;

F_c_low: 0.000 MHz
BW_GB: 1.000 MHz
F_offset_low: 5.500 MHz
F_edge_low: -5.500 MHz
spacing: 14.400 MHz
F_c_high: 14.400 MHz
F_offset_high: 10.000 MHz
F_edge_high: 24.400 MHz
BW_channel_CA: 29.900 MHz
Shift to center baseband transmission: -9.450 MHz
F_c_low: -9.450 MHz
F_edge_low: -14.950 MHz
F_c_high: 4.950 MHz
F_edge_high: 14.950 MHz

Component Carrier 1:
   Lower band edge: -13.950 MHz
   Upper band edge: -4.950 MHz

Component Carrier 2:
   Lower band edge: -4.050 MHz
   Upper band edge: 13.950 MHz

Required Oversampling Rate Calculation

The required oversampling factor for each component carrier OSRs are calculated for a common sampling rate for the aggregated signal.

% Bandwidth utilization of 85%
bwfraction = 0.85;

% Calculate sampling rates of the component carriers
CCSR = zeros(1,numCC);
for i=1:numCC
    info = lteOFDMInfo(enb{i});
    CCSR(i) = info.SamplingRate;

% Calculate overall sampling rate for the aggregated signal
OSR = 2^ceil(log2((BW_channel_CA/bwfraction)/(max(CCSR)/1e6)));
SR = OSR*max(CCSR);
fprintf('\nOutput sample rate: %0.3f Ms/s',SR/1e6);

% Calculate individual oversampling factors for the component carriers
Output sample rate: 61.440 Ms/s

Waveform Generation and Carrier Aggregation

To generate and aggregate the component carriers the individual component carriers are generated using lteRMCDLToollteRMCDLTool, resampled to a common sampling rate, frequency modulated to the appropriate center frequency and finally added together to form the aggregated signal.

% Generate component carriers
tx = cell(1,numCC);
for i=1:numCC
    tx{i} = lteRMCDLTool(enb{i},randi([0 1],1000,1));
    tx{i} = resample(tx{i},OSRs(i),1)/OSRs(i);
    tx{i} = hCarrierAggregationModulate(tx{i},SR,F_c(i)*1e6);

% Superpose the component carriers
waveform = tx{1};
for i = 2:numCC
    waveform = waveform + tx{i};

Plot Carrier Aggregation Waveform Spectrum

The power spectrum of the carrier aggregated signal is displayed using hCarrierAggregationPlotFFT.mhCarrierAggregationPlotFFT.m. In the spectrum the two individual carrier bandwidths are visible, centered at -9.5 MHz and 5.0 MHz.

hCarrierAggregationPlotFFT(waveform,SR, ...
    'Power Spectrum of Carrier Aggregation');


This example uses the following helper functions:

Selected Bibliography

  1. 3GPP TS36.101.