Xpander style filter modes for your 4-pole "ladder"

DSP, Plugin and Host development discussion.
RELATED
PRODUCTS

Post

Robin from www.rs-met.com wrote:hey, how about making it morphable via interpolating between the highpass weights, the bandpass weights and the (trivial) lowpass-weights. such that with some parameter p we have:
p=0: lowpass
p=0.5: bandpass
p=1: highpass
does that seem to be doable? i mean doable in the sense that the transition would be meaningful? i guess i have to try. i just ported Christian Budde's implementation of Antti's Moog-filter to C++ and i'm currently playing with it anyway.
Yes it's very doable, in fact it's already been done. Remember that cross fading the taps is not a morph, you want to move the zeros around linearly in frequency space.

Another option is to move notches around as your morph. In this way with two notches up high you have a low pass 4 pole, with one notch up high and one down low you have a bandpass, and with both notches down low you have a 4 pole high pass. Also having a filter with the notches tuned to exactly x2 and /2 the resonant peak sounds great. Check near the bottom of this page, I've called it N2P2N2 T:

http://vellocet.com/dsp/CascadedFilterResponses/

Regarding Antti's paper, just check and try to match the output of every one pole to match the analog as much as possible to get the best results.

Post

andy_FX wrote: Yes it's very doable, in fact it's already been done. Remember that cross fading the taps is not a morph
yeah, that was what i meant when i asked for a 'meaningful transition'. if i would design a second order filter in the z-plane, i would simply move one of the zeros from z=-1 to z=1 for a lowpass->bandpass morph (p=0...0.5) and then start to move the second zero for the bandpass->highpass morph (p=0.5...1.0). ...but with the Moog-model, i'm unfortunately not in the z-plane (where i feel somewhat comfortable). i hoped, the interpolation of the weights would give rise to a meaningful transition as well. your two-notches-around-the-pole filter looks interesting by the way. i will keep that in mind for my next z-plane based design explorations. maybe one could make the pole/notch distance (in octaves) an additional user parameter.
My website: rs-met.com, My presences on: YouTube, GitHub, Facebook

Post

mystran wrote: Välimäki&Huovilainen (Oscillator and Filter Algorithms for Virtual Analog Synthesis, Computer Music Journal 2006) claim it's doable (they also give coeffs for some common responses without going into details about how to derive them, other than a reference to the Oberheim service manuals), but I haven't tried, so can't comment on that one.
aha, thanks. unfortunately i don't have the CMJ. too bad that not all articles are as easily available as the DAFX articles are.
My website: rs-met.com, My presences on: YouTube, GitHub, Facebook

Post

mystran - thank you :-)

Post

Robin from www.rs-met.com wrote:
mystran wrote: Välimäki&Huovilainen (Oscillator and Filter Algorithms for Virtual Analog Synthesis, Computer Music Journal 2006) claim it's doable (they also give coeffs for some common responses without going into details about how to derive them, other than a reference to the Oberheim service manuals), but I haven't tried, so can't comment on that one.
aha, thanks. unfortunately i don't have the CMJ. too bad that not all articles are as easily available as the DAFX articles are.
Well they just state it's possible without any details whatsoever.


Anyway.... since solving the coeffs for a response is only a question of some trivial arithmetics, the problem of meaningful morph reduces to coming up with a meaningful morph between two frequency responses, and since the denominator of the response will have to stay equal, this further reduces to coming up with a meaningful morph between two 4th order polynomials (the s-domain nominators of the two responses).

Anyway, the little I have played with morphing filters (second-order biquads a couple of years ago when I was still trying to understand how a filter works) I would find the most useful cases of morph would be moving one or more zeroes from zero to -infinity (from 1 to -1 on z-plane) along the real axis to morph between lowpass and highpass through bandpass/peak (depending on whether you move the zeroes at the same time or one at a time), or moving conjugate pairs of zeroes on the imaginary axis (around the unit-circle on z-plane) to morph by moving a notch around (see the pictures andy posted, they are good). Ofcourse you can also freely move the pairs of zeroes away from the imaginary axis (which will cause the notches to become less steep, not reaching zero-gain anymore), but I personally find this less interesting.

