function [signalPoFiltracii, rusenie, signalPoPrahovani] = VlnkovyFilter(vstupnySignal,stupenDekompozicie,Fvz, pocetFiltrovanychPasiem)
% VlnkovyFilter - funkcia predstavuje vlnkovy filter vyuzivajuci rozklad signalu vlnkovou transformaciou a hybridne prahovanie
% Syntax: [signalPoFiltracii, Rusenie, signalPoPrahovani] = VlnkovyFilter(vstupnySignal,stupenDekompozicie,Fvz, pocetFiltrovanychPasiem)
% Vstupy:
    % vstupnySignal - vstupny signal, na ktory je aplikovana filtracia vlnkovym filtrom
    % stupenDekompozicie - stupen rozkladu ako vstup vlnkovej transformacie (funkcia swt)
    % Fvz - vzorkovacia frekvencia signalu
    % pocetFiltrovanychPasiem - pocet pasiem, na ktore je aplikovane hybridne prahovanie
% Vystupy:
    % signalPoFiltracii - signal s odfiltrovanym nizkofrevencnym rusenim
    % rusenie - odfiltrovana zlozka rusenia (odcitanim uzitocnej od povodneho vstupneho signalu)
    % signalPoPrahovani - signal po aplikacii prahovania, len pre potreby vykreslenia
% Autor: Martina Babicova
    % predlzenie signalu pre swt
    [predlzenySignal, zvysok]= PredlzenieSignalu(vstupnySignal,stupenDekompozicie);
    typVlnky = 'bior1.5';
    % rozklad signalu vlnkovou transformaciou
    [signalPoRozkladeWT] = swt(predlzenySignal, stupenDekompozicie, typVlnky);
    dlzkaOkna = Fvz;
    empirickyPrah = zeros(pocetFiltrovanychPasiem,floor(((length(signalPoRozkladeWT)))/dlzkaOkna));
    smerodajnaOdchylka = zeros(pocetFiltrovanychPasiem,floor(((length(signalPoRozkladeWT)))/dlzkaOkna));
    signalPoPrahovani = zeros(stupenDekompozicie+1,length(signalPoRozkladeWT));
    % cast prahovania - vlnkovy filter
    for pocetFiltrovanychPasiem = 1:pocetFiltrovanychPasiem
        for j = 1:dlzkaOkna:(length(signalPoRozkladeWT(pocetFiltrovanychPasiem,:)) - dlzkaOkna) % j = 1, 501, 751 pri dlzkaOkna = 500
            % zrataj smerodajnu odchylku
            smerodajnaOdchylka(pocetFiltrovanychPasiem,(((j-1)/dlzkaOkna)+1)) = (median(abs(signalPoRozkladeWT(pocetFiltrovanychPasiem,j:j+(dlzkaOkna-1)))-median(signalPoRozkladeWT(pocetFiltrovanychPasiem,:))))/0.6745;
            % zrataj empricky prah
            empirickyPrah(pocetFiltrovanychPasiem,(((j-1)/dlzkaOkna)+1)) = smerodajnaOdchylka(pocetFiltrovanychPasiem,(((j-1)/dlzkaOkna)+1)) .* 3; 
            prah = empirickyPrah(pocetFiltrovanychPasiem, (((j-1)/dlzkaOkna)+1));
             for k = j:(j + dlzkaOkna - 1) % iteracia v ramci okna 
                % porovnaj absolutnu hodnotu cisla v povodnom vektore na
                % pozicii k s empirickym prahom a ak je vascia pouzi
                % prahovanie a uloz do noveho vektora na poziciu k
                if abs(signalPoRozkladeWT(pocetFiltrovanychPasiem,k)) > prah
                    signalPoPrahovani(pocetFiltrovanychPasiem,k) = signalPoRozkladeWT(pocetFiltrovanychPasiem,k)- (prah^2/signalPoRozkladeWT(pocetFiltrovanychPasiem,k));                
                end
             end
        end
    end
    % nedotknute pasma
    for pasmaBezFitracie = pocetFiltrovanychPasiem+1:stupenDekompozicie+1
    signalPoPrahovani(pasmaBezFitracie,:) = signalPoRozkladeWT(pasmaBezFitracie,:);
    end

    signalPoFiltracii = iswt(signalPoPrahovani, typVlnky);
    signalPoFiltracii = signalPoFiltracii(1,1:end-zvysok); % odstranenie predlzenej casti kvoli rozkladu vlnkovou transformaciou
    rusenie = vstupnySignal- signalPoFiltracii;            % zisk rusenia odcitanim uzitocnej zlozky od vstupneho signalu
end