Main Content

Encode Data with LDPC Code in CCSDS Telemetry Standard

This example shows how to use the CCSDS LDPC Encoder block to encode data bits with (8160,7136) low-density parity-check (LDPC) code specified in the Consultative Committee for Space Data Systems (CCSDS) Telemetry standard. The Simulink® model in this example supports HDL code generation for the HDL CCSDS LDPC Encoder subsystem.

Set Up Input Variables

Set up workspace variables for the Simulink model and the MATLAB® function. You can modify these variable values according to your requirement.

numFrames = 5;
vectorSize = 8;

Generate Input Data

Generate the input data for the Simulink® model and the MATLAB function that you use in this example. Generate random input bits and then LDPC-encode using a function.

msg = {numFrames};
encData = {numFrames};
blockLen = 7136;
parityLen = 1022; % 8160 - 7136

encSampleIn = [];
encValidIn = []; encStartIn = []; encEndIn =[];
for ii = 1:numFrames

   % Generate input bits
    msg{ii} = (randi([0 1],blockLen,1)); % Data before encoding

    % Peform LDPC encoding
    G = coder.load('+satcom/+internal/+ccsds/tmLDPCGeneratorMatrices.mat','LDPCG7136Rate7By8');
    g = G.LDPCG7136Rate7By8;

    encData{ii} = satcom.internal.ccsds.tmldpcEncode(msg{ii},g); % Encoded data

    encFrameGap = round(parityLen/vectorSize) + 100; % Maximum frame gap

    inBits = reshape(msg{ii},vectorSize,[]);
    ldpcLen = size(inBits,2);
    encSampleIn = [encSampleIn inBits zeros(vectorSize,encFrameGap)]>0; %#ok<*AGROW>
    encStartIn = logical([encStartIn 1 zeros(1,ldpcLen-1) zeros(1,encFrameGap)]);
    encEndIn = logical([encEndIn zeros(1,ldpcLen-1) 1 zeros(1,encFrameGap)]);
    encValidIn = logical([encValidIn ones(1,ldpcLen) zeros(1,encFrameGap)]);
end

dataIn = encSampleIn.';
validIn = encValidIn;
startIn = encStartIn;
endIn = encEndIn;

simTime = length(encValidIn) + encFrameGap;

modelName = 'ccsdsHDLLDPCEncoder.slx';

Run Simulink Model

Encode data using the CCSDS LDPC Encoder block. Running the model imports the input signal variables from the MATLAB workspace to the LDPC Encoder block in the model.

open_system(modelName);
out = sim(modelName);

Compare Model Output with Function Input

Compare the output of the Simulink model with the MATLAB function output.

startIdx = find(squeeze(out.startOut));
endIdx = find(squeeze(out.endOut));
validOut = (squeeze(out.validOut));
actEncData = squeeze(out.encOut);
for ii = 1:numFrames
    idx = startIdx(ii):endIdx(ii);
    if vectorSize == 8
        encHDL = actEncData(:,idx);
    else
        encHDL = actEncData(idx);
    end

    HDLOutput = logical(encHDL(:));
    error = sum(abs(logical(encData{ii})-HDLOutput(:)));
    fprintf('Frame: %d, The Simulink model output and the MATLAB function input differ by %d bits\n', ii, error);

end
Frame: 1, The Simulink model output and the MATLAB function input differ by 0 bits
Frame: 2, The Simulink model output and the MATLAB function input differ by 0 bits
Frame: 3, The Simulink model output and the MATLAB function input differ by 0 bits
Frame: 4, The Simulink model output and the MATLAB function input differ by 0 bits
Frame: 5, The Simulink model output and the MATLAB function input differ by 0 bits

See Also

Blocks