Main Content

End-to-End DVB-RCS2 Simulation with RF Impairments and Corrections for TC-LM Bursts

This example shows how to measure the packet error rate (PER) of a Digital Video Broadcasting - Return Channel by Satellite second generation (DVB-RCS2) link that has a constant waveform ID for Turbo-Coding Linear Modulation (TC-LM) reference bursts. The example describes the burst detection and frequency synchronization strategies in detail, emphasizing how to estimate the radio frequency (RF) front-end impairments under noise conditions. In this example, you add RF front-end impairments and then pass it through an additive white Gaussian noise (AWGN) channel.


DVB-RCS2 defines the physical layer interface and medium access control layer functionalities required to provide broadband connectivity for an interactive satellite network between the satellite hub operator and user terminals. The standard specifies powerful duo-binary turbo codes for forward error control (FEC) and cyclic redundancy checks (CRC) for error detection and correction.

ETSI EN 301 545-2 V1.3.1 Annex A table A-1 summarizes the TC-LM reference burst waveforms for different modulation schemes and code rates. The receiver uses the DVB-S2X forward link to derive information about the reference waveform used for a specific timeslot. The receiver uses this information to perform the burst detection and frequency synchronization by exploiting the known symbols in the burst. The variety of waveforms and their characteristics make burst detection and frequency synchronization a challenging task.

This diagram summarizes the example workflow.

Main Processing Loop

The example processes 200 TC-LM bursts with Es/No of 15.5 dB, and then computes the number of packet errors. The comm.PhaseFrequencyOffset object adds a carrier frequency offset to the modulated signal, and the awgn function adds AWGN. The DVB-RCS2 standard allows frequency offset values of up to 3% of the symbol rate.

To recover the protocol data unit (PDU), the receiver performs matched filtering, synchronization operations, and bit recovery. The receiver uses the known symbol sequences, such as the preamble, postamble, and pilots, to perform the burst detection. The receiver derives the physical layer transmission parameters, such as modulation scheme, code rate, and turbo decoder parameters, from the waveform ID.

The network control centre performs a Multi-Frequency Time-Division mutiple access (MF-TDMA) based resource allocation. First, the control centre assigns multiple slots to every terminal for transmission. The DVB-RCS2 terminal (RCST) transmits a number of bursts for each interval. Each burst contains a PDU. The waveform generator appends CRC bits to the PDU. The content type of the burst determines the number of CRC bits appended to the burst. The receiver recovers the data bits and the CRC status from the waveform symbols. This example uses the CRC status of all the decoded bursts to measure the number of packet errors.

DVB-RCS2 Waveform Configuration Parameters

Specify these burst waveform configuration parameters.

  • Waveform ID

  • Content type of PDU

  • Pre-burst guard length

  • Post-burst guard length

This example supports only the TC-LM reference burst waveform IDs, which are in the ranges [1, 22] and [32, 49]. Apply the same configuration to the receiver object dvbrcs2RecoveryConfig.

% Waveform Generator parameter initialization
wg = dvbrcs2WaveformGenerator;
wg.ContentType = "traffic";
wg.WaveformID = 21;

% Guard interval specified as number of symbols
wg.PreBurstGuardLength= 0;
wg.PostBurstGuardLength = 0;

% View waveform generator information
ans = struct with fields:
              BurstLength: 1616
     PayloadLengthInBytes: 539
            MappingScheme: "16QAM"
                 CodeRate: "3/4"
           PreambleLength: 10
          PostambleLength: 9
              PilotPeriod: 10
         PilotBlockLength: 1
    PermutationParameters: [65 0 3 7 0]
               UniqueWord: "444E4EE4EEE4EEEE4E44"
                 PilotSum: 159

% Initialize the receiver properties using the waveform properties
cfg = dvbrcs2RecoveryConfig;
cfg.TransmissionFormat = wg.TransmissionFormat;
cfg.WaveformID = wg.WaveformID;
cfg.ContentType = wg.ContentType;
cfg.NumDecodingIterations = 8;

% Initialize the random number generator with an arbitrary seed

Simulation Parameters

