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;
|
||||
}
|
||||
|
|
@ -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
|
||||
Loading…
Add table
Add a link
Reference in a new issue