function klasifikator()

%--------------------------------1.krok--------------------------------


clear all;
close all;

format long;

load synch;
load cas;
load dif_sigS0;

% Zavedení NETLAB Toolbox

clc;                                 % smazání okna
addpath('NETLAB');                   % cesta ke knihovně NETLAB

% Zobrazení změřeného signálu

figure(1)
title('Add Round Key - prumerovani - Diferencni signal pro prechod stavu 0->1');
plotyy(cas_osa,synch_sig,cas_osa,dif_sigS0)
xlabel ('-> t[s]')
ylabel ('-> U[V]')
legend('Synch_sig','Signál');

% Předloha

%Rozdělení na jednotlivé bity

b0=dif_sigS0(6500:11500,1);
b1=dif_sigS0(11500:16500,1);
b2=dif_sigS0(16500:21500,1);
b3=dif_sigS0(21500:26500,1);
b4=dif_sigS0(26500:31500,1);
b5=dif_sigS0(31500:36500,1);
b6=dif_sigS0(36500:41500,1);
b7=dif_sigS0(41500:46500,1);
b8=dif_sigS0(46500:51500,1);

%Rozdělení na instrukce a zobrazení průběhů

m1=(dif_sigS0(11500:14000,1))';
x1=(dif_sigS0(14000:16500,1))';
figure(2)
subplot(2,1,1)
plot(m1)
hold on
title('Průběh instrukce movf první bit');
subplot(2,1,2)
plot(x1)
hold on
title('Průběh instrukce xorwf první bit');

m2=(dif_sigS0(16500:19000,1))';
x2=(dif_sigS0(19000:21500,1))';
figure(3)
subplot(2,1,1)
plot(m2)
hold on
title('Průběh instrukce movf druhý bit');
subplot(2,1,2)
plot(x2)
hold on
title('Průběh instrukce xorwf druhý bit');


m3=(dif_sigS0(21500:24000,1))';
x3=(dif_sigS0(26500:29000,1))';
figure(4)
subplot(2,1,1)
plot(m3)
hold on
title('Průběh instrukce movf třetí bit');
subplot(2,1,2)
plot(x3)
hold on
title('Průběh instrukce xorwf třetí bit');

m4=(dif_sigS0(29000:31500,1))';
x4=(dif_sigS0(31500:34000,1))';
figure(5)
subplot(2,1,1)
plot(m4)
hold on
title('Průběh instrukce movf čtvrtý bit');
subplot(2,1,2)
plot(x4)
hold on
title('Průběh instrukce xorwf čtvrtý bit');

m5=(dif_sigS0(34000:36500,1))';
x5=(dif_sigS0(36500:39000,1))';
figure(6)
subplot(2,1,1)
plot(m5)
hold on
title('Průběh instrukce movf pátý bit');
subplot(2,1,2)
plot(x5)
hold on
title('Průběh instrukce xorwf pátý bit');

m6=(dif_sigS0(39000:41500,1))';
x6=(dif_sigS0(41500:44000,1))';
figure(7)
subplot(2,1,1)
plot(m6)
hold on
title('Průběh instrukce movf šestý bit');
subplot(2,1,2)
plot(x6)
hold on
title('Průběh instrukce xorwf šestý bit');

m7=(dif_sigS0(44000:46500,1))';
x7=(dif_sigS0(46500:49000,1))';
figure(8)
subplot(2,1,1)
plot(m7)
hold on
title('Průběh instrukce movf sedmý bit');
subplot(2,1,2)
plot(x7)
hold on
title('Průběh instrukce xorwf sedmý bit');

m8=(dif_sigS0(49000:51500,1))';
x8=(dif_sigS0(51500:54000,1))';
figure(9)
subplot(2,1,1)
plot(m8)
hold on
title('Průběh instrukce movf osmý bit');
subplot(2,1,2)
plot(x8)
hold on
title('Průběh instrukce xorwf osmý bit');

