[FFmpeg-devel] [PATCH 2/2] swresample/resample: speed up Blackman Nuttall filter

Michael Niedermayer michael at niedermayer.cc
Mon Nov 9 23:14:52 CET 2015


On Mon, Nov 09, 2015 at 09:38:44AM -0500, Ganesh Ajjanagadde wrote:
> 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
> 
> Signed-off-by: Ganesh Ajjanagadde <gajjanagadde at gmail.com>
> ---
>  libswresample/resample.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)

LGTM

thanks

[...]
-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

Many that live deserve death. And some that die deserve life. Can you give
it to them? Then do not be too eager to deal out death in judgement. For
even the very wise cannot see all ends. -- Gandalf
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 181 bytes
Desc: Digital signature
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20151109/788c4404/attachment.sig>


More information about the ffmpeg-devel mailing list