Hi all,

  The patch included in this mail speeds up old filter_subband(), and It
seems that same speed-up can be applied to current window_subband(). I
tried to understand how current window_subband() works, but I couldn't.
  Someone, please explain it.

  Naoki


*** filterbank.c~       Mon Nov  8 10:58:50 1999
--- filterbank.c        Sat Apr 29 13:23:56 2000
***************
*** 208,213 ****
--- 208,305 ----
  ************************************************************************/
  
  
+ void idct32(double a[])
+ {
+   /* returns sum_j=0^31 a[j]*cos(PI*j*(k+1/2)/32), 0<=k<32 */
+ 
+   static double costab[] = {
+     0.5006029982351962726 ,0.74453627100229857749,0.5531038960344445421 
+,1.4841646163141661852,
+     
+0.51544730992262455249,0.97256823786196078263,0.62250412303566482475,3.4076084184687189804,
+     
+0.50547095989754364798,0.83934964541552681272,0.58293496820613388554,2.0577810099534108446,
+     0.53104259108978413284,1.1694399334328846596 ,0.674808341455005678  
+,10.19000812354803287 ,
+     0.5024192861881556782 
+,0.78815462345125020249,0.56694403481635768927,1.7224470982383341955,
+     0.52249861493968885462,1.0606776859903470633 
+,0.64682178335999007679,5.1011486186891552563,
+     
+0.50979557910415917998,0.89997622313641556513,0.60134488693504528634,2.5629154477415054814,
+     0.54119610014619701222,1.3065629648763763537 ,0.70710678118654746172,
+   };
+ 
+   static unsigned char addtab[] = {
+     1,29,31, 2,  1,25,27, 2,  1,21,23, 2,  1,17,19, 2,  
+     1,13,15, 2,  1, 9,11, 2,  1, 5, 7, 2,  0, 3, 1,     
+     1,27,31, 4,  1,26,30, 4,  1,19,23, 4,  1,18,22, 4,  
+     1,11,15, 4,  1,10,14, 4,  0, 7, 3,     0, 6, 2,     
+     1,23,31, 8,  1,22,30, 8,  1,21,29, 8,  1,20,28, 8,  
+     0,15, 7,     0,14, 6,     0,13, 5,     0,12, 4,     
+     0,31,15,     0,30,14,     0,29,13,     0,28,12,     
+     0,27,11,     0,26,10,     0,25, 9,     0,24, 8,     
+   };
+ 
+   static unsigned char buttab[] = {
+     15,31,30, 14,30,30, 13,29,30, 12,28,30, 
+     11,27,30, 10,26,30,  9,25,30,  8,24,30, 
+      7,23,30,  6,22,30,  5,21,30,  4,20,30, 
+      3,19,30,  2,18,30,  1,17,30,  0,16,30, 
+     23,15,29, 22,14,29, 21,13,29, 20,12,29, 
+     19,11,29, 18,10,29, 17, 9,29, 16, 8,29, 
+      7,31,28,  6,30,28,  5,29,28,  4,28,28, 
+      3,27,28,  2,26,28,  1,25,28,  0,24,28, 
+     27, 7,27, 26, 6,27, 25, 5,27, 24, 4,27, 
+     19,15,26, 18,14,26, 17,13,26, 16,12,26, 
+     11,23,25, 10,22,25,  9,21,25,  8,20,25, 
+      3,31,24,  2,30,24,  1,29,24,  0,28,24, 
+     29, 3,23, 28, 2,23, 25, 7,22, 24, 6,22, 
+     21,11,21, 20,10,21, 17,15,20, 16,14,20, 
+     13,19,19, 12,18,19,  9,23,18,  8,22,18, 
+      5,27,17,  4,26,17,  1,31,16,  0,30,16, 
+     30, 1,15, 28, 3,14, 26, 5,13, 24, 7,12, 
+     22, 9,11, 20,11,10, 18,13, 9, 16,15, 8, 
+     14,17, 7, 12,19, 6, 10,21, 5,  8,23, 4, 
+      6,25, 3,  4,27, 2,  2,29, 1,  0,31, 0, 
+   };
+ 
+   static unsigned char swaptab[] = {
+      1,16,  2, 8,  3,24,  5,20,
+      6,12,  7,28,  9,18, 11,26,
+     13,22, 15,30, 19,25, 23,29,
+   };
+ 
+   int i;
+   unsigned char *p;
+ 
+   p = addtab;
+   for(i=0;i<32;i++)
+     {
+       if (p[0]) {
+       a[p[2]] = -a[p[2]] - a[p[1]];
+       a[p[1]] += a[p[1] - p[3]];
+       p += 4;
+       } else {
+       a[p[1]] = -a[p[1]] - a[p[2]];
+       p += 3;
+       }
+     }
+ 
+   p = buttab;
+   for(i=0;i<80;i++)
+     {
+       double xr;
+       xr = a[p[1]]*costab[p[2]];
+       a[p[1]] = (a[p[0]] - xr);
+       a[p[0]] = (a[p[0]] + xr);
+       p += 3;
+     }
+ 
+   p = swaptab;
+   for(i=0;i<12;i++)
+     {
+       double xr;
+       xr = a[p[0]];
+       a[p[0]] = a[p[1]];
+       a[p[1]] = xr;
+       p += 2;
+     }
+ }
+ 
  void filter_subband(double z[64], double s[SBLIMIT]) {
  
     double yprime[32];
***************
*** 217,222 ****
--- 309,315 ----
     
     double s0,s1;
  
+ #if 0
     if(!init) {
        init=1;
        for (i=0; i<16; i++)  for (j=0; j<32; j++)
***************
*** 240,245 ****
--- 333,349 ----
       s[31-i] = s0-s1;
  
       }
+ #else
+   s[0] = z[16];
+ 
+   for(i=1;i<=16;i++)
+     s[i] = z[i+16]+z[16-i];
+ 
+   for(i=17;i<=31;i++)
+     s[i] = z[i+16]-z[80-i];
+ 
+   idct32(s);
+ #endif
  
     }
  


--
Naoki Shibata   e-mail: [EMAIL PROTECTED]

--
MP3 ENCODER mailing list ( http://geek.rcc.se/mp3encoder/ )

Reply via email to