function [SNR, y, sumik, praveSNR] = WWF(zasumenec, dlzka, SNRp, cykly, t, Fvz, data, vykreslovat)
%Adaptívny vlnkový wienerovský filter
%posledná premenná vykreslovat určuje či chceme vykreslovať grafy = 1,
%alebo nechceme

stupenstw1 = 4;
vlnkastw1 = 'db4';
K = 3.5;

vlnkastw2 = 'sym4';
stupenstw2 = 3;

praveSNR = 1;
okno0 = Fvz*ones(1,length(zasumenec));

modulo = mod(length(zasumenec),32);
doplnok = 32-modulo;
pomocnik = fliplr(zasumenec(end-doplnok+1:end));
zasumenec = [zasumenec pomocnik];

okno1 = [okno0 fliplr(okno0(end-doplnok+1:end))];
oknoPol1 = ceil(max(okno1)/2);

WC = swt(zasumenec,stupenstw1,vlnkastw1);


%rozširenie signálov kvôli plávajúcemu oknu
for i = 1: size(WC,1)
    WC1(i,:) = [fliplr(WC(i,1:(oknoPol1-1))) WC(i,:) fliplr(WC(i,end-oknoPol1+1:end))];
end
    
%vytvorenie prahov
for i = 1:size(WC,1)
    for j = 1: size(WC,2)
        sigma(i,j) = median(abs(WC1(i,j:j+(okno1(j)-1))))/0.6745;
        prah(i,j) = sigma(i,j)*K;
    end
end

for i = 1:size(WC1,1)
    pevnyprah(i) = K*(median(abs(WC1(i,:)))/0.6745);
end

t=1:length(WC(1,:));
if vykreslovat == 1
    figure
    subplot(4,1,1)
    plot(t/Fvz,WC(1,:))
    hold on
    plot(t/Fvz,prah(1,:),'r')
    plot(t/Fvz,pevnyprah(1),'g')
    title('Ukážka prahovania, porovnanie pevného a adaptívneho prahu - 1.stupeň vlnkového rozkladu')
    xlabel('t [s]')
    ylabel('U [mV]')
    %legend('vlnkové koeficienty','adaptívny prah', 'pevný prah')
    subplot(4,1,2)
    plot(t/Fvz,WC(2,:))
    hold on
    plot(t/Fvz,prah(2,:),'r')
    plot(t/Fvz,pevnyprah(2),'g')
    title('Ukážka prahovania, porovnanie pevného a adaptívneho prahu - 2.stupeň vlnkového rozkladu')
    xlabel('t [s]')
    ylabel('U [mV]')
    %legend('vlnkové koeficienty','adaptívny prah', 'pevný prah')
    subplot(4,1,3)
    plot(t/Fvz,WC(3,:))
    hold on
    plot(t/Fvz,prah(3,:),'r')
    plot(t/Fvz,pevnyprah(3),'g')
    title('Ukážka prahovania, porovnanie pevného a adaptívneho prahu - 3.stupeň vlnkového rozkladu')
    xlabel('t [s]')
    ylabel('U [mV]')
    %legend('vlnkové koeficienty','adaptívny prah', 'pevný prah')
    subplot(4,1,4)
    plot(t/Fvz,WC(4,:))
    title('4.stupeň vlnkového rozkladu')
    xlabel('t [s]')
    ylabel('U [mV]')
end

%prahovanie
for j = 1:size(WC,1)-1
    for i = 1:size(WC,2)
        if abs(WC(j,i)) > prah(j,i)
            WC(j,i) = WC(j,i)- (prah(j,i)^2/WC(j,i));
        else
            WC(j,i) = 0;
        end
    end
end


if vykreslovat == 1
    figure
    subplot(4,1,1)
    plot(t/Fvz,WC(1,:))
    title('Vlnkové koeficienty po prahovaní - 1.stupeň vlnkového rozkladu')
    xlabel('t [s]')
    ylabel('U [mV]')
    subplot(4,1,2)
    plot(t/Fvz,WC(2,:))
    title('Vlnkové koeficienty po prahovaní - 2.stupeň vlnkového rozkladu')
    xlabel('t [s]')
    ylabel('U [mV]')
    subplot(4,1,3)
    plot(t/Fvz,WC(3,:))
    title('Vlnkové koeficienty po prahovaní - 3.stupeň vlnkového rozkladu')
    xlabel('t [s]')
    ylabel('U [mV]')
    subplot(4,1,4)
    plot(t/Fvz,WC(4,:))
    title('4.stupeň vlnkového rozkladu')
    xlabel('t [s]')
    ylabel('U [mV]')
