
%==================== PŘIZPŮSOBENÝ FILTR ====================

 function [t, A, C_p, B_p] = prizp_filtr(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
h_p = flipud(vlna);     % impulsní charakteristika grafoelementu převrácená v čase
y_p = [];


% __________ PŘIZPŮSOBENÝ FILTR __________

y_p = filter( h_p, 1, A );    
   

y_p = y_p(m:end);
y_p = y_p.^2;


%_______________ PRAHOVÁNÍ _______________

z_p = conv(vlna, h_p);      % výpočet konvoluce vlny a její impusní charakteristiky

p_p = prah*max(z_p);


if max(y_p) < p_p          % pokud neexistuje hodnota nad prahem, je vykreslen originální signál
    
    C_p = 0;
    B_p = 0;

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

    for j_p = 2:length(y_p)-1

        if y_p(j_p) > p_p,        % nalezena hodnota nad prahem
            [hodnota_p1, poloha_p1] = max(y_p(j_p));            % ukládá hodnotu
            [hodnota_p2, poloha_p2] = max(y_p(j_p+1));          % ukládá hodnotu za nadprahovou hodnotou
            [hodnota_p3, poloha_p3] = max(y_p(j_p-1));          % ukládá hodnotu před nadprahovou hodnotou
            hodnoty_p = [hodnoty_p,hodnota_p3 hodnota_p1 hodnota_p2];        % hodnoty korelačních koeficientů
            polohy_p = [polohy_p, j_p - 1 + poloha_p3 j_p - 1 + poloha_p1 j_p - 1 + poloha_p2];   % uloží polohu hodnoty nad prahem a poloh před a za ní
            j_p = j_p + 1;                                      % zvýší index o jedna
        else
            j_p = j_p + 1;
        end

    end

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

    zmena_p = [];
    
    for o_p = 2:(length(hodnoty_p))

        zmena_p(o_p) = hodnoty_p(o_p)-hodnoty_p(o_p-1);

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

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

        for q_p = 2:(length(zmena_p))

            if (sign(zmena_p(q_p))==(-1)) && (sign(zmena_p(q_p-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_p(q_p-1) = hodnoty_p(q_p-1);                    % přiřazuji hodnotu kor. koef., který je před změnou znaménka
                q_p = q_p + 1;
            else
                q_p = q_p + 1;
            end
            
        end
        
    end

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

    hodnoty_max_p = [];
    polohy_max_p = [];

    for r_p = 1:length(lok_max_p)

        if lok_max_p(r_p)>0             % lok_max obsahuje nuly a mezi nimi hodnoty lokálních maxim, vybírám jen maxima
            [hodnota_max_p, poloha_max_p] = max(lok_max_p(r_p));
            hodnoty_max_p = [hodnoty_max_p, hodnota_max_p];
            polohy_max_p = [polohy_max_p, r_p - 1 + poloha_max_p];  % uloží polohu hodnoty nad prahem
            r_p = r_p + 1;
        else
            r_p = r_p + 1;
        end

    end

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

    polohy_vlny_p = [];

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

        d_p(f_p) = polohy_max_p(f_p);
        polohy_vlny_p = polohy_p(d_p);     % 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_p = [];

    for v_p = 1:length(polohy_vlny_p)

        hod_p(v_p) = polohy_vlny_p(v_p);      % beru hodnotu, ve které grafoelement začíná

        if hod_p(v_p) >= (n-m+1)              % pokud by označená část byla delší než signál, pak beru jen do konce signálu  
            
            B1_p = A(hod_p(v_p):end);
            U = zeros(m-length(B1_p), 1);
            B1_p =  [B1_p; U];
        
        else
            
            B1_p = A(hod_p(v_p):hod_p(v_p)+m-1);      % a od ní vezmu dalších m-1 hodnot - délka grafoelementu
        
        end
        
        B_p = [B_p, B1_p];                % uložení do matice

    end

    % uložení poloh jendotlivých prvků, které mají být DETEKOVÁNY

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

    for w_p = 1:length(polohy_vlny_p)

        s_p(w_p) = polohy_vlny_p(w_p);
        C1_p = G(s_p(w_p):s_p(w_p)+m-1);
        C_p = [C_p; C1_p];

    end
    
end


