Steiner Parker filter topology

DSP, Plugin and Host development discussion.
RELATED
PRODUCTS

Post

Could someone describe a Steiner Parker filter topology (in terms of integrators and connections) ? Still learning electronics but can't figure this out yet from schemes.
giq

Post

It's a Sallen-Key with a few more resistors to make the 3 inputs work.

It uses Diodes + bias voltage for voltage controlled resistors. It's therefore unbuffered.

It looks more complicated than it is because the path is mirrored, with the diodes being inverted on one branch. If you replace the diodes by linear resistors you can omit the second branch and look at it as a simple Sallen-Key filter.

- Urs

Post

http://www.willpirkle.com/Downloads/AN-5Korg35_V3.pdf

Not the same filter(no diodes), but at least explains the sallen-key topology a bit. The 'single amplifier' version looks interesting, which is unbuffered.

Post

Yes I know this document, but had no idea its a kind of SK. So diodes act as resistors in SP? Seems I need to get back to electronics to understand this :)
giq

Post

itoa wrote:Yes I know this document, but had no idea its a kind of SK. So diodes act as resistors in SP?
Just google diode-bridge or diode VCA, it might help. There is a lot of SK filters around, the buchla lowpass gate is one too.

*edit* I suggest first solving a simple SK filter, then move to more complex configurations. In theory a SK filter can have multiple inputs, which would make it interesting in a modular setup.

Post

I solved linear SK filter, now trying different nonlinearities. Very funny and confusing if you don't know electronics well :).

btw. Did I get it right? VA model of unbuffered RC pair is 2 one pole filters with different cutoff frequencies?
giq

Post

itoa wrote:btw. Did I get it right? VA model of unbuffered RC pair is 2 one pole filters with different cutoff frequencies?
Not sure, but intuitively I would expect some feedback from the 2nd stage into the 1st or something like that (unless you ignore the topology of the filter and simply try to simulate the transfer function).
Edit: I probably misunderstood you. I thought you're talking about two RC pairs. If it's one pair, then it should be one 1-pole filter. Not sure about the coupling, but I guess it will be represented as extra feedbacks to/from the neighboring parts of the structure. A general rule is: one integrator/pole per one capacitor or inductor.

Post

itoa wrote:I solved linear SK filter, now trying different nonlinearities. Very funny and confusing if you don't know electronics well :).

btw. Did I get it right? VA model of unbuffered RC pair is 2 one pole filters with different cutoff frequencies?
Hmmm, in effect this might be true, but the resistance and capacitance is the same.

Here's a one pole filter using a diode as a voltage controlled resistor:

Code: Select all

        +     -
    +---(Vbias)---+
    |             |
    |             |
----+----->|------+------
               | 
               =
               |
               gnd

Simple spoken:

The bias voltage is added at the input, lifts the "operation point" of the diode to a region that has the desired slope within its non-linear transfer curve. The input voltage adds to the bias voltage, gets dampened by the slope of the diode. Then the bias voltage is subtracted and what's left is just the flattened out input voltage.

(this is not true at all, because we should be talking admittance, not any "multiply by" factor, as we have to do a nodal analysis of the whole circuit. Otherwise we would end up multiplying each voltage with infinity for the zero resistance of the wires in-between - but I know it helped me a lot to think of diodes as variable resistors with a different slope at different voltages)

And finally, it's pretty much the same for this one:

Code: Select all

        +     -
    +---(Vbias)-------------+
    |                       |
    |                       |
----+----->|------>|--------+------
               |         |
               =         =
               |         |
               gnd       gnd
Both diodes operate at the same "slope" - but, some of the curent from the second capacitor can flow to the bias source, with that current being diverted to the first capacitor. This can be treated as current from the second capacitor flowing back into the first one - as it would be, were we replacing the diodes with linear resistors.

(take with grain of salt, coffee not fully in effect in my head)

- Urs

Post

Btw. I have a paper ready with an approachable model for Steiner-Parker and using Mystran's "Cheap" method to approximate the non-linearities.

Might post it, once I get back into the office.

Post

This would be great. I just want to understand the "VA topology" of this animal.
giq

Post

I won't be able to do this before Monday (and Monday will be packed...). But you could do a simple Nodal Analysis on this one, which out of the top of my head is the schematic I used:

Code: Select all

V0        V1       V2
----[R1]--+--[R2]--+-------+---
    -->   |  -->   |  -->  |
        | = C1   | = C2    |
        v |      v |       v res (buffered!)
          |        BP      |
HP--------+----------------+
Then for each sample replace gR1 by tanh(ic1eq)/ic1eq, gR2 by tanh(ic2eq)/ic2eq and res by tanh(V2)/V2, each using the previous sample.

Unfortunately, maybe due to the unbuffered nature, you'll need 4x oversampling to make it stable enough for high resonance.

Post

Thanks I will try to understand this :)

This is what I came to so far: http://www.mixcloud.com/giku/sp-filter-model-1-test/
Newton-Rhapson (4 iterations) and single nonlinearity. It's just SK with moved poles..
giq

Post