% Data určena k rozpoznání

z=x8;
%--------------------------------2.krok--------------------------------
% Nastaveni dat

disp('Probíhá nastavování dat pro neuronovou síť');

data = [m1; x1; m2; x2; m3; x3; m4; x4; m5; x5; m6; x6; m7; x7; m8; x8]; %Celková data pro trénink neuronové sítě

class1 = [ones(1,length(m1)) zeros(1, length (x1)) zeros(1,length(m2)) zeros(1, length (x2)) zeros(1,length(m3)) zeros(1, length (x3)) zeros(1,length(m4)) zeros(1, length (x4)) zeros(1,length(m5)) zeros(1, length (x5)) zeros(1,length(m6)) zeros(1, length (x6)) zeros(1,length(m7)) zeros(1, length (x7)) zeros(1,length(m8)) zeros(1, length (x8))];
class2 = [zeros(1,length(m1)) ones(1, length (x1)) zeros(1,length(m2)) zeros(1, length (x2)) zeros(1,length(m3)) zeros(1, length (x3)) zeros(1,length(m4)) zeros(1, length (x4)) zeros(1,length(m5)) zeros(1, length (x5)) zeros(1,length(m6)) zeros(1, length (x6)) zeros(1,length(m7)) zeros(1, length (x7)) zeros(1,length(m8)) zeros(1, length (x8))];
class3 = [zeros(1,length(m1)) zeros(1, length (x1)) ones(1,length(m2)) zeros(1, length (x2)) zeros(1,length(m3)) zeros(1, length (x3)) zeros(1,length(m4)) zeros(1, length (x4)) zeros(1,length(m5)) zeros(1, length (x5)) zeros(1,length(m6)) zeros(1, length (x6)) zeros(1,length(m7)) zeros(1, length (x7)) zeros(1,length(m8)) zeros(1, length (x8))];
class4 = [zeros(1,length(m1)) zeros(1, length (x1)) zeros(1,length(m2)) ones(1, length (x2)) zeros(1,length(m3)) zeros(1, length (x3)) zeros(1,length(m4)) zeros(1, length (x4)) zeros(1,length(m5)) zeros(1, length (x5)) zeros(1,length(m6)) zeros(1, length (x6)) zeros(1,length(m7)) zeros(1, length (x7)) zeros(1,length(m8)) zeros(1, length (x8))];
class5 = [zeros(1,length(m1)) zeros(1, length (x1)) zeros(1,length(m2)) zeros(1, length (x2)) ones(1,length(m3)) zeros(1, length (x3)) zeros(1,length(m4)) zeros(1, length (x4)) zeros(1,length(m5)) zeros(1, length (x5)) zeros(1,length(m6)) zeros(1, length (x6)) zeros(1,length(m7)) zeros(1, length (x7)) zeros(1,length(m8)) zeros(1, length (x8))];
class6 = [zeros(1,length(m1)) zeros(1, length (x1)) zeros(1,length(m2)) zeros(1, length (x2)) zeros(1,length(m3)) ones(1, length (x3)) zeros(1,length(m4)) zeros(1, length (x4)) zeros(1,length(m5)) zeros(1, length (x5)) zeros(1,length(m6)) zeros(1, length (x6)) zeros(1,length(m7)) zeros(1, length (x7)) zeros(1,length(m8)) zeros(1, length (x8))];
class7 = [zeros(1,length(m1)) zeros(1, length (x1)) zeros(1,length(m2)) zeros(1, length (x2)) zeros(1,length(m3)) zeros(1, length (x3)) ones(1,length(m4)) zeros(1, length (x4)) zeros(1,length(m5)) zeros(1, length (x5)) zeros(1,length(m6)) zeros(1, length (x6)) zeros(1,length(m7)) zeros(1, length (x7)) zeros(1,length(m8)) zeros(1, length (x8))];
class8 = [zeros(1,length(m1)) zeros(1, length (x1)) zeros(1,length(m2)) zeros(1, length (x2)) zeros(1,length(m3)) zeros(1, length (x3)) zeros(1,length(m4)) ones(1, length (x4)) zeros(1,length(m5)) zeros(1, length (x5)) zeros(1,length(m6)) zeros(1, length (x6)) zeros(1,length(m7)) zeros(1, length (x7)) zeros(1,length(m8)) zeros(1, length (x8))];
class9 = [zeros(1,length(m1)) zeros(1, length (x1)) zeros(1,length(m2)) zeros(1, length (x2)) zeros(1,length(m3)) zeros(1, length (x3)) zeros(1,length(m4)) zeros(1, length (x4)) ones(1,length(m5)) zeros(1, length (x5)) zeros(1,length(m6)) zeros(1, length (x6)) zeros(1,length(m7)) zeros(1, length (x7)) zeros(1,length(m8)) zeros(1, length (x8))];
class10 = [zeros(1,length(m1)) zeros(1, length (x1)) zeros(1,length(m2)) zeros(1, length (x2)) zeros(1,length(m3)) zeros(1, length (x3)) zeros(1,length(m4)) zeros(1, length (x4)) zeros(1,length(m5)) ones(1, length (x5)) zeros(1,length(m6)) zeros(1, length (x6)) zeros(1,length(m7)) zeros(1, length (x7)) zeros(1,length(m8)) zeros(1, length (x8))];
class11 = [zeros(1,length(m1)) zeros(1, length (x1)) zeros(1,length(m2)) zeros(1, length (x2)) zeros(1,length(m3)) zeros(1, length (x3)) zeros(1,length(m4)) zeros(1, length (x4)) zeros(1,length(m5)) zeros(1, length (x5)) ones(1,length(m6)) zeros(1, length (x6)) zeros(1,length(m7)) zeros(1, length (x7)) zeros(1,length(m8)) zeros(1, length (x8))];
class12 = [zeros(1,length(m1)) zeros(1, length (x1)) zeros(1,length(m2)) zeros(1, length (x2)) zeros(1,length(m3)) zeros(1, length (x3)) zeros(1,length(m4)) zeros(1, length (x4)) zeros(1,length(m5)) zeros(1, length (x5)) zeros(1,length(m6)) ones(1, length (x6)) zeros(1,length(m7)) zeros(1, length (x7)) zeros(1,length(m8)) zeros(1, length (x8))];
class13 = [zeros(1,length(m1)) zeros(1, length (x1)) zeros(1,length(m2)) zeros(1, length (x2)) zeros(1,length(m3)) zeros(1, length (x3)) zeros(1,length(m4)) zeros(1, length (x4)) zeros(1,length(m5)) zeros(1, length (x5)) zeros(1,length(m6)) zeros(1, length (x6)) ones(1,length(m7)) zeros(1, length (x7)) zeros(1,length(m8)) zeros(1, length (x8))];
class14 = [zeros(1,length(m1)) zeros(1, length (x1)) zeros(1,length(m2)) zeros(1, length (x2)) zeros(1,length(m3)) zeros(1, length (x3)) zeros(1,length(m4)) zeros(1, length (x4)) zeros(1,length(m5)) zeros(1, length (x5)) zeros(1,length(m6)) zeros(1, length (x6)) zeros(1,length(m7)) ones(1, length (x7)) zeros(1,length(m8)) zeros(1, length (x8))];
class15 = [zeros(1,length(m1)) zeros(1, length (x1)) zeros(1,length(m2)) zeros(1, length (x2)) zeros(1,length(m3)) zeros(1, length (x3)) zeros(1,length(m4)) zeros(1, length (x4)) zeros(1,length(m5)) zeros(1, length (x5)) zeros(1,length(m6)) zeros(1, length (x6)) zeros(1,length(m7)) zeros(1, length (x7)) ones(1,length(m8)) zeros(1, length (x8))];
class16 = [zeros(1,length(m1)) zeros(1, length (x1)) zeros(1,length(m2)) zeros(1, length (x2)) zeros(1,length(m3)) zeros(1, length (x3)) zeros(1,length(m4)) zeros(1, length (x4)) zeros(1,length(m5)) zeros(1, length (x5)) zeros(1,length(m6)) zeros(1, length (x6)) zeros(1,length(m7)) zeros(1, length (x7)) zeros(1,length(m8)) ones(1, length (x8))];

