function [c F l] = cbSegmentation(b)
%% Funkce slouží k úpravě dat
% V případě, je li dat ve vstupním bloku málo, přidá bity, pokud je dat
% mnoho rozdělí je do bloků a přidá ochranu CRC

% Maximální velikost bloku[rel8 36.212 v8.8.0, str.9]
Z = 6144;
% Bmin = 40;
% K jsou z tab 5.1.3-3[36.212 v8.8.0]
K_table = [40:8:512 528:16:1024 1056:32:2048 2112:64:6144];

% zjištění délky dat
B = length(b);

% %% Doplnění bitů do minimální délky
% % Přidání plnících bitů z nedostatečné délky vstupu.
% if(B<Bmin)
%     F = Bmin-B;
%     c = [zeros(F,1) b];
%     B = lenght(c);
% end

% l - louží k uložení délek bloků, d - tvorba řetězce bloků
l = []; d = [];
%% Výpočet množství bloků
% Porovnává se s maximální velikostí bloku a stanoví se zdali bude blok dat
% segmenován a kolik segmentu bude třeba.
if( B <= Z),
    L = 0;      % počet bitů CRC 
    C = 1;      % počet bloků
    B_ = B;
else
    L = 24;
    C = ceil(B/(Z-L));
    B_ = B + C*L;
end
    
%% Stanovení velikosti segmentů bloků
% Stanovují se dvě velikosti segmentů. Přídavek _p vyjadčuje 1. velikost a
% počet bloku, přídavek _m druhou velikost a počet bolků. Dále se pak
% stanovuje počet bloků obou velikostí a přidávají se doplňující bity.

% První velikost segmentu se stanoví následovně:
i = 1;
while (C*K_table(i) < B_)
    i = i + 1;
end
K_p = K_table(i);

% Pokud je C = 1, není třeba stanovovat druhou velikost bloku, protože se
% všechny informace vejdou do jediného bloku.
if(C == 1),
    C_p = 1; K_m = 0; C_m = 0;
elseif(C > 1),
    % Nalezení velikosti druhých bloků.
    K_m = K_table(i-1);
    delta_K = K_p - K_m;
    % Počty segmentů jednotlivých velikostí bloků
    C_m = floor((C*K_p - B_)/delta_K);
    C_p = C - C_m;
end

% Počet plnících bitů
F = C_p * K_p + C_m * K_m - B_;
for k = 1:F,
    c(k,1) = 0;
end
k = F+1; s = 1;
for r = 1:C,
    if(r < C_m +1)
        K_r = K_m;
    else
        K_r = K_p;
    end
    
    while(k < K_r - L + 1)
        c(k,r) = b(s);
        k = k + 1;
        s = s + 1;
    end
    l = [l k+L-1];
    k = 1;
    % Přidání CRC ke každému bloku dat
    if(C > 1)
        d = [d ; add_CRC('gCRC24B', c(:,r))];
    end
end

% Konečné uložení posdládaných bloků do c, jako do konečné proměnné
if(C > 1), c = d; end