
function y=delparfilt(Bm,Am,FIR,x);

%DELPARFILT filtering by parallel second-order sections.
%   Y=DELPARFILT(Bm,Am,FIRcoeff,X) filters the signal X by the parallel
%   second-order sections given in the matrices Bm and Am. Additionally, X
%   is filtered by an FIR filter given by FIRcoeff, and this is also added
%   to the output. If there is no parallel FIR part (not even a simple
%   coefficient), then use FIRcoeff=0 as a parameter.
%
%   The Bm and Am matrices are containing the [b0 b1]' and [1 a0 a1]'
%   coefficients for the different sections in their columns. For example,
%   Bm(:,3) gives the [b0 b1]' parameters of the third second-order
%   section. 
%
%   An important difference from PARFILT is that if there is an FIR part,
%   then the IIR part is delayed so that there is no overlap between the two.
%   This leads to improved numerical properties.
%
%   The delayed parallel filter can be designed by the DELPARFILTDES command,
%   or converted from a normal parallel filter by PARF2DELPARF.
%
%   For the details, see:
%
%   Balazs Bank and Julius O. Smith, III, "A delayed parallel filter structure
%   with an FIR part having improved numerical properties", 136th AES
%   Convention, Preprint No. 9084, Berlin, April 2014.
%
%   http://www.mit.bme.hu/~bank/delparf
%
%   C. Balazs Bank, 2014.

NFIR=length(FIR);
if NFIR==1, % if the FIR coeff is zero then there is no FIR part
    if FIR==0,
        NFIR=0;
    end;
end;

y=zeros(size(x));
s=size(Am);
for k=1:s(2),
    y(NFIR+1:end)=y(NFIR+1:end)+filter(Bm(:,k),Am(:,k),x(1:end-NFIR));
end;
if NFIR>0,
y=y+filter(FIR,1,x);
end;
    

