# Saturation¶

• Author or source: Bram
• Type: Waveshaper
• Created: 2002-09-19 14:27:46
notes
```when the input is below a certain threshold (t) these functions return the input, if it
goes over that threshold, they return a soft shaped saturation.
Neigther claims to be fast ;-)
```
code
 ``` 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35``` ```float saturate(float x, float t) { if(fabs(x) 0.f); return t + (1.f-t)*tanh((x-t)/(1-t)); else return -(t + (1.f-t)*tanh((-x-t)/(1-t))); } } or float sigmoid(x) { if(fabs(x)<1) return x*(1.5f - 0.5f*x*x); else return x > 0.f ? 1.f : -1.f; } float saturate(float x, float t) { if(abs(x) 0.f); return t + (1.f-t)*sigmoid((x-t)/((1-t)*1.5f)); else return -(t + (1.f-t)*sigmoid((-x-t)/((1-t)*1.5f))); } } ```

```             But My question is
BUT HAVE YOU TRIED YOUR CODE!!!!!!!!!!!!!!!!????
I think no, 'cos give a compiling error.
the right (for sintax) version is this:

float sigmoid(float x)
{
if(fabs(x)<1)
return x*(1.5f - 0.5f*x*x);
else
return x > 0.f ? 1.f : -1.f;
}

float saturate(float x, float t)
{
if(abs(x)<t)
return x;
else
{
if(x > 0.f)
return t + (1.f-t)*sigmoid((x-t)/((1-t)*1.5f));
else
return -(t + (1.f-t)*sigmoid((-x-t)/((1-t)*1.5f)));
}
}
```
```except for the missing parenthesis of course =)
the first line of saturate should be either

if(fabs(x)) return x;

or

if(abs(x)) return x;

depending on whether you're looking at the first or second saturate function (in the orig post)
```
• Date: 2021-01-01 11:50:14
• By: DKDiveDude
```
```

The first function seems to be only a unnecessary complicated brick limit function. See below how I implemented the first function’s code. Left is a sample between -1 and 1, positiveThreshold and negativeThreshold should be self explanatory.

if (left > positiveThreshold)
left = positiveThreshold + (1 - positiveThreshold) * tanh ((left - positiveThreshold) / (1 - positiveThreshold));
else if (left < negativeThreshold)
left = -(positiveThreshold + (1 - positiveThreshold) * tanh ((-left - positiveThreshold) / (1 - positiveThreshold)));