# Total delay of cascade FIR filters

I have a doubt regarding the total delay in terms of taps for cascade filters.

Imagine that I have an SOS IIR Filter (2 delays) and an FIR filter of 10 taps (10 delays) and another of 20 taps (20 delays). The total delay of the group is 20 + 10 + 2=32 delays or is it the maximum of all of the as the sample does travel along the net.

I guess, if my rationale is not wrong, that the steady state response of the whole net is reached at the sum of all of them as you need to have stable output from first stage, then second stage and then third stage.

• In my opinion, the "total delay" of the cascade of a bunch of linear, time-invariant filters, whether they be IIR or FIR, is simply the sum of the delays of each filter in the series, however that delay is defined. Total Group Delay is the sum of the individual group delays of each filter. Total Phase Delay is the sum of the individual phase delays of each filter. If the IIR filters are designed to maximize the phase linearity and if the FIR filters are symmetric about the mid-sample of the FIR impulse response, this overall total delay will be roughly constant for most frequencies. Oct 5, 2023 at 17:26

The throughput, like Marcus said, is $$1$$, since for each input sample there’s an output sample (unless you’re doing block processing, which I’m assuming you’re not).

As far as group delay, it is the sum of the individual group delays for each filter (if they're LTI!)

Here's an example:

Matlab code to reproduce:

N1 = 10;
N2 = 20;
h1 = fir1(N1, 0.8); % FIR1
h2 = fir1(N2, 0.2); % FIR2
[b,a] = butter(4, [0.4, 0.6], 'bandpass'); % IIR

imp = [1, zeros(1, 500)]; % Impulse

% impulse response of the cascade
out = filter(h1, 1, imp);
out = filter(h2, 1, out);
out = filter(b, a, out);

% individual group delays
[g1, w] = grpdelay(h1,1);
g2 = grpdelay(h2,1);
g3 = grpdelay(b,a);

% group delay of the impulse response
gout_imp = grpdelay(out,1);

% sum of individual group delays
gout_sum = g1+g2+g3;

figure
hold on
plot(w/pi, g1)
plot(w/pi, g2)
plot(w/pi, g3)
plot(w/pi, gout_imp, 'linewidth', 2)
plot(w/pi, gout_sum, 'linewidth', 2, 'linestyle','--')
legend('FIR1', 'FIR2', 'IIR', 'cascade', 'sum of individual group delays')
grid on
ylim([0 35])
xlim([5e-3, 1])