end

s = iswt(WC,vlnkastw1);

if vykreslovat == 1
    figure
    subplot(5,1,1)
    plot(t/Fvz,zasumenec)
    title('Pôvodný signál')
    xlabel('t [s]')
    ylabel('U [mV]')
    subplot(5,1,2)
    plot(t/Fvz,s)
    title('Vyfiltrovaný signál po prvej vlnkovej transfromácií')
    xlabel('t [s]')
    ylabel('U [mV]')
end

sumos = zasumenec - s;

um = swt(zasumenec,stupenstw2,vlnkastw2);
ym = swt(s,stupenstw2,vlnkastw2);
sumos = swt(sumos,stupenstw2,vlnkastw2);

for i = 1: size(sumos,1)
    sumos1(i,:) = [fliplr(sumos(i,1:(oknoPol1-1))) sumos(i,:) fliplr(sumos(i,end-(oknoPol1-1):end))];
end

for j = 1:size(sumos,2)
    for i = 1: size(sumos1,1)
        sigma2(i,j) = median(abs(sumos1(i,j:j+(okno1(j)-1))))/0.6745;
    end
end

for i = 1:size(um,1)
    for j=1:size(um,2)
        gm(i,j) = um(i,j)^2/(um(i,j)^2 + sigma2(i,j)^2);
        lym(i,j) = ym(i,j)*gm(i,j);
    end
end

y = iswt(lym,vlnkastw2);

if vykreslovat == 1
    subplot(5,1,3)
    plot(t/Fvz,y)
    title('Vyfiltrovaný signál po druhej vlnkovej transfromácií')
    xlabel('t [s]')
    ylabel('U [mV]')
end

sumik = zasumenec - y;

if vykreslovat == 1
    subplot(5,1,4)
    plot(t/Fvz,sumik)
    title('Šum, ktorý sme odfiltrovali')
    xlabel('t [s]')
    ylabel('U [mV]')
end


y1 = [fliplr(y(1:(oknoPol1-1))) y fliplr(y(end-(oknoPol1-1):end))];
sumik1 = [fliplr(sumik(1:(oknoPol1-1))) sumik fliplr(sumik(end-(oknoPol1-1):end))];

%výpočet SNR
for i = 1:length(sumik)
    %sig = y1(i:i+(okno1(i)-1))-mean(y1(i:i+(okno1(i)-1)));
    SNR(i) = 10*log10((sum((y1(i:i+(okno1(i)-1))-mean(y1(i:i+(okno1(i)-1)))).^2))/(sum(sumik1(i:i+(okno1(i)-1)).^2)));     %str.39
end

SNR = SNR(1:end-length(pomocnik));
zasumenec = zasumenec(1:end-length(pomocnik));

SNR(1:oknoPol1) = SNR(oknoPol1+1);
SNR(end-oknoPol1:end) = SNR(end-oknoPol1-1);


t = 1:length(SNR);
if vykreslovat == 1
    subplot(5,1,5)
    plot(t/Fvz,SNR)
    title('Odhadnutý priebeh SNR')
    xlabel('t [s]')
    ylabel('SNR [dB]')
end

y = y(1:end-length(pomocnik));

sumik = sumik(1:end-length(pomocnik));


%porovnanie požadovaného a výsledného 
if data == 1
    praveSNR = zeros(1, sum(cykly)*dlzka);
    tm = 1;

    for i = 1:length(cykly)
        praveSNR(tm:(cykly(i)*dlzka)+tm-1) = SNRp(i);
        tm = cykly(i)*dlzka+tm;
    end
    
    if vykreslovat == 1
        figure
        plot(t/Fvz,praveSNR)
        title('Požadovaný priebeh SNR - modrý, Odhadnutý priebeh SNR - červený')
        xlabel('t [s]')
        ylabel('SNR [dB]')
        hold on
        plot(t/Fvz,SNR, 'r')
    end
end



