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:
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);