• Ganesh Ajjanagadde's avatar
    swresample/resample: speed up Blackman Nuttall filter · cf491a92
    Ganesh Ajjanagadde authored
    This may be a slightly surprising optimization, but is actually based on
    an understanding of how math libraries compute trigonometric functions.
    Explanation is given here so that future development uses libm more effectively
    across the codebase.
    
    All libm's essentially compute transcendental functions via some kind of
    polynomial approximation, be it Taylor-Maclaurin or Chebyshev.
    Correction terms are added via polynomial correction factors when needed
    to squeeze out the last bits of accuracy. Lookup tables are also
    inserted strategically.
    
    In the case of trigonometric functions, periodicity is exploited via
    first doing a range reduction to an interval around zero, and then using
    some polynomial approximation.
    
    This range reduction is the most natural way of doing things - else one
    would need polynomials for ranges in different periods which makes no
    sense whatsoever.
    
    To avoid the need for the range reduction, it is helpful to feed in
    arguments as close to the origin as possible for the trigonometric
    functions. In fact, this also makes sense from an accuracy point of view:
    IEEE floating point has far more resolution for small numbers than big ones.
    
    This patch does this for the Blackman-Nuttall filter, and yields a
    non-negligible speedup.
    
    Sample benchmark (x86-64, Haswell, GNU/Linux)
    test: fate-swr-resample-dblp-2626-44100
    old:
    18893514 decicycles in build_filter (loop 1000),     256 runs,      0 skips
    18599863 decicycles in build_filter (loop 1000),     512 runs,      0 skips
    18445574 decicycles in build_filter (loop 1000),    1000 runs,     24 skips
    
    new:
    16290697 decicycles in build_filter (loop 1000),     256 runs,      0 skips
    16267172 decicycles in build_filter (loop 1000),     512 runs,      0 skips
    16251105 decicycles in build_filter (loop 1000),    1000 runs,     24 skips
    Reviewed-by: 's avatarMichael Niedermayer <michael@niedermayer.cc>
    Signed-off-by: 's avatarGanesh Ajjanagadde <gajjanagadde@gmail.com>
    cf491a92
Name
Last commit
Last update
..
aarch64 Loading commit data...
arm Loading commit data...
x86 Loading commit data...
Makefile Loading commit data...
audioconvert.c Loading commit data...
audioconvert.h Loading commit data...
dither.c Loading commit data...
dither_template.c Loading commit data...
libswresample.v Loading commit data...
log2_tab.c Loading commit data...
noise_shaping_data.c Loading commit data...
options.c Loading commit data...
rematrix.c Loading commit data...
rematrix_template.c Loading commit data...
resample.c Loading commit data...
resample.h Loading commit data...
resample_dsp.c Loading commit data...
resample_template.c Loading commit data...
soxr_resample.c Loading commit data...
swresample-test.c Loading commit data...
swresample.c Loading commit data...
swresample.h Loading commit data...
swresample_frame.c Loading commit data...
swresample_internal.h Loading commit data...
swresampleres.rc Loading commit data...
version.h Loading commit data...