Main Content

CCSDS Optical High Photon Efficiency Telemetry Waveform Generation

This example shows how to generate a high photon efficiency (HPE) waveform for the free space optical communications systems defined in Consultative Committee for Space Data Systems (CCSDS) 142.0-B-1 section 3 [1]. HPE optical communications are required for applications in which power efficiency is the dominant consideration in link design. The example describes the functions of the channel coding and synchronization sublayer of the data link layer for transferring the transfer frames over an optical photon-starved space link. In these photon-starved links, the photon-efficiency of the link is the primary concern. This example shows how to generate a binary vector to be provided to the physical layer, given a set of CCSDS transfer frames produced by the data link protocol sublayer. The binary vector indicates the positions of the pulsed slots. The 1s and 0s of the resultant binary vector indicate pulsed and non-pulsed slots, respectively, in the optical transmission.


This figure shows the internal organization of the coding and synchronization sublayer of telemetry (TM) signaling at the transmitting end. The coding and synchronization sublayer accepts CCSDS transfer frames of constant code rate and data length from the data link protocol sublayer, performs the necessary functions, and delivers a binary vector to the physical layer to indicate the slots containing light pulses. The input is a sequence of fixed-length transfer frames generated from the CCSDS TM Space Data Link Protocol defined in CCSDS 132.0-B-2 [3], or the CCSDS Advanced Orbiting Systems (AOS) Protocol defined in CCSDS 732.0-B-3 [4], or the CCSDS Universal Space Link Protocol (USLP) defined in CCSDS 732.1-B-1 [5].


HPE Telemetry Signal Generation

This figure shows the functional blocks of the architecture of HPE TM signaling at the transmitting end performed by the coding and synchronization sublayer.

workflow diagram.png

The input to the coding and synchronization sublayer is a sequence of CCSDS TM, AOS, or USLP transfer frames. Consider CCSDS transfer frames a0,a1,...,anumTF-1, where numTF is the number of CCSDS transfer frames, and each transfer frame ai consists of 1024 bytes of data. Generate a set of 15 randomized transfer frames.

% Generate transfer frames with random data
numTF = 15;
numBytesInTF = 1024;
dataTF = randi([0 1],numBytesInTF*8,numTF); % a_0,a_1,...,a_numTF-1

Prepend a 32-bit attached synchronization marker (ASM) in hexadecimal notation, 1ACFFC1D, to each transfer frame. A data unit that consists of an ASM and a transfer frame is a synchronization-marked transfer frame (SMTF). This figure shows the construction of SMTFs.


Map CCSDS transfer frames to the corresponding SMTFs.

% Attach ASM (0x1ACFFC1D) to the transfer frames
ASM = [0 0 0 1 1 0 1 0 1 1 0 0 1 1 1, ...
    1 1 1 1 1 1 1 0 0 0 0 0 1 1 1 0 1]';
SMTF = [repmat(ASM,1,size(dataTF,2)); dataTF]; % b_0,b_1,...,b_numTF-1

Slice the sequence of SMTFs into information blocks of length k, where k is determined by the code rate r, which is a managed parameter with values from the set {1/3, 1/2, 2/3}. This table gives information on each supported code rate and its corresponding information block size. If the size of the last information block is less than k, then the slicer fills that block with the minimum number of 0s (P) required to increase the block size to a multiple of k. The resultant number of information blocks after slicing is numInfoBlocks (C), where numInfoBlocks=(numBytesInTF*8+length(ASM))*numTF)+Pk. This list shows the block size after slicing, in bits, for each of the supported code rates:

  • Code rate 1/3 — 5006 bits

  • Code rate 1/2 — 7526 bits

  • Code rate 2/3 — 10046 bits

This figure shows the slicing and zero fill of SMTFs.

Slicer output.png

Select the block size (k) value. The code rate (r) is determined based on the block size (k) value.

k = 7526;
P = k - rem(length(SMTF(:)),k);
slicerIn = [SMTF(:); zeros(P,1)];
slicerOut = reshape(slicerIn,k,[]); % c_0,c_1,...,c_C-1
numInfoBlocks = size(slicerOut,2);

