function [QRS etime] = banka_filtru_global(signaly)
%%%VEVERKA VOJTĚCH,2015
stime=tic;
 global QRS
 fvz=500;
 svodu = size(signaly,1);
 
k = fvz/5;   %ošetření začátku a konce
for i=1:svodu  
signal=signaly(i,:);
zacatek(1:k) = signal(1);
konec(1:k) = signal(end);
signal = [zacatek signal konec];
signals(i,:)=signal;
end


for i=1:svodu  
xx=signals(i,:);
% návrh filtru
N = 251;         %délka impulzní charakteristiky
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, xx );
y(2,:) = filter( pp2, 1, xx );
y(3,:) = filter( pp3, 1, xx );
y(4,:) = filter( pp4, 1, xx );

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


for k=1:4
poloha=detekuj(um(k,:));
polohy(1,k) = {poloha};
end
    QRS = [];
    shluky = shlukovka(polohy);
    for m = 1:length(shluky)
        if length(shluky{1,m})>2
           QRS = [QRS median(shluky{1,m})];
        end
    end
    polohyfin{1,i}=QRS;
end
QRS = [];
shluky = shlukovka(polohyfin);
    for v = 1:length(shluky)
        if length(shluky{1,v})>svodu/2
           QRS = [QRS median(shluky{1,v})];
        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

 
