function [QRS etime] = Detektor1( signal, graf )
%%%BP; T.ŠIKNER
% jednosvodový detektor
% vstup je tvořen signal, svod, graf
% signal je nazev signál pro detekci
% svod je číslo svodu daného signálu
% graf udává jestli se při detekci vykreslí i graf, graf=1 vykreslení
% proběhne, graf=0 graf se nevykreslí
% výstup je QRS
% QRS jsou pozice QRS komplexu ve svodu
%
% způsob zadání:
% Detektor1('MO1_001_03.mat',1,1)
% pro tento příklad je zvolen první svod tohoto signálu a dojde k vykreslení grafu 

clc
stime=tic;
% vytvoreni casove osy
cas=linspace(0,10,5000);


% filtrace
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
fvz=500;
signal=[ones(1,100)*signal(1),signal,signal(end)*ones(1,525)];

h=fir1(50,50/(fvz/2),'stop');
x_pz=filter(h,1,signal);
x_pz=x_pz(26:end);

h=fir1(1000,0.67/(fvz/2),'high');
x_hp=filter(h,1,x_pz);
S=x_hp(601:end);
%konec filtrace
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%příprava signálu
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
n=length(S);

%krok 2
TS1=(S).^2;

%krok 3
for i=1:n    
    if i<6
        leva=i-1;
        w=TS1(i-leva:i+5);
        TS1max=max(w);  
        TS1min=min(w);    
        G1(i)=TS1max-TS1min;
    elseif i>(n-5)
        prava=n-i;
        w=TS1(i-5:i+prava);
        TS1max=max(w);  
        TS1min=min(w);    
        G1(i)=TS1max-TS1min;
    else
        w=TS1(i-5:i+5);
        TS1max=max(w);  
        TS1min=min(w);    
        G1(i)=TS1max-TS1min;     
    end
end

%krok 4
for i=1:n   
    if i<6
        leva=i-1;
        w=G1(i-leva:i+5);
        FG1(i)=sum(w)/length(w);      
    elseif i>(n-5)
        prava=n-i;
        w=G1(i-5:i+prava);
        FG1(i)=sum(w)/length(w);                
    else
        w=G1(i-5:i+5);
        FG1(i)=sum(w)/11;              
    end
end

%krok 5
S=S/max(abs(S));
TS1=TS1/max(TS1);
G1=G1/max(G1);
FG1=FG1/max(FG1);

%krok 6
e=2.718281828459045;
for i=1:n
    TS2(i)= 1 - ( 2 / ( e.^(2*S(i)) +1 )  )  ;
end

%krok 7
for i=1:n    
    if i<6
        leva=i-1;
        w=TS2(i-leva:i+5);
        TS2max=max(w);  
        TS2min=min(w);    
        G2(i)=TS2max-TS2min;
    elseif i>(n-5)
        prava=n-i;
        w=TS2(i-5:i+prava);
        TS2max=max(w);  
        TS2min=min(w);    
        G2(i)=TS2max-TS2min;
    else
        w=TS2(i-5:i+5);
        TS2max=max(w);  
        TS2min=min(w);    
        G2(i)=TS2max-TS2min;     
    end
end

%krok 8
for i=1:n   
    if i<6
        leva=i-1;
        w=G2(i-leva:i+5);
        FG2(i)=sum(w)/length(w);      
    elseif i>(n-5)
        prava=n-i;
        w=G2(i-5:i+prava);
        FG2(i)=sum(w)/length(w);                
    else
        w=G2(i-5:i+5);
        FG2(i)=sum(w)/11;              
    end
end

%krok 9
TS2=TS2/max(abs(TS2));
G2=G2/max(abs(G2));
FG2=FG2/max(abs(FG2));

%krok 10
for i=1:n
    TS3(i)=FG2(i)*S(i);
end

%krok 11
for i=1:n    
    if i<6
        leva=i-1;
        w=TS3(i-leva:i+5);
        TS3max=max(w);  
        TS3min=min(w);    
        G3(i)=TS3max-TS3min;
    elseif i>(n-5)
        prava=n-i;
        w=TS3(i-5:i+prava);
        TS3max=max(w);  
        TS3min=min(w);    
        G3(i)=TS3max-TS3min;
    else
        w=TS3(i-5:i+5);
        TS3max=max(w);  
        TS3min=min(w);    
        G3(i)=TS3max-TS3min;     
    end
end

%krok 12
for i=1:n   
    if i<6
        leva=i-1;
        w=G3(i-leva:i+5);
        FG3(i)=sum(w)/length(w);      
    elseif i>(n-5)
        prava=n-i;
        w=G3(i-5:i+prava);
        FG3(i)=sum(w)/length(w);                
    else
        w=G3(i-5:i+5);
        FG3(i)=sum(w)/11;              
    end
end

%krok 13
TS3=TS3/max(abs(TS3));
G3=G3/max(abs(G3));
FG3=FG3/max(abs(FG3));

%krok 14
%(a)
for i=1:n
    TS4(i)=FG1(i)+FG3(i);
end

%(b)
TS4m=TS4-median(TS4);

%(c)
Pre_Fq=TS4m/max(abs(TS4m));

%(d)
for i=1:n
    if Pre_Fq(i)>0.05
        Fq(i)=Pre_Fq(i);
    else
        Fq(i)=0;
    end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%detekce QRS

%krok 1
for i=1:n
    if Fq(i)>0.05
        Cq(i)=1;
    else
        Cq(i)=0;
    end
end

%krok 2 vypocet prvniho prahu
Fq_prah=Fq(Fq>0.05);
tm=median(Fq_prah);
t=tm;

%krok 3
oknoFq=[];
pozice_oknoFq=[];
QRS=[];


for i=1:(n-1)      
    if Cq(i)==1 && Cq(i+1)==1 && i~=(n-1)
        oknoFq=[oknoFq,Fq(i)];          
        pozice_oknoFq=[pozice_oknoFq,i]; 
  
    elseif Cq(i)==1 && Cq(i+1)==0
        oknoFq=[oknoFq,Fq(i)];
        pozice_oknoFq=[pozice_oknoFq,i]; 
        
        [Fq_max,Fq_max_pozice_oknoFq]=max(oknoFq);
        Fq_max_pozice=pozice_oknoFq(Fq_max_pozice_oknoFq);          
                        
        if Fq_max>t
            QRS=[QRS,Fq_max_pozice];
            t=0.5*Fq_max;
            if t>tm
                t=tm;
            end            
        end
        
    elseif Cq(i)==1 && Cq(i+1)==1 && i==(n-1)
        oknoFq=[oknoFq,Fq(i)];
        pozice_oknoFq=[pozice_oknoFq,i]; 
        
        [Fq_max,Fq_max_pozice_oknoFq]=max(oknoFq);
        Fq_max_pozice=pozice_oknoFq(Fq_max_pozice_oknoFq);          
                        
        if Fq_max>t
            QRS=[QRS,Fq_max_pozice];
            t=0.5*Fq_max;
            if t>tm
                t=tm;
            end            
        end 
                
    else
        oknoFq=[];    
        pozice_oknoFq=[];
    end  
    etime=toc(stime);
end

if graf==1
% vykresleni detekce
QRScas=cas(QRS);
figure(7)
plot(cas,svod1)
title('Původní signál s detekvoanými R vlnami')
xlabel('t [s]')
ylabel('U [mV]')
hold on
bod=ylim;
line ([QRScas ;QRScas],[bod],'color','red','linestyle',':')

end