summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartijn van Beurden <mvanb1@gmail.com>2022-10-07 11:13:25 +0200
committerMartijn van Beurden <mvanb1@gmail.com>2022-10-12 20:37:18 +0200
commit039586e909747815e33641f421fb5613e851c5c0 (patch)
tree768b4a4546bdf2f29c20fc9791546c1c1a617b71
parent06769de2412e243338dbe2fc7bc2ead48ac469e8 (diff)
downloadflac-039586e909747815e33641f421fb5613e851c5c0.tar.gz
Make autocorrelation calculation easier to vectorize
-rw-r--r--src/libFLAC/lpc.c55
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];
+ }
}
}