diff mbox series

[FFmpeg-devel,2/6] avfilter/asrc_sinc: Use av_bessel_i0()

Message ID 20230522233601.20552-2-michael@niedermayer.cc
State New
Headers show
Series [FFmpeg-devel,1/6] Move bessel_i0() from swresample/resample to avutil/mathematics | expand

Checks

Context Check Description
andriy/make_x86 success Make finished
andriy/make_fate_x86 success Make fate finished

Commit Message

Michael Niedermayer May 22, 2023, 11:35 p.m. UTC
The new function is much more precise
For default beta it is slightly slower, but its speed is already at the
worst case in that comparison
while the replaced function becomes much slower for larger beta

Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
---
 libavfilter/asrc_sinc.c | 21 ++-------------------
 1 file changed, 2 insertions(+), 19 deletions(-)
diff mbox series

Patch

diff --git a/libavfilter/asrc_sinc.c b/libavfilter/asrc_sinc.c
index 258f7a139e..ba22f69889 100644
--- a/libavfilter/asrc_sinc.c
+++ b/libavfilter/asrc_sinc.c
@@ -91,43 +91,26 @@  static int query_formats(AVFilterContext *ctx)
     return ff_set_common_samplerates_from_list(ctx, sample_rates);
 }
 
-static float bessel_I_0(float x)
-{
-    float term = 1, sum = 1, last_sum, x2 = x / 2;
-    int i = 1;
-
-    do {
-        float y = x2 / i++;
-
-        last_sum = sum;
-        sum += term *= y * y;
-    } while (sum != last_sum);
-
-    return sum;
-}
-
 static float *make_lpf(int num_taps, float Fc, float beta, float rho,
                        float scale, int dc_norm)
 {
     int i, m = num_taps - 1;
     float *h = av_calloc(num_taps, sizeof(*h)), sum = 0;
-    float mult = scale / bessel_I_0(beta), mult1 = 1.f / (.5f * m + rho);
+    float mult = scale / av_bessel_i0(beta), mult1 = 1.f / (.5f * m + rho);
 
     if (!h)
         return NULL;
 
     av_assert0(Fc >= 0 && Fc <= 1);
-
     for (i = 0; i <= m / 2; i++) {
         float z = i - .5f * m, x = z * M_PI, y = z * mult1;
         h[i] = x ? sinf(Fc * x) / x : Fc;
-        sum += h[i] *= bessel_I_0(beta * sqrtf(1.f - y * y)) * mult;
+        sum += h[i] *= av_bessel_i0(beta * sqrtf(1.f - y * y)) * mult;
         if (m - i != i) {
             h[m - i] = h[i];
             sum += h[i];
         }
     }
-
     for (i = 0; dc_norm && i < num_taps; i++)
         h[i] *= scale / sum;