Polyphase Filters

  • Author or source: C++ source code by Dave from Muon Software
  • Type: polyphase filters, used for up and down-sampling
  • Created: 2002-01-17 02:14:53
  • Linked files: BandLimit.cpp.
  • Linked files: BandLimit.h.


can someone give me a hint for a paper where this stuff is from?
  • Date: 2005-03-29 20:39:59
  • By: ABC
From there: http://www.cmsa.wmin.ac.uk/~artur/Poly.html

There is also this library, implementing the same filter, but optimised for down/upsampling and ported to SSE and 3DNow!:
There is an error in the 12th order, steep filter coefficients. Having checked the output against that produced by HIIR (see previous comment), i have identified the source of the error - the 4th b coefficient 0.06329609551399348, should be 0.6329609551399348.
  • Date: 2008-04-06 08:58:52
  • By: bla
you also need to delete the pointers inside the array

    for (int i=0;i<numfilters;i++)
            delete allpassfilter[i];

    delete[] allpassfilter;
some questions..  is it normal for these halfband filters to cause significant gain loss?  sonogram analysis shows a decrease in SNR if I have read the results correctly.

if using these filters for oversampling and I do this:

halfband filter
halfband filter
decimate (discard samples)

then presumably the second halfband filter does the antialiasing at half the new sampling rate?
Hello, I'm getting the high pass from the function by subtracting the 'oldout' variable.


But this does not make an ideal QMF, I'm getting pass-band aliasing, so I guessing the phase is off slightly between the low and high.
Is this the correct way of getting the high band?

Dave P
  • Date: 2010-01-21 19:31:46
  • By: bobby
Is the cutoff at 20kHz?  What sample rate are these coefficients for?  How would I calculate suitable coefficients for arbitrary sample rates?
It is worth noting that if these filters are being used for upsampling/downsampling, the "noble identity" can be used to reduce the CPU cost. The basic idea is that operations that can be expressed in the form:

filter that uses z^-N for its states -> downsample by N

can be rearranged to use the form

downsample by N -> filter that uses z^-1 for its states

The same property holds true for upsampling. See


for more details.

For the above code, this would entail creating an alternative allpass process function, that uses the z^-1 for its states, and then rearranging some of the operations.