diff ac3enc.c @ 3269:c925a46f7594 libavcodec

Patch to generate the ac3 window, based on code by Justin Ruggles.
author banan
date Sat, 22 Apr 2006 21:21:16 +0000
parents 8d42d21e570c
children 894ef0dba687
line wrap: on
line diff
--- a/ac3enc.c	Fri Apr 21 19:22:14 2006 +0000
+++ b/ac3enc.c	Sat Apr 22 21:21:16 2006 +0000
@@ -81,6 +81,51 @@
     return v;
 }
 
+
+/**
+ * Generate a Kaiser Window.
+ */
+static void k_window_init(int alpha, double *window, int n, int iter)
+{
+    int j, k;
+    double a, x;
+    a = alpha * M_PI / n;
+    a = a*a;
+    for(k=0; k<n; k++) {
+        x = k * (n - k) * a;
+        window[k] = 1.0;
+        for(j=iter; j>0; j--) {
+            window[k] = (window[k] * x / (j*j)) + 1.0;
+        }
+    }
+}
+
+/**
+ * Generate a Kaiser-Bessel Derived Window.
+ * @param alpha  determines window shape
+ * @param window array to fill with window values
+ * @param iter   number of iterations to use in BesselI0
+ */
+
+static void kbd_window_init(int alpha, int16_t *out_window, int iter)
+{
+    int k, n2;
+    double kwindow[256];
+    double window[256];
+
+    n2 = 256;
+    k_window_init(alpha, kwindow, n2, iter);
+    window[0] = kwindow[0];
+    for(k=1; k<n2; k++) {
+        window[k] = window[k-1] + kwindow[k];
+    }
+    for(k=0; k<n2; k++) {
+        window[k] = sqrt(window[k] / (window[n2-1]+1));
+        //out_window[k] = round(window[k]*((1<<15)-1)); //enable this for a rounded window
+        out_window[k] = fix15(window[k]);
+    }
+}
+
 static inline int calc_lowcomp1(int a, int b0, int b1)
 {
     if ((b0 + 256) == b1) {
@@ -882,6 +927,8 @@
     ac3_common_init();
 
     /* mdct init */
+    kbd_window_init(5.0, ac3_window, 50);
+
     fft_init(MDCT_NBITS - 2);
     for(i=0;i<N/4;i++) {
         alpha = 2 * M_PI * (i + 1.0 / 8.0) / (float)N;