N-band Linkwitz-Riley crossovers

DSP, Plugin and Host development discussion.
RELATED
PRODUCTS

Post

Hey,

So to design a single crossover with 12 db/oct you need a two-pole lowpass and a two-pole highpass with Q = 0.5 in parallel. These can then be summed by flipping the sign of the highpass output.

What if you have multiple crossovers? Do you just cascade the sections, or do they still need to be run in parallel (requiring bandpasses?)?

Bonus question: Two cascaded one-poles create a two-pole lowpass with Q = 0.5. How would you design the high-pass counterpart from one-poles?

Thanks for any knowledge :)

Post

The crossover filters would be in parallel, since they are all feed by the same input signal. So the low band would just have a low pass filter applied. The mid band would have a low pass and high pass (with flipped phase if using a LR filter). The high band would have a high pass filter applied. I think you could probably construct the crossover differently, but I don't think there would be any significant benefit.

I am not sure about the one-pole question. I think it would be easier to just construct a normal two-pole filter with the appropriate q.

This page helps me figure out some of this stuff (http://freeverb3vst.osdn.jp/iir_filter.shtml). I hope it is helpful.

Post

They can be routed in serial. If you choose to output the lowest LP first, you'll route that combo's HP to the next LP/HP combo input. Then gain adjustment is made on the LP outputs only.

Post

Thanks guys. I tested out both approached and neither worked in the case of 4 bands - both works for the case of 3 bands (that is, the output is a flat all-pass response when summed).

Here are my routings for the serial/cascaded approach:

Code: Select all

                                                    hp - inverter - HIGH BAND - 
                                                   /                           |
                                    X-over @ 6000:                             |
                                   /               \                           |
                                  hp                lp --- HIGH MID BAND ----  |
                                 /                                            \|
                                /                                              +--- SUMMED OUTPUT ---
                 X-over @ 3000:                                               /|  
                /               \                                            / | 
               hp                lp - inverter ---------- LOW MID BAND -----   |
              /                                                                |
X-over @ 200:                                                                  |
              \                                                                |
               lp --------------------------------------- LOW BAND ------------  
Yielding this response:
Image

For the parallel case:

Code: Select all

       hp @ 6000 - inverter ------------ HIGH BAND --------
      /                                                    |
     /  hp @ 3000 - lp @ 6000 ---------- HIGH MID BAND --- |
    /  /                                                  \|
-------                                                    +--- SUMMED OUTPUT
    \  \                                                  /|
     \  hp @ 200 - lp @ 3000 - inverter - LOW MID BAND --- |
      \                                                    |
       lp @ 200 ------------------------- LOW BAND --------
Yielding this response (dip is 2x larger):
Image

Post

Wow, something weird is happening there. That dip looks pretty broad to be a phase issue. It also is centered in a way that looks like the High Mid band is not working correctly.

Can you quickly enable a "solo function" to check that each band is working correctly?

Post

Not sure if I did mine correctly, since I get a tilted slope towards nyquist (when adjusting gains), but I put the inverter on the HP outputs. I haven't attempted the parallel network yet, but something looks strange about the inverters in your diagram.

Post

Yeah, here are the bands for reference for the parallel routing:
Image
Image
This band doesn't reach the same levels as the others, but that is expected since the low pass and the high pass alter the volume at the centre. I tried gain compensating it for fun, but it introduced small errors at the cross overs..
Image
Image

Here's for the serial case - notice how the higher bands have sharper slopes on the left edges, as they've passed through multiple high-passes:
Image
Image
Image
Image

Post

camsr wrote:Not sure if I did mine correctly, since I get a tilted slope towards nyquist (when adjusting gains), but I put the inverter on the HP outputs. I haven't attempted the parallel network yet, but something looks strange about the inverters in your diagram.
The way I look at it, for the serial network, every other stage switches the phase at the cross-over by 180 degrees. Inverting every HP output yields the same result.

Post

edit: it's easier to use the parallel topology :P
There needs to be an allpass somewhere, I forgot where, look for a thread I made asking about LR filters.

Post

I think this is the previous thread (viewtopic.php?f=33&t=445272).

I tried it myself and I get the same result. I think all of the phase shifts start to produce null points in the frequency without other phase compensation. I guess it depends on how close the frequency points are to each other.

Post

You'll need allpass sections to compensate for the phase response that every split causes (that run on the parallel branch). Without that, you'll get these phase cancellation issues unless the cross-over frequencies are sufficiently far apart.

Post

Yip, djeroen is correct, you need to adjust the phase. Remember that even for a 2band 12dB x-over, the summed output has an allpass response. In simple terms:

This is for 2x x-over frequencies (3band splitter - cascade)

Hi Band(10kHz)
Mid Band (1kHz) -> Allpass(10kHz)
Low Band(1kHz) -> Allpass(10kHz)

Basically, for every extra split, you add just add an allpass(same Q and order btw) into the lower leg(s). It can get crazy expensive above 4 bands. In one of my projects where the x-over frequency is a modulation target I used TPT/ZDF SV filter as the splitters, and it turned out to be slightly less CPU compared to the classic Biquad.

Regards
Andrew

Post

Thanks, the allpass filters was indeed the missing piece. I couldn't get the parallel routing to work, I would always end up with a bump (?) at the high-mid cross-over:
Image
However the serial case worked to within numerical precision. :) If you look at the bands I posted above, the serial case' next band work with the 'remainder' of the energy from the previous band, while the parallel does not - it just works on a specific region so I believe the error will get worse as you add more bands.