class = [class1; class2; class3; class4; class5; class6; class7; class8; class9; class10; class11; class12; class13; class14; class15; class16;]; % vzor pro klasifikaci


% Vytvoření neuronové sítě a trénování

disp('Probíhá vytvoření neuronové sítě');

nn = mlp(2501, 17 ,40016, 'logistic');   % parametry sítě, tvar aktivační funkce

% Nastavení konfigurace sitě

disp('Probíha nastavení parametrů sítě (počet trénovacích cyklů)');

options = zeros(1,18);           	% pole options naplněno nulovými hodnotami
options(1) = 1;                 	% výpis chyby během učení
options(14) = 3500;               	% počet trénovacích cyklů


[nn, options] = netopt(nn, options, data, class, 'scg');

%--------------------------------3.krok-------------------------------

save nn nn;
%load nn nn;

% Rozpoznování dat

disp('Probíhá rozpoznávaní dat neuronovou síťí pro zadaný vzorek');

res = mlpfwd(nn, z );		% spuštění klasifikace, jako druhý parametr mplfwed se zadává vzorek k rozpoznání
%
%--------------------------------4.krok-------------------------------

% Zobrazení výsledků

disp('Probíhá zpracování výsledků z neuronové sítě');

resm1 = res(1:2501)  ;          	%rozdělení výstupní hodnoty pro výpočet a grafické zpracování
resx1 = res(2502:5002);

