1
0

Squared gain when using double-smoothing

This commit is contained in:
Geraint 2025-06-23 08:48:54 +01:00
parent 5bfcf6f151
commit 64c739b4fc

View File

@ -116,6 +116,7 @@ struct LimiterSTFX : public BaseEffect {
void reset() {
multiBuffer.reset();
for (auto &e : channelEnvelopes) e.reset();
sqrtWet = (smoothingStages > 1);
}
int latencySamples() const {
@ -134,8 +135,9 @@ struct LimiterSTFX : public BaseEffect {
int attackSamples = delaySamplesTo;
int holdSamples = std::ceil(holdMs*0.001*sampleRate);
Sample releaseSamples = releaseMs*0.001*sampleRate;
Sample releaseSamples = releaseMs*0.001*sampleRate*smoothingStages;
int stages = smoothingStages;
sqrtWetSlew = 1/(Sample(attackSamples)*2 + 1);
for (auto &envelope : channelEnvelopes) {
envelope.peakHold.set(attackSamples + holdSamples);
@ -168,9 +170,16 @@ struct LimiterSTFX : public BaseEffect {
Sample gain = channelGains[c];
// blend between individual/minimum gain
gain += (minChannelGain - gain)*linkChannels;
if (smoothingStages > 1) {
gain *= gain;
sqrtWet += (1 - sqrtWet)*sqrtWetSlew;
} else {
sqrtWet *= 1 - sqrtWetSlew;
}
// smooth envelope gain
auto &envelope = channelEnvelopes[c];
gain = envelope(gain);
if (sqrtWet > Sample(1e-30)) gain += (std::sqrt(gain) - gain)*sqrtWet;
Sample delayed = block.fade(i,
multiBuffer[c][i - delaySamplesFrom],
@ -185,6 +194,7 @@ struct LimiterSTFX : public BaseEffect {
private:
int channels = 0;
double maxDelayMs = 0;
Sample sqrtWet = 0, sqrtWetSlew = 1;
signalsmith::delay::MultiBuffer<Sample> multiBuffer;
};