Required: Read and understand Andy Simper's paper about One Pole Filters. Then also have a glance over his paper about the Sallen Key Filter.

Outcome: This may also help understanding the "Cheap" method posted by Mystran in the other thread.

#---

Building a simple Steiner Parker Filter from scratch, using the "Cheap" method to add non-linearities to an otherwise linear model.

We start with a linear model composed of transistors, capacitors and current sources. As a prerequisite I have noted the Resistors as R1 and R2, the capacitors as C1 and C2, the inputs as LP, HP and BP. The nodes of interest are V1 and V2. The resonance amplifier is special, because it does buffer. We model it simply as "no effect on output, but current source on feedback".

Code: Select all

      ->     V1     ->     V2    
LP----R1-----+------R2-----+------+----Out
             |             |      |   
           | = C1        | = C2   v Res
           V |           V |      |
             |       HP----+      |
             |                    |
       BP----+--------------------+
Also, I've marked the direction of current flow with arrows. These are important to get the signs right when adding things up.

Here we go!

Step 1: Write down currents over resistors and capacitors (Ohm’s law: I = V / R = g * V):

Code: Select all

iR1 = g1*( LP - V1 )
iR2 = g2*( V1 - V2 )
iC1 = ( V1 - Res*V2 - BP ) + ic1eq
iC2 = ( V2 - HP ) + ic2eq
(I have set the admittance of the capacitors to 1 straight away - see Andy’s papers. If you wonder why I use two different gs for the resistor admittance... wait for it!)

Step 2: Apply Kirchhoff's current law at the two nodes:

Code: Select all

V1: 0 = iR1 - iR2 - iC1
V2: 0 = iR2 - iC2
All currents at each node add up to zero. Everything which has an arrow pointing towards the node is added. Everything which has an arrow pointing away from the node is subtracted.

Step 3. substituting currents in Step 2 with equations from Step 1:

Code: Select all

0 = g1*( LP - V1 ) - g2*( V1 - V2 ) - V1 + Res*V2 + BP + ic1eq
0 = g2*( V1 - V2 ) - V2 + HP + ic2eq
Step 4. Use Math Algebra System to solve for V1, V2:

I've used wxMaxima to do this:

Code: Select all

Solve([
	0 = g1*( LP - V1 ) - g2*( V1 - V2 ) - V1 + Res*V2 + BP + ic1eq,
	0 = g2*( V1 - V2 ) - V2 + HP + ic2eq
],[V1, V2] );	

this yields

Code: Select all

       ((g1*g2+g1)*LP+Res*(HP+ic2eq)+g2*(HP+ic2eq)+(g2+1)*BP+(g2+1)*ic1eq)
V1 = - ------------------------------------------------------------------- 
                    (g2*Res+(−g1−2)*g2−g1−1)
                      
       (g1*g2*LP+g2*(HP+ic2eq)+g1*(HP+ic2eq)+HP+g2*BP+ic2eq+g2*ic1eq)
V2 = - --------------------------------------------------------------
					(g2*Res+(−g1−2)*g2−g1−1)
These two equations each eliminate one unknown to calculate the other. We can simply discard the more complicated term for V1, and take the outcome of the simpler V2 as a *known* for the equations in Step 3. We can thus calculate V1 by

Code: Select all

V1 = ( g1 * LP + g2 * V2 + Res*V2 + BP + ic1eq ) / (g1+g2 + 1);
Step 5. Update States for Trapezoidal Integration

Code: Select all

	ic1eq = 2*(V1 - Res*V2 - BP) - ic1eq;
	ic2eq = 2*(V2 - HP) - ic2eq;
Step 6. Add non-linearities, cheap

First we need our coefficients:

Code: Select all

	g = tan( PI * cutoff/samplerate);
	k = Resonance * 2; // go higher for self oscillation, try 3-4

	g1 = g;
	g2 = g;
	Res = k;
Now, taking results from previous samples to scale those coeffs:

Code: Select all

	if( ic1eq != 0 ) g1 *= tanh( ic1eq )/ic1eq;
	if( ic2eq != 0 ) g2 *= tanh( ic2eq )/ic2eq;
	if( V2 != 0 ) Res *= tanh( V2 )/V2;
See, this is why we have separate admittances for each resistor. With the "Cheap" method, each resistor's admittance is scaled by the ratio of the waveshaped state vs. the linear state from the previous sample. Mystran uses a factor f for each stage, I use individual gs.

Step 7. Put it all together
  • first, write down code form Step 6
    second, write down long equation for V2 from Step 4
    third, write down short equation for V1 from Step 4
    next, write down code from Step 5
    lastly, Out = V2
Note: I think this is only stable up to below Nyquist/2, possibly due to its unbuffered nature. You'll need 4x oversampling if you want to allow for screaming resonance.

Enjoy,

- Urs
Last edited by Urs on Mon Jan 05, 2015 6:50 pm, edited 2 times in total.

Post

Love!
giq

Post

Small typo in Step 6, ic1eq and ic2eq were replaced with iceq1 and 2 respectively.

Post Reply

Return to “DSP and Plugin Development”