function [b] = add_CRC(type, a)
%% Funkce add_CRC
% add_CRC(type, a) je funkce, která přidá CRC ke vstupní posloupnosti "a".
% 
% Proměnná "a" je vstupní bitová posloupnos. Proměnná type je proměnná typu
% string, která určuje jaký typ generátoru bude pro generování CRC použit.
% CRC je generováno podle specifikace 3GPP TS 36.212 V8.9.0.
%
% Promnná "type" se může rovnat čtyřem řetězcům.
%
% type = 'gCRC24A' - pro generocání CRC délky 24 bitů, podle definice CRC
% generátoru 24A
%
% ...
%
%
%   Vytvořil: Milan Kounek, jako součást diplomové práce Model fyzické
%   vrstvy systému LTE.
%   $Revize: 1 $  $Date: 2012/06/17 08:16:06 $

%% Generátory
% popis generátorů CRC za pomoci jejich polynomů

% gCRC24A: D24 + D23 + D18 + D17 + D14 + D11 + D10 + D7 + D6 + D5 + D4 + D3
% + D + 1
% polynom
gCRC24A_p = [1 1 0 0 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 1 1 1 0 1 1];
% generátor CRC za pomoci fce crc.generator
gCRC24A = crc.generator(gCRC24A_p);

% gCRC24B: D24 + D23 + D6 + D5 + D + 1
gCRC24B_p = [1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 1];
gCRC24B = crc.generator(gCRC24B_p);

% gCRC16: D16 + D12 + D5 + 1
gCRC16_p = [1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 1];
gCRC16 = crc.generator(gCRC16_p);

% gCRC8: D8 + D7 + D4 + D3 + D + 1
gCRC8_p = [1 1 0 0 1 1 0 1 1];
gCRC8 = crc.generator(gCRC8_p);

%% Vygenerování a přidání CRC
% podle zadaného typu generátoru vygeneruje a přidá CRC ke vstupním datům.
if(strcmp(type, 'gCRC24A')),
    % vygenerování CRC z původní posloupnosti a přidání CRC na konec
    % posloupnosti
    b = generate(gCRC24A, a);
elseif(strcmp(type, 'gCRC24B')),
    b = generate(gCRC24B, a);
elseif(strcmp(type, 'gCRC16')),
    b = generate(gCRC16, a);
elseif(strcmp(type, 'gCRC8')),
    b = generate(gCRC8, a);
end    