Z1202 wrote:andy-cytomic wrote:There may be some benefit even for LR4, but the main difference is for LR8. You only need 2xSVF4pole instead of 5xSVF2pole, so you save one SVF2Pole worth of computation.

Ah, I think I know what you mean now. But it was bugging me, that the same should be doable with 2-pole SVF. And actually it is.

So we want to obtain an 8-pole LP signal and a corresponding 4-pole AP signal, where ideally we would use two 2-pole SVFs to generate an LP4 and an AP4 signal and two others to turn LP4 into LP8. So let's concentrate on these first two SVFs, where we connect the LP output of the first SVF to the input of the second SVF. Let the denominators of their transfer functions be s^2+2R1s+1 and s^2+2R2s+1 respectively. So, the LP4 signal is 1/(s^2+2R1s+1)(s^2+2R2s+1). Using this denominator, let's write the numerators for all other signals we can pick from the modal outputs of these two SVFs:

2nd SVF LP: 1

2nd SVF BP: s

2nd SVF HP: s^2

1st SVF LP: (s^2+2R2s+1)

1st SVF BP: (s^2+2R2s+1)s

1st SVF HP: (s^2+2R2s+1)s^2

It's easy to see that these polynomials form a basis in the space of 4th order polynomials. Indeed, the first three are trivial basis vectors. Now we can subtract their linear combination from 1st SVF BP to turn it into s^3, making the fourth trivial basis vector. And then we subtract the linear combination of these 4 trivial basis vectors from 1st SVF HP, making the fifth trivial basis vector.

Thus, we can express any 4-th order transfer function's numerator via 2nd SVFs outputs and 1st SVFs BP and HP outputs. (In practice it could also make sense to use the input signals to both of the SVFs, as this gives additional options to simplify the math. Whether it will actually simplify it, needs to be seen).

Now I wonder if anybody spots a mistake.

That was bugging me too, but I've given it a quick look over and it all looks good, and the plots all work great, nice work! I don't see any mistakes. I haven't implemented it yet to check but I know from experience it will be fine, especially with 2 pole sections cascaded, there isn't much to go wrong.

I have approached this sort of thing previously by solving directly for the coefficients of s in the numerator, and this has worked here just fine as well

(In fact I did just this to form the AP2 response for the SVF4pole!)

The "missing" output when R1 != R2 is the allpass from the way Mystran previously described. It looks like this:

(1 - 2 R1 s + s^2) (1 - 2 R2 s + s^2)/(1 + 2 R1 s + s^2) (1 + 2 R2 s + s^2)

so, if we take what Vadim proposed and set up a numerator as the sum of all the outputs we have like this:

m5 1 +

m4 s +

m3 s^2 +

m2 (s^2 + 2 R2 s + 1) +

m1 (s^2 + 2 R2 s + 1) s +

m0 (s^2 + 2 R2 s + 1) s^2

Then solve the simultaneous equations for each coefficient of the powers of s to be equal to the ap4 response we want it will give us the values of m0, m1, m2, m3, m4, m5. We have an over specified system, which looks most neatly solved by settings m2 to zero (lp2), then we get:

{m0 -> 1, m1 -> -2 (R1 + 2 R2), m2 -> 0, m3 -> 1 + 8 R2 (R1 + R2), m4 -> 2 R2, m5 -> 1}

So the signal chain is:

---LR8---

SVF2pole1(in,R1 -> hp2,bp2,lp2)

SVF2pole2(lp2,R2 -> lp2hp2,lp2bp2,lp4)

SVF2pole3(lp4,R1 -> lp6)

SVF2pole4(lp6,R2 -> lp8)

ap4 = m0 hp2 + m1 bp2 + m3 lp2hp2 + m4 lp2bp2 + m5 lp4

hp8 = ap4 - lp8

I would guess this method will be directly applicable to the SVF4 as well for higher orders, so it will come down to profiling to really tell which is fastest. The trouble with the SVF2pole is still you need to cascade 4 in series, which is inherently not a parallel computation.

Knowing Mystran he probably already did all this and was keeping quiet (hehe), but thanks Vadim for following along what I've been saying and suggesting a better solution, so we can all now benefit from constructing an LR8 from 4 x SVF2poles

Note that in the above I've been using 2 R1 and 2 R2 like Vadim suggested, so if you want damping values directly then divide these by 2 and you'll get:

{m0 -> 1, m1 -> -R1 - 2 R2, m2 -> 0, m3 -> 1 + 2 R2 (R1 + R2), m4 -> R2, m5 -> 1}

This sort of thing just wouldn't work in analog, since the tollerances have to be so precise to make it happen, which is I think why Rane make a single SVF4pole. If anyone is using this stuff make sure to calculate as exactly as possible your R1 and R2 (or higher order) directly from the biquad equations at high precision, if they don't multiply out to give sqrt(2) then they won't cancel and you won't get a very good high pass output from your crossover!

I've got a product coming up which needs some decent crossovers, so this is great timing. Thanks to both Mystran and Vadim for your excellent contributions, and I hope others will find my posts useful on how to put it all together to make a final working crossover.

(edit: updated lp4 to lp6 in SVF2pole4(lp4,R2 -> lp8) above)

Last edited by andy-cytomic on Sun Mar 04, 2018 5:36 pm, edited 1 time in total.