swresample/resample: speed up build_filter for Blackman-Nuttall filter
authorGanesh Ajjanagadde <gajjanagadde@gmail.com>
Thu, 5 Nov 2015 03:02:13 +0000 (22:02 -0500)
committerGanesh Ajjanagadde <gajjanagadde@gmail.com>
Fri, 6 Nov 2015 02:52:40 +0000 (21:52 -0500)
commitc8780822bacc38a8d84c882d564b07dd152366ed
tree594963f040c580cdd41a64fdfced3d555d039575
parent7d6a4797f17f29ed6f48eecbf9c50ae99a8fb04d
swresample/resample: speed up build_filter for Blackman-Nuttall filter

This uses the trigonometric double and triple angle formulae to avoid
repeated (expensive) evaluation of libc's cos().

Sample benchmark (x86-64, Haswell, GNU/Linux)
test: fate-swr-resample-dblp-44100-2626
old:
1104466600 decicycles in build_filter(loop 1000),     256 runs,      0 skips
1096765286 decicycles in build_filter(loop 1000),     512 runs,      0 skips
1070479590 decicycles in build_filter(loop 1000),    1024 runs,      0 skips

new:
588861423 decicycles in build_filter(loop 1000),     256 runs,      0 skips
591262754 decicycles in build_filter(loop 1000),     512 runs,      0 skips
577355145 decicycles in build_filter(loop 1000),    1024 runs,      0 skips

This results in small differences with the old expression:
difference (worst case on [0, 2*M_PI]), argmax 0.008:
max diff (relative): 0.000000000000157289807188
blackman_old(0.008): 0.000363951585488813192382
blackman_new(0.008): 0.000363951585488755946507

These are judged to be insignificant for the performance gain. PSNR to
reference file is unchanged up to second decimal point for instance.

Reviewed-by: Michael Niedermayer <michael@niedermayer.cc>
Signed-off-by: Ganesh Ajjanagadde <gajjanagadde@gmail.com>
libswresample/resample.c