function [signalPoFiltraciiVlnka, signalPoFiltraciiWiener, vyvojSNRVlnka, vyvojSNRWiener, hodnotySNRWiener] = WienerovskyFilterSOdhadomSNR(vstupnySignal,DWT1,DWT2,Fvz, pocetFiltrovanychPasiem)
% WienerovskyFilter - funkcia predstavuje wienerovsky filter vyuzivajuci metodu pilotneho odhadu (funkcia VlnkovyFilter) pre vysledny odhad SNR
% vystup z pilotneho odhadu spolu s rozlozenym signalom druhou vlnkovou transformaciou je pouzity na vypocet korekcneho faktoru 
% a upravou korekcnym faktorom cez spatnou vlnkovu transformaciu ziskany uzitocny signal a nasledne odhad SNR
% Syntax: [signalPoFiltraciiVlnka, signalPoFiltraciiWiener, vyvojSNRVlnka, vyvojSNRWiener, hodnotySNRWiener] = WienerovskyFilter(vstupnySignal,DWT1,DWT2,Fvz, pocetFiltrovanychPasiem)
% Vstupy:
    % vstupnySignal - vstupny signal, na ktory je aplikovana filtracia vlnkovym filtrom
    % DWT1 - stupen rozkladu ako vstup 1. vlnkovej transformacie (funkcia swt)
    % DWT2 - stupen rozkladu ako vstup 2. vlnkovej transformacie (funkcia swt)
    % Fvz - vzorkovacia frekvencia signalu
    % pocetFiltrovanychPasiem - pocet pasiem, na ktore je aplikovane hybridne prahovanie a korekcny faktor
% Vystupy:
    % signalPoFiltraciiVlnka - signal po filtracii Vlnkovym filtrom
    % signalPoFiltraciiWiener - signal po filtracii Wienerovskym filtrom
    % vyvojSNRVlnka - vyvoj hodnot SNR (vypocitanych zo signalu po pouziti Vlnkoveho filtru)
    % VyvojSNRWiener - vyvoj hodnot SNR (vypocitanych zo signalu po pouziti Wienerovskeho filtru)
    % hodnotySNRWiener - konkretne vypocitane hodnoty SNR pre statisticke spracovanie
