## Waveshaper with polynomials

DSP, Plug-in and Host development discussion.
lunelasuis
KVRer
3 posts since 29 May, 2018 from Kyiv
Hi, KVR community
I'm wondering if someone could help me with developing saturation function. I'm looking for wave shapes as in the attachment (simple sine wave in the input). I know that it's can be done with Chebyshev polynomials but I'm bit confused that this waves are not symmetrical as sine wave - peaks and zero are shifted. I'm not shure about simple polynomials with powers. So I'm looking for advice what functions can be my starting point to play with

Thanks
You do not have the required permissions to view the files attached to this post.

Music Engineer
KVRAF
3765 posts since 8 Mar, 2004 from Berlin, Germany
in order to get these exact waveshapes from a sinewave input, i'd probably try to first apply an arc-sine to turn the sine back into a phase/position variable (should be a sawtooth shape) and then use that as index to a table that contains the exact waveshape that you want. ...just as a first idea.

...but - it's actually a bit more complicated, since the arc-sine is ambiguous. there are multiple angles (to be exact, 2, within one cycle) that would have the same sine and the arc-sin function can't know which one you want (and just give you the first) - but if you look at two successive samples instead of just one (i.e. x[n] and x[n-1]), you could figure out, whether you are in first quarter (ascending values -> x[n] > x[n-1]) or second quarter (x[n] < x[n-1]) and add pi/2 to asin's output in the 2nd case - and similar for the 2nd half-wave
Last edited by Music Engineer on Wed May 30, 2018 12:09 pm, edited 1 time in total.

Music Engineer
KVRAF
3765 posts since 8 Mar, 2004 from Berlin, Germany
hmmm...thinking more closely, such a strategy could fail very close to the minima and maxima - if the actual min/max occurs between two samples. ...maybe x[n-2] should also be taken into consideration

lunelasuis
KVRer
3 posts since 29 May, 2018 from Kyiv
Music Engineer wrote:in order to get these exact waveshapes from a sinewave input, i'd probably try to first apply an arc-sine to turn the sine back into a phase/position variable (should be a sawtooth shape) and then use that as index to a table that contains the exact waveshape that you want. ...just as a first idea.
Thank you for your response. I thought about it too and decided that I want to find flexible functions instead of presaved wave tables. I believed that there are some tricky things instead of chebyshev and hyperbolic tangent.

Arcsin function to get sawtooth is looks promising, but as you mentioned it fails in the local extremums so i can even get some crackles in the output. I still playing with it and looking for more advices.

My current approach is https://www.desmos.com/calculator/w2ay1jeuci (https://www.desmos.com/calculator/w2ay1jeuci).
It's mix of Chebyshev and tanh functions (a is drive from 0 to 1, gain = 6):

Code: Select all (#)

``````    y(i) = (x - a / 8 * (2*x^2 - 1));

y(i) = y(i) - (a / 2) * (4 * x^3 - 3*x);

y(i) = y(i) - (a / 8) * (8 * x^4 - 8 * x^2 + 1);

y(i) = y(i) * (1 - a) + (a / gain) * tanh (gain * y(i));
``````
But as seen on the second image of my first post I'm looking to add some more triangle waveform to it, but dunno how.

Also if take into account harmonic analysis of the output, with my approach i have lack of the highest harmonics in the spectrum.

Ivan_C
KVRian
1065 posts since 11 Aug, 2004 from Breuillet, France
These curves in the first post suggest that you are not looking for a static waveshaper, but for a combination of waveshaping and filtering instead. There is no static function / waveshaper which could give a curve with f(x) = a on rising and f(x) = b on falling, with x being a sine wave... Or maybe you have some hysteresis happening there as well ?

lunelasuis
KVRer
3 posts since 29 May, 2018 from Kyiv
Ivan_C wrote:These curves in the first post suggest that you are not looking for a static waveshaper, but for a combination of waveshaping and filtering instead. There is no static function / waveshaper which could give a curve with f(x) = a on rising and f(x) = b on falling, with x being a sine wave... Or maybe you have some hysteresis happening there as well ?
Thanks a lot! This brings me directly to the point. can't believe I didn't think about it. Now I'm playing with [tanh -> eq] and get much better results and closer to what i'm looking for. Thanks again

mystran
KVRAF
4983 posts since 12 Feb, 2006 from Helsinki, Finland
Ivan_C wrote:There is no static function / waveshaper which could give a curve with f(x) = a on rising and f(x) = b on falling, with x being a sine wave... Or maybe you have some hysteresis happening there as well ?
Well, you probably could turn an analytic sinusoids (ie. take the input sine and put it through a Hilbert transform) to pretty much anything with a complex polynomial of sufficient order (which can produce asymmetry just fine now, since you get to control harmonic phases too), but yeah.. most likely the original pictures are the result of some combination of saturation (and maybe other waveshaping) and filtering, which might or might not be coupled in some way.
If you'd like Signaldust to return, please ask Katinka Tuisku to resign.