[sdiy] Tanh and other distortion functions
rburnett at richieburnett.co.uk
Thu Apr 14 01:00:08 CEST 2011
Tanh is accurate for modelling lots of common saturation mechanisms like
those that occur in the long-tailed pair differential amplifier.
However, two challenges presented by Tanh from a DSP viewpoint are that it
results in a broad output spectrum (so needs adequate oversampling to avoid
introducing aliasing,) and the curve rounds off gradually over a wide input
range so you either need a big look-up table with interpolation, or a
high-order polynomial to model it accurately.
My favourite *cheap* saturation function for DSP audio work is: y = 1.5 x -
This gives an s-shape saturation curve for input values that lie between -1
and 1. The gradient (dy/dx) also goes to zero at x=-1 and x=1 meaning that
you can clip larger input magnitudes to the range -1<x<1 without incurring a
discontinuity in y or the first differential. The output essentially tends
smoothly to -1 or +1 as the input tends to -1 or +1 and then remains there
for x<-1 or x>1.
This polynomial is easily implemented efficiently on a DSP with MAC
operations by re-arranging into the Horner form: y = ( 1.5 - 0.5 x^2 ) x
It's also easy to implement on a micro that doesn't have hardware-multiply
support because the polynomial coefficients of 1.5 and 0.5 can easily be
realised using a combination of binary right-shift and add.
This function can also be used as a cheap wave-shaping function to convert a
triangle wave into a sinewave. Only odd harmonics exist in the output, the
strongest of which being the 3rd at about -38dB.
More information about the Synth-diy