Under the hood of Chow Phaser

Recently, I released the ChowPhaser audio plugin, an open-source phaser effect based loosely on the Schulte Compact Phasing ‘A’. I thought it might be cool to take a look under the hood of ChowPhaser and show what sets it apart from the average digital phaser effect.

As usual, this blog can also be read as a Jupyter Notebook.

The Schulte Phaser

The original Schulte phaser is a pretty rare effect but with a somewhat large cult status, owing to its use by several notable artists including Kraftwerk, Pink Floyd, Tangerine Dream, and more. While I won’t do a full circuit analysis here, I will try to explain the overall function of the phaser at a higher level. The general signal processing structure of the Schulte phaser is shown below:

The Schulte phaser uses 8 first order phasing allpass sections all sharing the same low-frequency oscillator (LFO). The output of the first two sections is fed back to the input, the amount of feedback being controlled by the feedback gain G. The output of the feedback loop is then fed to one output channel, and mixed with the output of the allpass sections then fed to the second output channel.

LFO

The typical digital phaser might use an LFO made up of a pure sine wave, square wave or other standard digital waveform. While the Schulte phaser does use a sine-like oscillator circuit, the way this oscillator affects the allpass sections is a little bit more complex. The Schulte LFO circuit is used to drive a light bulb, which then affects the resistance of a light-dependent resistor (LDR) present in each allpass section. LDR tend to exhibit an interesting nonlinear characteristic, of the form:

where R0 is the maximum resistance of the LDR, and x is proportional to the light received by the LDR. When creating ChowPhaser, I thought it might be interesting to allow the user to “skew” the LFO in a form similar to the response of an LDR driven by an oscillating light bulb. Since the phaser uses a digital sine wave on the range [-1, 1], our “skew” equation is written as:

with λ as a skew parameter. The LFO output for several different skew parameters is shown below.

Feedback Stage

While the Schulte phaser uses some of the same allpass sections for the feedback and modulation processing, separating these two processes can be convenient in the digital implementation. With that in mind, I developed a dedicated feedback stage with the architecture shown below:

At first glance, this structure might seem incomputable, since it contains a delay-free loop. That said, we can still find closed-form solution, using the process described by Dave Berners and Jonathan Abel in their 2016 AES paper.

This stage can then be implemented using a standard biquad filter. We can then connect the phasers in the feedback stage to our sine LFO, which gives the following frequency responses.

To make the effect more interesting, we can implement the feedback stage using a nonlinear biquad filter, as I’ve described in some previous blog posts. The nonlinear biquad filter allows us to apply a saturating nonlinearity to the states of the biquad filter, or to the feedback paths of the filter. These nonlinearities cause the frequency response of the feedback stage to change depending on the operating point of the filter.

Modulation

With the feedback stage separated out, we can now develop a dedicated modulation stage made up of a chain of allpass sections modulated by the phaser LFO. While the original circuit uses a chain of 8 allpass sections, in the digital realm we are free to change the number of allpass sections in real-time, even allowing the user to fade between the number of stages continuously.

Putting It All Together

In the end, all these components need to be brought together as a cohesive, musical effect. With that in mind, I’ve made a mono version of the effect with a similar signal flow to the original Schulte phaser, as well as a stereo version, with a dedicated LFO, feedback stage, and modulation stage for each channel. There are also “drive”, “thrash”, and “dirt” controls that affect the nonlinearities present in the feedback stage. A video demo of the effect can be seen on YouTube. To download the plugin or checkout the source code, check out the ChowPhaser GitHub repository.

Big thanks to everyone reading this, as well as to some folks on the KVR forum for inspiring me to check out the Schulte phaser in the first place, and in particular Margus for helping with the design of the plugin!

Jatin Chowdhury is a student.