Each k-bit information block from the slicer is pseudo-randomized by performing the digit-wise modulo-2 addition with a pseudo-random sequence produced by a linear-feedback shift register, as specified in CCSDS 142.0-B-1 section 3.5 [1]. The shift register is initialized to the all 1s state at the beginning of each sliced information block.

% Initialize pseudonoise sequence generator System object
pnSequence = comm.PNSequence("SamplesPerFrame",k, ...
    Polynomial=[1 1 0 1 0 1 0 0 1], ...
% Perform pseudo randomization on SMTFs
psIn = repmat(pnSequence(),1,numInfoBlocks);
psOut = xor(psIn,slicerOut);                 % d_0,d_1,...,d_C-1

Append 32 cyclic redundancy check (CRC) bits to the end of each pseudo-randomized information block, as described in CCSDS 142.0-B-1 section 3.6 [1]. The CRC is used for block error detection and to terminate the serially concatenated pulse position modulation (SCPPM) decoder. Append two 0s to each information block with attached CRC to terminate the outer convolutional encoder in the SCPPM encoder. The CRC and termination bits add a combined 34 bits to the randomized information block. This figure shows the structure of a pseudo-randomized information block with CRC and termination bits.

encoder input.png

Pass the resultant SCPPM encoder input block through the SCPPM encoder. The SCPPM forward error correction scheme is necessary for efficient operation of the deep space link. The encoder maps k + 34 bits into S = 15120/m pulse position modulation (PPM) symbols (where m is the modulation order, in the range [2, 8]).

% Perform SCPPM encoding
crc32Generator = comm.CRCGenerator(...
    Polynomial="x^32+x^29+x^18+x^14+x^3+1", ...
m = 6;
S = 15120/m;
encSym = zeros(S,numInfoBlocks);
for frmIdx=1:numInfoBlocks
    crcData = crc32Generator(psOut(:,frmIdx));             % Generate CRC
    scppmIn = [crcData; 0; 0];                             % f_0,f_1,...,f_C-1
    [encSym(:,frmIdx),info] = ccsdsSCPPMEncode(scppmIn,m); % q_0,q_1,...,q_C-1

Channel interleave the sequence of PPM symbols with a convolutional interleaver, as described in CCSDS 142.0-B-1 section 3.9 [1]. N and B are managed parameters and are so chosen that B×N is a multiple of S, which in turn is a multiple of N. The interleaver has N rows, where an ith row contains a shift register of length i×B, consisting of i×B PPM symbols. After passing the last symbol, the interleaver is operated for another B×N×(N-1) steps before the last symbol appears at the output. Thus, the output contains B×N×(N-1) more symbols than the input. Since B×N×(N-1) is a multiple of S, there are no leftover PPM symbols in the last block. The resultant sequence r has R=C+(B*N*(N-1))S blocks, each containing S symbols.

% Channel interleaving
N = 18;     % Number of shift registers
B = 840;    % Register step length

% Validate channel interleaver parameters
if mod(N*B,S)~=0
    error('N*B must be a multiple of 15120/m');
elseif mod(S,N)~=0
    error('15120/m must be a multiple of N');

% Set random number generator to avoid generating different initial states
% each time
rng(1, 'twister')
% Generate initial states for channel interleaving
M = 2^m;
reqInitStates = randi([0 M-1],S,N*(N-1)*B/S);
convIntrlvrObj = comm.ConvolutionalInterleaver(NumRegisters=N, ...
for i = 1:size(reqInitStates,2)
    currIn = reqInitStates(:,i);
% Generate random additional symbols required for the last symbol to appear at the output
addSymTemp = randi([0 M-1],N*B*(N-1),1);
additionalSym = reshape(addSymTemp,S,[]);

% Channel interleaving
chIn = [encSym,additionalSym];
chOut = zeros(S,size(chIn,2));
for i= 1:size(chIn,2)
    chOut(:,i) = convIntrlvrObj(chIn(:,i)); % r_0,r_1,...,r_R-1

Prepend a code synchronization marker (CSM) of W PPM symbols based on m to each interleaved codeword.

 % CSM Specification
 if m == 2
     CSM = [0 3 1 2 1 3 2 0 0 3 2 1 0 2 1 3 1 0 3 2 3 2 1 0];
 elseif m == 3
     CSM = [0 3 1 2 5 4 7 6 6 7 4 5 2 1 3 0];
     CSM = [0 2 7 14 1 2 15 5 8 4 10 2 14 3 14 11];
 % Attach CSM to each S symbol block
 csmOut = [repmat(CSM',1,size(chOut,2)); chOut];    % s_0,s_1,...,s_R-1

Repeat each PPM symbol qd times, where qd is a managed parameter with values from the set {1, 2, 3, 4, 8, 16, 32}. Use the repetition factor to increase the level of soft information for the decoder and to aid super-symbol synchronization. The output of the repeater has numSym symbols, where numSym=qd×R×(S+W).

% Repeat each PPM symbol
qd = 1;
repOut = repelem(csmOut(:),qd,1); % t_0,t_1,...,t_T-1

Map each PPM symbol to a binary vector of length M (where M=2m) by placing (M — 1) 0s and a single 1 into one of the possible positions, based on the code symbol value. M-ary PPM provides excellent power efficiency for the photon-starved operating regime of deep space optical links. After each set of M slots, insert M4 guard slots. Guard slots are used for compatibility with existing laser technology, and to aid in synchronization. Each transmitted PPM symbol occupies 5×M4 PPM slots, which are transmitted over the physical channel. This figure shows slot mapping and guard slot insertion.

Guard slot insertion.png

After slot mapping and guard slot insertion, the result is a slot sequence v0,v1,...,vnumSym-1, where each vj is a vector of length 5×M4.

% Slot mapping and guard slot insertion
txOut = zeros(length(repOut)*5*M/4,1);
mapIdx = (0:length(repOut)-1)'*5*M/4 + repOut + 1;
txOut(mapIdx) = 1;                                 % v_0,v_1,...,v_T-1

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

Use ccsdsHPEWaveformGenerator feature to programmatically configure the CCSDS HPE TM waveform.

Signal Visualization

Modulate the binary vector received from the coding and synchronization sublayer using On-Off keying (OOK).

Rb = 1e9;                              % Bit rate
Tb = 1/Rb;                             % Bit duration
sps = 10;                              % Samples per symbol
fsamp = Rb*sps;                        % Sampling frequency
unrz = ones(1,sps);                    % Signal for unipolar Non-return-to-zero (NRZ)
sigLen = 1000;                         % Number of bits to visualize
binData = txOut(1:sigLen);             % Generate data of length sigLen
modSignal = upfirdn(binData,unrz,sps); % Modulate data using OOK

Create a spectrumAnalyzer object to display the frequency spectrum of the generated CCSDS optical HPE TM waveform.

txAnalyzer = spectrumAnalyzer(SampleRate=fsamp,AveragingMethod="exponential");

Pass the modulated signal through a deep space Poisson channel.

ns = 3;                                                          % Average signal photons per pulsed slot
nb = 0.0001;                                                     % Average noise photons per slot

% Initialize Poisson channel System object
chanObj = dsocPoissonChannel(NumSignalPhotons=ns,NumNoisePhotons=nb);
% Pass modulated data through Poisson channel
receivedSlotCount = chanObj(modSignal);
% Calculate LLRs using received slot counts
receivedLLR = receivedSlotCount*log(1+(ns/nb))-ns;

Create a spectrumAnalyzer object to display the frequency spectrum of the received CCSDS optical HPE TM waveform.

rxAnalyzer = spectrumAnalyzer(SampleRate=fsamp,AveragingMethod="exponential");


[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] The Consultative Committee for Space Data Systems. Optical Communications Physical Layer, Recommended Standard, Issue 1. CCSDS 141.0-B-1. Washington, D.C.: CCSDS, August 2019.

[3] The Consultative Committee for Space Data Systems. TM Space Data Link Protocol. Recommended Standard, Issue 2. CCSDS 132.0-B-2. Washington, D.C.: CCSDS, September 2015.

[4] The Consultative Committee for Space Data Systems. AOS Space Data Link Protocol. Recommended Standard, Issue 3. CCSDS 732.0-B-3. Washington, D.C.: CCSDS, September 2015.

[5] The Consultative Committee for Space Data Systems. Unified Space Data Link Protocol. Recommended Standard, Issue 1. CCSDS 732.1-B-1. Washington, D.C.: CCSDS, October 2018.

See Also

Related Topics