function [y] = IIRfrequency( x, freqs, fs, pars, typ)
%[y] = IIRFREQUENCY( x, freqs, fs, pars, typ, t )
%IIRFREQUENCY zo zvolených parametrov vytvorí frekvenčne priepustný filter
%s nekonečnou impulznou odozvou (vytvorí čitateľa a menovateľa prenosu) a
%vykoná filtráciu dát
% Vstupy:   x - vstupný signál filtru, môže byť viac vo forme matice, kde
%           jednotlivé signály odpovedajú riadkom
%           N - dĺžka základnej impulznej odozvy
%           freqs - vektor potrebných prechodových frekvencií
%           fs - vzorkovacia frekvencia
%           pars - vektor potrebných decibelových parametrov (kladné
%           hodnoty)
%           typ - charakter filtru
%               'low' - potrebné 2 parametre vo freqs a pars
%               'high' - potrebné 2 parametre vo freqs a pars
%               'bpass' - potrebné 4 parametre vo freqs a 3 v pars
%               'bstop' - potrebné 4 parametre vo freqs a 3 v pars
% Výstupy:  y - výstupný signál filtru

fs = fs(:); fs = fs(1);

assert(isnumeric(x)==1,'Vstupný signál musí pozostávať z číselných hodnôt');
assert(isnumeric(fs)==1 && fs>0 && real(fs)==fs,'Vzorkovacia frekvencia fs musí byť kladné reálne číslo');
if ~(isnumeric(freqs)==1 && sum(freqs > 0)==numel(freqs))
    assert(1==0,'Prechodové frekvencie freqs musia byť kladné reálne čísla');
end
freqs = real(freqs); freqs = freqs(:);
if ~(isnumeric(pars)==1 && sum(pars > 0)==numel(pars))
    assert(1==0,'Decibelové parametre pars musia byť kladné reálne čísla');
end
pars = real(pars); pars = pars(:);

%% TYP FILTRU

switch typ
    
    case 'low'
        try
            fpass = freqs(1);
            fstop = freqs(2);
            gp = -pars(1);
            gs = -pars(2);
        catch
            error('Nevyhovujúci počet prechodových frekvencií a parametrov');
        end
        [~,~,Bcasc,Acasc] = butterworth( fs, fpass, fstop, gp, gs, 'low');
        y = IIRzerophase(x,Bcasc,Acasc);
    case 'high'
        try
            fpass = freqs(1);
            fstop = freqs(2);
            gp = -pars(1);
            gs = -pars(2);
        catch
            error('Nevyhovujúci počet prechodových frekvencií a parametrov');
        end
        [~,~,Bcasc,Acasc] = butterworth( fs, fpass, fstop, gp, gs, 'high');
        y = IIRzerophase(x,Bcasc,Acasc);
        
    case 'bpass'
        try
            fstop1 = freqs(1);
            fpass1 = freqs(2);
            fpass2 = freqs(3);
            fstop2 = freqs(4);
            Gs1 = -pars(1);
            Gp = -pars(2);
            Gs2 = -pars(3);
        catch
            error('Nevyhovujúci počet prechodových frekvencií');
        end
        [~,~,Bcasc,Acasc] = butterworthband(fs, fstop1, fpass1, fpass2, fstop2, Gs1, Gp, Gs2, 'pass');
        y = IIRzerophase(x,Bcasc,Acasc);
    case 'bstop'
        try
            fpass1 = freqs(1);
            fstop1 = freqs(2);
            fstop2 = freqs(3);
            fpass2 = freqs(4);
            Gp1 = -pars(1);
            Gs = -pars(2);
            Gp2 = -pars(3);
        catch
            error('Nevyhovujúci počet prechodových frekvencií');
        end
        [~,~,Bcasc1,Acasc1] = butterworth( fs, fpass1, fstop1, Gp1, Gs ,'low');
        [~,~,Bcasc2,Acasc2] = butterworth( fs, fpass2, fstop2, Gp2, Gs ,'high');
        y1 = IIRzerophase(x,Bcasc1,Acasc1);
        y2 = IIRzerophase(x,Bcasc2,Acasc2);
        y = y1 + y2;
    otherwise
        assert(1==0,'Neplatná voľba typu filtru');
end


end

