function [ B,A,Bcasc,Acasc] = butterworthband(  Fs, F1, F2, F3, F4, G1, G2, G3, typ  )
%[B,A,Bcasc,Acasc] =BUTTERWORTHBAND(  Fs, F1, F2, F3, F4, G1, G2, G3, typ  )
%BUTTERWORTHBAND z daných parametrov amplitúdovej odozvy vytvorí čitateľ a menovateľ prenosu frekvenčne priepustného
%           filtru s možnosťou BANDPASS a BANDSTOP, pre LOWPASS a HIGHPASS
%           viď BUTTERWORTH. Návrh BANDSTOP nie je vhodný (autor nedokázal nájsť lepší spôsob)
%Vstupy:    Fs - vzorkovacia frekvencia v Hertzoch
%           F1, F2, F3, F4 - prechodné frekvencie v Hertzoch, ich význam sa
%           mení v závislosti na type filtru
%           G1, G2, G3 - amplitúdové prenosy na hraniciach prechodných oblastí (v záporných decibeloch) 
%           typ - 'pass'/'stop' na rozlíšenie návrhu bandpassu a bandstopu
%Výstupy    A - vektor koeficientov menovateľa prenosu
%           B - vektor koeficientov čitateľa prenosu
%           Acasc - jednotlivé sekcie menovateľa prenosu
%           Bcasc - jednotlivé sekcie čitateľa prenosu

% POZOR! bandstop nefunguje ideálne, veľké chyby pre vysokých stupňoch,
% treba použiť dve filtrácie zvlášť a sčítať ich

% PREČO: nenašiel som dostupný zdroj, ktorý by spomínal návrh pólov a núl
% pre analógove ekvivalenty, keďže analógové filtre nie sú súčasťou práce,
% viac som sa tým nezaoberal
% spravil som to čisto ako sčítanie dvoch sekcií (paralelné spojenie
% filtrov - stop) a násobenie dvoch sekcnií(paralelné spojenie
% filtrov - pass)

switch typ
    
    case 'pass'
        fstop1 = F1;
        fpass1 = F2;
        fpass2 = F3;
        fstop2 = F4;
        Gs1 = G1;
        Gp = G2;
        Gs2 = G3;
        
        [B1,A1,Bcasc1,Acasc1] = butterworth( Fs, fpass1, fstop1, Gp, Gs1 ,'high');
        [B2,A2,Bcasc2,Acasc2] = butterworth( Fs, fpass2, fstop2, Gp, Gs2 ,'low');
        
        B = convolution(B1,B2);
        A = convolution(A1,A2);
        Bcasc = [Bcasc1; Bcasc2];
        Acasc = [Acasc1; Acasc2];
        
    case 'stop'             %nefunguje ideálne, veľké chyby pre vysokých stupňoch, treba použiť dve filtrácie zvlášť a sčítať ich!
        fpass1 = F1;
        fstop1 = F2;
        fstop2 = F3;
        fpass2 = F4;
        Gp1 = G1;
        Gs = G2;
        Gp2 = G3;
        

        [B1,A1,~,Acasc1] = butterworth( Fs, fpass1, fstop1, Gp1, Gs ,'low','even');
        [B2,A2,~,Acasc2] = butterworth( Fs, fpass2, fstop2, Gp2, Gs ,'high','even');
        
        
        
        A = convolution(A1,A2); %násobenie menovateľov (sčítame dva zlomky)
        B = convolution(B1,A2)+convolution(B2,A1); %krížové násobenie menovateľ-čitateľ a ich sčítanie
        Acasc = [Acasc1; Acasc2];
        
        
        zeroes = roots(B);
        usflzero = [];
        singlezero = [];
        
        for i = 1:length(zeroes)
           if imag(zeroes(i))>0
              usflzero(end+1)=zeroes(i); 
           end
           if imag(zeroes(i))==0
              singlezero = zeroes(i); 
           end
        end
        
        [ ~,~,~, Bcasc] = gettf( [], usflzero);
        if size(singlezero) ~= 0
           Bcasc(end+1,:) = [0 1 -singlezero]; 
        end
        
        for i = 1:size(Acasc,1) %normalizácia priepustnej oblasti (passband)
            K = sum(Bcasc(i,:))/sum(Acasc(i,:));
            Bcasc(i,:) = Bcasc(i,:)./K;
        end
    otherwise
        assert(1==0,'Neplatná voľba typu filtru');
end

end

