diff options
author | Martijn van Beurden <mvanb1@gmail.com> | 2022-10-07 11:13:25 +0200 |
---|---|---|
committer | Martijn van Beurden <mvanb1@gmail.com> | 2022-10-12 20:37:18 +0200 |
commit | 039586e909747815e33641f421fb5613e851c5c0 (patch) | |
tree | 768b4a4546bdf2f29c20fc9791546c1c1a617b71 | |
parent | 06769de2412e243338dbe2fc7bc2ead48ac469e8 (diff) | |
download | flac-039586e909747815e33641f421fb5613e851c5c0.tar.gz |
Make autocorrelation calculation easier to vectorize
-rw-r--r-- | src/libFLAC/lpc.c | 55 |
1 files changed, 36 insertions, 19 deletions
diff --git a/src/libFLAC/lpc.c b/src/libFLAC/lpc.c index a090a877..1814fef5 100644 --- a/src/libFLAC/lpc.c +++ b/src/libFLAC/lpc.c @@ -130,29 +130,46 @@ void FLAC__lpc_compute_autocorrelation(const FLAC__real data[], uint32_t data_le autoc[lag] = d; } #endif + if(lag <= 8) { + #undef MAX_LAG + #define MAX_LAG 8 + #include "deduplication/lpc_compute_autocorrelation_intrin.c" + } + else if(lag <= 12) { + #undef MAX_LAG + #define MAX_LAG 12 + #include "deduplication/lpc_compute_autocorrelation_intrin.c" + } + else if(lag <= 16) { + #undef MAX_LAG + #define MAX_LAG 16 + #include "deduplication/lpc_compute_autocorrelation_intrin.c" + } + else { - /* - * this version tends to run faster because of better data locality - * ('data_len' is usually much larger than 'lag') - */ - double d; - uint32_t sample, coeff; - const uint32_t limit = data_len - lag; + /* + * this version tends to run faster because of better data locality + * ('data_len' is usually much larger than 'lag') + */ + double d; + uint32_t sample, coeff; + const uint32_t limit = data_len - lag; - FLAC__ASSERT(lag > 0); - FLAC__ASSERT(lag <= data_len); + FLAC__ASSERT(lag > 0); + FLAC__ASSERT(lag <= data_len); - for(coeff = 0; coeff < lag; coeff++) - autoc[coeff] = 0.0; - for(sample = 0; sample <= limit; sample++) { - d = data[sample]; for(coeff = 0; coeff < lag; coeff++) - autoc[coeff] += d * data[sample+coeff]; - } - for(; sample < data_len; sample++) { - d = data[sample]; - for(coeff = 0; coeff < data_len - sample; coeff++) - autoc[coeff] += d * data[sample+coeff]; + autoc[coeff] = 0.0; + for(sample = 0; sample <= limit; sample++) { + d = data[sample]; + for(coeff = 0; coeff < lag; coeff++) + autoc[coeff] += d * data[sample+coeff]; + } + for(; sample < data_len; sample++) { + d = data[sample]; + for(coeff = 0; coeff < data_len - sample; coeff++) + autoc[coeff] += d * data[sample+coeff]; + } } } |