The DVB-RCS2 standard supports flexible channel bandwidths. This example selects an arbitrary channel bandwidth value of 1.2 MHz, which corresponds to 1 megasymbols per second. The frequency synchronization algorithm in this example can track carrier frequency offsets (CFOs) up to 10 kHz. The symbol rate is equal to B/(1+R), where B is the channel bandwidth, and R is the roll-off factor. Set the roll-off factor to 0.2, as defined in ETSI EN 301 545-2 V1.3.1 section Set the carrier frequency to 14.5 GHz, and the fixed CFO contribution to 1590 Hz, as defined in ETSI EN TR 101 545-4 V1.1.1 section 10.1.2. Specify the RCST terminal type as "Fixed", "Pedestrian", or "Vehicular". This example derives the corresponding velocity value of the terminal from ETSI EN TR 101 545-4 V1.1.1 section 6.2.1 table 6.1, and uses the terminal type to calculate the CFO contributed by the terminal motion. The RCST may have the functionality to perform Doppler precompensation if it has the appropriate equipment to calculate its position and velocity.

Select the Es/No from ETSI EN TR 101 545-4 V1.1.1 section 10.2.1 table 10.5. To obtain a PER of 10-5, you must specify a higher Es/No value.

% Samples per symbol
simParams.sps = wg.SamplesPerSymbol;
% Number of bursts to be processed
simParams.numBursts = 200;
% Channel bandwidth in Hertz
simParams.chanBW = 1.2e6;

% Select the type of terminal that is transmitting the DVB-RCS2 signal
simParams.RCSTType = "Fixed";
simParams.HasDopplerPrecompensation = true;
simParams.carrierFreq = 14.5e9;
% CFO in Hz
simParams.cfoFixedContribution = 1590;
% Velocity in meters per second
if strcmp(simParams.RCSTType,"Fixed")
    velocity = 0;
elseif strcmp(simParams.RCSTType,"Pedestrian")
    velocity = 1.38;
elseif strcmp(simParams.RCSTType,"Vehicular")
    velocity = 33.33;
speedLight = physconst("LightSpeed");
% Doppler shift in Hz
dopplerShift = velocity*simParams.carrierFreq/speedLight;

% Energy per symbol to noise ratio in decibels
simParams.EsNodB = 15.5;                           
sps = wg.SamplesPerSymbol;

Initialize the comm.PhaseFrequencyOffset System object and Doppler precompensation object.

% Carrier phase and frequency offset addition
rolloffFactor = 0.2;
symbolRate = simParams.chanBW/(1 + rolloffFactor);
sampleRate = symbolRate*simParams.sps;

