function [polohy_R,hodnoty_R] = R_detector(data)
%R_DETECTOR Detekce souřadnic špiček R vln

% data - ekg signál, který chceme analyzovat


casova_osa=data(:,1);
                      
for lead=2:4
signal = data; 
fvz = 500;                            % vzorkovaci frekvence
signal = signal(:,lead);         % vybereme svod

size_signal = size(signal);
if size_signal(1)>=size_signal(2)       
    signal=signal';                    % transformace signálu
end

%prodloužení signálu
signal_prodlouzeny = [(signal(1)).*ones(1,170), signal,(signal(end)).*ones(1,170) ];
l = length (signal);              % delka signalu
L = length (signal_prodlouzeny); 


% detektor vlny R
%--------------------------------------------------------------------------
% filtr typu PP pro QRS:

fmez=[11 21];       % mezni kmitocty pasmove propusti
fm=fvz/2;           % maximalni kmitocet, ktery vyhovuje vzorkovacimu teoremu
Wn=fmez/fm;         % normovany kmitocet 
N=121;              % rad filtru
b = fir1(N,Wn,'bandpass');  % nastaveni parametru filtru
y = filter( b, 1, signal_prodlouzeny);  % filtrace signálu

% umocneni na druhou:
yy = y.^2;   % umocneni vyfiltrovaneho signalu na druhou

% vyhlazeni umocneneho signalu filtrem typu DP:
fmez2=20;           % mezni kmitocet dolni propusti
fm=fvz/2;           % maximalni kmitocet, ktery vyhovuje vzorkovacimu teoremu
Wn2=fmez2/fm;       % normovany kmitocet 
N2=75;              % rad filtru
b2 = fir1(N2,Wn2,'low');    % nastaveni parametru filtru
Y = filter( b2, 1, yy );    % filtrace signalu

% detekovani maxim predzpracovaneho signalu (kmitu R) dle adaptivnich
% prahovych kriterii:
prah = max(Y(1:2*fvz))*0.4;  % nastavime pocatecni prah pro detekci R vlny - 40% maxima
index = 171;          % priprava indexu pro cyklus WHILE
polohy = [];        % sem budeme ukladat polohy detekovanych R vln
hodnoty = [];       % sem budeme ukladat hodnoty maxim detekovanych R vln
polohy_R = [];        % sem budeme ukladat polohy detekovanych R vln
hodnoty_R = [];       % sem budeme ukladat hodnoty maxim detekovanych R vln
delka_okna = 150;    % delka okna, ve kterem budeme vyhledavat maxima
zpozdeni_filtru=(((N-1)/2)+((N2-1)/2)); % zpozdeni filtru PP a HP

%  prohledavame signal a hledame hodnotu nad prahem 

while index<L-delka_okna-20
    if Y(index)>prah % jestlize najdeme hodnotu nad prahem    
        vyber = Y(index:index+delka_okna);    
        [hodnota,poloha] = max(vyber);      % vyhledavani maxima vybraneho kusu signalu
        hodnoty =[hodnoty hodnota];
        polohy =[polohy poloha];
        
        hodnota1 = max(signal_prodlouzeny((index+poloha-20-zpozdeni_filtru):(index+poloha+20-zpozdeni_filtru)));
        
        hodnoty_R = [hodnoty_R hodnota1];        % uloz hodnotu maxima
        
        %cyklus pro zpřesnění polohy
        for k=(index+poloha-20-zpozdeni_filtru):(index+poloha+20-zpozdeni_filtru)
            if signal_prodlouzeny(k)==hodnota1
                  poloha1=k;
                  break
            else
                poloha1=index+poloha;
            end
        end
        
        polohy_R = [polohy_R, poloha1];    % uloz polohu maxima
        
        index = index + delka_okna;         % zvys index o delku okna
                
        prah = median(hodnoty)*0.18;
    else % pokud nenajdes hodnotu nad prahem, tak zvys index o 1
        index = index + 1;        
    end    
end

polohy_R=polohy_R-170;


% uložení výsledků
if lead==2
    polohy_R_I=polohy_R;
    hodnoty_R_I=hodnoty_R;
elseif lead ==3
    polohy_R_III=polohy_R;
    hodnoty_R_III=hodnoty_R;
else
    polohy_R_II=polohy_R;
    hodnoty_R_II=hodnoty_R;
end

 end


polohy_R = struct('I',polohy_R_I,'II',polohy_R_II,'III',polohy_R_III);
hodnoty_R = struct('I',hodnoty_R_I,'II',hodnoty_R_II,'III',hodnoty_R_III);

end