% Autor: Martina Babicova
    vykreslenie = 0;
    % filtracia nizkofrekvencnych zloziek s vyuzitim EMD
    [signalPoFiltraciiSEMD]= EMDFiltracia(vstupnySignal);
    % filtracia Vlnkovy filter
    % signalPoFiltraciiVlnka je pilotny odhad uzitocneho signalu
    [signalPoFiltraciiVlnka, RuseniePoFiltraciiVlnka, signalPoPrahovaniVlnka] = VlnkovyFilter(signalPoFiltraciiSEMD,DWT1,Fvz,pocetFiltrovanychPasiem);
    stupenDekompozicie = DWT2;
    % Predlzenie signalu
    [signalPoFiltraciiSEMD, zvysok1]= PredlzenieSignalu(signalPoFiltraciiSEMD,stupenDekompozicie);
    % 2.vlnkova transformacia
    SWT2 = swt(signalPoFiltraciiSEMD,stupenDekompozicie, 'bior1.5');
    [ISWT1, zvysok2]= PredlzenieSignalu(signalPoFiltraciiVlnka,stupenDekompozicie);
    SWT2PilotnyOdhad = swt(ISWT1,stupenDekompozicie,'bior1.5');
    % Deklaracia premennych
    rozptyl_sumu = zeros(stupenDekompozicie+1,floor(((length(signalPoFiltraciiSEMD)))/Fvz));
    korekcnyFaktor = zeros(stupenDekompozicie,length(signalPoFiltraciiSEMD));
    signalPoUpraveWienerFiltrom = zeros(stupenDekompozicie+1,length(signalPoFiltraciiSEMD));
    % hlavny vypocet wienerovskeho filtru - nasobenie korekcnym faktorom filtrovane pasma
    for i = 1: pocetFiltrovanychPasiem
        for j = 1:Fvz:length(vstupnySignal(1,:))
            rozptyl_sumu(i,(((j-1)/Fvz)+1)) = (median(abs(SWT2(i,j:j+(Fvz - 1)))-median(SWT2(i,:))))./0.6745;
            for k = j:(j + Fvz - 1)
                korekcnyFaktor(i,k) = ((SWT2PilotnyOdhad(i,k).^2)/((SWT2PilotnyOdhad(i,k).^2+ (rozptyl_sumu(i,(((j-1)/Fvz)+1))).^2)));
                signalPoUpraveWienerFiltrom(i,k) = SWT2PilotnyOdhad(i,k)*korekcnyFaktor(i,k);
            end
        end
    end
    for pasmaBezFiltracie = pocetFiltrovanychPasiem+1:(stupenDekompozicie + 1)
    signalPoUpraveWienerFiltrom(pasmaBezFiltracie,:) = SWT2PilotnyOdhad(pasmaBezFiltracie,:);
    end
    signalPoFiltraciiWiener = iswt(signalPoUpraveWienerFiltrom, 'bior1.5');
    signalPoFiltraciiWiener = signalPoFiltraciiWiener(1,1:end-zvysok2);
    signalPoFiltraciiSEMD = signalPoFiltraciiSEMD(1,1:end-zvysok1);
    RuseniePoFiltraciiWiener = signalPoFiltraciiSEMD - signalPoFiltraciiWiener;
    
    % vyvoj hodnoty SNR pre Vlnkovy Filter
    hodnotySNRVlnka = [];
    % prechadzaj v cykle s krokom dlzkaOkna vzorky uzitocneho signalu a sumu a
    % vypocitaj z nich SNR pomocou funkcie VypocetSNR
    indexacia = 0;      % premenna potrebna pre indexaciu, potreba brat napr. pri dlzkaOkna = 250 : 1 až 250 vzorkov, 251 až 500 vzorkov, atd.
    aktualneOkno = 1;   % zacni na prvom okne
    dlzkaOkna = Fvz;
    % vypocet SNR v plavajucom okne: t = 1, 251, 501, 751... ak je Fvz = 250
    for t = 1:dlzkaOkna:length(signalPoFiltraciiVlnka)-Fvz
        hodnotySNRVlnka = [hodnotySNRVlnka, VypocetSNR(signalPoFiltraciiVlnka(1, indexacia+1:aktualneOkno*dlzkaOkna), RuseniePoFiltraciiVlnka(1, indexacia+1:aktualneOkno*dlzkaOkna))];
        indexacia = indexacia+dlzkaOkna;
        aktualneOkno = aktualneOkno + 1;
    end
    % median z 5 vzorkov, 1. median pre 1-5 vzoriek, 2.median pre 6-10 vzoriek atd.
    vyvojSNRVlnka = VyvojSNR(hodnotySNRVlnka,Fvz, 5);
    
    % vyvoj hodnot SNR pre Wienervsky filter
    hodnotySNRWiener = [];
    indexacia = 0;
    aktualneOkno = 1;
    dlzkaOkna = Fvz;
    % vypocet SNR v plavajucom okne: t = 1, 501, 1001,... ak je Fvz = window = 500
    for t = 1:dlzkaOkna:length(signalPoFiltraciiWiener)-Fvz
        hodnotySNRWiener = [hodnotySNRWiener, VypocetSNR(signalPoFiltraciiWiener(1, indexacia+1:aktualneOkno*dlzkaOkna), RuseniePoFiltraciiWiener(1, indexacia+1:aktualneOkno*dlzkaOkna))];
        indexacia = indexacia+dlzkaOkna;
        aktualneOkno = aktualneOkno + 1;
    end
    % median z 5 vzorkov, 1. median pre 1-5 vzoriek, 2.median pre 6-10 vzoriek atd.
    vyvojSNRWiener = VyvojSNR(hodnotySNRWiener,Fvz, 5);
    if vykreslenie == 1
        figure();
        subplot 311; plot(signalPoFiltraciiSEMD);hold on; plot(signalPoFiltraciiVlnka);
        subplot 312;plot(signalPoFiltraciiSEMD);hold on; plot(signalPoFiltraciiWiener);
        subplot 313;plot(vyvojSNRVlnka);hold on; plot(vyvojSNRWiener)
    end
end