% Initialize the frequency offset system object
freqOffset = comm.PhaseFrequencyOffset( ...
        FrequencyOffset=simParams.cfoFixedContribution+dopplerShift, ...

% Initialize the Doppler precompensation object
if simParams.HasDopplerPrecompensation
    % Specify the frequency value to precompensate prior to transmission
    precompensationFreq = -dopplerShift;
    dopplerPrecompensator = comm.PhaseFrequencyOffset( ...
        FrequencyOffset=precompensationFreq, ...

Synchronizer Initialization

The receiver performs these operations on the received data, in sequence:

  • Burst detection

  • Carrier frequency offset estimation and compensation

  • Bit recovery

This diagram illustrates the sequence of the receiver operations.

The burst detection and frequency synchronization algorithms are variations of differential correlation. The burst detection algorithm identifies the start of each individual burst, and discards any initial junk symbols. The frequency offset estimation reduces the frequency offset to a level that does not affect the performance of the bit recovery algorithms.

The burst detection uses preamble sequences to identify the start of bursts. To achieve better accuracy, the receiver first buffers several bursts. The synchronizer object HelperDVBRCS2Synchonizer applies a differential correlator to the buffered samples and averages the result over a single burst interval.

Because the correlation between the noisy, adjacent samples is not ideal, a decrease in the Es/No value affects the performance of the differential correlator. This makes averaging over multiple bursts essential.

The receiver carries out the CFO estimation using the pilots present in the burst. Differential correlation, with pilot period as the correlation interval, leads to a reliable estimate of the CFO under lower noise conditions. As the number of pilots increases, the accuracy of the CFO estimate improves.

You can change the number of bursts for synchronization based on the waveform ID, such as reducing the number of bursts required for synchronization for waveforms with larger preambles, higher numbers of pilots symbols, or a postamble sequence. For more information on the minimum number of bursts for synchronization for each waveform ID, see the table in the Further Exploration section.

Specify the waveform ID, symbol rate, number of bursts for synchronization, pre-burst and post-burst guard lengths, filter span (in symbols), and samples per symbol to HelperDVBRCS2Synchonizer.

numBurstsForSync = 8;
freqSynchronizer = HelperDVBRCS2Synchronizer( ...
    WaveformID=wg.WaveformID, ...
    SymbolRate=symbolRate, ...
    NumBurstsForSynchronization=numBurstsForSync, ...
    PreBurstGuardLength=wg.PreBurstGuardLength, ...
    PostBurstGuardLength=wg.PostBurstGuardLength, ...
    FilterSpanInSymbols=wg.FilterSpanInSymbols, ...


Initialize the scope objects required to visualize various stages of the main processing loop.

rxConst = comm.ConstellationDiagram(Title="Frequency Shifted waveform", ...
    XLimits=[-1 1],YLimits=[-1 1], ...
    ShowReferenceConstellation=false, ...

specAn = spectrumAnalyzer(SampleRate=sampleRate, ...
    ChannelNames={'Transmitted waveform','Received waveform'}, ...

Receiver Processing

To synchronize the received burst and recover the PDU, the receiver processes distorted DVB-RCS2 waveform samples one burst at a time by following these steps.

  1. Apply matched filtering, outputting at a rate of one sample per symbol.

  2. Buffer the required number of bursts into the synchronizer.

  3. Perform burst detection using differential correlation.

  4. Estimate and apply frequency offset correction.

  5. Estimate and compensate for residual carrier frequency offset.

  6. Perform bit recovery and verify integrity of a PDU using the CRC status.

% Initialize the count for the packet errors
pduErrTotal = 0;
% Preallocate memory for the vector containing individual frequency
% estimates post reception of each burst
estimatedFreqOffsetVector = zeros(simParams.numBursts,1);

% Main processing loop
for burstIndex = 1:simParams.numBursts
    % Generate a frame protocol data unit
    framePDU = randi([0 1],wg.FramePDULength,1);
    % Generate a complex baseband frame
    txOutTemp = wg(framePDU);

    % Apply carrier frequency offset
    txOut = freqOffset(txOutTemp);
    % Apply Doppler precompensation, if applicable
    if simParams.HasDopplerPrecompensation
        cfoOut = dopplerPrecompensator(txOut);
        cfoOut = txOut;
    % Visualize the frequency offset waveform

    % To simulate a receiver which has been switched on early, we prepend
    % junk symbols to the first burst for the timeslot
    if burstIndex == 1
        maxNumJunkSymbols = 250;
        numJunkSymbols = randi(maxNumJunkSymbols,1,1)*sps;
        rxIn = awgn([zeros(numJunkSymbols,1); cfoOut(:)], ...
            simParams.EsNodB - 10*log10(simParams.sps),"measured");
        rxIn = awgn(cfoOut(:),simParams.EsNodB - 10*log10(simParams.sps),"measured");
    % Frequency analysis between transmitted and received signal
    specAn([txOutTemp rxIn(1:length(txOutTemp))]);

    % Synchronization frequencies
    [compensatedWaveform,syncIndex, ...
        estimatedFreqOffset,numBurstsProcessed] = freqSynchronizer(rxIn);
    if numBurstsProcessed > freqSynchronizer.NumBurstsForSynchronization
        % Bit recovery
        estimatedFreqOffsetVector(burstIndex,:) = estimatedFreqOffset;        
        [rxOut,pduErr] = ...
        if logical(pduErr)
            pduErrTotal = pduErrTotal + 1;

if simParams.numBursts > freqSynchronizer.NumBurstsForSynchronization
    disp("Number of bursts lost: " + num2str(pduErrTotal));
    disp("PER = " + num2str(pduErrTotal/(simParams.numBursts - freqSynchronizer.NumBurstsForSynchronization)));
Number of bursts lost: 0
PER = 0

Further Exploration

This example has shown you how to decode bursts with a waveform ID of 21 at an Es/No value of 15.5 db. Try running this example with these modifications.

  1. Change waveform ID to other valid values to generate different TC-LM waveforms.

  2. Vary Es/No and observe the performance of the synchronizer.

  3. Disable Doppler precompensation and observe the performance of the receiver for different Es/No values.

  4. Change the terminal type to change the velocity profile of the RCST.

  5. Vary the fixed frequency offset component to observe the effects on the transmitted waveform.

  6. Vary the velocity values of the different RCST types, and try to observe the frequency offset constellation plot.

  7. Vary the frequency value used for frequency precompensation, and run the example to observe whether the receiver is capable of handling residual frequency errors.

  8. Change the synchronizer configuration to use a different number of bursts.

  9. Change the seed value of the random number generator to obtain different values for the number of junk symbols, the payload sequences, and the AWGN channel simulations.

Use this table to select the simulation parameters.


The example uses these helper functions:


  1. ETSI EN 301 545-2 V1.2.1 (2014-04), DVB-RCS2 Lower Layer Satellite Specification.

  2. ETSI TS 101 545-1 V1.3.1 (2020-07), DVB-RCS2 System Level Specification