diff options
author | Jean-Marc Valin <jmvalin@jmvalin.ca> | 2013-06-13 23:51:58 -0400 |
---|---|---|
committer | Jean-Marc Valin <jmvalin@jmvalin.ca> | 2013-06-13 23:51:58 -0400 |
commit | 4e018b22bb1594daccb29cd6e92cca11809111d2 (patch) | |
tree | 69790771bf6109819b6e4767a54b74bd932e76c3 /celt/pitch.c | |
parent | 39cbc45828cdbb2a74e4bea44a399e3a5b0a4530 (diff) | |
download | opus-4e018b22bb1594daccb29cd6e92cca11809111d2.tar.gz |
SSE optimization of remove_doubling()
Should be trivial to adapt for Neon.
Diffstat (limited to 'celt/pitch.c')
-rw-r--r-- | celt/pitch.c | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/celt/pitch.c b/celt/pitch.c index f8115c2f..025f448d 100644 --- a/celt/pitch.c +++ b/celt/pitch.c @@ -394,6 +394,20 @@ void pitch_search(const opus_val16 * OPUS_RESTRICT x_lp, opus_val16 * OPUS_RESTR RESTORE_STACK; } +#ifndef OVERRIDE_DUAL_INNER_PROD +static opus_val32 dual_inner_prod(opus_val16 *x, opus_val16 *y1, opus_val16 *y2, int N) +{ + int i; + opus_val32 xy=0; + for (i=0;i<N;i++) + { + xy = MAC16_16(xy, x[i], y1[i]); + xy = MAC16_16(xy, x[i], y2[i]); + } + return xy; +} +#endif + static const int second_check[16] = {0, 0, 3, 2, 3, 2, 5, 2, 3, 2, 3, 2, 5, 2, 3, 2}; opus_val16 remove_doubling(opus_val16 *x, int maxperiod, int minperiod, int N, int *T0_, int prev_period, opus_val16 prev_gain) @@ -470,12 +484,7 @@ opus_val16 remove_doubling(opus_val16 *x, int maxperiod, int minperiod, { T1b = (2*second_check[k]*T0+k)/(2*k); } - xy=0; - for (i=0;i<N;i++) - { - xy = MAC16_16(xy, x[i], x[i-T1]); - xy = MAC16_16(xy, x[i], x[i-T1b]); - } + xy = dual_inner_prod(x, &x[-T1], &x[-T1b], N); yy = yy_lookup[T1] + yy_lookup[T1b]; #ifdef FIXED_POINT { |