clear all;
close all;

fprintf('\n*******************************************************\n');
fprintf('*                                                     *\n');
fprintf('*      Algoritmus na odhalenie period funkcie         *\n');
fprintf('*                                                     *\n');
fprintf('*******************************************************\n');

% *** SETTNIGS *** 
cas=5*pi;        %kolko casu budeme vidiet funckiu

% *** zistime presnot a potrebny pocet vzoriek ***
pocet_vzoriek=100;
presnost=100;
rozkmit=1;
while (presnost>(0.0005*rozkmit))
    pocet_vzoriek=floor(pocet_vzoriek*1.05);
    vzorky=linspace(0,cas,pocet_vzoriek);
    % -- nasa funkcia --%
    %f=sin(vzorky);
    f=sin(vzorky)+cos(4*vzorky);
    %f=sin(2*vzorky)+cos(4*vzorky);
    %f=5*vzorky;
    presnost=0; %v podstate max rozdiel
    rozkmit=abs(max(f)-min(f));
    for i=1:pocet_vzoriek-1,
        tmp=abs(f(i)-f(i+1));
        if (tmp>presnost)
               presnost=tmp;
        end;
    end;
end;


pocet_vzoriek=0;
presnost=0;
f=(ones(100),zeros(100),ones(100),zeros(100));
rozkmit=1;



fprintf('Najvacsi rozdiel hodnot susednych vzoriek %.7f\n',presnost);
fprintf('Rozkmit funkcie %.2f\n',rozkmit);
fprintf('Pocet vzoriek %d\n',pocet_vzoriek);

presnost=(presnost*0.6);

suhlasi=0; %FALSE
for i=2:(pocet_vzoriek-1),
    if (suhlasi==0 && (abs(f(1)-f(i))<=presnost) && (i<floor(pocet_vzoriek/2)) && (i>pocet_vzoriek/400))
       zaciatok_dalsej=i;
       %fprintf('i = %d\n',i); %rovnake vzorky ako 1. vzorka
       kompenzacia_posunu=f(1)-f(i);
       %fprintf('rozdiel prvych vzoriek %.7f\n',kompenzacia_posunu);
       suhlasi=1; %TRUE
       for j=1:(i-1),
           rozdiel_vzoriek=f(1+j)-(f(i+j)+kompenzacia_posunu);
           kompenzacia_posunu=kompenzacia_posunu+(0.01*rozdiel_vzoriek);
           if (abs(rozdiel_vzoriek)>presnost && suhlasi==1)
                suhlasi=0; %FALSE
                %fprintf('failed porovnavanie susedov %d\n',(i+j));
                %fprintf('Rozdiel hodnoty vzoriek %.7f\n',rozdiel_vzoriek);
           end;
       end;
    end;
end;


g1=stem(f);
title('Cela funkcia');
set(g1, 'Marker', 'none');

if (suhlasi==1)

    
    %vykreslime 1 periodu
    pocet_vozriek_periody=zaciatok_dalsej-1;
    
    tmp=(pocet_vzoriek-(floor(pocet_vzoriek/pocet_vozriek_periody)*pocet_vozriek_periody))/pocet_vzoriek;
    if ( tmp <0.01)
        fprintf('-> Periodicka funkcia\n');
    else
        fprintf('-> Kvázy-periodicka funkcia\n');
    end;    
 
    prva_perioda=f(1:pocet_vozriek_periody); %hranicnu ratame do dalsej periody
    figure;
    g2=stem (prva_perioda); 
    set(g2, 'Marker', 'none');
    title ('Prva perioda');
    fprintf('Dlzka periody %.7f\n',cas/pocet_vzoriek*pocet_vozriek_periody);
    kompenzacia_posunu=f(1)-f(zaciatok_dalsej);
    default_kompenzacia_posunu=kompenzacia_posunu;
    perioda_no=0;
    pocet=0;
    for i=(zaciatok_dalsej):(pocet_vzoriek-1),
        if (mod(i,pocet_vozriek_periody)>0)
            rozdiel_vzoriek=f(mod(i,pocet_vozriek_periody))-f(i)+kompenzacia_posunu; %+kompenzacia_posunu
            kompenzacia_posunu=kompenzacia_posunu+(0.01*rozdiel_vzoriek);      
            perioda=floor(i/zaciatok_dalsej)+1;                 
            if (perioda_no<perioda) %ak sa zmeni perioda- vypiseme hlasku ze perioda zacina...
                rozdiel_vzoriek=default_kompenzacia_posunu;
                perioda_no=perioda;
                if (perioda_no==2)
                    fprintf('%d. perioda - vzorka 1 az %d\n',perioda_no-1,i-1);                    
                end;
                if (perioda_no>2)
                    fprintf(' az %d\n',i-1);
                end;
                fprintf('%d. perioda - vzorka %d',perioda_no,i);
            end;
        end;
    end;
else
    fprintf('-> Neperiodicka funkcia\n');
end;