BogaudioModules

BogaudioModules for VCV Rack
Log | Files | Refs | README | LICENSE

commit f30262be19977920bc06c8e74683253871df11fd
parent 48eea20e0215f2938d61415444023d83fbbc6bbe
Author: Matt Demanett <matt@demanett.net>
Date:   Sun, 19 Feb 2023 18:48:28 -0500

Fix slew limiter DSP to accomodate high sample rates and extreme shapes. #221 #220

Diffstat:
Msrc/dsp/signal.cpp | 18+++++++++---------
Msrc/dsp/signal.hpp | 2+-
2 files changed, 10 insertions(+), 10 deletions(-)

diff --git a/src/dsp/signal.cpp b/src/dsp/signal.cpp @@ -183,25 +183,25 @@ void ShapedSlewLimiter::setParams(float sampleRate, float milliseconds, float sh } float ShapedSlewLimiter::next(float sample) { - float difference = sample - _last; - float ttg = fabsf(difference) / range; - if (_time < 0.0001f || ttg < 0.0001f) { + double difference = sample - _last; + double ttg = fabs(difference) / range; + if (_time < 0.0001f) { return _last = sample; } if (_shapeExponent != 0.0f) { - ttg = powf(ttg, _shapeExponent); + ttg = pow(ttg, _shapeExponent); } ttg *= _time; - ttg = std::max(0.0f, ttg - _sampleTime); + ttg = std::max(0.0, ttg - _sampleTime); ttg /= _time; if (_shapeExponent != 0.0f) { - ttg = powf(ttg, _inverseShapeExponent); + ttg = pow(ttg, _inverseShapeExponent); } - float y = fabsf(difference) - ttg * range; + double y = fabs(difference) - ttg * range; if (difference < 0.0f) { - return _last = std::max(_last - y, sample); + return _last = std::max(_last - y, (double)sample); } - return _last = std::min(_last + y, sample); + return _last = std::min(_last + y, (double)sample); } diff --git a/src/dsp/signal.hpp b/src/dsp/signal.hpp @@ -121,7 +121,7 @@ struct ShapedSlewLimiter { float _time; float _shapeExponent; float _inverseShapeExponent; - float _last = 0.0; + double _last = 0.0; ShapedSlewLimiter(float sampleRate = 1000.0f, float milliseconds = 1.0f, float shape = 1.0f) { setParams(sampleRate, milliseconds, shape);