Skip to content

Wave Shaper Atan

Overview

Wave shaper nonlinearity using either linear interpolation or math function

Discussion

The module implements arctangent wave shaping. The arctangent is a part of a family of functions called sigmoid functions. Sigmoid functions produce S-shaped curves. The amplitude transfer function of a vacuum tube generally resembles a sigmoid, so this function can be used to try to mimic a tube sound. With the arctangent function atan(kx), where k controls the amplitude of the input value and thus the amount of nonlinear processing applied. The exact equation is:

y(n) = ( 1 / (arctan(k)) ) * arctan(k*x(n))

A normalization factor has been added to retrict the output to the range of -1 to +1. With k=1 the input/output relationship is nearly linear. As k increases, the S-shaped curve emerges and adds gain.

Asymmetrical distortion can be implemented easily by using two different k-values, one for positive input samples and the other for negative ones. This asymetrical distortion is found in Class-A tube circuits. Cascading multiple stages will result in more harmonic distortion. In some amplifiers curves are also inverted in between each stage. The resulting sound is quite different than simply cascading the modules without inversion.

Optional: Wave shaper module using table lookup and linear interpolation.

Module Pack

awe-mod-dspc-snd

ClassID

classID = 41821

Type Definition

typedef struct _ModuleWaveShaperAtan
{
ModuleInstanceDescriptor instance;            // Common Audio Weaver module instance structure
INT32 numStages;                              // The number of stages in series
INT32 invStages;                              // Inverting or not inverting every other stage when cascaded
FLOAT32 kPos;                                 // Defines the amount of nonlinear processing for the positive half of the input signal
FLOAT32 kNeg;                                 // Defines the amount of nonlinear processing for the negative half of the input signal
INT32 useTableLookup;                         // Shaping via lookup table
FLOAT32 minX;                                 // X value corresponding to the first table entry.
FLOAT32 maxX;                                 // X value corresponding to the last table entry.
INT32 L;                                      // Number of entries in the table.
FLOAT32 divisor;                              // Precomputed constant = (L-1)/(maxX-minX) to eliminate division on the target.
INT32 tableHeap;                              // Heap in which to allocate memory.
FLOAT32* table_atan;                          // Array of arctan table values
} ModuleWaveShaperAtanClass;

Variables

Properties

Name Type Usage isHidden Default Value Range Units
numStages int parameter 0 1 1:5
invStages int parameter 0 0 0:1
kPos float parameter 0 1 0.1:5
kNeg float parameter 0 1 0.1:5
useTableLookup int parameter 0 0 0:1
minX float const 1 -5 Unrestricted
maxX float const 1 5 Unrestricted
L int const 1 64 2:1:8192
divisor float const 1 6.3 Unrestricted
tableHeap int const 1 2 Unrestricted
table_atan float* parameter 1 [64 x 1] Unrestricted

Pins

Input Pins

Name in
Description Audio input
Data type float
Channel range Unrestricted
Block size range Unrestricted
Sample rate range Unrestricted
Complex support Real

Output Pins

Name out
Description Audio output
Data Type float

Matlab Usage

File Name: wave_shaper_atan_module.m 
 M = wave_shaper_atan_module(NAME, MAXPREGAIN, TABLESIZE, MEMHEAP) 
 Module that implements a wave shaper function deploying a  
 table lookup (linear interpolation). It additionally allows the user to  
 control the amount of nonlinear processing applied. Cascading multiple 
 stages result in more harmonic distortion. 

 Arguments: 
   NAME        - Name of the module 
   MAXPREGAIN  - Max pre gain (defines max distortion) 
   TABLESIZE   - Defines the size of the look-up-table 
   MEMHEAP     - Specifies the memory heap to use to allocate the table 
                 buffer. This is a string and follows the memory allocation 
                 enumeration in Framework.h. Allowable values are: 
                 'AWE_HEAP_FAST' - always use internal DM memory. 
                 'AWE_HEAP_FASTB' - always use internal PM memory. 
                 'AWE_HEAP_SLOW' - always use external memory (the default). 
                 'AWE_HEAP_FAST2SLOW' - use internal memory. If this fails 
                 then use external memory (the default) 

Copyright (c) 2026 DSP Concepts, Inc.