mutliband-crossover IIR-design with allpass-sum?

DSP, Plugin and Host development discussion.
RELATED
PRODUCTS

Post

A Linkwitz/Riley crossover is a pair of a lowpass- and highpass-filter that is used to split a signal into low and high band like so:

Code: Select all

    
    --->high
    |
in--|
    |
    --->low
the special property of the Linkwitz/Riley design is, that when we add the lowpass and highpass signals back together, the sum of these outputs gives a signal with the same magnitudes in the frequency domain as the original signal - that is to say: the filter obtained from adding the low and high output is an allpass. using other designs for the lowpass and highpass branch (say Butterworth, Chebychev, whatever), we would see wiggles in the frequency-response of the sum-filter in the vicinity of the crossover frequency - not so in the Linkwitz/Riley design, and this is what makes this design so attractive for crossovers.

but what would i do when i need more then two bands, say 4? a simple idea would be to split the lowpass and highpass signals further, creating a tree-like structure:

Code: Select all

       --->high
    ---|
    |  --->high-mid
in--|
    |  --->low-mid
    ---|
       --->low
however, when i do this with Linkwitz/Riley filters, the filter obtained by the sum of the 4 ouputs: low + low-mid + high-mid + high is now NOT allpass anymore. neither would be a parallel connection of a lowpass, a highpass and 2 bandpasses (right?). so what am i going to do to retain the desirable allpass-sum property for multiband crossovers? my idea is to pre-filter the input signal with a filter that compensates for the wiggles in the filter-sum but are there better ways?

disclaimer: i'm well aware that perfect-reconstruction crossovers can be contructed from FIR filters which do not suffer from any of these problems, but i want to discuss IIR designs here.
My website: rs-met.com, My presences on: YouTube, GitHub, Facebook

Post

A simple way to get from two bands to three is to split one band into another two and then add an allpass into the unsplit band. To get to four bands you then split a band again and insert allpasses onto the other bands. To get to five bands, split a band again and add in more allpasses to correct the phase.

Note that this approach this will not cancel out the phase shift but compensates for it so you may end up with a large time difference between your high and low frequencies. It also increases in number of filters rapidly as you increase the number of bands so can get computaionally expensive quickly.

Post

that would seem to work, but aren't there any computationally cheaper methods?

Post

Hi,

I just want to say that I found the same issues with more than two bands, but I either didn't find a solution for it or I can't really remember.

What I remember is the fact that I was experimenting with the sign quite a lot, but I can't tell right away whether I had success with this method or not.

Christian

Post

thanks Caco, that makes sense. let me work it out in some more detail - O.K., so let's start with the two-way crossover:

Code: Select all

    
    --->high
    |
in--|
    |
    --->low
and split the upper branch further:

Code: Select all

       --->high
    ---|
    |  --->high-mid
in--|
    |  
    ------>low
giving a 3-way crossover. now, the upper branch is itself an allpass-filter, so we insert an allpass into the lowpass branch, too (with the same phase-response as the one in the upper branch, yes?):

Code: Select all

       --->high
    ---|
    |  --->high-mid
in--|
    |  
    ---AP->low
we now add a 4th band by splitting the unsplit lowpass branch furter (leaving the allpass in?):

Code: Select all

       -------->high
    ---|
    |  -------->high-mid
in--|
    |       --->low-mid
    ---AP-->|
            --->low
but now, we have again messed with phase, so we need 2 further allpasses in the upper branch which have the same phase-response as the low-branch allpass:

Code: Select all

       ---AP--->high
    ---|
    |  ---AP--->high-mid
in--|
    |       --->low-mid
    ---AP-->|
            --->low
which (by linearity) we can reduce to:

Code: Select all

            --->high
    ---AP-->|
    |       --->high-mid
in--|
    |       --->low-mid
    ---AP-->|
            --->low
now, the AP in the upper branch would compensate for the combined effect of the allpass in the lower branch as well as for the allpass that results from adding 'low' and 'low-mid'. so far so good and it looks nicely symmetric. but actually, it's not: if we had created the crossover by first further splitting the lower branch and then the upper, the situation would be vice versa. the allpass in the lower branch would have to compensate for the combined effect of allpass in the upper branch and for the effect of adding 'high' and 'high-mid'. so in the first case, we have a high order allpass in the upper branch and a low order allpass in the lower branch, in the second case vice versa. this asymmetry still bothers me.

