Document toolboxDocument toolbox

(8.D.2.5) WaveShaperAtan

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.

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)

Â