function [QRS etime] = banka_filtru(x)
%%%Veverka Vojtěch, 2015
 global QRS etime
 stime=tic;
 fvz=500;

% návrh filtru
N = 251;         %délka impulzní charakteristiky

%%%ÚPRAVA DÉLKY SIGNÁLU%%%
k = fvz/5;   %ošetření začátku a konce
zacatek(1:k) = x(1);
konec(1:k) = x(end);
x = [zacatek x konec];

x=[x, zeros(1,125)];
pp1=fir1(N,[8 16]/(fvz));
pp2=fir1(N,[16 32]/(fvz));
pp3=fir1(N,[32 64]/(fvz));
pp4=fir1(N,[64 128]/(fvz));
%%____filtrace filtrem___%%

y(1,:) = filter( pp1, 1, x );
y(2,:) = filter( pp2, 1, x );
y(3,:) = filter( pp3, 1, x );
y(4,:) = filter( pp4, 1, x );

delay = mean(grpdelay(pp1));
for i=1:4  
pomzp=y(i,:);
pomzp(1:delay) = [];
pomzp=pomzp(100:5075);
yy(i,:)=pomzp;
end
%umocneni
for i=1:4
 yyy=yy(i,:);
 um(i,:)=yyy.^2;
end



for i=1:4
poloha=detekuj(um(i,:));
polohy(1,i) = {poloha};
end
    QRS = [];
    shluky = shlukovka(polohy);
    for i = 1:length(shluky)
        if length(shluky{1,i})>2
           QRS = [QRS median(shluky{1,i})];
        end
    end
    etime=toc(stime);
end

function [polohy]=detekuj(signal)

fvz=500;    
prah = mean(signal);  %vypocteni prahove hodnoty
d = length(signal);   %delka signalu  
krok = 1;             %krok pro while cyklus  
polohy = [];          %promena pro ulozeni poloh QRS  
okno = 120;           %delka okna pro vyhledávání maximální hodnoty
ref = 0.2 *fvz;       %refrakterni doba
signal=[signal zeros(1,okno)];    % rzsireni signalu o okno

while krok<d;
    
    if signal(krok)>prah; % kontrola nadprahovych hodnot
        
        kus = signal(krok:krok+okno); % vyber useku pro vyber maxima
        [hodnota,poloha] = max( kus ); 
        polohy = [polohy, krok+poloha-1]; % ulozeni polohy
        krok=polohy(end)+ref;
       if length(polohy)>=2 
           RR=polohy(end)-polohy(end-1); 
           RR1=RR*1.66;
       end          
       
  %%% Proběhne kontrola rekrakterni faze, pokud nepřijde QRS po refrakterni
  %%% fazi sníží se hodnota prahu
        if length(polohy)>=2
            if  krok==(polohy(end)+RR1)
                prah=0.5*prah;
                krok=polohy(end)+ref;
            end
        end
    end
    krok=krok+1;
end
end

function shluky = shlukovka(polohy)
mezery=50;
polohy2 = sort(cell2mat(polohy));
if length(polohy2)>=2
    vzdalenosti = pdist(polohy2'); 
    shlukovani = linkage(vzdalenosti); 
    shluk = cluster(shlukovani,'cutoff', mezery,'criterion','distance')'; % nastaveni shlukove analyzy
    [poradi,hodnota] = unique(shluk,'first'); 
    [~,poradi2] = sort(hodnota); 
    shluky = cell(1,length(poradi)); % ulozeni shluku
    for i = poradi
        shluky{i} = sort(polohy2(shluk==poradi2(i)));
    end
else
    shluky = {polohy2};
end
end

 
