Index: Source/platform/audio/HRTFPanner.cpp |
diff --git a/Source/platform/audio/HRTFPanner.cpp b/Source/platform/audio/HRTFPanner.cpp |
index bab33c8173f42faf16cff3bb267d22271e99306c..851410a61a04a0459d6627280bdf565679a45b5d 100644 |
--- a/Source/platform/audio/HRTFPanner.cpp |
+++ b/Source/platform/audio/HRTFPanner.cpp |
@@ -75,10 +75,20 @@ HRTFPanner::~HRTFPanner() |
size_t HRTFPanner::fftSizeForSampleRate(float sampleRate) |
{ |
// The HRTF impulse responses (loaded as audio resources) are 512 sample-frames @44.1KHz. |
- // Currently, we truncate the impulse responses to half this size, but an FFT-size of twice impulse response size is needed (for convolution). |
- // So for sample rates around 44.1KHz an FFT size of 512 is good. We double the FFT-size only for sample rates at least double this. |
- ASSERT(sampleRate >= 44100 && sampleRate <= 96000.0); |
- return (sampleRate < 88200.0) ? 512 : 1024; |
+ // Currently, we truncate the impulse responses to half this size, |
+ // but an FFT-size of twice impulse response size is needed (for convolution). |
+ // So for sample rates around 44.1KHz an FFT size of 512 is good. |
+ // For different sample rates, the truncated response is resampled. |
+ // The resampled length is used to compute the FFT size by choosing a power of two that is |
+ // greater than or equal the resampled length. This power of two is doubled to get the actual FFT size. |
+ |
+ ASSERT(sampleRate >= 3000 && sampleRate <= 192000); |
+ |
+ int truncatedImpulseLength = 256; |
+ double sampleRateRatio = sampleRate / 44100; |
+ double resampledLength = truncatedImpulseLength * sampleRateRatio; |
+ |
+ return 2 * (1 << static_cast<unsigned>(log2(resampledLength))); |
} |
void HRTFPanner::reset() |