function [ y] = IIRcasc( x, Bcasc, Acasc, zin )
%[y] = IIRCASC( x, Bcasc, Acasc, zin )
%IIRCASC vykoná filtráciu dát pomocou filtru daného čitateľom a menovateľom
%prenosu vo forme sekcií s daným počiatočným stavom filtru
% Vstupy:   x - vstupný signál filtru, môže byť viac vo forme matice, kde
%           jednotlivé signály odpovedajú riadkom
%           Bcasc - sekcie čitateľa prenosu
%           Acasc - sekcie menovateľa prenosu
%           zin - počiatočné podmienky pre diferenčnú rovnicu
% Výstup:   y - výstupný signál filtru          
%[1] https://www.dsprelated.com/freebooks/filters/State_Space_Realization.html
%[2] https://www.dsprelated.com/freebooks/filters/State_Space_Filters.html

assert(isnumeric(x)==1,'Vstupný signál musí pozostávať z číselných hodnôt');
assert(isnumeric(Bcasc)==1,'Čitateľ prenosu musí pozostávať z číselných hodnôt');

b = size(Bcasc,1);

if nargin<3
    Acasc = [zeros(b,1) ones(b,1)];
end
assert(isnumeric(Acasc)==1,'Menovateľ prenosu musí pozostávať z číselných hodnôt');

a = size(Acasc,1);

assert(a==b,'Počet sekcií čitateľa a menovateľa musí byť rovnaký');
assert(a==b,'Počet sekcií čitateľa a menovateľa musí byť rovnaký');

n = max(size(Acasc,2)-1,size(Bcasc,2)-1);

if nargin < 4
   zin = zeros(b,n); 
else
   ZIN = [];
   for i = 1:b
       z = zin(i,:);
       z(n) = 0;
       ZIN(i,:) = z;
   end
   zin = ZIN;
end

[K,N] = size(x);
yn = zeros(K,N);

for j = 1:K
    y = x(j,:);
    for i=1:b
        y = IIRfilt(y,Bcasc(i,:),Acasc(i,:),zin(i,:));
    end  
    yn(j,:) = y;
end

y = yn;

end