in my crossover-plugin (which i have just revisited which is why i'm asking this stuff), the overall phase-response would depend on the order in which the user activates/de-activates splits, which is undesirable. is there a way to symmetrize the situation?
My website: rs-met.com, My presences on: YouTube, GitHub, Facebook

Post

Christian Budde wrote:Hi,

I just want to say that I found the same issues with more than two bands, but I either didn't find a solution for it or I can't really remember.

What I remember is the fact that I was experimenting with the sign quite a lot, but I can't tell right away whether I had success with this method or not.

Christian
Hi Christian. good to see, i'm not alone.
My website: rs-met.com, My presences on: YouTube, GitHub, Facebook

Post

With the allpass correction method you should always be splitting the top band and applying the allpass to all the lower bands, as far as I understand it.

Post

So with a four band split (Filters 1 have the lowest crossover, 3 the highest)

Lowest band goes through: LP1, AP2, AP3 (Total order 8 )
Low mid band goes through: HP1, LP2, AP3 (Total order 10)
High mid band goes through: HP1, HP2, LP3 (Total order 12)
High band goes through: HP1, HP2, HP3 (Total order 12)

Post

l0calh05t wrote:With the allpass correction method you should always be splitting the top band and applying the allpass to all the lower bands, as far as I understand it.
so you mean, the way i described above would be the right way, but doing it the other way around (first splitting the lower branch and compensating in the upper, then splitting the upper band) would be wrong? ...invalid? why?
My website: rs-met.com, My presences on: YouTube, GitHub, Facebook

Post

Robin from www.rs-met.com wrote: so you mean, the way i described above would be the right way, but doing it the other way around (first splitting the lower branch and compensating in the upper, then splitting the upper band) would be wrong? ...invalid? why?
If you design a standard rbj allpass it will have exactly twice the phase shift as a corresponding lowpass, but since the lowpasses are squared in a crossover the phase shift will be the same. So since the phase shift is the same as in a lowpass it would seem to be the obvious choice to always split the topmost band and apply allpass correction to the lower bands.
Last edited by l0calh05t on Fri Feb 19, 2010 6:51 pm, edited 1 time in total.

Post

l0calh05t wrote:So with a four band split (Filters 1 have the lowest crossover, 3 the highest)

Lowest band goes through: LP1, AP2, AP3 (Total order 8 )
Low mid band goes through: HP1, LP2, AP3 (Total order 10)
High mid band goes through: HP1, HP2, LP3 (Total order 12)
High band goes through: HP1, HP2, HP3 (Total order 12)
so the lowpass branch does not get split further? hhmm...that's kinda mmm...naja...so-so...first, it's even more asymmetric and second, i would not be able to take advantage of accumulating filter-slopes - when we split the lowpass-branch further, the lowpass->lowpass filter would increase it's slope at the cutoff of the second lowpass (which is, well, actually the first :hihi: )
My website: rs-met.com, My presences on: YouTube, GitHub, Facebook

Post

The amount of processing applied to each channel will vary, yes. But the amount of phase shifting applied to each channel will be similar, so I don't think this would cause any problems.

Post

l0calh05t wrote: If you design a standard rbj allpass it will have exactly twice the phase shift as a corresponding lowpass, but since the lowpasses are squared in a crossover the phase shift will be the same. So since the phase shift is the same as in a lowpass it would seem to be the obvious choice to always split the topmost band and apply allpass correction to the lower bands.
ahh, O.K. - i was not yet considering the problem of the design of the compensation allpass. but i'm actually dealing with (squared) high-order Butterworth-lowpasses (and highpasses) here. RBJ lowpass would be the special case of 2nd order Butterworth (for Q=sqrt(1/2) ...i think).

designing the compensation-allpass will probably be non-trivial but i have some hope that i can figure it out, see my other (related) tread:

http://www.kvraudio.com/forum/viewtopic.php?t=278658
My website: rs-met.com, My presences on: YouTube, GitHub, Facebook

Post

Robin from www.rs-met.com wrote: ahh, O.K. - i was not yet considering the problem of the design of the compensation allpass. but i'm actually dealing with (squared) high-order Butterworth-lowpasses (and highpasses) here. RBJ lowpass would be the special case of 2nd order Butterworth (for Q=sqrt(1/2) ...i think).

designing the compensation-allpass will probably be non-trivial but i have some hope that i can figure it out, see my other (related) tread:

http://www.kvraudio.com/forum/viewtopic.php?t=278658
Ok, I was considering squared 2nd order butterworth filters (4th order in total). In that case the design is trivial if done as I explained above.

And I fear you won't be able to avoid calculating the roots.

Post

l0calh05t wrote:And I fear you won't be able to avoid calculating the roots.
yeehaahh - looking forward to it. ...i can already hear the complaints about high CPU-usage when automating crossover-frequencies...
My website: rs-met.com, My presences on: YouTube, GitHub, Facebook

Post Reply

Return to “DSP and Plugin Development”