resm2 = res(5003:7503) ;         	
resx2 = res(7504:10004); 

resm3 = res(10005:12505) ;         	
resx3 = res(12506:15006)  ;

resm4 = res(15007:17507) ;         	
resx4 = res(17508:20008) ;

resm5 = res(20009:22509) ;         	
resx5 = res(22510:25010);

resm6 = res(25011:27511) ;          	
resx6 = res(27512:30012);

resm7 = res(30013:32513) ;         	
resx7 = res(32514:35014);

resm8 = res(35015:37515);
resx8 = res(37516:40016);

oresm1 = 0;       	
oresx1 = 0; 
oresm2 = 0;       	
oresx2 = 0; 
oresm3 = 0;       	
oresx3 = 0; 
oresm4 = 0;       	
oresx4 = 0; 
oresm5 = 0;       	
oresx5 = 0; 
oresm6 = 0;       	
oresx6 = 0; 
oresm7 = 0;       	
oresx7 = 0; 
oresm8 = 0;       	
oresx8 = 0; 

for i=1:2501,
    oresm1=oresm1+resm1(i);
end

for i=1:2501,
    oresx1=oresx1+resx1(i);
end

for i=1:2501,
    oresm2=oresm2+resm2(i);
end

for i=1:2501,
    oresx2=oresx2+resx2(i);
end

for i=1:2501,
    oresm3=oresm3+resm3(i);
end

for i=1:2501,
    oresx3=oresx3+resx3(i);
end

for i=1:2501,
    oresm4=oresm4+resm4(i);
end

for i=1:2501,
    oresx4=oresx4+resx4(i);
end

for i=1:2501,
    oresm5=oresm5+resm5(i);
end

for i=1:2501,
    oresx5=oresx5+resx5(i);
end

for i=1:2501,
    oresm6=oresm6+resm6(i);
end

for i=1:2501,
    oresx6=oresx6+resx6(i);
