From 73854e9ec9824bdfc433db70065dfe2dafeba878 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Thu, 26 Aug 2021 17:16:36 +0200 Subject: [PATCH] filter-chain: improve convolver Make the input buffer a little larger and leave the top blockSize samples zero. That way we can fill up the lower part, leave the upper part zero padded and feed this to the fft directly. Also only clear the lower part when we can't fill it completely. This removes some memcpy and memset operations. --- src/modules/module-filter-chain/convolver.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/modules/module-filter-chain/convolver.c b/src/modules/module-filter-chain/convolver.c index c87cd70ad..24dd2e50e 100644 --- a/src/modules/module-filter-chain/convolver.c +++ b/src/modules/module-filter-chain/convolver.c @@ -189,7 +189,7 @@ static struct convolver1 *convolver1_new(int block, const float *ir, int irlen) fft_cpx_init(&conv->pre_mult, conv->fftComplexSize); fft_cpx_init(&conv->conv, conv->fftComplexSize); conv->overlap = fft_alloc(sizeof(float) * conv->blockSize); - conv->inputBuffer = fft_alloc(sizeof(float) * conv->blockSize); + conv->inputBuffer = fft_alloc(sizeof(float) * conv->segSize); conv->inputBufferFill = 0; conv->current = 0; @@ -229,11 +229,11 @@ static int convolver1_run(struct convolver1 *conv, const float *input, float *ou const int inputBufferPos = conv->inputBufferFill; memcpy(conv->inputBuffer + inputBufferPos, input + processed, processing * sizeof(float)); + if (inputBufferPos == 0 && processing < conv->blockSize) + memset(conv->inputBuffer + processing, 0, + sizeof(float) * (conv->blockSize - processing)); - memcpy(conv->fft_buffer, conv->inputBuffer, conv->blockSize * sizeof(float)); - memset(conv->fft_buffer + conv->blockSize, 0, (conv->segSize - conv->blockSize) * sizeof(float)); - - fft_run(conv->fft, conv->fft_buffer, &conv->segments[conv->current]); + fft_run(conv->fft, conv->inputBuffer, &conv->segments[conv->current]); if (conv->inputBufferFill == 0) { fft_cpx_clear(&conv->pre_mult, conv->fftComplexSize); @@ -255,11 +255,11 @@ static int convolver1_run(struct convolver1 *conv, const float *input, float *ou ifft_run(conv->ifft, &conv->conv, conv->fft_buffer); - fft_sum(output + processed, conv->fft_buffer + inputBufferPos, conv->overlap + inputBufferPos, processing); + fft_sum(output + processed, conv->fft_buffer + inputBufferPos, + conv->overlap + inputBufferPos, processing); conv->inputBufferFill += processing; if (conv->inputBufferFill == conv->blockSize) { - memset(conv->inputBuffer, 0, sizeof(float) * conv->blockSize); conv->inputBufferFill = 0; memcpy(conv->overlap, conv->fft_buffer + conv->blockSize, conv->blockSize * sizeof(float));