
%==================== KORELAČNÍ ANALÝZA ====================

 function [t, A, C_k, B_k] = korelace(signal, fvz, vlna, prah)


%_______________ PARAMETRY _______________

A = signal;             % signál
n = length(A);          % délka signálu
tvz = 1/fvz;
t = [tvz:tvz:n*tvz];    % časová osa


m = length(vlna);       % délka úseku
kk = [];                % příprava vektoru pro ukládání korelačních koeficientů


%__________ KORELAČNÍ ANALÝZA __________

kk = [];                % příprava vektoru pro ukládání korelačních koeficientů

for i_k = 1:n-m+1
    
     kk_1 = corr(A(i_k:i_k+m-1), vlna);     % výpočet kor. koeficientu
     kk = [kk, kk_1];                       % uložení kor. koeficientu do vektoru
   
end

kk = abs(kk);   % abs. hodnota kor. koeficientů, aby byly detekovány i vlny opačné polarity

%_______________ PRAHOVÁNÍ _______________

p_k = prah;                 % nastavení prahu pro detekci 


if max(kk) < p_k            % pokud neexistuje hodnota nad prahem, jsou výstupy nulové
    
    C_k = 0;
    B_k = 0;
    
else                         % jinak program pokračuje dál

    polohy_kk = [];          % příprava vektoru pro ukládání poloh detekovaných vln
    hodnoty_kk = [];         % příprava vektoru pro ukládání hodnot detekovaných vln

    for j_k = 2:length(kk)-1

        if kk(j_k) > p_k,        % nalezena hodnota nad prahem
            [hodnota_kk1, poloha_kk1] = max(kk(j_k));            % ukládá hodnotu
            [hodnota_kk2, poloha_kk2] = max(kk(j_k+1));          % ukládá hodnotu za nadprahovou hodnotou
            [hodnota_kk3, poloha_kk3] = max(kk(j_k-1));          % ukládá hodnotu před nadprahovou hodnotou
            hodnoty_kk = [hodnoty_kk,hodnota_kk3 hodnota_kk1 hodnota_kk2];        % hodnoty korelačních koeficientů 
            polohy_kk = [polohy_kk, j_k - 1 + poloha_kk3 j_k - 1 + poloha_kk1 j_k - 1 + poloha_kk2];   % uloží polohu hodnoty nad prahem a poloh před a za ní
            j_k = j_k + 1;                                    % zvýší index o jedna
        else
            j_k = j_k + 1;
        end

    end

    %___ VÝPOČET DIFERENCE MEZI SOUSEDNÍMI PRVKY - NALEZENÍ LOKÁLNÍHO MAXIMA___

    zmena_k = [];
    
    for o_k = 2:(length(hodnoty_kk))

        zmena_k(o_k) = hodnoty_kk(o_k)-hodnoty_kk(o_k-1);

    end

    s_zmena = length(zmena_k);      % určení velikosti vektoru zmena_k

    if s_zmena == 0                 % pokud je vektor prázdný, znamená to 
                                            % že byla nalezena jediná hodnota nad prahem
        lok_max_k = max(kk);                % a je uložena jako lokální maximum
        
    else                                    % jinak hledám lokální maxima ve vektoru

        for q_k = 2:(length(zmena_k))

            if (sign(zmena_k(q_k))==(-1)) && (sign(zmena_k(q_k-1))==1)  % pokud nastane změna znaménka, je v zmena(q-1) lokální maximum, protože se za ní mění znaménko
                lok_max_k(q_k-1) = hodnoty_kk(q_k-1);                   % přiřazuji hodnotu kor. koef., který je před změnou znaménka
                q_k = q_k + 1;
            else                             
                q_k = q_k + 1;
            end

        end
        
    end

    %_______________ URČENÍ POLOH A HODNOT LOKÁLNÍCH MAXIM _______________

    hodnoty_max_k = [];
    polohy_max_k = [];

    for r_k = 1:length(lok_max_k)

        if lok_max_k(r_k) > 0             % lok_max obsahuje nuly a mezi nimi hodnoty lokálních maxim, vybírám jen maxima
            [hodnota_max_k, poloha_max_k] = max(lok_max_k(r_k));
            hodnoty_max_k = [hodnoty_max_k, hodnota_max_k];
            polohy_max_k = [polohy_max_k, r_k - 1 + poloha_max_k];  % uloží polohu hodnoty nad prahem
            r_k = r_k + 1;
        else
            r_k = r_k + 1;
        end

    end

    %_______________ URČENÍ ZAČÁTKU HLEDANÉHO GRAFOELEMENTU _______________

    polohy_vlny_k = [];

    for f_k = 1:length(polohy_max_k)        % poloha lokálního maxima nám určí začátek hledaného grafoelementu

        d_k(f_k) = polohy_max_k(f_k);
        polohy_vlny_k = polohy_kk(d_k);     % vektor poloh hledaných grafoelementů

    end


    %_______________ ULOŽENÍ HODNOT A POLOH VŠECH PRVKŮ VLN DO MATIC _______________


    % uložení hodnot jendotlivých prvků, které mají být detekovány

    B_k = [];

    for v_k = 1:length(polohy_vlny_k)

        hod_k(v_k) = polohy_vlny_k(v_k);      % beru hodnotu, ve které grafoelement začíná
        
        if hod_k(v_k) >= (n-m+1)              % pokud by označená část byla delší než signál, pak beru jen do konce signálu  
            
            B1_k = A(hod_k(v_k):end);
            U_k = zeros(m-length(B1_k), 1);
            B1_k =  [B1_k; U_k];
        
        else
            
            B1_k = A(hod_k(v_k):hod_k(v_k)+m-1);      % a od ní vezmu dalších m-1 hodnot - délka grafoelementu
        
        end
        
        B_k = [B_k, B1_k];                % uložení do matice

    end

    % uložení poloh jendotlivých prvků, které mají být detekovány

    G = [1:n];      % vektor poloh, ze ktrého vybíráme
    C_k = [];

    for w_k = 1:length(polohy_vlny_k)

        s_k(w_k) = polohy_vlny_k(w_k);
        C1_k = G(s_k(w_k):s_k(w_k)+m-1);
        C_k = [C_k; C1_k];

    end
 
end