feat: add soft clipping mode

This commit is contained in:
Liam Kerr 2026-08-02 22:58:56 +01:00
parent 556519a750
commit e7ff4fcc18
5 changed files with 45 additions and 13 deletions

View file

@ -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;
}

View file

@ -5,7 +5,9 @@
class Clipper {
public:
Clipper(float init_clip = 1.0f);
enum ClipperMode { kClipperModeSoft, kClipperModeHard, kClipperModeCount };
Clipper(float init_clip = 1.0f, ClipperMode mode = kClipperModeSoft);
void process(const float *in, float *out, uint32_t frames);
void processStereo(const float *inLeft, const float *inRight, float *outLeft,
@ -14,10 +16,13 @@ public:
private:
float clip_;
float clip(const float in);
ClipperMode mode_;
public:
void setGain(float c) { clip_ = c; }
float getGain() const { return clip_; }
void setMode(ClipperMode m) { mode_ = m; }
ClipperMode getMode() const { return mode_; }
};
#endif // CLIPPER_HPP_INCLUDED