Anyway, here are the update diagrams. Serial:

Code: Select all

                                                    hp - inverter - HIGH BAND --------- 
                                                   /                                   |
                                    X-over @ 6000:                                     |
                                   /               \                                   |
                                  hp                lp ------------ HIGH MID BAND ---  |
                                 /                                                    \|
                                /                                                      +--- SUMMED OUTPUT ---
                 X-over @ 3000:                                                       /|  
                /               \                                                    / | 
               hp                lp - ap @ 6000 - inverter -------- LOW MID BAND ---   |
              /                                                                        |
X-over @ 200:                                                                          |
              \                                                                        |
               lp - ap @ 3000 -- ap @ 6000 ------------------------ LOW BAND ----------  
Parallel:

Code: Select all

       hp @ 6000 - ap @ 200 - ap @ 3000 - inverter -- HIGH BAND -------
      /                                                                |
     /  hp @ 3000 - lp @ 6000 - ap @ 3000 ----------- HIGH MID BAND -- |
    /  /                                                              \|
-------                                                                +--- SUMMED OUTPUT
    \  \                                                              /|
     \  hp @ 200 - lp @ 3000 - ap @ 6000 - inverter - LOW MID BAND --- |
      \                                                                |
       lp @ 200 - ap @ 3000 - ap @ 6000 - LOW BAND --------------------
I think the best explanation of this system, in layman's terms, is that each band's phase response needs to be as if it went through all the cross-overs. I also - now - don't see how the parallel routing could ever work.

Post

Ichad.c wrote:Basically, for every extra split, you add just add an allpass(same Q and order btw) into the lower leg(s). It can get crazy expensive above 4 bands. In one of my projects where the x-over frequency is a modulation target I used TPT/ZDF SV filter as the splitters, and it turned out to be slightly less CPU compared to the classic Biquad.
Indeed, it makes the split less sexy than I thought it would. I also use SVFs so you get the lp+hp from the same filter, which makes the situation a bit better.

Post

Mayae wrote:
Ichad.c wrote:Basically, for every extra split, you add just add an allpass(same Q and order btw) into the lower leg(s). It can get crazy expensive above 4 bands. In one of my projects where the x-over frequency is a modulation target I used TPT/ZDF SV filter as the splitters, and it turned out to be slightly less CPU compared to the classic Biquad.
Indeed, it makes the split less sexy than I thought it would. I also use SVFs so you get the lp+hp from the same filter, which makes the situation a bit better.
I think(unverified) you can save an allpass if you sum the Low & Low Mid Band and then apply the ap @ 6000.

Post Reply

Return to “DSP and Plugin Development”