function [QRS etime]=umocneni_multi(signaly)
%%%VEVERKA VOJTĚCH, 2015
global QRS etime
stime=tic;
%%%PŘEDZPRACOVÁNÍ%%%
%nastavení filtru
fvz=500; %vzorkovací frekvence
N=251; %řád filtru
svodu = size(signaly,1);
k=fvz/5;

pp=fir1(N,[15 30]/(fvz));%natavení parametrů filtru
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

%filtrace pásmovou propusti
for i=1:svodu  
signal=signals(i,:);
yy(i,:) = filter( pp, 1, signal );
end

%eliminace zpoždění způsobeného zpožďovacími členy filtru FIR
delay = mean(grpdelay(pp));
for i=1:svodu  
pomzp=yy(i,:);
pomzp(1:delay) = [];
fin(i,:)=pomzp;
end

%umocnění a vyhlazení dolní propusti 
for i=1:svodu  
 yy=fin(i,:);
 yy=yy.^2;
dp=fir1( 100, 10/(fvz/2));
yy= filter (dp, 1, yy);
delay = mean(grpdelay(dp));
yy(1:delay) = [];
yy=yy(100:5025);
    um(i,:)=yy;
end



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