From 68d30f9c8d8571acf43a39caffc7d5b64ed9f253 Mon Sep 17 00:00:00 2001 From: reuk Date: Fri, 5 Mar 2021 19:00:23 +0000 Subject: [PATCH] Convolution: Compensate for volume changes when resampling IRs When normalisation is disabled, the Convolution will now adjust the gain of the IR using the ratio of the source and destination sampling rates. This should keep the output level constant when the Convolution's sampling rate is changed. --- modules/juce_dsp/frequency/juce_Convolution.cpp | 2 ++ modules/juce_dsp/frequency/juce_Convolution_test.cpp | 7 +++++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/modules/juce_dsp/frequency/juce_Convolution.cpp b/modules/juce_dsp/frequency/juce_Convolution.cpp index 6fb58f1196..706813e754 100644 --- a/modules/juce_dsp/frequency/juce_Convolution.cpp +++ b/modules/juce_dsp/frequency/juce_Convolution.cpp @@ -781,6 +781,8 @@ private: if (wantsNormalise == Convolution::Normalise::yes) normaliseImpulseResponse (resampled); + else + resampled.applyGain ((float) (originalSampleRate / processSpec.sampleRate)); const auto currentLatency = jmax (processSpec.maximumBlockSize, (uint32) latency.latencyInSamples); const auto maxBufferSize = shouldBeZeroLatency ? static_cast (processSpec.maximumBlockSize) diff --git a/modules/juce_dsp/frequency/juce_Convolution_test.cpp b/modules/juce_dsp/frequency/juce_Convolution_test.cpp index af93b73702..0cbd97d0d7 100644 --- a/modules/juce_dsp/frequency/juce_Convolution_test.cpp +++ b/modules/juce_dsp/frequency/juce_Convolution_test.cpp @@ -514,6 +514,9 @@ public: AudioBuffer result (original.getNumChannels(), finalSize); resamplingSource.getNextAudioBlock ({ &result, 0, result.getNumSamples() }); + + result.applyGain ((float) resampleRatio); + return result; }(); @@ -550,10 +553,10 @@ public: const auto ramp = makeRamp (static_cast (spec.maximumBlockSize) * 8); using BlockSize = decltype (spec.maximumBlockSize); - for (auto latency : { /*static_cast (0), + for (auto latency : { static_cast (0), spec.maximumBlockSize / 3, spec.maximumBlockSize, - spec.maximumBlockSize * 2, */ + spec.maximumBlockSize * 2, static_cast (spec.maximumBlockSize * 2.5) }) { testConvolution (spec,