Hi Yoann, You can simply multiply the functions with their conditions:
f(x) = (x < LowerThreshold) * LowerSignal(x) + ((x >= LowerThreshold) & (x <= UpperThreshold)) * LinearSignal + (x > UpperThreshold) * UpperSignal process = f Hope this works for you! Flo Am So., 22. Nov. 2020 um 12:39 Uhr schrieb yoann.le.bor...@gmail.com <yoann.le.bor...@gmail.com>: > > > Hi! > > I'm currently trying to create a waveshaper using different functions > according to its input signal and I'm stuck at what would be the best > approach doing so using Faust. > > Here is the concept: > > If the signal is x=s(t), the waveshaper is F(x) where: > F(x) = log10(x)+1 when x > e/10 > F(x) = 10x/(e*log(10)) when x >= e/10 and x >=- e/10 > F(x) = -log10(-x)-1 when x < -e/10 > > Here is a quick and incomplete sketch for further discussions: > import("stdfaust.lib"); > UpperSignal = _ : log10 : _+1 : _ ; // when x > e/10 > LinearSignal = _ : _*1.59768011306 : _ ; // when x >= e/10 and x >=- e/10 > LowerSignal = _ : _*-1 : log10 : _*-1 : _-1 : _ ; //when x < - e/10 > UpperThreshold = 0.27182818284 ; // e/10 > LowerThreshold = -0.27182818284 ; // -e/10 > process = _ <: UpperSignal,LinearSignal,LowerSignal:>_; > > The attached picture is a visual representation where the dashed orange > lines are thresholds, red sections of the curve are UpperSignal and > LowerSignal and the black section of the curve is LinearSignal. > > This is an example of a commonly used method for waveshaping where you > use different functions according to the input signal. > > Here are two interesting articles using this method with various degrees > of complexity: > - > https://medium.com/@jatinchowdhury18/complex-nonlinearities-episode-1-double-soft-clipper-5ce826fa82d6 > - https://www.ampbooks.com/mobile/dsp/preamp/ > > In a non functional language, I would have used a classic if/then/else > but, as specified in the faust manual: > "WARNING: since select2 is strict (always evaluating both branches), the > resulting if does not have the usual "lazy" semantic of the C if form, > and thus cannot be used to protect against forbidden computations like > division-by-zero for instance." > > Ideally, only one of the three functions should be computed by > correctly routing the input signal (using ! or another mean). > > What would be the Faustian way to do so? > > Best regards, > Yoann > > > _______________________________________________ > Faudiostream-users mailing list > Faudiostream-users@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/faudiostream-users -- Florian Hülsmann <f...@cbix.de> http://cbix.de _______________________________________________ Faudiostream-users mailing list Faudiostream-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/faudiostream-users