Converting a transfer function to cascade form.
function [bcas,acas,g]=tocas(b,a)
%TOCAS Convert direct-form transfer function to cascade of biquad sections
%
% [BCAS,ACAS,G] = TOCAS(B,A) converts the direct-form transfer function
% -1 -nb
% B(z) b(1) + b(2)z + .... + b(nb+1)z
% H(z) = ---- = ----------------------------
% -1 -na
% A(z) 1 + a(2)z + .... + a(na+1)z
%
% to the cascade form
% -1 -2 -1 -2
% (1 + b(12)z + b(12)z ) (1 + b(22)z + b(22)z )
% H(z) = G ----------------------- --------------------------- ...
% -1 -2 -1 -2
% (1 + a(12)z + a(12)z ) (1 + a(22)z + a(22)z )
%
% BCAS will be a matrix of the numerator coefficients,
% ACAS will be a matrix of the denominator coefficients,
% G will be the gain.
p=cplxpair(roots(a));
z=cplxpair(roots(b));
M=length(z);
k = find(b ~= 0);
ninf = k(1)-1; % Number of zeros at infinity (leading zeros in b)
N=length(p);
g=b(ninf+1)/a(1);
nsec = floor((max(M+ninf,N)+1)/2);
bcas=[ones(nsec,1) zeros(nsec,2)];
acas=[ones(nsec,1) zeros(nsec,2)];
for k=2:2:N
acas(k/2,:)=real(poly([p(k-1),p(k)]));
end
if (rem(N,2)==1)
acas((N+1)/2,1:2) = poly(p(N));
end
for k=2:2:M
bcas(k/2,:)=real(poly([z(k-1),z(k)]));
end
if (rem(M,2)==1)
bcas((M+1)/2,1:2) = poly(z(M));
end
k = floor((M+3)/2);
while (ninf >= 2)
bcas(k,:) = [0 0 1];
ninf = ninf - 2;
k = k + 1;
end;
if (ninf == 1)
if (rem(M,2) == 0)
bcas(k,:) = [0 1 0];
else
bcas((M+1)/2,:) = [0 poly(z(M))];
end
end