feat: add soft clipping mode
This commit is contained in:
parent
556519a750
commit
e7ff4fcc18
5 changed files with 45 additions and 13 deletions
|
|
@ -1,10 +1,12 @@
|
|||
#include "Clipper.hpp"
|
||||
#include <cmath>
|
||||
|
||||
Clipper::Clipper(float init_clip) : clip_(init_clip) {}
|
||||
Clipper::Clipper(float init_clip, ClipperMode init_mode)
|
||||
: clip_(init_clip), mode_(init_mode) {}
|
||||
|
||||
void Clipper::process(const float *in, float *out, uint32_t frames) {
|
||||
for (uint32_t i = 0; i < frames; ++i) {
|
||||
out[i] = in[i] > clip_ ? clip_ : in[i];
|
||||
out[i] = clip(in[i]);
|
||||
}
|
||||
}
|
||||
void Clipper::processStereo(const float *inLeft, const float *inRight,
|
||||
|
|
@ -16,11 +18,20 @@ void Clipper::processStereo(const float *inLeft, const float *inRight,
|
|||
}
|
||||
|
||||
float Clipper::clip(const float in) {
|
||||
float out = in;
|
||||
if (in > 0) {
|
||||
out = in > clip_ ? clip_ : in;
|
||||
} else {
|
||||
out = in < -clip_ ? -clip_ : in;
|
||||
switch (mode_) {
|
||||
default:
|
||||
case kClipperModeHard: {
|
||||
float out = in;
|
||||
if (in > 0) {
|
||||
out = in > clip_ ? clip_ : in;
|
||||
} else {
|
||||
out = in < -clip_ ? -clip_ : in;
|
||||
}
|
||||
return out;
|
||||
}
|
||||
case kClipperModeSoft: {
|
||||
float normalized = (in / clip_) * 0.75f;
|
||||
return std::tanh(normalized) * clip_;
|
||||
}
|
||||
}
|
||||
return out;
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue