function [y] = CONTIadaptBEZ(x,t)
%[y] = CONTIadaptBEZ(x,t)
%CONTIADAPTBEZ vykoná adaptívnu filtráciu bez modifikácie šumu
%Vstupy:    x - signál na filtrovanie
%           t - čas (potrebný pre interpolovanie)
%Výstup:    y - výsledok filtrácie

%Toto bol úplne prvý pokus o adaptívny filter, mal pár myšlienok naviac než
%je popísané v práci, ide iba o porovnanie s tým, že nerobí modifikáciu
%šumu (v zmysle popísanom v práci)

%% KROK 1: filtrácia na získanie odhadu derivácie

Nskip = 5; 
threshold = 0.02; 
gaussmin = 10;
gaussmax = 100;

y1 = gaussADAPT(x,t,Nskip,threshold,0.1,gaussmin,gaussmax); %použije sa na odhad derivácie
dy1 = diff(y1);

%% KROK 2: filtrácia pôvodného signálu s odhadom derivácie

Nskip = 1;
threshold = 0.03;
gaussmin = 5;
gaussmax = 100;

y2 = gaussADAPT(x,t,Nskip,threshold,0.2,gaussmin,gaussmax,1,dy1);
dy2 = diff(y2);

%% KROK 3: filtrácia nového odhadu derivácie

Nskip = 1;
threshold = 0.03;
gaussmin = 10;
gaussmax = 100;

tfordy2 = t(2:end);
dy2filt = gaussADAPT(dy2,tfordy2,Nskip,threshold,0.2,gaussmin,gaussmax,1); %zlepšenie odhadu derivácie

%% KROK 4: filtrácia pôvodného signálu s relatívne hladkým odhadom derivácie

Nskip = 1;
threshold = 0.05;
gaussmin = 4;
gaussmax = 100;
y4 = gaussADAPT(x,t,Nskip,threshold,0.1,gaussmin,gaussmax,1,dy2filt,7); %edgesupport + zlepšená derivácia

%% KROK 5: filtrácia nového signálu, ktorá "chráni" už iba lokálne extrémy a prudké zmeny (veľké derivácie - vysoký threshold)

Nskip = 1;
threshold = 0.3;
gaussmin = 2;
gaussmax = 30;

ymaybefinal = gaussADAPT(y4,t,Nskip,threshold,0.4,gaussmin,gaussmax,1,diff(y4),10); %zhľadzovanie stôp po interpolácii

%% KROK 6: záverečné prebehnutie gaussom s malým oknom na zahľadenie stôp po interpolácii

y = gauss(15,ymaybefinal); %posledné zľadenie

%% KROK 7: odhalenie chýb z výsledného šumu a ich korekcia

%v práci nie je popísané, zachytávajú sa body, ktoré majú výrazne veľkú
%chybu od pôvodnej zašumenej teploty

noise = y - x;
avg = sum(noise)/length(noise);
rozptyl = sqrt((1/length(noise))*sum((noise-avg).^2));

%bolo nutné stanoviť si nejakú kritickú hranicu, ktorá by odhaľovala veľké
%chyby, rozhodol som sa pre vzdialenosť od strednej hodnoty ako nejaký
%rozumný násobok rozptylu
konst = 4.5;
indexes1 = (noise>avg + konst*rozptyl);
indexes2 = (noise<avg - konst*rozptyl);
indexes = logical(indexes1+indexes2);   %prvky, ktoré presahujú kritickú hranicu

zaznamy = 1:length(noise);
zaznamy = zaznamy(indexes);             %prevedenie na indexy vo vektore
newzeroindexes = [];                    %indexy prvkov, ktoré sa rozhodnem
%nepovažovať za kritické
newoneindexes = [];                     %indexy prvkov, ktoré budem
%považovať za kritické a naviac za kritické označím aj ich blízkych susedov
range = 10;                             %rozsah do akej vzdialenosti budem
%považovať susedov za kritických

for i = 1:length(zaznamy)
    %pokiaľ pôvodne označený prvok za kritický nemá vo svojej blízkosti
    %žiadny ďalší kritický prvok, tak ho nechám tak a nebudem opravovať,
    %tým sa vyhnem tomu, aby som opravoval dobré oblasti iba kvôli tomu, že
    %v jednom bode došlo k malej odchylke
    a = isempty(find(zaznamy==zaznamy(i)-1, 1));
    b = isempty(find(zaznamy==zaznamy(i)+1, 1));
    c = isempty(find(zaznamy==zaznamy(i)-2, 1));
    d = isempty(find(zaznamy==zaznamy(i)+2, 1));
    
    
    
     if (a&&b&&c&&d)
        newzeroindexes(end+1) = zaznamy(i);
     else
        newoneindexes(end+1:end+2*range+1) = zaznamy(i)-range:zaznamy(i)+range;
     end
end

newzeroindexes = unique(newzeroindexes(logical((newzeroindexes>0) + (newzeroindexes<=length(x))))); %úprava,
%aby sme sa nachádzali v správnom intervale indexov
newoneindexes = unique(newoneindexes(logical((newoneindexes>0) + (newoneindexes<=length(x)))));
indexes(newzeroindexes) = 0;
indexes(newoneindexes) = 1;
criticpoints = x(indexes);          %body pôvodného signálu, ktoré si pýtaju slabšiu filtráciu

ymaybefinal(indexes) = criticpoints;    %posledný krok filtrácie vykonáme
%znova, ale s tým, že na kritických miestach použijeme hodnoty z pôvodného
%signálu
y = gauss(10,ymaybefinal);

end