Anyway, for the 4th order case, you get either 4-zeroes to move on the real-axis or 2-complex conjugate pairs. I guess one sensible possibility would be to implement morphs between 2nd order responses, and then build the total response as a combination of two 2nd order responses which are morphed separately (say lp4 to lp3+hp1 would break down to morphing lp2 to lp2, and lp2 to bp2).

But like I said, I haven't ever really tried this (other than some biquad toying on z-plane) so all this is purely theoretical speculation. This discussion is wonderful though, because I just realized I don't need to correct phases to correct my notch responses (with extra feedback delay moving the notch away from the point of resonance which has compensation) because I could just as well move the notch for a new set of coeffs (STUPID ME!! :x).

Post

mystran wrote:I would find the most useful cases of morph would be moving one or more zeroes from zero to -infinity (from 1 to -1 on z-plane) along the real axis to morph between lowpass and highpass through bandpass/peak (depending on whether you move the zeroes at the same time or one at a time)
yep, this is exactly what i had in mind in my reply to andy. moving around poles and zeros in the z-plane is quite intuitive. but i also want self-oscillation and nonlinear behaviuor (harmonics). that's why i'm cosidering a nonlinear biquad like:

y[n] = b0*x[n] + b1*x[n-1] - saturate(a1*y[n-1] + a2*y[n-2])

in which i would move the poles out of the unit circle for self oscillation at an angle given by the desired resonance frequency. the resonance parameter would somehow map to the pole-radius, with 1 being the borderline to self-oscillation. above one, i would then get some harmonics as well. at least i think so. didn't try it yet, just an idea
Anyway, for the 4th order case, you get either 4-zeroes to move on the real-axis or 2-complex conjugate pairs. I guess one sensible possibility would be to implement morphs between 2nd order responses, and then build the total response as a combination of two 2nd order responses which are morphed separately (say lp4 to lp3+hp1 would break down to morphing lp2 to lp2, and lp2 to bp2).
i must think about that. could i retain the overall filter structure in that approach?
My website: rs-met.com, My presences on: YouTube, GitHub, Facebook

Post

Robin from www.rs-met.com wrote: yep, this is exactly what i had in mind in my reply to andy. moving around poles and zeros in the z-plane is quite intuitive. but i also want self-oscillation and nonlinear behaviuor (harmonics). that's why i'm cosidering a nonlinear biquad like:
Are we talking about the cascaded 4-pole with global feedback? With that structure, you can move the zeroes around by combining the pole-outputs in different amounts, but the poles will stay as they are as they are controlled by the cutoff and resonance control; both of which where essentially ignored in my analysis, because you'll need to do more than a combination of outputs to get much out of them, and I believe that's another subject. I guess an analysis of removing one pole would fit the subject though, since that's done in the Oberheim (and to andy's credit I didn't really fully understand how it works before his note about in the circuit-modeling thread triggered me to look more closely into the Oberheim manuals.. originally I just took the principle 'cos I wasn't modeling the Oberheim filter; I just wanted alternative responses from my ladder).

Now, if we forget about the ladder; I can't remember if your example biquad is stable (in the sense of not hitting the rails once it saturates), but I believe it must be if you've tested it (not all possible saturations in the feedback loop(s) of a biquad are stable in the above sense). What I do remember though (even if it's a couple years since I last played with non-linearities in biquads) that I did test that one, and a couple of other ways to saturate a biquad, and I didn't manage to get any distortion that I'd liked (YMMV, and IIRC the most interesting possibility was only doing saturation on the y[n-2] term.. if that's not stable in self-oscillation, then I must remember wrong).

You'll get harmonics in self-oscillation with any filter with arbitrary saturations (assuming you get stable self-oscillation in the first place), but I think the more interesting case are the subtle non-linear effects that give good filters an interesting character; the transistor and OTA ladders for example have interesting yet different characters even if in the linear sense they are the exact same filter.

Now I'm not going to claim that you can't get interesting character out of a biquad, but personally I hate biquads for anything expect pure LTI EQ. If you want interesting second order filter, I would start from something similar to a Sallen-Key (with a diode clip in the feedback :)).

Finally and slightly simplifying the pole-angle is commonly known as "cutoff control" and the pole-radius as the "resonance control," which means that for a second-order filter, the remaining degrees of freedom are the positions of the zeroes.

Post Reply

Return to “DSP and Plugin Development”