Main Content

End-to-End CCSDS High Photon Efficiency Telemetry Optical Link Simulation

This example shows how to measure the block error rate in a Consultative Committee for Space Data Systems (CCSDS) high photon efficiency (HPE) telemetry (TM) end-to-end optical link with timing offset impairment. HPE optical communications are useful for applications where power efficiency is the dominant consideration in link design. The example describes the functionality of the channel coding and synchronization sublayer for performing timing synchronization and recovering the transfer frames, as specified in Downlink Receiver Algorithms for Deep Space Optical Communications [3]. This example uses a binary-input, integer-output, deep space pulse position modulation (PPM) Poisson channel, as defined in Coded Modulation for the Deep-Space Optical Channel section IV [2].


This figure shows the internal organization of the coding and synchronization sublayer of the TM signaling at the receiving end.

Internal Organization.png

At the receiving end, the coding and synchronization sublayer accepts the output slot counts from the physical layer. Each slot count, is the receiver estimate of the intensity of light (number of photons) for that slot, from the deep space Poisson channel. The functions of the sublayer include codeword synchronization and serially concatenated convolutionally coded pulse position modulation (SCPPM) decoding. The SCPPM decoder outputs this information.

  • Decoded information blocks — Use these decoded information blocks to recover synchronization-marked transfer frames (SMTFs). Use SMTFs to recover CCSDS transfer frames.

  • Cyclic redundancy check (CRC) status — The CRC check status indicates whether each decoded information block is a valid block. Use the CRC status to calculate quality and sequence indicators for each transfer frame. The quality indicator specifies if each recovered transfer frame is a valid data unit. The sequence indicator specifies if each recovered transfer frame is the direct successor of the previous transfer frame. In this example, you calculate the block error rate by using the CRC status.

The coding and synchronization sublayer delivers the transfer frames, the quality indicator, and the sequence indicator to the data link layer.

Configuration and Simulation Parameters

Specify the configuration parameters for waveform generation and data recovery. You can adjust the PPM modulation order, information block size, and repetition factor to see how these impact the simulation.

cfgParams.ModOrder = 16;            % PPM modulation order
cfgParams.InfoSize = 7526;          % Information block size
cfgParams.NumRegisters = 18;        % Number of shift registers for Convolutional Interleaving
cfgParams.RegisterLengthStep = 420; % Additional registers in each step for Convolutional Interleaving
cfgParams.RepeatFactor = 2;         % Repetition factor
cfgParams.TFLength = 1024;          % Transfer frame length - 1024 bytes

Specify the simulation parameters, consisting of the number of transfer frames, average number of signal photons per pulsed slot, and average number of noise photons per slot.

numTF = 20;                    % Number of transfer frames
nsLen = 4;
ns = linspace(0.9,1.06,nsLen); % Average number of signal photons per pulsed slot
nb = 0.05;                     % Average number of noise photons per slot

End-to-End Block Error Rate Processing Loop

This figure shows the functions performed at the receiver end for timing synchronization and the recovery of binary-valued CCSDS transfer frames.

Rx workflow cab ppt.png

To analyze the block error rate performance for a CCSDS HPE TM end-to-end optical link, follow these steps:

  1. Generate the CCSDS HPE TM waveform for the TM, Advanced Orbiting Systems (AOS), or Unified Space Data Link Protocol (USLP ) transfer frames, as detailed in CCSDS 142.0-B-1 section 3 [1]. The ccsdsHPEWaveformGenerator System object generates a binary vector and provides it to the physical layer. The modulation format uses intersymbol guard time for PPM slot synchronization. Each transmitted symbol occupies 5×M4 PPM slots, which includes M signal slots and M4 guard slots. The 1s of the resultant binary vector represent a laser pulse and 0s represent no laser pulse.

  2. Transmit the modulated binary data over a deep space optical communications (DSOC) channel. This example adopts a Poisson point process model for the channel. The dsocPoissonChannel System object adds Poisson distributed noise and timing offset to the signal. This channel estimates the photon count in each slot at the receiver.

  3. Perform PPM slot synchronization, as specified in Maximum Likelihood Synchronization for Pulse Position Modulation with Inter-Symbol Guard Times [4]. This method implements a maximum likelihood (ML) scheme. To estimate the timing offset, the ML method performs simple correlation with intersymbol guard slots. Estimate the mean signal photons per pulsed slot and mean background noise photons per slot based on this correlation.

  4. Compute log-likelihood ratios (LLRs) by using the estimated fractional timing offset, as specified in Optical PPM Demodulation from Slot-Sampled Photon Counting Detectors [5]. The log-likelihood ratio calculation also requires the estimated mean signal photons per pulsed slot and mean noise photons per slot.

  5. Perform repeat-symbol synchronization, as specified in Repeat-PPM Super-Symbol Synchronization [6]. To estimate the symbol offset, compute the maximum of all summed slot LLRs of a repeat-symbol over all possible offsets. Sum the repeated slot LLRs to form the combined log-likelihood values.

  6. Perform codeword synchronization. Find codeword synchronization markers (CSMs) by using the ML approximation method, as specified in Results from a CCSDS-compliant High Photon Efficiency Downlink SDR Platform [7].

  7. Perform channel deinterleaving.

  8. Perform SCPPM decoding using ccsdsSCPPMDecode function, and obtain the CRC status. Calculate the block errors by using the CRC status.

  9. Perform pseudo derandomization.

  10. Perform frame synchronization to obtain the transfer frames, the quality indicator, and the sequence indicator. If a recovered transfer frame is from one or more incorrectly decoded codewords, mark its quality indicator as 0. Otherwise, mark it as 1. If a recovered transfer frame is the direct successor of the previous one, mark its sequence indicator as 0. Mark it as 1 when you detect a gap.

