Main Content

Decode CCSDS Reed-Solomon and Convolutional Concatenated Code

This example shows how to use the CCSDS RS Decoder block with the Viterbi Decoder block to decode a Reed-Solomon (RS) and convolutional concatenated code according to the Consultative Committee for Space Data Systems (CCSDS) standard. The synchronization and channel coding sublayer of the CCSDS TM standard includes concatenated coding scheme with Reed-Solomon code as the outer code and convolutional code as the inner code. The example supports HDL code generation for the HDL CCSDS Concatenated Decoder subsystem.

Set Up Concatenated Code Parameters

Specify input variables. You can change only k and i variable values in this section based on your requirements.

% Reed-Solomon code parameters
n = 255;  % Codeword length
k = 223;  % Message length
i = 1;    % Interleaving depth

% Convolutional code parameters
convRate = '1/2';     % Convolutional code rate
K = 7;                % Constraint length
codePoly = [171 133]; % Code generator polynomial
trBackDepth = 32;     % Traceback depth

Generate Transmitter Waveform

Generate transmitter waveform using the ccsdsTMWaveformGenerator (Satellite Communications Toolbox) System object™ in Satellite Communications Toolbox. The System object performs RS encoding, convolutional encoding, and QPSK modulation on the input data and generates a transmitter waveform.

% Generate random input data
dataBits = randi([0,1],k*i*8,1);

% Configure |ccsdsTMWaveformGenerator| System object
obj = ccsdsTMWaveformGenerator('WaveformSource','synchronization and channel coding',...

% Call System object to generate RS and convolutional encoded and QPSK
% modulated transmitter waveform
tmWaveform = obj(dataBits);

Add AWGN Channel

Add white Gaussian noise to the transmitter waveform.

snrdB = 5; % SNR of noise in dB
snr = 10^(snrdB/10);
noiseVar = 1/snr;

% Generate noise with unit power
awgnUnitPow = (1/sqrt(2))*(randn(length(tmWaveform),1) ...

% Add noise to the transmitter waveform
chOut = tmWaveform + sqrt(noiseVar)*awgnUnitPow;

Demodulate Receiver Waveform

Demodulate the received AWGN channel output waveform using the comm.PSKDemodulator System object and prepare input for the Simulink® model.

% Configure the |comm.PSKDemodulator| System object for QPSK demodulation
qpskDemod = comm.PSKDemodulator('ModulationOrder',4,...
    'CustomSymbolMapping',[0 2 3 1],...  % Mapping as per the CCSDS standard
    'DecisionMethod','Approximate log-likelihood ratio',...

% Call the System object to demodulate the received waveform and output the
% LLR values
demodOut = qpskDemod(chOut);

% Invert every alternate LLR value (starting from second LLR) to remove
% symbol inversion, according to the CCSDS standard
demodOut(2:2:end) = -demodOut(2:2:end);

% Normalize all LLR values with required soft wordlength
llrWL = 4;
maxDemodOut = max(abs(demodOut));
vitInput = fi(-demodOut*(2^(llrWL-1))/maxDemodOut,1,llrWL,0);

Decode Demodulated Waveform Using Simulink Model

To decode the demodulated waveform, simulate the CCSDSConcatenateDecoder.slx model. The model contains Viterbi Decoder and CCSDS RS Decoder blocks.

% Input signals for the Simulink model
dataIn = vitInput;
startIn = true;
endIn = [false(length(dataIn)/2 -1,1); true];
validIn = true(length(dataIn)/2,1);

% Set mask parameters of CCSDS RS Decoder block
modelName = 'CCSDSConcatenateDecoder';
subsystem = 'HDL CCSDS Concatenated Decoder';
set_param([modelName '/' subsystem '/CCSDS RS Decoder'], ...
        'MessageLength',num2str(k), ...

% Stop time
vitLatency = 148;
upsampleFac = 8;
rsLatency = 3065; % Maximum latency of the CCSDS RS Decoder block
rsOutLen = k*i;
pipelineDelay = 17;
stopTime = vitLatency + (rsLatency+rsOutLen)*upsampleFac + pipelineDelay;

% Simulate the model

Compare Simulink Block Output with MATLAB System Object Input

Compare the output of the CCSDS RS Decoder block with the input of the ccsdsTMWaveformGenerator System object.

fprintf('\nHDL CCSDS RS Decoder\n');
fprintf('Number of bits mismatched between decoded block output and System object input: %d',nnz(decodedBits~=dataBits))
Number of bits mismatched between decoded block output and System object input: 0

See Also