end

for i=1:2501,
    oresm7=oresm7+resm7(i);
end

for i=1:2501,
    oresx7=oresx7+resx7(i);
end

for i=1:2501,
    oresm8=oresm8+resm8(i);
end

for i=1:2500,
    oresx8=oresx8+resx8(i);
end

fprintf('\n');
disp('Výsledek: ');

oresm1 =(oresm1/2501)*100;
oresx1 =(oresx1/2501)*100;

oresm2 =(oresm2/2501)*100;
oresx2 =(oresx2/2501)*100;

oresm3 =(oresm3/2501)*100;
oresx3 =(oresx3/2501)*100;

oresm4 =(oresm4/2501)*100;
oresx4 =(oresx4/2501)*100;

oresm5 =(oresm5/2501)*100;
oresx5 =(oresx5/2501)*100;

oresm6 =(oresm6/2501)*100;
oresx6 =(oresx6/2501)*100;

oresm7 =(oresm7/2501)*100;
oresx7 =(oresx7/2501)*100;

oresm8 =(oresm8/2501)*100;
oresx8 =(oresx8/2501)*100;

% Sezaření výsledků pomocí metody InsertionSort

v =[oresm1 oresx1 oresm2 oresx2 oresm3 oresx3 oresm4 oresx4 oresm5 oresx5 oresm6 oresx6 oresm7 oresx7 oresm8 oresx8]

ArrayOfRandomNumbers=v;
Sequence=ArrayOfRandomNumbers;
Sequence1=Sequence;
for counter=1:1:length(Sequence)-1
    for counter1=counter:-1:1
        if (Sequence(counter1+1)<Sequence(counter1))
            Sequence1(counter1)=Sequence(counter1+1);
            Sequence1(counter1+1)=Sequence(counter1);
            Sequence=Sequence1;
        end
    end
end
vy=Sequence1

% Výpis výsledku

if(oresm1 == vy(1,16) ) 
    disp('Zadaná data odpovídají funkci mofv první')
end;

if(oresx1 == vy(1,16) ) 
    disp('Zadaná data odpovídají funkci xorf první bit')
end;

if(oresm2 == vy(1,16) ) 
    disp('Zadaná data odpovídají funkci mofv druhý')
end;

if(oresx2 == vy(1,16) ) 
    disp('Zadaná data odpovídají funkci xorf druhý bit')
end;

if(oresm3 == vy(1,16) ) 
    disp('Zadaná data odpovídají funkci mofv třetí')
end;

if(oresx3 == vy(1,16) ) 
    disp('Zadaná data odpovídají funkci xorf třetí bit')
end;

if(oresm4 == vy(1,16) ) 
    disp('Zadaná data odpovídají funkci mofv čtvrtý')
end;

if(oresx4 == vy(1,16) ) 
    disp('Zadaná data odpovídají funkci xorf čtvrtý bit')
end;

if(oresm5 == vy(1,16) ) 
    disp('Zadaná data odpovídají funkci mofv pátý')
end;

if(oresx5 == vy(1,16) ) 
    disp('Zadaná data odpovídají funkci xorf pátý bit')
end;

if(oresm6 == vy(1,16) ) 
    disp('Zadaná data odpovídají funkci mofv šestý')
end;

if(oresx6 == vy(1,16) ) 
    disp('Zadaná data odpovídají funkci xorf šestý bit')
end;

if(oresm7 == vy(1,16) ) 
    disp('Zadaná data odpovídají funkci mofv sedmý')
end;

if(oresx7 == vy(1,16) ) 
    disp('Zadaná data odpovídají funkci xorf sedmý bit')
end;

if(oresm8 == vy(1,16) ) 
    disp('Zadaná data odpovídají funkci mofv osmý')
end;

if(oresx8 == vy(1,16) ) 
    disp('Zadaná data odpovídají funkci xorf osmý bit')
end;

end

