Is subtraction a common method for efficient filtering?

I've recently been doing some DSP programming with regard to filter banks. One topic that I've come across was that of the dyadic filter bank. This filter bank essentially breaks a signal into sub-band signals corresponding to some octave.

Looking at some diagrams, I notice that many of them illustrate implementing both a highpass filter and low pass filter. This will essentially generate two sub-band signals. Conceptually, this makes sense.

However, it seems rather inefficient to implement two separate filters. Would it not be more efficient to implement a single filter, and then subtract the output from the original signal to determine the other signal?

In other words, implement just the low pass filter to obtain the lower subband signal. Then simply subtract that lower subband signal from the inputted signal. This should yield the higher band signal.

So my question:

• Is this technique common?
• Furthermore, would it be vulnerable to phase distortion in the sense that your low pass filter may have phase distorted or lagged the lower band signal?
• when the need is for a complementary filter, yes, subtracting the LPF output from the original input results in a HPF. and the output of the LPF and the derived HPF adds to a "wire". it's just that the HPF filter might otherwise not be the best HPF, from a point-of-view of selectivity. – robert bristow-johnson Oct 27 '16 at 2:43

You are right about the importance of the phase.

Subtraction in the time domain is equivalent to subtraction in the frequency domain. If the frequency domain phase at some frequency is not equal between the complex number being subtracted and the complex number subtracting, even if their magnitudes are the same, the result will be non-zero: Figure 1. Subtraction of complex numbers of equal magnitude does not always result in a zero. The calculation is black = red - blue.

If the black dot represents the combined frequency response for a system output = input - filtered input at a frequency that you intend to be part of a stop band, you must ensure that the filter is zero-phase. Or if the filter is linear-phase and has in its impulse response a center of symmetry at some time, you must delay the copy of the input by the same amount of time before subtraction. This will not work with efficient infinite impulse response (IIR) filters because of their non-linear phase.

• Excellent information. Assuming my filter is linear phase, I just need to account for the constant group delay before doing the subtraction. Thank you! – Izzo Oct 27 '16 at 14:58

However, it seems rather inefficient to implement two separate filters. Would it not be more efficient to implement a single filter, and then subtract the output from the original signal to determine the other signal?

That is in fact a very common technique, and as Olli pointed out it can only work if you make sure that the HPF (LPF) version is subtracted from the original signal only after incorporating the filter's group delay into the original signal's path to form a LPF (HPF).

orig -->LPF-->(·-1)-> (+) --->
|                 ^
|                 |
-----> Delay -----/

If you think about this, assume that the LPF in this scheme is exactly a half-band filter, and thus, the resulting HPF is a HB, too, only that it let's through the "other half" of the spectrum.

Nyquist says that you're now necessarily oversampling the output by 2 - the signal is now contained in only one half of the available spectrum. Hence, you "can" now drop half of the samples, without incurring aliasing (let's act as if transition widths don't exist, for the moment). Dropping half of the samples is typically denoted by ↓2.

orig -->LPF-->(·-1)-> (+) -> ↓2 -->
|                 ^
|                 |
-----> Delay -----/

Hm, that looks like we're doing the dropping too late. No use adding samples if we're going to ignore them later on. Hence, above is identical to:

orig -->LPF-->(·-1)-> ↓2 ->(+) -->
|                      ^
|                      |
-----> Delay --> ↓2----/

which is identical to:

orig -->LPF-> ↓2 -> (·-1)->(+) -->
|                      ^
|                      |
-----> ↓2 --> Delay----/

Now, your LPF is a FIR filter.

Without wanting to explain all of Polyphase filters, you can, without any problem, take a filter with N taps, and decompose it into to tap vectors, one containing the 0., 2., 4., (even) … and the other one containing the 1., 3., … (odd) taps, and just feed every other even sample into the first, and every odd sample into the second sub-filter and add up the result. If you think about this, you can now "pull in" the ↓2 over the point where you add these filters' outputs, and it becomes clear that you then save a lot of computation.

What does this have to do with your question? If you spin this thought further, you can decompose any (sufficiently long) filter into a number $L$ of sub-filters. If you then "rotate" each subfilter by an $e^{l\frac{j2\pi}{L} n }$ with $l$ denoting the $l$th subfilter, and $n$ being a sample counter, you end you end up with something that takes one very sharp filter, and replicates it $L$ times, each time shifted by $\frac1L$ of the overall bandwidth, and gives you $L$ streams of samples, each containing one bank's output of this so-called Polyphase Analysis Filterbank, without you paying the computational cost of $L$ very sharp bandpass filters.

So, if you need to take one filter, and generate identical, yet frequency-shifted bandpass filters in a bank of filters whose sum should be the original signal: use these. They are awesome!

• I have been doing quite a bit of studying regarding the polyphase realization of anti-alias filters, and plan to implement them in my dyadic filter bank. I was able to sit down and look at the efficiency of them lowering the number of MAC/timestep, and they truly are awesome! – Izzo Oct 27 '16 at 15:03