CTC(Convolutional Turbo Code) basics and specifications

This section of MATLAB source code covers CTC Encoder or Convolutional Turbo code matlab code.

The Convolutional Turbo Code Encoder or CTC Encoder is depicted in the following figure including constituent encoder. It uses double binary circular recursive systematic convolutional code.The following is the matlab code for the CTC structure defined in the figure.

Refer Turbo encoder page which describes basics of CTC Encoder or Convolutional Turbo Encoder technique with rate 1 by 3 example used for forward error correction.

The difference between convolutional encoder and turbo encoder is that in convolutional encoder input bits are not preserved and are altered. While in the case of turbo coding input bits are preserved and are multiplexed with other altered bits generated through encoder and (interleaver+encoder) modules.

CTC Encoder MATLAB Code

function OutBits = CTCEncoder(InpBits, N, P)

CircularStateTable = [
0 6 4 2 7 1 3 5;
0 3 7 4 5 6 2 1;
0 5 3 6 2 7 1 4;
0 4 1 5 6 2 7 3;
0 2 5 7 1 3 4 6;
0 7 6 1 3 4 5 2];

InitState = [0 0 0];
[Junk FinalState] = CTCRSCEncoder(InpBits, N, InitState);
Ri = mod(N, 7);
Ci = FinalState(1)*4 + FinalState(2)*2 + FinalState(3);
CS = CircularStateTable(Ri, Ci+1);
InitState(1) = floor(CS/4);
CS = mod(CS,4);
InitState(2) = floor(CS/2);
CS = mod(CS,2);
InitState(3) = CS;
[p1 FS] = CTCRSCEncoder(InpBits, N, InitState);
if sum(FS == InitState) ~= 3
disp('P1 mismatch')
return
end
IB = CTCInterleaver(InpBits, N, P);
InitState = [0 0 0];
[Junk FinalState] = CTCRSCEncoder(IB, N, InitState);
Ri = mod(N, 7);
Ci = FinalState(1)*4 + FinalState(2)*2 + FinalState(3);
CS = CircularStateTable(Ri, Ci+1);
InitState(1) = floor(CS/4);
CS = mod(CS,4);
InitState(2) = floor(CS/2);
CS = mod(CS,2);
InitState(3) = CS;
[p2 FS] = CTCRSCEncoder(IB, N, InitState);
if sum(FS == InitState) ~= 3
disp('P2 mismatch')
return
end

OutBits = zeros(6*N, 1);
for k = 0:N-1
OutBits(6*k+1) = InpBits(2*k+1);
OutBits(6*k+2) = InpBits(2*k+2);
OutBits(6*k+3) = p1(2*k+1);
OutBits(6*k+4) = p2(2*k+1);
OutBits(6*k+5) = p1(2*k+2);
OutBits(6*k+6) = p2(2*k+2);
end

function [ParityBits, FinState] = CTCRSCEncoder(InpBits, N, InitState)
%[ParityBits, FinState] = CTCRSCEncoder(InpBits, N, InitState)
%InitState = initial state of encoder (0 to 7) in binary
%FinState = final state of encoder (0 to 7) in binary

TNxt = CTCEncTable(:, 6:8);
TOut = CTCEncTable(:, 9:10);
ParityBits = zeros(2*N, 1);
CS = InitState;

for k = 0:N-1
A = InpBits(2*k+1);
B = InpBits(2*k+2);
m = CS(1)*16 + CS(2)*8 + CS(3)*4 + A*2 + B;
NS = TNxt(m+1, :);
Pb = TOut(m+1, :);
ParityBits(2*k+1) = Pb(1);
ParityBits(2*k+2) = Pb(2);
CS = NS;
end
FinState = NS;

function InterleavedBits = CTCInterleaver(InpBits, N, P)
%InterleavedBits = CTCInterleaver(InpBits, N, P)
%N - Length of input bit in pairs
%P - [p0 p1 p2 p3], interleaver parameters

InterleavedBits = zeros(2*N, 1);
xI = zeros(N, 2);
for k = 0:N-1
A = InpBits(2*m+1);
B = InpBits(2*m+2);
if mod(k, 2) == 1
InterleavedBits(2*k+1) = A;
InterleavedBits(2*k+2) = B;
else
InterleavedBits(2*k+1) = B;
InterleavedBits(2*k+2) = A;
end

end