%% minsign.m 
% Nalezeni minim v signalu

function [polohy_min_kor, hodnoty_min_kor, count_min_kor] = minsign( prutok )

N = length(prutok); % Delka promenne prutok
polohy_min=[]; % Vektor pro ukladani poloh minim [x]
hodnoty_min=[]; % Vektor pro ukladana hodnot minim [y]
count_min = 0; % Promenna pro pocet detekovanych minim
index=1; % Pomocna promenna
poloha_x = 2; % Pocatecni pozice pro ukladani polohy minima

while index<N % Dokud je index mensi nez delka vektoru ...
    k=index+1; % ... Zvyseni hodnoty pomocneho parametru
    if prutok(index) < -0.1 % Pokud je hodnota prvku mensi nez nula ...
        min_hodnota=prutok(index); % ... uloz hodnotu prvku jako minimum
        while prutok(k)< 0 % Dokud jsou prvky vektoru mensi nez nula:
            if prutok(k)<=min_hodnota % Pokud je prvek mensi nez minimum ...
                min_hodnota = prutok(k); % ... uloz hodnotu prvku jako nove minimum ...
                poloha_x=k; % ... uloz take polohu minima
            end
            if k<N % Pokud je pomocna promenna mensi nez delka vektoru ...
                k=k+1; % ... zvys hodnotu o 1
            else
                break % Jinak ukonci cyklus
            end;
        end
              polohy_min = [polohy_min, poloha_x]; % Ulozeni polohy minima do vektoru
              hodnoty_min = [hodnoty_min, min_hodnota]; % Ulozeni hodnoty minima do vektoru
              count_min = count_min+1; % Zvys o 1 pocet detekovanych minim
    end
    index=k; % zvyseni hodnoty index na hodnotu k
end

polohy_nul = zeros(1,count_min-1); % Vektor pruchodu nulou

% Odstraneni falesnych zakmitu (minim)
for i=1:count_min-1 % Pro detekovana minima
    for j=1:20 % Pro 20 nasledujicich prvku u kazdeho minima
        pruchod_nul = prutok(polohy_min(i)) * prutok(polohy_min(i)+j); % Otestuj, zda je pritomen nulovy bod
        if pruchod_nul < 0 % Pokud ano (hodnota mensi nez nula) ...
            polohy_nul(i)=1; % Oznac pozici minima
        end
    end
end

polohy_min_kor = polohy_min(polohy_nul ~= 1); % Polohy novych minim, ktera nejsou v blizkosti nuloveho bodu
hodnoty_min_kor = hodnoty_min(polohy_nul ~= 1); % Hodnoty techto novych minim
count_min_kor = length(polohy_min_kor); % Novy celkovy pocet minim