% Initialize timing offset for the first iteration, to visualize the
% initialized offset with the calculated offset in the timing offset plot.
% From next iterations random offset is considered
slotOffset = 11;
ts = 0.45;                     % Normalized timing offset

% Initialize data for simulation
blockErrors = zeros(nsLen,1);
totalBlocks = zeros(nsLen,1);
maxNumBlocks = 60;
plotOffset = true;             % Flag to plot timing offset  
m = log2(cfgParams.ModOrder);
sps = 5*cfgParams.ModOrder/4;  % Slots per symbol

% Initialize waveform generator
hpeWavegen = ccsdsHPEWaveformGenerator(TransmissionType="telemetry", ...
    NumBytesInTransferFrame=cfgParams.TFLength, ...
    NumBitsInInformationBlock=cfgParams.InfoSize, ...
    PPMOrder=cfgParams.ModOrder, ...
    NumRows=cfgParams.NumRegisters, ...
    RegisterLengthIncrement=cfgParams.RegisterLengthStep, ...

% Initialize channel
dsocChan = dsocPoissonChannel(NumNoisePhotons=nb, ...

% Initialize PN Sequence
pnSequenceObj = comm.PNSequence(SamplesPerFrame=cfgParams.InfoSize, ...
    Polynomial=[1 1 0 1 0 1 0 0 1], ...
pnSequence = pnSequenceObj();
blockLen = 15120/m;
% Initialize convolutional deinterleaver
deintrlvrObj = comm.ConvolutionalDeinterleaver(NumRegisters=cfgParams.NumRegisters, ...

% Number of additional steps required for the last symbol to appear at the
% output in channel deinterleaving
numAdditionalSteps = cfgParams.RegisterLengthStep*cfgParams.NumRegisters*(cfgParams.NumRegisters-1);

for itr = 1:nsLen
    dsocChan.NumSignalPhotons = ns(itr);
    disp(["Running link simulation for ns = ", num2str(ns(itr)), "..."])
    while totalBlocks(itr) < maxNumBlocks
        % Generate transfer frames with random data
        dataTF = randi([0 1],cfgParams.TFLength*8*numTF,1);

        % Generate CCSDS HPE TM Waveform
        txOut = hpeWavegen(dataTF);

        % Add slot offset and pass modulated data through poisson channel
        chanOutput = dsocChan([randi([0 1],slotOffset,1); txOut]);

        % Estimate timing offset, mean signal photons per pulsed slot and
        % background noise photons per slot. Plot maximum likelihood timing
        % offset estimate and log-likelihood function between each integer
        % interval for the first iteration. Highlight the final estimated
        % timing offset corresponding to the log-likelihood function peak
        % value.
        [estOffset,nsEst,nbEst] = HelperCCSDSHPETMTimingOffsetEstimator(chanOutput,m,plotOffset);
        plotOffset = false;                        % Clear the flag to prevent plotting in each iteration

        % Slot offset correction
        intOffset = floor(estOffset);              % Integer timing offset
        fracOffset = estOffset-intOffset;          % Fractional timing offset
        slotSyncOut = chanOutput(intOffset+1:end);

        % Compute LLRs
        zk0 = slotSyncOut*log(1 + (1-fracOffset)*(nsEst/nbEst));
        zk1 = [slotSyncOut(2:end); 0].*log(1 + fracOffset*(nsEst/nbEst));
        llr = zk0 + zk1;

        % Remove guard slots
        llrSym = buffer(llr,sps);
        ssIn = llrSym(1:cfgParams.ModOrder,:);

        % Perform repeat symbol synchronization and codeword synchronization
        ssOut = HelperCCSDSHPETMSymbolSynchronizer(ssIn,cfgParams.RepeatFactor);
        symLen = size(ssOut,2);

        % Perform channel deinterleaving
        chDeinterleaveOut = zeros(cfgParams.ModOrder,symLen-numAdditionalSteps);
        for idx = 1:cfgParams.ModOrder
            chOut = deintrlvrObj(ssOut(idx,:)');
            chDeinterleaveOut(idx,:) = chOut(1 + numAdditionalSteps:end);

        numInfoBlocks = size(chDeinterleaveOut,2)/blockLen;
        decData = zeros(cfgParams.InfoSize + 32 + 2,numInfoBlocks); % 32 CRC bits + 2 termination bits
        errBlock = zeros(1,numInfoBlocks);

        % SCPPM decoding
        for blockIdx = 1:numInfoBlocks
            sIdx = (blockIdx - 1)*blockLen + 1;
            eIdx = blockIdx*blockLen;
            code = chDeinterleaveOut(:,sIdx:eIdx);
            [decData(:,blockIdx),errBlock(blockIdx)] = ccsdsSCPPMDecode(code(:),hpeWavegen.CodeRate,m);

        % Perform pseudo de-randomization on SMTFs
        psIn = repmat(pnSequence,1,numInfoBlocks);
        psOut = xor(psIn,decData(1:cfgParams.InfoSize,:));

        % Frame synchronization
        errBit = repmat(errBlock,size(psOut,1),1);
        [out,qualityInd,seqInd] = HelperCCSDSHPETMFrameSynchronizer(psOut(:),errBit,cfgParams.TFLength*8);

        % Update number of information block errors and total information
        % blocks for each iteration
        blockErrors(itr) = blockErrors(itr) + (numInfoBlocks - sum(~errBlock));
        totalBlocks(itr) = totalBlocks(itr) + numInfoBlocks;

        % Generate random timing offset for the next iteration
        slotOffset = randi(100,1,1);
        ts = rand;
        dsocChan.TimingOffset = ts;
    "Running link simulation for ns = "    "0.9"    "..."

Figure contains an axes object. The axes object with title Log-likelihood function plot for M = 16, xlabel Timing offset (slots), ylabel Log-likelihood function contains 3 objects of type line, text. One or more of the lines displays its values using only markers

    "Running link simulation for ns = "    "0.95333"    "..."

    "Running link simulation for ns = "    "1.0067"    "..."

    "Running link simulation for ns = "    "1.06"    "..."

Plot Block Error Rate

blockER = blockErrors./totalBlocks;
plot(ns, blockER,"*-")
xlim([0.9 2])
xlabel("Signal photons per slot, ns")
ylabel("Block error rate")
title("Performance for ModOrder = "+num2str(cfgParams.ModOrder)+", nb = "+num2str(nb))

Figure contains an axes object. The axes object with title Performance for ModOrder = 16, nb = 0.05, xlabel Signal photons per slot, ns, ylabel Block error rate contains an object of type line.

This figure shows the block error rate analysis for an end-to-end CCSDS HPE TM optical link over a deep space Poisson channel, for 1e6 frames with InfoSize = 7526, ModOrder = 16, NumRegisters = 18, RegisterLengthStep = 420, RepeatFactor = 2, TFLength = 1024 bytes, numTF = 50, nb = 0.0008.


This table shows the managed parameters for the HPE telemetry signaling.


The example uses these helper files:


[1] The Consultative Committee for Space Data Systems. Optical Communications Coding and Synchronization, Recommended Standard, Issue 1. CCSDS 142.0-B-1. Washington, D.C.: CCSDS, August 2019.

[2] Moision, B., and J. Hamkins. “Coded Modulation for the Deep-Space Optical Channel: Serially Concatenated Pulse-Position Modulation.” Interplanetary Network Progress Report 42–161 (May 1, 2005): 1–25.

[3] Srinivasan, Meera, Ryan Rogalin, Norman Lay, Matthew Shaw, and Andre Tkacenko. “Downlink Receiver Algorithms for Deep Space Optical Communications.” edited by Hamid Hemmati and Don M. Boroson, 100960A. San Francisco, California, United States, 2017.

[4] Rogalin, Ryan, and Meera Srinivasan. “Maximum Likelihood Synchronization for Pulse Position Modulation with Inter-Symbol Guard Times.” In 2016 IEEE Global Communications Conference (GLOBECOM), 1–6. Washington, DC, USA: IEEE, 2016.

[5] K. J. Quirk, and M. Srinivasan. "Optical PPM Demodulation from Slot-Sampled Photon Counting Detectors." In MILCOM 2013 - 2013 IEEE Military Communications Conference; San Diego, California, USA, 18–20 November 2013.

[6] Connelly, J. “Repeat-PPM Super-Symbol Synchronization.” Interplanetary Network Progress Report 42–207 (November 1, 2016): 1–24.

[7] Schlemmer, Harald, Nemanja Stamenic, Balazs Ferenczi, and Michael Schoenhuber. “Results from a CCSDS-Compliant High Photon Efficiency Downlink SDR Platform.” In 2019 8th International Workshop on Tracking, Telemetry and Command Systems for Space Applications (TTC), 1–5. Darmstadt, Germany: IEEE, 2019.