function [signalFF, outputDataKOR, QRS_new] = vyberCyklu(signal, RR, QRS, fvz, pol_seg)
%% Funkce kontroly okolí QRS komplexu a výběru segmentu
%   pokud hrozí, že okno by mělo být větší než kolik prvků máme k
%   dispozici pak tato funkce to vyřeší tak, že vezme hodnoty které má k
%   dispozici a zbytek doplní průměrnými hodnotami z okolí.
%   Jinak klasicky vybere segment
%   Význam proměných:
%         signal.............10s záznam EKG
%         pol_seg_vzorky.........zadané intervaly v ms informující o poloviční delce kratšího segmentu
%         outputDataKOR..........matice o numel(QRS) řádcích vždy o 2*pol_seg_vzorky prvcích
%         signalFF...............signál pro korelace

signal = signal(:)'; %ujištění se o správné orietaci 
prumerny_RR_ms = mean(RR)*1000;     %chceme aby to bylo vyjádřeno v ms

nQRS = numel(QRS);
N = numel(signal);
t = N/fvz*1000;
    %% Výpočet délky jednotlivých intervalů pře a za detekovaným R na základě časových intervalu 
    polovina_segmentu = round((N*pol_seg)/t); %polovina segmentu ve vzorcích
    celkem = 2*polovina_segmentu + 1; %celková délka segmentu
    
    %% Určení délky delších segmentů
    prum_RR_vzorky = round((N*prumerny_RR_ms)/t);
    pQR_T_FF = round(prum_RR_vzorky/2);
    RSt_T_FF = round(prum_RR_vzorky/2);
    celkem_FF = RSt_T_FF + pQR_T_FF + 1;
    
    % Řešení pro malý počet QRS
    if celkem_FF>800
        pQR_T_FF = polovina_segmentu+100; %přidáváme 100 a 200 ms a to je poloviční počedt prvků
        RSt_T_FF = polovina_segmentu+200;
        celkem_FF = RSt_T_FF + pQR_T_FF + 1;
    end
        
%% Alokace paměti
    signalFF = zeros(1,celkem_FF);
    outputDataKOR = zeros(1,celkem);
    QRS_new = zeros(1,nQRS);
%% Výběr okna
% Zde řešíme dva problémy a to nedostatek prvků na začátku signálu a
% nedostatek prvků na konci signálu, prvně musíme najít problémové části a
% to jsou první a poslední pozice QRS(řešeno switch) a poté řešíme zda tam
% je problém s nedostatkem prvků(řeší if). Pokud ano, zbytek je doplněn
% prumernými hodnotami aby měli signály stejnou délku
    for i = 1:nQRS % tvorba pro doplnění hodnot
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        if numel(1:QRS(i))<=polovina_segmentu
            prumer_zacatek = mean(signal(QRS(i)-numel(1:QRS(i)+1):QRS(i)-numel(1:QRS(i)+20)));%prvních 20 hodnot, prumer z nich
        else
            prumer_zacatek = mean(signal(QRS(i)-polovina_segmentu:QRS(i)-polovina_segmentu+20));
        end
        
        if numel(signal(QRS(i):end))<=polovina_segmentu %pokud za QRS nemáme dostatečný počet prvků
            prumer_konec = mean(signal(QRS(i)+numel(signal(QRS(i):end-20)):QRS(i)+numel(signal(QRS(i):end-1))));
        else 
            prumer_konec = mean(signal(QRS(i)+polovina_segmentu-20:QRS(i)+polovina_segmentu)); %posledních 20 hodnot prumer z nich
        end
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        % A ZDE TO SAMÉ ALE PRO DELŠÍ SIGNÁLY %
        if numel(1:QRS(i))<=pQR_T_FF
            prumer_zacatek_FF = mean(signal(QRS(i)-numel(1:QRS(i))+1:(QRS(i)-numel(1:QRS(i)))+20));%prvních 20 hodnot, prumer z nich
        else
            prumer_zacatek_FF = mean(signal(QRS(i)-pQR_T_FF:QRS(i)-pQR_T_FF+20));  
        end
        
        if numel(signal(QRS(i):end))<=RSt_T_FF
            prumer_konec_FF = mean(signal(QRS(i)+ numel(signal(QRS(i):end-20)):QRS(i)+numel(signal(QRS(i):end-1))));
        else
            prumer_konec_FF = mean(signal(QRS(i)+RSt_T_FF-20:QRS(i)+RSt_T_FF)); %posledních 20 hodnot prumer z nich
        end
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        
%%%%%%%%%%%%%%% VYBÍRÁNÍ SEGMENTŮ PRO KRATŠÍ SIGNÁLY %%%%%%%%%%%%%%%%%%%%%%%
        switch i
            case {1,2}
                if QRS(i)<=polovina_segmentu
                  outputDataKOR(i,:) = [prumer_zacatek*ones(1,(celkem-numel(signal(1:QRS(i)+polovina_segmentu)))), signal(1:QRS(i)+polovina_segmentu)];
                  QRS_new(i) = QRS(i)+numel(randi([-30, 30],[1,(celkem-numel(signal(1:QRS(i)+polovina_segmentu)))]));
                else
                  outputDataKOR(i,:) = signal(QRS(i)-polovina_segmentu:QRS(i)+polovina_segmentu); 
                  QRS_new(i) = QRS(i)-numel(signal(1:(QRS(i)-polovina_segmentu)));
                end
            case {nQRS,nQRS-1}
                if (N-QRS(i))<=polovina_segmentu
                  pom = signal((QRS(i)-polovina_segmentu):end);
                  outputDataKOR(i,:) = [pom(:)', prumer_konec*ones(1,(celkem-numel(signal(QRS(i)-polovina_segmentu:end))))]; 
                  QRS_new(i) = QRS(i)-numel(signal(1 :(QRS(i)-polovina_segmentu)));
                else
                  outputDataKOR(i,:) = signal(QRS(i)-polovina_segmentu:QRS(i)+polovina_segmentu);
                  QRS_new(i) = QRS(i)-numel(signal(1 :(QRS(i)-polovina_segmentu)));
                end
            otherwise 
                  outputDataKOR(i,:) = signal(QRS(i)-polovina_segmentu:QRS(i)+polovina_segmentu);
                  QRS_new(i) = QRS(i)-numel(signal(1 :(QRS(i)-polovina_segmentu)));
        end
%%%%%%%%%%%%%%%%%%%%% VYBÍRÁNÍ KOMPLEXŮ PRO DELŠÍ SIGNÁLY %%%%%%%%%%%%%%%%%%%        
        switch i
            case {1,2}
                if QRS(i)<=pQR_T_FF
                  signalFF(i,:) = [prumer_zacatek_FF*ones(1,(celkem_FF-numel(signal(1:QRS(i)+RSt_T_FF)))), signal(1:QRS(i)+RSt_T_FF)];
                else
                  signalFF(i,:) = signal(QRS(i)-pQR_T_FF:QRS(i)+RSt_T_FF);
                end
            case {nQRS,nQRS-1}
                if (N-QRS(i))<=RSt_T_FF
                    pom = signal((QRS(i)-pQR_T_FF):end);
                  signalFF(i,:) = [pom(:)', prumer_konec_FF*ones(1,(celkem_FF-numel(signal(QRS(i)-pQR_T_FF:end))))]; 
                else
                  signalFF(i,:) = signal(QRS(i)-pQR_T_FF:QRS(i)+RSt_T_FF);
                end
            otherwise 
                  signalFF(i,:) = signal(QRS(i)-pQR_T_FF:QRS(i)+RSt_T_FF);
        end
        
    end

end

