%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                                                                        %
%                             WiMAX_Trellis                              %
%                                                                        %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%PREVOD VYTVARACICH POLYNOMOV KODERA DO TRELLISU
%Vstupna premenna:
%g - vytvaracie mnohocleny kodera v binarnom tvare
%Vystupna premenna:
%naOut - nasledujui vystup v trellise
%naStav - nasledujuci stav v trellise
%preOut - predchadzajuci vystup v trellise
%preStav - predchadzajuci stav v trellise
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [naOut,naStav,preOut,preStav] = WiMAX_Trellis(g)
[n,K] = size(g);                                                     
m = K - 1;                                                               
max_stav = 2^m;                                                      

for i = 1:max_stav
        stav = de2bi(i-1,m,'left-msb');                             

        %%PRE 0
        vs_b = 0;                                                           %sys. bit
        sp_v = mod(vs_b+sum(and(g(1,2:end),stav(1:end))),2);                %vypocet SV
        out_0(2) = mod(sp_v+sum(and(g(2,2:end),stav(1:end))),2);            %par. bit W
        out_0(3) = mod(sp_v+sum(and(g(3,2:end),stav(1:end))),2);            %par. bit Y
        stav_0 = [sp_v, stav(1:m-1)];                                       %stav buniek
        out_0(1) = 0;                                                    

        %%PRE 1
        vs_b = 1;                                                           %sys. bit
        sp_v = mod(vs_b+sum(and(g(1,2:end),stav(1:end))),2);                %vypocet SV
        out_1(2) = mod(sp_v+sum(and(g(2,2:end),stav(1:end))),2);            %par. bit W
        out_1(3) = mod(sp_v+sum(and(g(3,2:end),stav(1:end))),2);            %par. bit Y 
        stav_1 = [sp_v, stav(1:m-1)];                                       %stav buniek
        out_1(1) = 1;                                                  
       
        %%UPDATE TABULKY NASLEDUJUCI STAV/VYSTUP
        naOut(i,:) = 2*[out_0 out_1]-1;                                     %konvertovanie nasledujuceho vystupu do -1/1
        naStav(i,:) = [(bi2de(stav_0,'left-msb')+1) ...                     %urcenie nasledujuceho stavu
           (bi2de(stav_1,'left-msb')+1)]; 
end

%%URCENIE PREDCHADZAJUCICH STAVOV/VYSTUPOV
preOut = zeros(max_stav,2);
for bit=0:1
    for i = 1:max_stav
        preStav(naStav(i,bit+1), bit+1) = i;
        preOut(naStav(i, bit+1), bit*3+1:bit*3+3) ...
             = naOut(i, bit*3+1:bit*3+3);
    end 
end
end