# Filter-banks: efficient splitting?

Started by February 8, 2005
```I'm trying to split an audio signal into various bands and perform
cross-correlation between bands over a stereo signal, so phase must be
linear.

To make filterbank I just defined X equal-width frequency bands,
generated FIR filters in matlab and filtered the signal X times
-v.slow unsurprisingly.

Now I'm quite sure this is a ludicrous way of doing things but what is
the correct method for what must be a routine task? X could be equal
to a power of two if that helps, i.e. 2 bands, 4, 8,16,32 etc.

Thanks,

Tom
```
```"Mr Pook" <curried_pook@yahoo.co.uk> wrote in message
> I'm trying to split an audio signal into various bands and perform
> cross-correlation between bands over a stereo signal, so phase must be
> linear.
>
> To make filterbank I just defined X equal-width frequency bands,
> generated FIR filters in matlab and filtered the signal X times
> -v.slow unsurprisingly.
>
> Now I'm quite sure this is a ludicrous way of doing things but what is
> the correct method for what must be a routine task? X could be equal
> to a power of two if that helps, i.e. 2 bands, 4, 8,16,32 etc.

It is often more efficient to filter using frequency domain multiplication -
particularly when the arrays are long.
You do an N-point multiplication rather than a time-domain convolution.
Just FFT each of those filters of yours (assuming they are FIR filters) and
go from there.

I'd not though about it before but perhaps there could be fewer
multiplications.
For example:
NOT something I'd recommend without some refinement, but a model for what
might be done....
Since your're going to be multiplying by zero over the same spans of
frequency time after time, then it seems redundant in some sense.
So, maybe you define filters that are so close to zero in the stop band
(away from the passband) that all you do is simply zero the array in those
regions and don't multiply at all.  A lot depends on what your processor can
do in one cycle.  Similarly, multiply in the passbands and out their skirts
some distance for a number of complex frequency samples 2*N/K-x where K is
the number of bands and x is some factor that goes beyond the band edges and
adjusts for the zeros you'll pack.

Someone will complain that this introduces temporal aliasing but that is a
matter of degree in the practical world.

Then, in order to do the cross correlation, you can complex multiply in the
frequency domain between the two bands.  But .... doesn't that result in all
zeros?

Fred

```
```The magic words you want to Google are:  polyphase DCT filter bank

--
Matt

```
```in article yEfOd.3411\$504.500893@news20.bellglobal.com, Matt Timmermans at
mt0000@sympatico.nospam-remove.ca wrote on 02/08/2005 22:42:

> The magic words you want to Google are:  polyphase DCT filter bank

here's another magic term: "halfband FIR filter".  (since efficiency is
something you're after.)
--

r b-j                  rbj@audioimagination.com

"Imagination is more important than knowledge."

```
```Mr Pook wrote:

> I'm trying to split an audio signal into various bands and perform
> cross-correlation between bands over a stereo signal, so phase must be
> linear.
>=20
> To make filterbank I just defined X equal-width frequency bands,
> generated FIR filters in matlab and filtered the signal X times
> -v.slow unsurprisingly.
>=20
> Now I'm quite sure this is a ludicrous way of doing things but what is
> the correct method for what must be a routine task? X could be equal
> to a power of two if that helps, i.e. 2 bands, 4, 8,16,32 etc.
>=20
> Thanks,
>=20
> Tom

Nothing wrong.

Take the center of the bands as an integer part (X) of the sample=20
frequency and use complex filters and decimate by that integer. Each=20
filter then moves the center frequency to baseband (0 Hz).
Nr computations needed: 2 * filter_length / decimation_factor

Ren=E9

```
```>Mr Pook wrote:
>
>> I'm trying to split an audio signal into various bands and perform
>> cross-correlation between bands over a stereo signal, so phase must be
>> linear.
>>=20
>> To make filterbank I just defined X equal-width frequency bands,
>> generated FIR filters in matlab and filtered the signal X times
>> -v.slow unsurprisingly.
>>=20
>> Now I'm quite sure this is a ludicrous way of doing things but what is
>> the correct method for what must be a routine task? X could be equal
>> to a power of two if that helps, i.e. 2 bands, 4, 8,16,32 etc.
>>=20
>> Thanks,
>>=20
>> Tom
>
>Nothing wrong.

A bit old but perhaps can be useful for future references..
Why not to use wavelet decomposition ? Will split the entire spectrum into
equal width frequency bands that can be furethr processed separately ...
wavelet discrete transform does it and each subsequent transform split the
input band into two equal band (halfband splitting). For instance, 8-level
DWT yields 256 (2^8) bands.

Alex

```