--- a/video/out/filter_kernels.c	2024-04-26 11:14:00.377199103 +0800
+++ b/video/out/filter_kernels.c	2024-04-26 11:13:50.217202856 +0800
@@ -32,6 +32,31 @@

 // NOTE: all filters are designed for discrete convolution

+double factorial(int n) {
+    if (n == 0)
+        return 1;
+    else
+        return n * factorial(n - 1);
+}
+
+double power(double base, int exponent) {
+    double result = 1.0;
+    for (int i = 0; i < exponent; i++) {
+        result *= base;
+    }
+    return result;
+}
+
+double BesselJ1(double x) {
+    double result = 0.0;
+    for (int n = 0; n <= 10; n++) {
+        result += power(-1, n) * power(x / 2.0, 2 * n + 1) / (factorial(n) * factorial(n + 1));
+    }
+    return result;
+}
+
+
+
 const struct filter_window *mp_find_filter_window(const char *name)
 {
     if (!name)
@@ -324,7 +349,7 @@
     if (fabs(x) < 1e-8)
         return 1.0;
     x *= M_PI;
-    return 2.0 * j1(x) / x;
+    return 2.0 * BesselJ1(x) / x;
 }

 static double sphinx(params *p, double x)
