shithub: aacdec

Download patch

ref: d81e3555e2df1b812f83e267bbcf0644edf4174f
parent: e6651e57c8f32b278a94e36b75ab94ffb193a293
author: menno <menno>
date: Thu Sep 26 15:01:45 EDT 2002

Big cleanup of FFT (completely using complex_t type now)
Changed bitstream reading functions
Reordered huffman decoding a bit

--- a/libfaad/bits.c
+++ b/libfaad/bits.c
@@ -16,7 +16,7 @@
 ** along with this program; if not, write to the Free Software 
 ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 **
-** $Id: bits.c,v 1.8 2002/08/10 19:01:18 menno Exp $
+** $Id: bits.c,v 1.9 2002/09/26 19:01:45 menno Exp $
 **/
 
 #include "common.h"
@@ -42,18 +42,18 @@
 #endif
     ld->bufb = tmp;
 
-    ld->pos = 0;
+    ld->bits_left = 32;
     ld->tail = ((uint32_t*)buffer + 2);
 }
 
 uint32_t faad_get_processed_bits(bitfile *ld)
 {
-    return 8 * (4*(ld->tail - ld->start) - 4) - (32 - ld->pos);
+    return 8 * (4*(ld->tail - ld->start) - 4) - (ld->bits_left);
 }
 
 uint8_t faad_byte_align(bitfile *ld)
 {
-    uint8_t remainder = (uint8_t)(ld->pos % 8);
+    uint8_t remainder = (uint8_t)((32 - ld->bits_left) % 8);
 
     if (remainder)
     {
@@ -63,24 +63,24 @@
     return 0;
 }
 
-uint8_t *faad_getbitbuffer(bitfile *ld, uint16_t bits
+uint8_t *faad_getbitbuffer(bitfile *ld, uint32_t bits
                        DEBUGDEC)
 {
     uint16_t i;
 	uint8_t temp;
-    uint16_t bytes = bits / 8;
-    uint8_t remainder = bits % 8;
+    uint16_t bytes = (uint16_t)bits / 8;
+    uint8_t remainder = (uint8_t)bits % 8;
 
     uint8_t *buffer = (uint8_t*)malloc((bytes+1)*sizeof(uint8_t));
 
     for (i = 0; i < bytes; i++)
     {
-        buffer[i] = faad_getbits(ld, 8 DEBUGVAR(print,var,dbg));
+        buffer[i] = (uint8_t)faad_getbits(ld, 8 DEBUGVAR(print,var,dbg));
     }
 
     if (remainder)
     {
-        temp = faad_getbits(ld, remainder DEBUGVAR(print,var,dbg)) << (8-remainder);
+        temp = (uint8_t)faad_getbits(ld, remainder DEBUGVAR(print,var,dbg)) << (8-remainder);
 
         buffer[bytes] = temp;
     }
--- a/libfaad/bits.h
+++ b/libfaad/bits.h
@@ -16,7 +16,7 @@
 ** along with this program; if not, write to the Free Software 
 ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 **
-** $Id: bits.h,v 1.7 2002/08/07 08:14:31 menno Exp $
+** $Id: bits.h,v 1.8 2002/09/26 19:01:45 menno Exp $
 **/
 
 #ifndef __BITS_H__
@@ -37,64 +37,69 @@
 typedef struct _bitfile
 {
     /* bit input */
-	uint32_t bufa;
-	uint32_t bufb;
-	uint32_t pos;
-	uint32_t *tail;
-	uint32_t *start;
+    uint32_t bufa;
+    uint32_t bufb;
+    uint32_t bits_left;
+    uint32_t *tail;
+    uint32_t *start;
 } bitfile;
 
 
-#if defined(_WIN32)
+#if defined (_WIN32)
 #define BSWAP(a) __asm mov eax,a __asm bswap eax __asm mov a, eax
 #elif defined(LINUX) || defined(DJGPP)
 #define BSWAP(a) __asm__ ( "bswapl %0\n" : "=r" (a) : "0" (a) )
 #else
 #define BSWAP(a) \
-	 ((a) = ( ((a)&0xff)<<24) | (((a)&0xff00)<<8) | (((a)>>8)&0xff00) | (((a)>>24)&0xff))
+    ((a) = ( ((a)&0xff)<<24) | (((a)&0xff00)<<8) | (((a)>>8)&0xff00) | (((a)>>24)&0xff))
 #endif
 
+static uint32_t bitmask[] = {
+    0x0, 0x1, 0x3, 0x7, 0xF, 0x1F, 0x3F, 0x7F, 0xFF, 0x1FF,
+    0x3FF, 0x7FF, 0xFFF, 0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF,
+    0x1FFFF, 0x3FFFF, 0x7FFFF, 0xFFFFF, 0x1FFFFF, 0x3FFFFF,
+    0x7FFFFF, 0xFFFFFF, 0x1FFFFFF, 0x3FFFFFF, 0x7FFFFFF,
+    0xFFFFFFF, 0x1FFFFFFF, 0x3FFFFFFF, 0x7FFFFFFF
+};
 
 void faad_initbits(bitfile *ld, void *buffer);
 uint8_t faad_byte_align(bitfile *ld);
 uint32_t faad_get_processed_bits(bitfile *ld);
-uint8_t *faad_getbitbuffer(bitfile *ld, uint16_t bits
+uint8_t *faad_getbitbuffer(bitfile *ld, uint32_t bits
                        DEBUGDEC);
 
-
-static INLINE uint32_t faad_showbits(bitfile *ld, uint8_t bits)
+static INLINE uint32_t faad_showbits(bitfile *ld, uint32_t bits)
 {
-    int32_t nbit = (bits + ld->pos) - 32;
-    if (nbit > 0) 
+    if (bits <= ld->bits_left)
     {
-        return ((ld->bufa & (0xffffffff >> ld->pos)) << nbit) |
-            (ld->bufb >> (32 - nbit));
+        return (ld->bufa >> (ld->bits_left - bits)) & bitmask[bits];
     } else {
-        return (ld->bufa & (0xffffffff >> ld->pos)) >> (32 - ld->pos - bits);
+        bits -= ld->bits_left;
+        return ((ld->bufa & bitmask[ld->bits_left]) << bits) | (ld->bufb >> (32 - bits));
     }
 }
 
-static INLINE void faad_flushbits(bitfile *ld, uint8_t bits)
+static INLINE void faad_flushbits(bitfile *ld, uint32_t bits)
 {
-	ld->pos += bits;
+    if (bits < ld->bits_left)
+    {
+        ld->bits_left -= bits;
+    } else {
+        uint32_t tmp;
 
-	if (ld->pos >= 32) 
-	{
-		uint32_t tmp;
-
-		ld->bufa = ld->bufb;
-		tmp = *(uint32_t*)ld->tail;
+        ld->bufa = ld->bufb;
+        tmp = *(uint32_t*)ld->tail;
 #ifndef ARCH_IS_BIG_ENDIAN
-		BSWAP(tmp);
+        BSWAP(tmp);
 #endif
-		ld->bufb = tmp;
-		ld->tail++;
-		ld->pos -= 32;
-	}
+        ld->bufb = tmp;
+        ld->tail++;
+        ld->bits_left += (32 - bits);
+    }
 }
 
 /* return next n bits (right adjusted) */
-static INLINE uint32_t faad_getbits(bitfile *ld, uint8_t n DEBUGDEC)
+static INLINE uint32_t faad_getbits(bitfile *ld, uint32_t n DEBUGDEC)
 {
     uint32_t ret;
 
@@ -101,8 +106,8 @@
     if (n == 0)
         return 0;
 
-	ret = faad_showbits(ld, n);
-	faad_flushbits(ld, n);
+    ret = faad_showbits(ld, n);
+    faad_flushbits(ld, n);
 
 #ifdef ANALYSIS
     if (print)
@@ -109,7 +114,7 @@
         fprintf(stdout, "%4d %2d bits, val: %4d, variable: %d %s\n", dbg_count++, n, ret, var, dbg);
 #endif
 
-	return ret;
+    return ret;
 }
 
 static INLINE uint8_t faad_get1bit(bitfile *ld DEBUGDEC)
--- a/libfaad/cfft.c
+++ b/libfaad/cfft.c
@@ -16,19 +16,22 @@
 ** along with this program; if not, write to the Free Software 
 ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 **
-** $Id: cfft.c,v 1.7 2002/09/13 13:08:45 menno Exp $
+** $Id: cfft.c,v 1.8 2002/09/26 19:01:45 menno Exp $
 **/
 
 /*
  * Algorithmically based on Fortran-77 FFTPACK
  * by Paul N. Swarztrauber(Version 4, 1985).
+ *
+ * Does even sized fft only
  */
 
 /* isign is +1 for backward and -1 for forward transforms */
 
-
 #include "common.h"
+
 #include <stdlib.h>
+#include <assert.h>
 
 #include "cfft.h"
 #include "cfft_tab.h"
@@ -35,39 +38,46 @@
 
 
 /*----------------------------------------------------------------------
-   passf2, passf3, passf4, passf5, passf. Complex FFT passes fwd and bwd.
+   passf2, passf3, passf4, passf5. Complex FFT passes fwd and bwd.
   ----------------------------------------------------------------------*/
 
-static void passf2(uint16_t ido, uint16_t l1, real_t *cc, real_t *ch,
-                   real_t *wa1, int8_t isign)
+static void passf2(uint16_t ido, uint16_t l1, complex_t *cc, complex_t *ch,
+                   complex_t *wa, int8_t isign)
 {
     uint16_t i, k, ah, ac;
-    real_t ti2, tr2;
 
-    if (ido <= 2)
+    if (ido == 1)
     {
         for (k = 0; k < l1; k++)
         {
-            ah = k*ido;
-            ac = 2*k*ido;
-            ch[ah] = cc[ac] + cc[ac+ido];
-            ch[ah+ido*l1] = cc[ac] - cc[ac+ido];
-            ch[ah+1] = cc[ac+1] + cc[ac+ido+1];
-            ch[ah+ido*l1+1] = cc[ac+1] - cc[ac+ido+1];
+            ah = 2*k;
+            ac = 4*k;
+
+            RE(ch[ah]) = RE(cc[ac]) + RE(cc[ac+1]);
+            IM(ch[ah]) = IM(cc[ac]) + IM(cc[ac+1]);
+            RE(ch[ah+l1]) = RE(cc[ac]) - RE(cc[ac+1]);
+            IM(ch[ah+l1]) = IM(cc[ac]) - IM(cc[ac+1]);
         }
     } else {
         for (k = 0; k < l1; k++)
         {
-            for (i = 0; i < ido-1; i += 2)
+            ah = k*ido;
+            ac = 2*k*ido;
+
+            for (i = 0; i < ido; i++)
             {
-                ah = i + k*ido;
-                ac = i + 2*k*ido;
-                ch[ah] = cc[ac] + cc[ac+ido];
-                tr2 = cc[ac] - cc[ac+ido];
-                ch[ah+1] = cc[ac+1] + cc[ac+1+ido];
-                ti2 = cc[ac+1] - cc[ac+1+ido];
-                ch[ah+l1*ido+1] = MUL_R_C(ti2,wa1[i]) + MUL_R_C(tr2,wa1[i+1])*isign;
-                ch[ah+l1*ido] = MUL_R_C(tr2,wa1[i]) - MUL_R_C(ti2,wa1[i+1])*isign;
+                complex_t t2;
+
+                RE(ch[ah]) = RE(cc[ac]) + RE(cc[ac+ido]);
+                IM(ch[ah]) = IM(cc[ac]) + IM(cc[ac+ido]);
+
+                RE(t2) = RE(cc[ac]) - RE(cc[ac+ido]);
+                IM(t2) = IM(cc[ac]) - IM(cc[ac+ido]);
+
+                RE(ch[ah+l1*ido]) = MUL_R_C(RE(t2),RE(wa[i])) - MUL_R_C(IM(t2),IM(wa[i]))*isign;
+                IM(ch[ah+l1*ido]) = MUL_R_C(IM(t2),RE(wa[i])) + MUL_R_C(RE(t2),IM(wa[i]))*isign;
+                ah++;
+                ac++;
             }
         }
     }
@@ -74,58 +84,65 @@
 }
 
 
-static void passf3(uint16_t ido, uint16_t l1, real_t *cc, real_t *ch,
-                   real_t *wa1, real_t *wa2, int8_t isign)
+static void passf3(uint16_t ido, uint16_t l1, complex_t *cc, complex_t *ch,
+                   complex_t *wa1, complex_t *wa2, int8_t isign)
 {
     static real_t taur = COEF_CONST(-0.5);
     static real_t taui = COEF_CONST(0.866025403784439);
     uint16_t i, k, ac, ah;
-    real_t ci2, ci3, di2, di3, cr2, cr3, dr2, dr3, ti2, tr2;
+    complex_t c2, c3, d2, d3, t2;
 
-    if (ido == 2)
+    if (ido == 1)
     {
-        for (k = 1; k <= l1; k++)
+        for (k = 0; k < l1; k++)
         {
-            ac = (3*k-2) * ido;
-            tr2 = cc[ac] + cc[ac+ido];
-            cr2 = cc[ac-ido] + MUL_R_C(tr2,taur);
-            ah = (k-1) * ido;
-            ch[ah] = cc[ac-ido] + tr2;
+            ac = 3*k+1;
+            ah = k;
 
-            ti2 = cc[ac+1] + cc[ac+ido+1];
-            ci2 = cc[ac-ido+1] + MUL_R_C(ti2,taur);
-            ch[ah+1] = cc[ac-ido+1] + ti2;
+            RE(t2) = RE(cc[ac]) + RE(cc[ac+1]);
+            IM(t2) = IM(cc[ac]) + IM(cc[ac+1]);
+            RE(c2) = RE(cc[ac-1]) + MUL_R_C(RE(t2),taur);
+            IM(c2) = IM(cc[ac-1]) + MUL_R_C(IM(t2),taur);
 
-            cr3 = MUL_R_C((cc[ac] - cc[ac+ido]), taui)*isign;
-            ci3 = MUL_R_C((cc[ac+1] - cc[ac+ido+1]), taui)*isign;
-            ch[ah+l1*ido] = cr2 - ci3;
-            ch[ah+2*l1*ido] = cr2 + ci3;
-            ch[ah+l1*ido+1] = ci2 + cr3;
-            ch[ah+2*l1*ido+1] = ci2 - cr3;
+            RE(ch[ah]) = RE(cc[ac-1]) + RE(t2);
+            IM(ch[ah]) = IM(cc[ac-1]) + IM(t2);
+
+            RE(c3) = MUL_R_C((RE(cc[ac]) - RE(cc[ac+1])), taui)*isign;
+            IM(c3) = MUL_R_C((IM(cc[ac]) - IM(cc[ac+1])), taui)*isign;
+
+            RE(ch[ah+l1]) = RE(c2) - IM(c3);
+            IM(ch[ah+l1]) = IM(c2) + RE(c3);
+            RE(ch[ah+2*l1]) = RE(c2) + IM(c3);
+            IM(ch[ah+2*l1]) = IM(c2) - RE(c3);
         }
     } else {
-        for (k = 1; k <= l1; k++)
+        for (k = 0; k < l1; k++)
         {
-            for (i = 0; i < ido-1; i += 2)
+            for (i = 0; i < ido; i++)
             {
-                ac = i + (3*k-2) * ido;
-                tr2 = cc[ac] + cc[ac+ido];
-                cr2 = cc[ac-ido] + MUL_R_C(tr2,taur);
-                ah = i + (k-1) * ido;
-                ch[ah] = cc[ac-ido] + tr2;
-                ti2 = cc[ac+1] + cc[ac+ido+1];
-                ci2 = cc[ac-ido+1] + MUL_R_C(ti2,taur);
-                ch[ah+1] = cc[ac-ido+1] + ti2;
-                cr3 = MUL_R_C((cc[ac] - cc[ac+ido]), taui)*isign;
-                ci3 = MUL_R_C((cc[ac+1] - cc[ac+ido+1]), taui)*isign;
-                dr2 = cr2 - ci3;
-                dr3 = cr2 + ci3;
-                di2 = ci2 + cr3;
-                di3 = ci2 - cr3;
-                ch[ah+l1*ido+1] = MUL_R_C(di2,wa1[i]) + MUL_R_C(dr2,wa1[i+1])*isign;
-                ch[ah+l1*ido] = MUL_R_C(dr2,wa1[i]) - MUL_R_C(di2,wa1[i+1])*isign;
-                ch[ah+2*l1*ido+1] = MUL_R_C(di3,wa2[i]) + MUL_R_C(dr3,wa2[i+1])*isign;
-                ch[ah+2*l1*ido] = MUL_R_C(dr3,wa2[i]) - MUL_R_C(di3,wa2[i+1])*isign;
+                ac = i + (3*k+1)*ido;
+                ah = i + k * ido;
+
+                RE(t2) = RE(cc[ac]) + RE(cc[ac+ido]);
+                RE(c2) = RE(cc[ac-ido]) + MUL_R_C(RE(t2),taur);
+                IM(t2) = IM(cc[ac]) + IM(cc[ac+ido]);
+                IM(c2) = IM(cc[ac-ido]) + MUL_R_C(IM(t2),taur);
+
+                RE(ch[ah]) = RE(cc[ac-ido]) + RE(t2);
+                IM(ch[ah]) = IM(cc[ac-ido]) + IM(t2);
+
+                RE(c3) = MUL_R_C((RE(cc[ac]) - RE(cc[ac+ido])), taui)*isign;
+                IM(c3) = MUL_R_C((IM(cc[ac]) - IM(cc[ac+ido])), taui)*isign;
+
+                RE(d2) = RE(c2) - IM(c3);
+                IM(d3) = IM(c2) - RE(c3);
+                RE(d3) = RE(c2) + IM(c3);
+                IM(d2) = IM(c2) + RE(c3);
+
+                RE(ch[ah+l1*ido]) = MUL_R_C(RE(d2),RE(wa1[i])) - MUL_R_C(IM(d2),IM(wa1[i]))*isign;
+                IM(ch[ah+l1*ido]) = MUL_R_C(IM(d2),RE(wa1[i])) + MUL_R_C(RE(d2),IM(wa1[i]))*isign;
+                RE(ch[ah+l1*2*ido]) = MUL_R_C(RE(d3),RE(wa2[i])) - MUL_R_C(IM(d3),IM(wa2[i]))*isign;
+                IM(ch[ah+l1*2*ido]) = MUL_R_C(IM(d3),RE(wa2[i])) + MUL_R_C(RE(d3),IM(wa2[i]))*isign;
             }
         }
     }
@@ -132,65 +149,70 @@
 }
 
 
-static void passf4(uint16_t ido, uint16_t l1, real_t *cc, real_t *ch,
-                   real_t *wa1, real_t *wa2, real_t *wa3, int8_t isign)
+static void passf4(uint16_t ido, uint16_t l1, complex_t *cc, complex_t *ch,
+                   complex_t *wa1, complex_t *wa2, complex_t *wa3, int8_t isign)
 {
     uint16_t i, k, ac, ah;
-    real_t ci2, ci3, ci4, cr2, cr3, cr4, ti1, ti2, ti3, ti4, tr1, tr2,
-        tr3, tr4;
+    complex_t c2, c3, c4, t1, t2, t3, t4;
 
-    if (ido == 2)
+    if (ido == 1)
     {
         for (k = 0; k < l1; k++)
         {
-            ac = 4*k*ido + 1;
-            ti1 = cc[ac] - cc[ac+2*ido];
-            ti2 = cc[ac] + cc[ac+2*ido];
-            tr4 = cc[ac+3*ido] - cc[ac+ido];
-            ti3 = cc[ac+ido] + cc[ac+3*ido];
-            tr1 = cc[ac-1] - cc[ac+2*ido-1];
-            tr2 = cc[ac-1] + cc[ac+2*ido-1];
-            ti4 = cc[ac+ido-1] - cc[ac+3*ido-1];
-            tr3 = cc[ac+ido-1] + cc[ac+3*ido-1];
-            ah = k*ido;
-            ch[ah] = tr2 + tr3;
-            ch[ah+2*l1*ido] = tr2 - tr3;
-            ch[ah+1] = ti2 + ti3;
-            ch[ah+2*l1*ido+1] = ti2 - ti3;
-            ch[ah+l1*ido] = tr1 + tr4*isign;
-            ch[ah+3*l1*ido] = tr1 - tr4*isign;
-            ch[ah+l1*ido+1] = ti1 + ti4*isign;
-            ch[ah+3*l1*ido+1] = ti1 - ti4*isign;
+            ac = 4*k;
+            ah = k;
+
+            RE(t2) = RE(cc[ac]) + RE(cc[ac+2]);
+            IM(t2) = IM(cc[ac]) + IM(cc[ac+2]);
+            RE(t3) = RE(cc[ac+1]) + RE(cc[ac+3]);
+            IM(t3) = IM(cc[ac+1]) + IM(cc[ac+3]);
+            RE(t1) = RE(cc[ac]) - RE(cc[ac+2]);
+            IM(t1) = IM(cc[ac]) - IM(cc[ac+2]);
+            RE(t4) = IM(cc[ac+3]) - IM(cc[ac+1]);
+            IM(t4) = RE(cc[ac+1]) - RE(cc[ac+3]);
+
+            RE(ch[ah]) = RE(t2) + RE(t3);
+            IM(ch[ah]) = IM(t2) + IM(t3);
+            RE(ch[ah+l1]) = RE(t1) + RE(t4)*isign;
+            IM(ch[ah+l1]) = IM(t1) + IM(t4)*isign;
+            RE(ch[ah+2*l1]) = RE(t2) - RE(t3);
+            IM(ch[ah+2*l1]) = IM(t2) - IM(t3);
+            RE(ch[ah+3*l1]) = RE(t1) - RE(t4)*isign;
+            IM(ch[ah+3*l1]) = IM(t1) - IM(t4)*isign;
         }
     } else {
         for (k = 0; k < l1; k++)
         {
-            for (i = 0; i < ido-1; i += 2)
+            for (i = 0; i < ido; i++)
             {
-                ac = i + 1 + 4*k*ido;
-                ti1 = cc[ac] - cc[ac+2*ido];
-                ti2 = cc[ac] + cc[ac+2*ido];
-                ti3 = cc[ac+ido] + cc[ac+3*ido];
-                tr4 = cc[ac+3*ido] - cc[ac+ido];
-                tr1 = cc[ac-1] - cc[ac+2*ido-1];
-                tr2 = cc[ac-1] + cc[ac+2*ido-1];
-                ti4 = cc[ac+ido-1] - cc[ac+3*ido-1];
-                tr3 = cc[ac+ido-1] + cc[ac+3*ido-1];
+                ac = i + 4*k*ido;
                 ah = i + k*ido;
-                ch[ah] = tr2 + tr3;
-                cr3 = tr2 - tr3;
-                ch[ah+1] = ti2 + ti3;
-                ci3 = ti2 - ti3;
-                cr2 = tr1 + tr4*isign;
-                cr4 = tr1 - tr4*isign;
-                ci2 = ti1 + ti4*isign;
-                ci4 = ti1 - ti4*isign;
-                ch[ah+l1*ido] = MUL_R_C(cr2,wa1[i]) - MUL_R_C(ci2,wa1[i+1])*isign;
-                ch[ah+l1*ido+1] = MUL_R_C(ci2,wa1[i]) + MUL_R_C(cr2,wa1[i+1])*isign;
-                ch[ah+2*l1*ido] = MUL_R_C(cr3,wa2[i]) - MUL_R_C(ci3,wa2[i+1])*isign;
-                ch[ah+2*l1*ido+1] = MUL_R_C(ci3,wa2[i]) + MUL_R_C(cr3,wa2[i+1])*isign;
-                ch[ah+3*l1*ido] = MUL_R_C(cr4,wa3[i]) - MUL_R_C(ci4,wa3[i+1])*isign;
-                ch[ah+3*l1*ido+1] = MUL_R_C(ci4,wa3[i]) + MUL_R_C(cr4,wa3[i+1])*isign;
+
+                RE(t2) = RE(cc[ac]) + RE(cc[ac+2*ido]);
+                IM(t2) = IM(cc[ac]) + IM(cc[ac+2*ido]);
+                RE(t3) = RE(cc[ac+ido]) + RE(cc[ac+3*ido]);
+                IM(t3) = IM(cc[ac+ido]) + IM(cc[ac+3*ido]);
+                RE(t1) = RE(cc[ac]) - RE(cc[ac+2*ido]);
+                IM(t1) = IM(cc[ac]) - IM(cc[ac+2*ido]);
+                RE(t4) = IM(cc[ac+3*ido]) - IM(cc[ac+ido]);
+                IM(t4) = RE(cc[ac+ido]) - RE(cc[ac+3*ido]);
+
+                RE(ch[ah]) = RE(t2) + RE(t3);
+                IM(ch[ah]) = IM(t2) + IM(t3);
+
+                RE(c2) = RE(t1) + RE(t4)*isign;
+                IM(c2) = IM(t1) + IM(t4)*isign;
+                RE(c3) = RE(t2) - RE(t3);
+                IM(c3) = IM(t2) - IM(t3);
+                RE(c4) = RE(t1) - RE(t4)*isign;
+                IM(c4) = IM(t1) - IM(t4)*isign;
+
+                RE(ch[ah+l1*ido]) = MUL_R_C(RE(c2),RE(wa1[i])) - MUL_R_C(IM(c2),IM(wa1[i]))*isign;
+                IM(ch[ah+l1*ido]) = MUL_R_C(IM(c2),RE(wa1[i])) + MUL_R_C(RE(c2),IM(wa1[i]))*isign;
+                RE(ch[ah+2*l1*ido]) = MUL_R_C(RE(c3),RE(wa2[i])) - MUL_R_C(IM(c3),IM(wa2[i]))*isign;
+                IM(ch[ah+2*l1*ido]) = MUL_R_C(IM(c3),RE(wa2[i])) + MUL_R_C(RE(c3),IM(wa2[i]))*isign;
+                RE(ch[ah+3*l1*ido]) = MUL_R_C(RE(c4),RE(wa3[i])) - MUL_R_C(IM(c4),IM(wa3[i]))*isign;
+                IM(ch[ah+3*l1*ido]) = MUL_R_C(IM(c4),RE(wa3[i])) + MUL_R_C(RE(c4),IM(wa3[i]))*isign;
             }
         }
     }
@@ -197,8 +219,8 @@
 }
 
 
-static void passf5(uint16_t ido, uint16_t l1, real_t *cc, real_t *ch,
-                   real_t *wa1, real_t *wa2, real_t *wa3, real_t *wa4,
+static void passf5(uint16_t ido, uint16_t l1, complex_t *cc, complex_t *ch,
+                   complex_t *wa1, complex_t *wa2, complex_t *wa3, complex_t *wa4,
                    int8_t isign)
 {
     static real_t tr11 = COEF_CONST(0.309016994374947);
@@ -206,276 +228,107 @@
     static real_t tr12 = COEF_CONST(-0.809016994374947);
     static real_t ti12 = COEF_CONST(0.587785252292473);
     uint16_t i, k, ac, ah;
-    real_t ci2, ci3, ci4, ci5, di3, di4, di5, di2, cr2, cr3, cr5, cr4,
-        ti2, ti3, ti4, ti5, dr3, dr4, dr5, dr2, tr2, tr3, tr4, tr5;
+    complex_t c2, c3, c4, c5, d3, d4, d5, d2, t2, t3, t4, t5;
 
-    if (ido == 2)
+    if (ido == 1)
     {
-        for (k = 1; k <= l1; ++k)
+        for (k = 0; k < l1; k++)
         {
-            ac = (5*k-4) * ido + 1;
-            ti5 = cc[ac] - cc[ac+3*ido];
-            ti2 = cc[ac] + cc[ac+3*ido];
-            ti4 = cc[ac+ido] - cc[ac+2*ido];
-            ti3 = cc[ac+ido] + cc[ac+2*ido];
-            tr5 = cc[ac-1] - cc[ac+3*ido-1];
-            tr2 = cc[ac-1] + cc[ac+3*ido-1];
-            tr4 = cc[ac+ido-1] - cc[ac+2*ido-1];
-            tr3 = cc[ac+ido-1] + cc[ac+2*ido-1];
-            ah = (k-1) * ido;
-            ch[ah] = cc[ac-ido-1] + tr2 + tr3;
-            ch[ah+1] = cc[ac-ido] + ti2 + ti3;
-            cr2 = cc[ac-ido-1] + MUL_R_C(tr2,tr11) + MUL_R_C(tr3,tr12);
-            ci2 = cc[ac-ido] + MUL_R_C(ti2,tr11) + MUL_R_C(ti3,tr12);
-            cr3 = cc[ac-ido-1] + MUL_R_C(tr2,tr12) + MUL_R_C(tr3,tr11);
-            ci3 = cc[ac-ido] + MUL_R_C(ti2,tr12) + MUL_R_C(ti3,tr11);
-            cr5 = (MUL_R_C(tr5,ti11)*isign + MUL_R_C(tr4,ti12));
-            ci5 = (MUL_R_C(ti5,ti11)*isign + MUL_R_C(ti4,ti12));
-            cr4 = (MUL_R_C(tr5,ti12)*isign - MUL_R_C(tr4,ti11));
-            ci4 = (MUL_R_C(ti5,ti12)*isign - MUL_R_C(ti4,ti11));
-            ch[ah+l1*ido] = cr2 - ci5;
-            ch[ah+4*l1*ido] = cr2 + ci5;
-            ch[ah+l1*ido+1] = ci2 + cr5;
-            ch[ah+2*l1*ido+1]=ci3 + cr4;
-            ch[ah+2*l1*ido] = cr3 - ci4;
-            ch[ah+3*l1*ido] = cr3 + ci4;
-            ch[ah+3*l1*ido+1] = ci3 - cr4;
-            ch[ah+4*l1*ido+1] = ci2 - cr5;
-        }
-    } else {
-        for (k = 1; k <= l1; k++)
-        {
-            for (i = 0; i < ido-1; i += 2)
-            {
-                ac = i + 1 + (k*5-4) * ido;
-                ti5 = cc[ac] - cc[ac+3*ido];
-                ti2 = cc[ac] + cc[ac+3*ido];
-                ti4 = cc[ac+ido] - cc[ac+2*ido];
-                ti3 = cc[ac+ido] + cc[ac+2*ido];
-                tr5 = cc[ac-1] - cc[ac+3*ido-1];
-                tr2 = cc[ac-1] + cc[ac+3*ido-1];
-                tr4 = cc[ac+ido-1] - cc[ac+2*ido-1];
-                tr3 = cc[ac+ido-1] + cc[ac+2*ido-1];
-                ah = i + (k-1) * ido;
-                ch[ah] = cc[ac-ido-1] + tr2 + tr3;
-                ch[ah+1] = cc[ac-ido] + ti2 + ti3;
-                cr2 = cc[ac-ido-1] + MUL_R_C(tr2,tr11) + MUL_R_C(tr3,tr12);
-                ci2 = cc[ac-ido] + MUL_R_C(ti2,tr11) + MUL_R_C(ti3,tr12);
-                cr3 = cc[ac-ido-1] + MUL_R_C(tr2,tr12) + MUL_R_C(tr3,tr11);
-                ci3 = cc[ac-ido] + MUL_R_C(ti2,tr12) + MUL_R_C(ti3,tr11);
-                cr5 = (MUL_R_C(tr5,ti11)*isign + MUL_R_C(tr4,ti12));
-                ci5 = (MUL_R_C(ti5,ti11)*isign + MUL_R_C(ti4,ti12));
-                cr4 = (MUL_R_C(tr5,ti12)*isign - MUL_R_C(tr4,ti11));
-                ci4 = (MUL_R_C(ti5,ti12)*isign - MUL_R_C(ti4,ti11));
-                dr3 = cr3 - ci4;
-                dr4 = cr3 + ci4;
-                di3 = ci3 + cr4;
-                di4 = ci3 - cr4;
-                dr5 = cr2 + ci5;
-                dr2 = cr2 - ci5;
-                di5 = ci2 - cr5;
-                di2 = ci2 + cr5;
-                ch[ah+l1*ido] = MUL_R_C(dr2,wa1[i]) - MUL_R_C(di2,wa1[i+1])*isign;
-                ch[ah+l1*ido+1] = MUL_R_C(di2,wa1[i]) + MUL_R_C(dr2,wa1[i+1])*isign;
-                ch[ah+2*l1*ido] = MUL_R_C(dr3,wa2[i]) - MUL_R_C(di3,wa2[i+1])*isign;
-                ch[ah+2*l1*ido+1] = MUL_R_C(di3,wa2[i]) + MUL_R_C(dr3,wa2[i+1])*isign;
-                ch[ah+3*l1*ido] = MUL_R_C(dr4,wa3[i]) - MUL_R_C(di4,wa3[i+1])*isign;
-                ch[ah+3*l1*ido+1] = MUL_R_C(di4,wa3[i]) + MUL_R_C(dr4,wa3[i+1])*isign;
-                ch[ah+4*l1*ido] = MUL_R_C(dr5,wa4[i]) - MUL_R_C(di5,wa4[i+1])*isign;
-                ch[ah+4*l1*ido+1] = MUL_R_C(di5,wa4[i]) + MUL_R_C(dr5,wa4[i+1])*isign;
-            }
-        }
-    }
-}
+            ac = 5*k + 1;
+            ah = k;
 
+            RE(t2) = RE(cc[ac]) + RE(cc[ac+3]);
+            IM(t2) = IM(cc[ac]) + IM(cc[ac+3]);
+            RE(t3) = RE(cc[ac+1]) + RE(cc[ac+2]);
+            IM(t3) = IM(cc[ac+1]) + IM(cc[ac+2]);
+            RE(t4) = RE(cc[ac+1]) - RE(cc[ac+2]);
+            IM(t4) = IM(cc[ac+1]) - IM(cc[ac+2]);
+            RE(t5) = RE(cc[ac]) - RE(cc[ac+3]);
+            IM(t5) = IM(cc[ac]) - IM(cc[ac+3]);
 
-static void passf(uint16_t *nac, uint16_t ido, uint16_t ip, uint16_t l1,
-                  uint16_t idl1, real_t *cc, real_t *ch, real_t *wa,
-                  int8_t isign)
-{
-    uint16_t idij, idlj, idot, ipph, i, j, k, l, jc, lc, ik, nt, idj, idl;
-    uint16_t inc, idp;
-    real_t wai, war;
+            RE(ch[ah]) = RE(cc[ac-1]) + RE(t2) + RE(t3);
+            IM(ch[ah]) = IM(cc[ac-1]) + IM(t2) + IM(t3);
 
-    idot = ido / 2;
-    nt = ip*idl1;
-    ipph = (ip+1) / 2;
-    idp = ip*ido;
+            RE(c2) = RE(cc[ac-1]) + MUL_R_C(RE(t2),tr11) + MUL_R_C(RE(t3),tr12);
+            IM(c2) = IM(cc[ac-1]) + MUL_R_C(IM(t2),tr11) + MUL_R_C(IM(t3),tr12);
+            RE(c3) = RE(cc[ac-1]) + MUL_R_C(RE(t2),tr12) + MUL_R_C(RE(t3),tr11);
+            IM(c3) = IM(cc[ac-1]) + MUL_R_C(IM(t2),tr12) + MUL_R_C(IM(t3),tr11);
+            RE(c4) = (MUL_R_C(RE(t5),ti12)*isign - MUL_R_C(RE(t4),ti11));
+            IM(c4) = (MUL_R_C(IM(t5),ti12)*isign - MUL_R_C(IM(t4),ti11));
+            RE(c5) = (MUL_R_C(RE(t5),ti11)*isign + MUL_R_C(RE(t4),ti12));
+            IM(c5) = (MUL_R_C(IM(t5),ti11)*isign + MUL_R_C(IM(t4),ti12));
 
-    if (ido >= l1)
-    {
-        for (j = 1; j < ipph; j++)
-        {
-            jc = ip - j;
-
-            for (k = 0; k < l1; k++)
-            {
-                for (i = 0; i < ido; i++)
-                {
-                    ch[i+(k+j*l1)*ido] = cc[i+(j+k*ip)*ido] + cc[i+(jc+k*ip)*ido];
-                    ch[i+(k+jc*l1)*ido] = cc[i+(j+k*ip)*ido] - cc[i+(jc+k*ip)*ido];
-                }
-            }
+            RE(ch[ah+l1]) = RE(c2) - IM(c5);
+            IM(ch[ah+l1]) = IM(c2) + RE(c5);
+            RE(ch[ah+2*l1]) = RE(c3) - IM(c4);
+            IM(ch[ah+2*l1]) = IM(c3) + RE(c4);
+            RE(ch[ah+3*l1]) = RE(c3) + IM(c4);
+            IM(ch[ah+3*l1]) = IM(c3) - RE(c4);
+            RE(ch[ah+4*l1]) = RE(c2) + IM(c5);
+            IM(ch[ah+4*l1]) = IM(c2) - RE(c5);
         }
-
+    } else {
         for (k = 0; k < l1; k++)
         {
             for (i = 0; i < ido; i++)
-                ch[i+k*ido] = cc[i+k*ip*ido];
-        }
-    } else {
-        for (j = 1; j < ipph; j++)
-        {
-            jc = ip - j;
-
-            for (i = 0; i < ido; i++)
             {
-                for (k = 0; k < l1; k++)
-                {
-                    ch[i+(k+j*l1)*ido] = cc[i+(j+k*ip)*ido] + cc[i+(jc+k*ip)*ido];
-                    ch[i+(k+jc*l1)*ido] = cc[i+(j+k*ip)*ido] - cc[i+(jc+k*ip)*ido];
-                }
-            }
-        }
+                ac = i + (k*5 + 1) * ido;
+                ah = i + k * ido;
 
-        for (i = 0; i < ido; i++)
-        {
-            for (k = 0; k < l1; k++)
-                ch[i+k*ido] = cc[i+k*ip*ido];
-        }
-    }
+                RE(t2) = RE(cc[ac]) + RE(cc[ac+3*ido]);
+                IM(t2) = IM(cc[ac]) + IM(cc[ac+3*ido]);
+                RE(t3) = RE(cc[ac+ido]) + RE(cc[ac+2*ido]);
+                IM(t3) = IM(cc[ac+ido]) + IM(cc[ac+2*ido]);
+                RE(t4) = RE(cc[ac+ido]) - RE(cc[ac+2*ido]);
+                IM(t4) = IM(cc[ac+ido]) - IM(cc[ac+2*ido]);
+                RE(t5) = RE(cc[ac]) - RE(cc[ac+3*ido]);
+                IM(t5) = IM(cc[ac]) - IM(cc[ac+3*ido]);
 
-    idl = 2 - ido;
-    inc = 0;
+                RE(ch[ah]) = RE(cc[ac-ido]) + RE(t2) + RE(t3);
+                IM(ch[ah]) = IM(cc[ac-ido]) + IM(t2) + IM(t3);
 
-    for (l = 1; l < ipph; l++)
-    {
-        lc = ip - l;
-        idl += ido;
+                RE(c2) = RE(cc[ac-ido]) + MUL_R_C(RE(t2),tr11) + MUL_R_C(RE(t3),tr12);
+                IM(c2) = IM(cc[ac-ido]) + MUL_R_C(IM(t2),tr11) + MUL_R_C(IM(t3),tr12);
+                RE(c3) = RE(cc[ac-ido]) + MUL_R_C(RE(t2),tr12) + MUL_R_C(RE(t3),tr11);
+                IM(c3) = IM(cc[ac-ido]) + MUL_R_C(IM(t2),tr12) + MUL_R_C(IM(t3),tr11);
+                RE(c4) = (MUL_R_C(RE(t5),ti12)*isign - MUL_R_C(RE(t4),ti11));
+                IM(c4) = (MUL_R_C(IM(t5),ti12)*isign - MUL_R_C(IM(t4),ti11));
+                RE(c5) = (MUL_R_C(RE(t5),ti11)*isign + MUL_R_C(RE(t4),ti12));
+                IM(c5) = (MUL_R_C(IM(t5),ti11)*isign + MUL_R_C(IM(t4),ti12));
 
-        for (ik = 0; ik < idl1; ik++)
-        {
-            cc[ik+l*idl1] = ch[ik] + MUL_R_C(ch[ik+idl1],wa[idl-2]);
-            cc[ik+lc*idl1] = MUL_R_C(ch[ik+(ip-1)*idl1],wa[idl-1])*isign;
-        }
+                IM(d2) = IM(c2) + RE(c5);
+                IM(d3) = IM(c3) + RE(c4);
+                RE(d4) = RE(c3) + IM(c4);
+                RE(d5) = RE(c2) + IM(c5);
+                RE(d2) = RE(c2) - IM(c5);
+                IM(d5) = IM(c2) - RE(c5);
+                RE(d3) = RE(c3) - IM(c4);
+                IM(d4) = IM(c3) - RE(c4);
 
-        idlj = idl;
-        inc += ido;
-
-        for (j = 2; j < ipph; j++)
-        {
-            jc = ip - j;
-            idlj += inc;
-
-            if (idlj > idp)
-                idlj -= idp;
-
-            war = wa[idlj-2];
-            wai = wa[idlj-1];
-
-            for (ik = 0; ik < idl1; ik++)
-            {
-                cc[ik+l*idl1] += MUL_R_C(ch[ik+j*idl1],war);
-                cc[ik+lc*idl1] += MUL_R_C(ch[ik+jc*idl1],wai)*isign;
+                RE(ch[ah+l1*ido]) = MUL_R_C(RE(d2),RE(wa1[i])) - MUL_R_C(IM(d2),IM(wa1[i]))*isign;
+                IM(ch[ah+l1*ido]) = MUL_R_C(IM(d2),RE(wa1[i])) + MUL_R_C(RE(d2),IM(wa1[i]))*isign;
+                RE(ch[ah+2*l1*ido]) = MUL_R_C(RE(d3),RE(wa2[i])) - MUL_R_C(IM(d3),IM(wa2[i]))*isign;
+                IM(ch[ah+2*l1*ido]) = MUL_R_C(IM(d3),RE(wa2[i])) + MUL_R_C(RE(d3),IM(wa2[i]))*isign;
+                RE(ch[ah+3*l1*ido]) = MUL_R_C(RE(d4),RE(wa3[i])) - MUL_R_C(IM(d4),IM(wa3[i]))*isign;
+                IM(ch[ah+3*l1*ido]) = MUL_R_C(IM(d4),RE(wa3[i])) + MUL_R_C(RE(d4),IM(wa3[i]))*isign;
+                RE(ch[ah+4*l1*ido]) = MUL_R_C(RE(d5),RE(wa4[i])) - MUL_R_C(IM(d5),IM(wa4[i]))*isign;
+                IM(ch[ah+4*l1*ido]) = MUL_R_C(IM(d5),RE(wa4[i])) + MUL_R_C(RE(d5),IM(wa4[i]))*isign;
             }
         }
     }
-
-    for (j = 1; j < ipph; j++)
-    {
-        for (ik = 0; ik < idl1; ik++)
-            ch[ik] += ch[ik+j*idl1];
-    }
-
-    for (j = 1; j < ipph; j++)
-    {
-        jc = ip - j;
-
-        for (ik = 1; ik < idl1; ik += 2)
-        {
-            ch[ik-1+j*idl1] = cc[ik-1+j*idl1] - cc[ik+jc*idl1];
-            ch[ik-1+jc*idl1] = cc[ik-1+j*idl1] + cc[ik+jc*idl1];
-            ch[ik+j*idl1] = cc[ik+j*idl1] + cc[ik-1+jc*idl1];
-            ch[ik+jc*idl1] = cc[ik+j*idl1] - cc[ik-1+jc*idl1];
-        }
-    }
-
-    *nac = 1;
-
-    if (ido == 2)
-        return;
-
-    *nac = 0;
-
-    for (ik = 0; ik < idl1; ik++)
-        cc[ik] = ch[ik];
-
-    for (j = 1; j < ip; j++)
-    {
-        for (k = 0; k < l1; k++)
-        {
-            cc[(k+j*l1)*ido+0] = ch[(k+j*l1)*ido+0];
-            cc[(k+j*l1)*ido+1] = ch[(k+j*l1)*ido+1];
-        }
-    }
-
-    if (idot <= l1)
-    {
-        idij = 0;
-
-        for (j = 1; j < ip; j++)
-        {
-            idij += 2;
-
-            for (i = 3; i < ido; i += 2)
-            {
-                idij += 2;
-
-                for (k = 0; k < l1; k++)
-                {
-                    cc[i-1+(k+j*l1)*ido] = MUL_R_C(ch[i-1+(k+j*l1)*ido],wa[idij-2]) -
-                        MUL_R_C(ch[i+(k+j*l1)*ido],wa[idij-1])*isign;
-                    cc[i+(k+j*l1)*ido] = MUL_R_C(ch[i+(k+j*l1)*ido],wa[idij-2]) +
-                        MUL_R_C(ch[i-1+(k+j*l1)*ido],wa[idij-1])*isign;
-                }
-            }
-        }
-    } else {
-        idj = 2 - ido;
+}
 
-        for (j = 1; j < ip; j++)
-        {
-            idj += ido;
 
-            for (k = 0; k < l1; k++)
-            {
-                idij = idj;
-
-                for (i = 3; i < ido; i += 2)
-                {
-                    idij += 2;
-                    cc[i-1+(k+j*l1)*ido] = MUL_R_C(ch[i-1+(k+j*l1)*ido],wa[idij-2]) -
-                        MUL_R_C(ch[i+(k+j*l1)*ido],wa[idij-1])*isign;
-                    cc[i+(k+j*l1)*ido] = MUL_R_C(ch[i+(k+j*l1)*ido],wa[idij-2]) +
-                        MUL_R_C(ch[i-1+(k+j*l1)*ido],wa[idij-1])*isign;
-                }
-            }
-        }
-    }
-}
-
-
-
 /*----------------------------------------------------------------------
    cfftf1, cfftf, cfftb, cffti1, cffti. Complex FFTs.
   ----------------------------------------------------------------------*/
 
-INLINE void cfftf1(uint16_t n, real_t *c, real_t *ch, real_t *wa,
-                   uint16_t *ifac, int8_t isign)
+INLINE void cfftf1(uint16_t n, complex_t *c, complex_t *ch,
+                   uint16_t *ifac, complex_t *wa, int8_t isign)
 {
-    uint16_t idot, i;
+    uint16_t i;
     uint16_t k1, l1, l2;
-    uint16_t na, nf, ip, iw, ix2, ix3, ix4, nac, ido, idl1;
+    uint16_t na, nf, ip, iw, ix2, ix3, ix4, ido, idl1;
 
     nf = ifac[1];
     na = 0;
@@ -487,90 +340,83 @@
         ip = ifac[k1];
         l2 = ip*l1;
         ido = n / l2;
-        idot = ido+ido;
-        idl1 = idot*l1;
+        idl1 = ido*l1;
 
         switch (ip)
         {
         case 2:
             if (na == 0)
-                passf2(idot, l1, c, ch, &wa[iw], isign);
+                passf2(ido, l1, c, ch, &wa[iw], isign);
             else
-                passf2(idot, l1, ch, c, &wa[iw], isign);
+                passf2(ido, l1, ch, c, &wa[iw], isign);
 
             na = 1 - na;
             break;
         case 3:
-            ix2 = iw + idot;
+            ix2 = iw + ido;
 
             if (na == 0)
-                passf3(idot, l1, c, ch, &wa[iw], &wa[ix2], isign);
+                passf3(ido, l1, c, ch, &wa[iw], &wa[ix2], isign);
             else
-                passf3(idot, l1, ch, c, &wa[iw], &wa[ix2], isign);
+                passf3(ido, l1, ch, c, &wa[iw], &wa[ix2], isign);
 
             na = 1 - na;
             break;
         case 4:
-            ix2 = iw + idot;
-            ix3 = ix2 + idot;
+            ix2 = iw + ido;
+            ix3 = ix2 + ido;
 
             if (na == 0)
-                passf4(idot, l1, c, ch, &wa[iw], &wa[ix2], &wa[ix3], isign);
+                passf4(ido, l1, c, ch, &wa[iw], &wa[ix2], &wa[ix3], isign);
             else
-                passf4(idot, l1, ch, c, &wa[iw], &wa[ix2], &wa[ix3], isign);
+                passf4(ido, l1, ch, c, &wa[iw], &wa[ix2], &wa[ix3], isign);
 
             na = 1 - na;
             break;
         case 5:
-            ix2 = iw + idot;
-            ix3 = ix2 + idot;
-            ix4 = ix3 + idot;
+            ix2 = iw + ido;
+            ix3 = ix2 + ido;
+            ix4 = ix3 + ido;
 
             if (na == 0)
-                passf5(idot, l1, c, ch, &wa[iw], &wa[ix2], &wa[ix3], &wa[ix4], isign);
+                passf5(ido, l1, c, ch, &wa[iw], &wa[ix2], &wa[ix3], &wa[ix4], isign);
             else
-                passf5(idot, l1, ch, c, &wa[iw], &wa[ix2], &wa[ix3], &wa[ix4], isign);
+                passf5(ido, l1, ch, c, &wa[iw], &wa[ix2], &wa[ix3], &wa[ix4], isign);
 
             na = 1 - na;
             break;
-        default:
-            if (na == 0)
-                passf(&nac, idot, ip, l1, idl1, c, ch, &wa[iw], isign);
-            else
-                passf(&nac, idot, ip, l1, idl1, ch, c, &wa[iw], isign);
-
-            if (nac != 0)
-                na = 1 - na;
-            break;
         }
 
         l1 = l2;
-        iw += (ip-1) * idot;
+        iw += (ip-1) * ido;
     }
 
     if (na == 0)
         return;
 
-    for (i = 0; i < 2*n; i++)
-        c[i] = ch[i];
+    for (i = 0; i < n; i++)
+    {
+        RE(c[i]) = RE(ch[i]);
+        IM(c[i]) = IM(ch[i]);
+    }
 }
 
-void cfftf(cfft_info *cfft, real_t *c)
+void cfftf(cfft_info *cfft, complex_t *c)
 {
-    cfftf1(cfft->n, c, cfft->work, cfft->tab, cfft->ifac, -1);
+    cfftf1(cfft->n, c, cfft->work, cfft->ifac, cfft->tab, -1);
 }
 
-void cfftb(cfft_info *cfft, real_t *c)
+void cfftb(cfft_info *cfft, complex_t *c)
 {
-    cfftf1(cfft->n, c, cfft->work, cfft->tab, cfft->ifac, +1);
+    cfftf1(cfft->n, c, cfft->work, cfft->ifac, cfft->tab, +1);
 }
 
-static void cffti1(uint16_t n, real_t *wa, uint16_t *ifac)
+static void cffti1(uint16_t n, complex_t *wa, uint16_t *ifac)
 {
     static uint16_t ntryh[4] = {3, 4, 2, 5};
 #ifndef FIXED_POINT
     real_t arg, argh, argld, fi;
-    uint16_t idot, ido, ipm;
+    uint16_t ido, ipm;
     uint16_t i1, k1, l1, l2;
     uint16_t ld, ii, ip;
 #endif
@@ -618,7 +464,7 @@
 
 #ifndef FIXED_POINT
     argh = 2.0*M_PI / (real_t)n;
-    i = 1;
+    i = 0;
     l1 = 1;
 
     for (k1 = 1; k1 <= nf; k1++)
@@ -627,31 +473,30 @@
         ld = 0;
         l2 = l1*ip;
         ido = n / l2;
-        idot = ido + ido + 2;
         ipm = ip - 1;
 
-        for (j = 1; j <= ipm; j++)
+        for (j = 0; j < ipm; j++)
         {
             i1 = i;
-            wa[i-1] = 1.0;
-            wa[i] = 0.0;
+            RE(wa[i]) = 1.0;
+            IM(wa[i]) = 0.0;
             ld += l1;
             fi = 0;
             argld = ld*argh;
 
-            for (ii = 4; ii <= idot; ii += 2)
+            for (ii = 0; ii < ido; ii++)
             {
-                i += 2;
-                fi += 1;
+                i++;
+                fi++;
                 arg = fi * argld;
-                wa[i-1] = cos(arg);
-                wa[i] = sin(arg);
+                RE(wa[i]) = cos(arg);
+                IM(wa[i]) = sin(arg);
             }
 
             if (ip > 5)
             {
-                wa[i1-1] = wa[i-1];
-                wa[i1] = wa[i];
+                RE(wa[i1]) = RE(wa[i]);
+                IM(wa[i1]) = IM(wa[i]);
             }
         }
         l1 = l2;
@@ -664,10 +509,10 @@
     cfft_info *cfft = (cfft_info*)malloc(sizeof(cfft_info));
 
     cfft->n = n;
-    cfft->work = (real_t*)malloc(2*n*sizeof(real_t));
+    cfft->work = (complex_t*)malloc(n*sizeof(complex_t));
 
 #ifndef FIXED_POINT
-    cfft->tab = (real_t*)malloc(2*n*sizeof(real_t));
+    cfft->tab = (complex_t*)malloc(n*sizeof(complex_t));
 
     cffti1(n, cfft->tab, cfft->ifac);
 #else
--- a/libfaad/cfft.h
+++ b/libfaad/cfft.h
@@ -16,7 +16,7 @@
 ** along with this program; if not, write to the Free Software 
 ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 **
-** $Id: cfft.h,v 1.3 2002/09/08 18:14:37 menno Exp $
+** $Id: cfft.h,v 1.4 2002/09/26 19:01:45 menno Exp $
 **/
 
 #ifndef __CFFT_H__
@@ -28,33 +28,30 @@
 
 typedef struct
 {
-    real_t *work;
-    real_t *tab;
-    uint16_t ifac[15];
     uint16_t n;
+    uint16_t ifac[15];
+    complex_t *work;
+    complex_t *tab;
 } cfft_info;
 
-void cfftf(cfft_info *cfft, real_t *c);
-void cfftb(cfft_info *cfft, real_t *c);
+void cfftf(cfft_info *cfft, complex_t *c);
+void cfftb(cfft_info *cfft, complex_t *c);
 cfft_info *cffti(uint16_t n);
 void cfftu(cfft_info *cfft);
 
 
-static void passf2(uint16_t ido, uint16_t l1, real_t *cc, real_t *ch,
-                   real_t *wa1, int8_t isign);
-static void passf3(uint16_t ido, uint16_t l1, real_t *cc, real_t *ch,
-                   real_t *wa1, real_t *wa2, int8_t isign);
-static void passf4(uint16_t ido, uint16_t l1, real_t *cc, real_t *ch,
-                   real_t *wa1, real_t *wa2, real_t *wa3, int8_t isign);
-static void passf5(uint16_t ido, uint16_t l1, real_t *cc, real_t *ch,
-                   real_t *wa1, real_t *wa2, real_t *wa3, real_t *wa4,
+static void passf2(uint16_t ido, uint16_t l1, complex_t *cc, complex_t *ch,
+                   complex_t *wa, int8_t isign);
+static void passf3(uint16_t ido, uint16_t l1, complex_t *cc, complex_t *ch,
+                   complex_t *wa1, complex_t *wa2, int8_t isign);
+static void passf4(uint16_t ido, uint16_t l1, complex_t *cc, complex_t *ch,
+                   complex_t *wa1, complex_t *wa2, complex_t *wa3, int8_t isign);
+static void passf5(uint16_t ido, uint16_t l1, complex_t *cc, complex_t *ch,
+                   complex_t *wa1, complex_t *wa2, complex_t *wa3, complex_t *wa4,
                    int8_t isign);
-static void passf(uint16_t *nac, uint16_t ido, uint16_t ip, uint16_t l1,
-                  uint16_t idl1, real_t *cc, real_t *ch, real_t *wa,
-                  int8_t isign);
-INLINE void cfftf1(uint16_t n, real_t *c, real_t *ch, real_t *wa,
-                   uint16_t *ifac, int8_t isign);
-static void cffti1(uint16_t n, real_t *wa, uint16_t *ifac);
+INLINE void cfftf1(uint16_t n, complex_t *c, complex_t *ch,
+                   uint16_t *ifac, complex_t *wa, int8_t isign);
+static void cffti1(uint16_t n, complex_t *wa, uint16_t *ifac);
 
 
 #ifdef __cplusplus
--- a/libfaad/cfft_tab.h
+++ b/libfaad/cfft_tab.h
@@ -1,22 +1,22 @@
 /*
 ** FAAD - Freeware Advanced Audio Decoder
 ** Copyright (C) 2002 M. Bakker
-**  
+**
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
 ** the Free Software Foundation; either version 2 of the License, or
 ** (at your option) any later version.
-** 
+**
 ** This program is distributed in the hope that it will be useful,
 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 ** GNU General Public License for more details.
-** 
+**
 ** You should have received a copy of the GNU General Public License
-** along with this program; if not, write to the Free Software 
+** along with this program; if not, write to the Free Software
 ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 **
-** $Id: cfft_tab.h,v 1.1 2002/09/13 13:08:45 menno Exp $
+** $Id: cfft_tab.h,v 1.2 2002/09/26 19:01:45 menno Exp $
 **/
 
 #ifndef __CFFT_TAB_H__
@@ -28,3254 +28,1642 @@
 
 #ifdef FIXED_POINT
 
-real_t cfft_tab_512[] =
-{
-    0x10000000,
-    0x0,
-    0xFFFB10B,
-    0x3243A4,
-    0xFFEC430,
-    0x648558,
-    0xFFD3977,
-    0x96C32B,
-    0xFFB10F1,
-    0xC8FB2F,
-    0xFF84AB2,
-    0xFB2B74,
-    0xFF4E6D6,
-    0x12D5209,
-    0xFF0E57E,
-    0x15F6D01,
-    0xFEC46D1,
-    0x1917A6C,
-    0xFE70AFE,
-    0x1C3785D,
-    0xFE13238,
-    0x1F564E6,
-    0xFDABCB8,
-    0x2273E1A,
-    0xFD3AABF,
-    0x259020E,
-    0xFCBFC92,
-    0x28AAED7,
-    0xFC3B27D,
-    0x2BC4289,
-    0xFBACCD1,
-    0x2EDBB3D,
-    0xFB14BE7,
-    0x31F1708,
-    0xFA7301D,
-    0x3505406,
-    0xF9C79D5,
-    0x381704E,
-    0xF91297B,
-    0x3B269FE,
-    0xF853F7D,
-    0x3E33F31,
-    0xF78BC51,
-    0x413EE05,
-    0xF6BA073,
-    0x444749A,
-    0xF5DEC63,
-    0x474D111,
-    0xF4FA0AA,
-    0x4A5018D,
-    0xF40BDD4,
-    0x4D50432,
-    0xF314475,
-    0x504D727,
-    0xF213524,
-    0x5347892,
-    0xF109081,
-    0x563E69F,
-    0xEFF5730,
-    0x5931F79,
-    0xEED89DA,
-    0x5C2214E,
-    0xEDB2930,
-    0x5F0EA4E,
-    0xEC835E6,
-    0x61F78AC,
-    0xEB4B0B8,
-    0x64DCA9B,
-    0xEA09A67,
-    0x67BDE53,
-    0xE8BF3B8,
-    0x6A9B20D,
-    0xE76BD78,
-    0x6D74405,
-    0xE60F878,
-    0x7049279,
-    0xE4AA58F,
-    0x7319BA9,
-    0xE33C598,
-    0x75E5DDA,
-    0xE1C5977,
-    0x78AD751,
-    0xE046211,
-    0x7B70658,
-    0xDEBE054,
-    0x7E2E93A,
-    0xDD2D531,
-    0x80E7E47,
-    0xDB941A0,
-    0x839C3D0,
-    0xD9F269D,
-    0x864B82A,
-    0xD848529,
-    0x88F59AD,
-    0xD695E4C,
-    0x8B9A6B5,
-    0xD4DB312,
-    0x8E39DA0,
-    0xD31848A,
-    0x90D3CD0,
-    0xD14D3CD,
-    0x93682AA,
-    0xCF7A1F4,
-    0x95F6D96,
-    0xCD9F021,
-    0x987FC02,
-    0xCBBBF77,
-    0x9B02C5C,
-    0xC9D1121,
-    0x9D7FD18,
-    0xC7DE64E,
-    0x9FF6CAD,
-    0xC5E4032,
-    0xA267996,
-    0xC3E2004,
-    0xA4D2251,
-    0xC1D8702,
-    0xA736561,
-    0xBFC766E,
-    0xA99414D,
-    0xBDAEF8D,
-    0xABEB49E,
-    0xBB8F3AB,
-    0xAE3BDE3,
-    0xB968418,
-    0xB085BAE,
-    0xB73A226,
-    0xB2C8C97,
-    0xB504F2F,
-    0xB504F37,
-    0xB2C8C8E,
-    0xB73A22E,
-    0xB085BA6,
-    0xB968420,
-    0xAE3BDDA,
-    0xBB8F3B3,
-    0xABEB495,
-    0xBDAEF95,
-    0xA994144,
-    0xBFC7675,
-    0xA736559,
-    0xC1D870A,
-    0xA4D2248,
-    0xC3E200C,
-    0xA26798D,
-    0xC5E4039,
-    0x9FF6CA4,
-    0xC7DE656,
-    0x9D7FD0F,
-    0xC9D1128,
-    0x9B02C53,
-    0xCBBBF7E,
-    0x987FBF8,
-    0xCD9F028,
-    0x95F6D8D,
-    0xCF7A1FB,
-    0x93682A0,
-    0xD14D3D4,
-    0x90D3CC6,
-    0xD318491,
-    0x8E39D96,
-    0xD4DB318,
-    0x8B9A6AB,
-    0xD695E53,
-    0x88F59A3,
-    0xD848530,
-    0x864B820,
-    0xD9F26A3,
-    0x839C3C5,
-    0xDB941A6,
-    0x80E7E3C,
-    0xDD2D537,
-    0x7E2E930,
-    0xDEBE05A,
-    0x7B7064D,
-    0xE046217,
-    0x78AD746,
-    0xE1C597C,
-    0x75E5DCF,
-    0xE33C59E,
-    0x7319B9E,
-    0xE4AA594,
-    0x704926E,
-    0xE60F87D,
-    0x6D743FA,
-    0xE76BD7D,
-    0x6A9B203,
-    0xE8BF3BD,
-    0x67BDE49,
-    0xEA09A6C,
-    0x64DCA90,
-    0xEB4B0BD,
-    0x61F78A1,
-    0xEC835EA,
-    0x5F0EA44,
-    0xEDB2934,
-    0x5C22143,
-    0xEED89DE,
-    0x5931F6E,
-    0xEFF5734,
-    0x563E694,
-    0xF109085,
-    0x5347887,
-    0xF213528,
-    0x504D71C,
-    0xF314479,
-    0x4D50427,
-    0xF40BDD8,
-    0x4A50182,
-    0xF4FA0AE,
-    0x474D106,
-    0xF5DEC67,
-    0x444748F,
-    0xF6BA076,
-    0x413EDFA,
-    0xF78BC54,
-    0x3E33F25,
-    0xF853F80,
-    0x3B269F2,
-    0xF91297E,
-    0x3817043,
-    0xF9C79D8,
-    0x35053FA,
-    0xFA7301F,
-    0x31F16FD,
-    0xFB14BE9,
-    0x2EDBB31,
-    0xFBACCD3,
-    0x2BC427E,
-    0xFC3B27F,
-    0x28AAECB,
-    0xFCBFC94,
-    0x2590203,
-    0xFD3AAC1,
-    0x2273E0F,
-    0xFDABCBA,
-    0x1F564DA,
-    0xFE13239,
-    0x1C37851,
-    0xFE70AFF,
-    0x1917A60,
-    0xFEC46D2,
-    0x15F6CF5,
-    0xFF0E57F,
-    0x12D51FE,
-    0xFF4E6D7,
-    0xFB2B68,
-    0xFF84AB3,
-    0xC8FB24,
-    0xFFB10F2,
-    0x96C320,
-    0xFFD3978,
-    0x64854C,
-    0xFFEC430,
-    0x324398,
-    0xFFFB10B,
-    0xFFFFFFF5,
-    0xFFFFFFF,
-    0xFFCDBC51,
-    0xFFFB10B,
-    0xFF9B7A9D,
-    0xFFEC42F,
-    0xFF693CC9,
-    0xFFD3977,
-    0xFF3704C5,
-    0xFFB10F1,
-    0xFF04D481,
-    0xFF84AB2,
-    0xFED2ADEB,
-    0xFF4E6D5,
-    0xFEA092F4,
-    0xFF0E57D,
-    0xFE6E8588,
-    0xFEC46D0,
-    0xFE3C8798,
-    0xFE70AFD,
-    0xFE0A9B0F,
-    0xFE13236,
-    0xFDD8C1DA,
-    0xFDABCB7,
-    0xFDA6FDE6,
-    0xFD3AABD,
-    0xFD75511E,
-    0xFCBFC90,
-    0xFD43BD6B,
-    0xFC3B27A,
-    0xFD1244B8,
-    0xFBACCCF,
-    0xFCE0E8EC,
-    0xFB14BE5,
-    0xFCAFABEF,
-    0xFA7301A,
-    0xFC7E8FA6,
-    0xF9C79D3,
-    0xFC4D95F7,
-    0xF912978,
-    0xFC1CC0C4,
-    0xF853F7A,
-    0xFBEC11F0,
-    0xF78BC4E,
-    0xFBBB8B5B,
-    0xF6BA070,
-    0xFB8B2EE3,
-    0xF5DEC60,
-    0xFB5AFE67,
-    0xF4FA0A7,
-    0xFB2AFBC2,
-    0xF40BDD1,
-    0xFAFB28CE,
-    0xF314471,
-    0xFACB8762,
-    0xF213520,
-    0xFA9C1956,
-    0xF10907D,
-    0xFA6CE07C,
-    0xEFF572C,
-    0xFA3DDEA7,
-    0xEED89D6,
-    0xFA0F15A7,
-    0xEDB292B,
-    0xF9E08749,
-    0xEC835E1,
-    0xF9B2355A,
-    0xEB4B0B4,
-    0xF98421A2,
-    0xEA09A62,
-    0xF9564DE8,
-    0xE8BF3B3,
-    0xF928BBF0,
-    0xE76BD73,
-    0xF8FB6D7D,
-    0xE60F873,
-    0xF8CE644D,
-    0xE4AA589,
-    0xF8A1A21C,
-    0xE33C593,
-    0xF87528A5,
-    0xE1C5971,
-    0xF848F99E,
-    0xE04620B,
-    0xF81D16BC,
-    0xDEBE04E,
-    0xF7F181AF,
-    0xDD2D52B,
-    0xF7C63C26,
-    0xDB9419A,
-    0xF79B47CC,
-    0xD9F2697,
-    0xF770A649,
-    0xD848523,
-    0xF7465941,
-    0xD695E46,
-    0xF71C6256,
-    0xD4DB30B,
-    0xF6F2C327,
-    0xD318484,
-    0xF6C97D4D,
-    0xD14D3C6,
-    0xF6A09260,
-    0xCF7A1ED,
-    0xF67803F5,
-    0xCD9F01A,
-    0xF64FD39B,
-    0xCBBBF70,
-    0xF62802DF,
-    0xC9D111A,
-    0xF600934A,
-    0xC7DE647,
-    0xF5D98661,
-    0xC5E402A,
-    0xF5B2DDA6,
-    0xC3E1FFC,
-    0xF58C9A96,
-    0xC1D86FA,
-    0xF566BEAA,
-    0xBFC7666,
-    0xF5414B59,
-    0xBDAEF85,
-    0xF51C4215,
-    0xBB8F3A3,
-    0xF4F7A449,
-    0xB96840F,
-    0xF4D37361,
-    0xB73A21E,
-    0xF4AFB0C1,
-    0xB504F26,
-    0xF48C5DCA,
-    0xB2C8C86,
-    0xF4697BD8,
-    0xB085B9D,
-    0xF4470C45,
-    0xAE3BDD2,
-    0xF4251063,
-    0xABEB48C,
-    0xF4038983,
-    0xA99413B,
-    0xF3E278EF,
-    0xA736550,
-    0xF3C1DFED,
-    0xA4D223F,
-    0xF3A1BFBF,
-    0xA267984,
-    0xF38219A3,
-    0x9FF6C9B,
-    0xF362EED0,
-    0x9D7FD05,
-    0xF344407B,
-    0x9B02C49,
-    0xF3260FD1,
-    0x987FBEF,
-    0xF3085DFE,
-    0x95F6D83,
-    0xF2EB2C25,
-    0x9368296,
-    0xF2CE7B68,
-    0x90D3CBC,
-    0xF2B24CE1,
-    0x8E39D8C,
-    0xF296A1A7,
-    0x8B9A6A1,
-    0xF27B7ACA,
-    0x88F5999,
-    0xF260D957,
-    0x864B816,
-    0xF246BE54,
-    0x839C3BB,
-    0xF22D2AC3,
-    0x80E7E32,
-    0xF2141FA1,
-    0x7E2E925,
-    0xF1FB9DE4,
-    0x7B70643,
-    0xF1E3A67E,
-    0x78AD73C,
-    0xF1CC3A5D,
-    0x75E5DC5,
-    0xF1B55A67,
-    0x7319B94,
-    0xF19F077E,
-    0x7049263,
-    0xF189427E,
-    0x6D743F0,
-    0xF1740C3E,
-    0x6A9B1F8,
-    0xF15F6590,
-    0x67BDE3E,
-    0xF14B4F3F,
-    0x64DCA86,
-    0xF137CA11,
-    0x61F7896,
-    0xF124D6C8,
-    0x5F0EA39,
-    0xF112761E,
-    0x5C22138,
-    0xF100A8C8,
-    0x5931F63,
-    0xF0EF6F77,
-    0x563E689,
-    0xF0DECAD4,
-    0x534787C,
-    0xF0CEBB84,
-    0x504D711,
-    0xF0BF4224,
-    0x4D5041C,
-    0xF0B05F4F,
-    0x4A50177,
-    0xF0A21396,
-    0x474D0FB,
-    0xF0945F87,
-    0x4447484,
-    0xF08743A9,
-    0x413EDEE,
-    0xF07AC07D,
-    0x3E33F1A,
-    0xF06ED680,
-    0x3B269E7,
-    0xF0638626,
-    0x3817038,
-    0xF058CFDE,
-    0x35053EF,
-    0xF04EB414,
-    0x31F16F1,
-    0xF045332B,
-    0x2EDBB26,
-    0xF03C4D7F,
-    0x2BC4272,
-    0xF034036B,
-    0x28AAEC0,
-    0xF02C553E,
-    0x25901F7,
-    0xF0254345,
-    0x2273E03,
-    0xF01ECDC5,
-    0x1F564CF,
-    0xF018F4FF,
-    0x1C37845,
-    0xF013B92C,
-    0x1917A55,
-    0xF00F1A80,
-    0x15F6CE9,
-    0xF00B1928,
-    0x12D51F2,
-    0xF007B54C,
-    0xFB2B5C,
-    0xF004EF0E,
-    0xC8FB18,
-    0xF002C688,
-    0x96C314,
-    0xF0013BD0,
-    0x648540,
-    0xF0004EF5,
-    0x32438C,
-    0x10000000,
-    0x0,
-    0xFFEC430,
-    0x648558,
-    0xFFB10F1,
-    0xC8FB2F,
-    0xFF4E6D6,
-    0x12D5209,
-    0xFEC46D1,
-    0x1917A6C,
-    0xFE13238,
-    0x1F564E6,
-    0xFD3AABF,
-    0x259020E,
-    0xFC3B27D,
-    0x2BC4289,
-    0xFB14BE7,
-    0x31F1708,
-    0xF9C79D5,
-    0x381704E,
-    0xF853F7D,
-    0x3E33F31,
-    0xF6BA073,
-    0x444749A,
-    0xF4FA0AA,
-    0x4A5018D,
-    0xF314475,
-    0x504D727,
-    0xF109081,
-    0x563E69F,
-    0xEED89DA,
-    0x5C2214E,
-    0xEC835E6,
-    0x61F78AC,
-    0xEA09A67,
-    0x67BDE53,
-    0xE76BD78,
-    0x6D74405,
-    0xE4AA58F,
-    0x7319BA9,
-    0xE1C5977,
-    0x78AD751,
-    0xDEBE054,
-    0x7E2E93A,
-    0xDB941A0,
-    0x839C3D0,
-    0xD848529,
-    0x88F59AD,
-    0xD4DB312,
-    0x8E39DA0,
-    0xD14D3CD,
-    0x93682AA,
-    0xCD9F021,
-    0x987FC02,
-    0xC9D1121,
-    0x9D7FD18,
-    0xC5E4032,
-    0xA267996,
-    0xC1D8702,
-    0xA736561,
-    0xBDAEF8D,
-    0xABEB49E,
-    0xB968418,
-    0xB085BAE,
-    0xB504F2F,
-    0xB504F37,
-    0xB085BA6,
-    0xB968420,
-    0xABEB495,
-    0xBDAEF95,
-    0xA736559,
-    0xC1D870A,
-    0xA26798D,
-    0xC5E4039,
-    0x9D7FD0F,
-    0xC9D1128,
-    0x987FBF8,
-    0xCD9F028,
-    0x93682A0,
-    0xD14D3D4,
-    0x8E39D96,
-    0xD4DB318,
-    0x88F59A3,
-    0xD848530,
-    0x839C3C5,
-    0xDB941A6,
-    0x7E2E930,
-    0xDEBE05A,
-    0x78AD746,
-    0xE1C597C,
-    0x7319B9E,
-    0xE4AA594,
-    0x6D743FA,
-    0xE76BD7D,
-    0x67BDE49,
-    0xEA09A6C,
-    0x61F78A1,
-    0xEC835EA,
-    0x5C22143,
-    0xEED89DE,
-    0x563E694,
-    0xF109085,
-    0x504D71C,
-    0xF314479,
-    0x4A50182,
-    0xF4FA0AE,
-    0x444748F,
-    0xF6BA076,
-    0x3E33F25,
-    0xF853F80,
-    0x3817043,
-    0xF9C79D8,
-    0x31F16FD,
-    0xFB14BE9,
-    0x2BC427E,
-    0xFC3B27F,
-    0x2590203,
-    0xFD3AAC1,
-    0x1F564DA,
-    0xFE13239,
-    0x1917A60,
-    0xFEC46D2,
-    0x12D51FE,
-    0xFF4E6D7,
-    0xC8FB24,
-    0xFFB10F2,
-    0x64854C,
-    0xFFEC430,
-    0x10000000,
-    0x0,
-    0xFFB10F1,
-    0xC8FB2F,
-    0xFEC46D1,
-    0x1917A6C,
-    0xFD3AABF,
-    0x259020E,
-    0xFB14BE7,
-    0x31F1708,
-    0xF853F7D,
-    0x3E33F31,
-    0xF4FA0AA,
-    0x4A5018D,
-    0xF109081,
-    0x563E69F,
-    0xEC835E6,
-    0x61F78AC,
-    0xE76BD78,
-    0x6D74405,
-    0xE1C5977,
-    0x78AD751,
-    0xDB941A0,
-    0x839C3D0,
-    0xD4DB312,
-    0x8E39DA0,
-    0xCD9F021,
-    0x987FC02,
-    0xC5E4032,
-    0xA267996,
-    0xBDAEF8D,
-    0xABEB49E,
-    0xB504F2F,
-    0xB504F37,
-    0xABEB495,
-    0xBDAEF95,
-    0xA26798D,
-    0xC5E4039,
-    0x987FBF8,
-    0xCD9F028,
-    0x8E39D96,
-    0xD4DB318,
-    0x839C3C5,
-    0xDB941A6,
-    0x78AD746,
-    0xE1C597C,
-    0x6D743FA,
-    0xE76BD7D,
-    0x61F78A1,
-    0xEC835EA,
-    0x563E694,
-    0xF109085,
-    0x4A50182,
-    0xF4FA0AE,
-    0x3E33F25,
-    0xF853F80,
-    0x31F16FD,
-    0xFB14BE9,
-    0x2590203,
-    0xFD3AAC1,
-    0x1917A60,
-    0xFEC46D2,
-    0xC8FB24,
-    0xFFB10F2,
-    0xFFFFFFF5,
-    0xFFFFFFF,
-    0xFF3704C5,
-    0xFFB10F1,
-    0xFE6E8588,
-    0xFEC46D0,
-    0xFDA6FDE6,
-    0xFD3AABD,
-    0xFCE0E8EC,
-    0xFB14BE5,
-    0xFC1CC0C4,
-    0xF853F7A,
-    0xFB5AFE67,
-    0xF4FA0A7,
-    0xFA9C1956,
-    0xF10907D,
-    0xF9E08749,
-    0xEC835E1,
-    0xF928BBF0,
-    0xE76BD73,
-    0xF87528A5,
-    0xE1C5971,
-    0xF7C63C26,
-    0xDB9419A,
-    0xF71C6256,
-    0xD4DB30B,
-    0xF67803F5,
-    0xCD9F01A,
-    0xF5D98661,
-    0xC5E402A,
-    0xF5414B59,
-    0xBDAEF85,
-    0xF4AFB0C1,
-    0xB504F26,
-    0xF4251063,
-    0xABEB48C,
-    0xF3A1BFBF,
-    0xA267984,
-    0xF3260FD1,
-    0x987FBEF,
-    0xF2B24CE1,
-    0x8E39D8C,
-    0xF246BE54,
-    0x839C3BB,
-    0xF1E3A67E,
-    0x78AD73C,
-    0xF189427E,
-    0x6D743F0,
-    0xF137CA11,
-    0x61F7896,
-    0xF0EF6F77,
-    0x563E689,
-    0xF0B05F4F,
-    0x4A50177,
-    0xF07AC07D,
-    0x3E33F1A,
-    0xF04EB414,
-    0x31F16F1,
-    0xF02C553E,
-    0x25901F7,
-    0xF013B92C,
-    0x1917A55,
-    0xF004EF0E,
-    0xC8FB18,
-    0x10000000,
-    0x0,
-    0xFF4E6D6,
-    0x12D5209,
-    0xFD3AABF,
-    0x259020D,
-    0xF9C79D6,
-    0x381704D,
-    0xF4FA0AB,
-    0x4A5018B,
-    0xEED89DB,
-    0x5C2214C,
-    0xE76BD79,
-    0x6D74402,
-    0xDEBE056,
-    0x7E2E937,
-    0xD4DB314,
-    0x8E39D9D,
-    0xC9D1124,
-    0x9D7FD14,
-    0xBDAEF90,
-    0xABEB49A,
-    0xB085BAA,
-    0xB96841C,
-    0xA267992,
-    0xC5E4035,
-    0x93682A5,
-    0xD14D3D0,
-    0x839C3CB,
-    0xDB941A2,
-    0x7319BA5,
-    0xE4AA590,
-    0x61F78A8,
-    0xEC835E7,
-    0x504D724,
-    0xF314476,
-    0x3E33F2E,
-    0xF853F7E,
-    0x2BC4287,
-    0xFC3B27D,
-    0x1917A6A,
-    0xFEC46D2,
-    0x648556,
-    0xFFEC430,
-    0xFF3704D0,
-    0xFFB10F1,
-    0xFE0A9B1A,
-    0xFE13238,
-    0xFCE0E8F8,
-    0xFB14BE7,
-    0xFBBB8B67,
-    0xF6BA073,
-    0xFA9C1962,
-    0xF109082,
-    0xF98421AE,
-    0xEA09A68,
-    0xF87528B1,
-    0xE1C5978,
-    0xF770A655,
-    0xD84852B,
-    0xF6780401,
-    0xCD9F023,
-    0xF58C9AA1,
-    0xC1D8704,
-    0xF4AFB0CC,
-    0xB504F32,
-    0xF3E278F9,
-    0xA73655C,
-    0xF3260FDC,
-    0x987FBFD,
-    0xF27B7AD4,
-    0x88F59A8,
-    0xF1E3A687,
-    0x78AD74C,
-    0xF15F6597,
-    0x67BDE4F,
-    0xF0EF6F7D,
-    0x563E69B,
-    0xF0945F8C,
-    0x4447496,
-    0xF04EB418,
-    0x31F1705,
-    0xF01ECDC8,
-    0x1F564E3,
-    0xF004EF0F,
-    0xC8FB2D,
-    0xF0013BD0,
-    0xFF9B7AA6,
-    0xF013B92F,
-    0xFE6E8593,
-    0xF03C4D84,
-    0xFD43BD76,
-    0xF07AC083,
-    0xFC1CC0CF,
-    0xF0CEBB8B,
-    0xFAFB28D9,
-    0xF137CA1A,
-    0xF9E08755,
-    0xF1B55A71,
-    0xF8CE6458,
-    0xF246BE5F,
-    0xF7C63C32,
-    0xF2EB2C32,
-    0xF6C97D58,
-    0xF3A1BFCD,
-    0xF5D9866C,
-    0xF4697BE6,
-    0xF4F7A454,
-    0xF5414B68,
-    0xF425106D,
-    0xF62802EE,
-    0xF362EEDA,
-    0xF71C6266,
-    0xF2B24CEA,
-    0xF81D16CC,
-    0xF2141FA9,
-    0xF928BC01,
-    0xF1894285,
-    0xFA3DDEB7,
-    0xF1127624,
-    0xFB5AFE78,
-    0xF0B05F54,
-    0xFC7E8FB6,
-    0xF063862A,
-    0xFDA6FDF6,
-    0xF02C5541,
-    0xFED2ADFA,
-    0xF00B192A,
-    0x10000000,
-    0x0,
-    0xFEC46D1,
-    0x1917A6C,
-    0xFB14BE7,
-    0x31F1708,
-    0xF4FA0AA,
-    0x4A5018D,
-    0xEC835E6,
-    0x61F78AC,
-    0xE1C5977,
-    0x78AD751,
-    0xD4DB312,
-    0x8E39DA0,
-    0xC5E4032,
-    0xA267996,
-    0xB504F2F,
-    0xB504F37,
-    0xA26798D,
-    0xC5E4039,
-    0x8E39D96,
-    0xD4DB318,
-    0x78AD746,
-    0xE1C597C,
-    0x61F78A1,
-    0xEC835EA,
-    0x4A50182,
-    0xF4FA0AE,
-    0x31F16FD,
-    0xFB14BE9,
-    0x1917A60,
-    0xFEC46D2,
-    0x10000000,
-    0x0,
-    0xFB14BE7,
-    0x31F1708,
-    0xEC835E6,
-    0x61F78AC,
-    0xD4DB312,
-    0x8E39DA0,
-    0xB504F2F,
-    0xB504F37,
-    0x8E39D96,
-    0xD4DB318,
-    0x61F78A1,
-    0xEC835EA,
-    0x31F16FD,
-    0xFB14BE9,
-    0xFFFFFFF5,
-    0xFFFFFFF,
-    0xFCE0E8EC,
-    0xFB14BE5,
-    0xF9E08749,
-    0xEC835E1,
-    0xF71C6256,
-    0xD4DB30B,
-    0xF4AFB0C1,
-    0xB504F26,
-    0xF2B24CE1,
-    0x8E39D8C,
-    0xF137CA11,
-    0x61F7896,
-    0xF04EB414,
-    0x31F16F1,
-    0x10000000,
-    0x0,
-    0xF4FA0AB,
-    0x4A5018B,
-    0xD4DB314,
-    0x8E39D9D,
-    0xA267992,
-    0xC5E4035,
-    0x61F78A8,
-    0xEC835E7,
-    0x1917A6A,
-    0xFEC46D2,
-    0xFCE0E8F8,
-    0xFB14BE7,
-    0xF87528B1,
-    0xE1C5978,
-    0xF4AFB0CC,
-    0xB504F32,
-    0xF1E3A687,
-    0x78AD74C,
-    0xF04EB418,
-    0x31F1705,
-    0xF013B92F,
-    0xFE6E8593,
-    0xF137CA1A,
-    0xF9E08755,
-    0xF3A1BFCD,
-    0xF5D9866C,
-    0xF71C6266,
-    0xF2B24CEA,
-    0xFB5AFE78,
-    0xF0B05F54,
-    0x10000000,
-    0x0,
-    0xEC835E6,
-    0x61F78AC,
-    0xB504F2F,
-    0xB504F37,
-    0x61F78A1,
-    0xEC835EA,
-    0x10000000,
-    0x0,
-    0xB504F2F,
-    0xB504F37,
-    0xFFFFFFF5,
-    0xFFFFFFF,
-    0xF4AFB0C1,
-    0xB504F26,
-    0x10000000,
-    0x0,
-    0x61F78A8,
-    0xEC835E7,
-    0xF4AFB0CC,
-    0xB504F32,
-    0xF137CA1A,
-    0xF9E08755,
-    0x10000000,
-    0x0,
-    0x10000000,
-    0x0,
-    0x10000000,
-    0x0,
-    0x3,
-    0xF0000001,
+complex_t cfft_tab_512[] =
+{
+    { 0x10000000, 0x0 },
+    { 0xFFFB110, 0x3243A4 },
+    { 0xFFEC430, 0x648558 },
+    { 0xFFD3970, 0x96C32C },
+    { 0xFFB10F0, 0xC8FB30 },
+    { 0xFF84AB0, 0xFB2B75 },
+    { 0xFF4E6D0, 0x12D520A },
+    { 0xFF0E580, 0x15F6D02 },
+    { 0xFEC46D0, 0x1917A6C },
+    { 0xFE70B00, 0x1C3785C },
+    { 0xFE13240, 0x1F564E6 },
+    { 0xFDABCC0, 0x2273E1C },
+    { 0xFD3AAC0, 0x259020C },
+    { 0xFCBFC90, 0x28AAED8 },
+    { 0xFC3B280, 0x2BC428C },
+    { 0xFBACCD0, 0x2EDBB3C },
+    { 0xFB14BE0, 0x31F1708 },
+    { 0xFA73020, 0x3505408 },
+    { 0xF9C79D0, 0x381704C },
+    { 0xF912980, 0x3B26A00 },
+    { 0xF853F80, 0x3E33F34 },
+    { 0xF78BC50, 0x413EE08 },
+    { 0xF6BA070, 0x44474A0 },
+    { 0xF5DEC60, 0x474D110 },
+    { 0xF4FA0B0, 0x4A50188 },
+    { 0xF40BDD0, 0x4D50430 },
+    { 0xF314470, 0x504D728 },
+    { 0xF213520, 0x5347898 },
+    { 0xF109080, 0x563E6A0 },
+    { 0xEFF5730, 0x5931F78 },
+    { 0xEED89E0, 0x5C22150 },
+    { 0xEDB2930, 0x5F0EA50 },
+    { 0xEC835E0, 0x61F78B0 },
+    { 0xEB4B0C0, 0x64DCAA0 },
+    { 0xEA09A60, 0x67BDE58 },
+    { 0xE8BF3B0, 0x6A9B210 },
+    { 0xE76BD80, 0x6D74400 },
+    { 0xE60F880, 0x7049278 },
+    { 0xE4AA590, 0x7319BA8 },
+    { 0xE33C5A0, 0x75E5DD8 },
+    { 0xE1C5970, 0x78AD750 },
+    { 0xE046210, 0x7B70650 },
+    { 0xDEBE050, 0x7E2E940 },
+    { 0xDD2D530, 0x80E7E40 },
+    { 0xDB941A0, 0x839C3D0 },
+    { 0xD9F26A0, 0x864B830 },
+    { 0xD848530, 0x88F59B0 },
+    { 0xD695E50, 0x8B9A6B0 },
+    { 0xD4DB310, 0x8E39DA0 },
+    { 0xD318480, 0x90D3CD0 },
+    { 0xD14D3D0, 0x93682B0 },
+    { 0xCF7A1F0, 0x95F6DA0 },
+    { 0xCD9F020, 0x987FC00 },
+    { 0xCBBBF80, 0x9B02C50 },
+    { 0xC9D1120, 0x9D7FD20 },
+    { 0xC7DE650, 0x9FF6CB0 },
+    { 0xC5E4030, 0xA2679A0 },
+    { 0xC3E2000, 0xA4D2250 },
+    { 0xC1D8700, 0xA736560 },
+    { 0xBFC7670, 0xA994150 },
+    { 0xBDAEF90, 0xABEB4A0 },
+    { 0xBB8F3B0, 0xAE3BDE0 },
+    { 0xB968420, 0xB085BB0 },
+    { 0xB73A220, 0xB2C8CA0 },
+    { 0xB504F30, 0xB504F30 },
+    { 0xB2C8C90, 0xB73A230 },
+    { 0xB085BA0, 0xB968420 },
+    { 0xAE3BDE0, 0xBB8F3B0 },
+    { 0xABEB490, 0xBDAEFA0 },
+    { 0xA994140, 0xBFC7670 },
+    { 0xA736550, 0xC1D8710 },
+    { 0xA4D2250, 0xC3E2010 },
+    { 0xA267990, 0xC5E4030 },
+    { 0x9FF6CA0, 0xC7DE660 },
+    { 0x9D7FD10, 0xC9D1120 },
+    { 0x9B02C50, 0xCBBBF80 },
+    { 0x987FC00, 0xCD9F020 },
+    { 0x95F6D90, 0xCF7A1F0 },
+    { 0x93682A0, 0xD14D3D0 },
+    { 0x90D3CD0, 0xD318490 },
+    { 0x8E39D90, 0xD4DB320 },
+    { 0x8B9A6B0, 0xD695E50 },
+    { 0x88F59B0, 0xD848530 },
+    { 0x864B820, 0xD9F26A0 },
+    { 0x839C3C0, 0xDB941B0 },
+    { 0x80E7E50, 0xDD2D530 },
+    { 0x7E2E938, 0xDEBE050 },
+    { 0x7B70648, 0xE046220 },
+    { 0x78AD738, 0xE1C5980 },
+    { 0x75E5DD8, 0xE33C5A0 },
+    { 0x7319BA0, 0xE4AA590 },
+    { 0x7049268, 0xE60F880 },
+    { 0x6D74408, 0xE76BD80 },
+    { 0x6A9B208, 0xE8BF3C0 },
+    { 0x67BDE48, 0xEA09A70 },
+    { 0x64DCA80, 0xEB4B0C0 },
+    { 0x61F78A8, 0xEC835E0 },
+    { 0x5F0EA40, 0xEDB2930 },
+    { 0x5C22138, 0xEED89E0 },
+    { 0x5931F78, 0xEFF5730 },
+    { 0x563E698, 0xF109080 },
+    { 0x5347880, 0xF213530 },
+    { 0x504D710, 0xF314480 },
+    { 0x4D50430, 0xF40BDD0 },
+    { 0x4A50180, 0xF4FA0B0 },
+    { 0x474D0F8, 0xF5DEC70 },
+    { 0x4447498, 0xF6BA070 },
+    { 0x413EE00, 0xF78BC50 },
+    { 0x3E33F20, 0xF853F80 },
+    { 0x3B26A04, 0xF912980 },
+    { 0x3817048, 0xF9C79D0 },
+    { 0x35053F8, 0xFA73020 },
+    { 0x31F16F0, 0xFB14BF0 },
+    { 0x2EDBB3C, 0xFBACCD0 },
+    { 0x2BC4280, 0xFC3B280 },
+    { 0x28AAEC4, 0xFCBFC90 },
+    { 0x2590214, 0xFD3AAC0 },
+    { 0x2273E14, 0xFDABCC0 },
+    { 0x1F564D8, 0xFE13240 },
+    { 0x1C37844, 0xFE70B00 },
+    { 0x1917A6A, 0xFEC46D0 },
+    { 0x15F6CF6, 0xFF0E580 },
+    { 0x12D51F6, 0xFF4E6D0 },
+    { 0xFB2B77, 0xFF84AB0 },
+    { 0xC8FB29, 0xFFB10F0 },
+    { 0x96C31C, 0xFFD3980 },
+    { 0x64853F, 0xFFEC430 },
+    { 0x3243A1, 0xFFFB110 },
+    { 0xFFFFFFF5, 0x10000000 },
+    { 0xFFCDBC47, 0xFFFB110 },
+    { 0xFF9B7AAA, 0xFFEC430 },
+    { 0xFF693CCD, 0xFFD3970 },
+    { 0xFF3704BF, 0xFFB10F0 },
+    { 0xFF04D472, 0xFF84AB0 },
+    { 0xFED2ADF4, 0xFF4E6D0 },
+    { 0xFEA092F2, 0xFF0E580 },
+    { 0xFE6E857E, 0xFEC46D0 },
+    { 0xFE3C87A4, 0xFE70B00 },
+    { 0xFE0A9B12, 0xFE13230 },
+    { 0xFDD8C1D4, 0xFDABCB0 },
+    { 0xFDA6FDD8, 0xFD3AAC0 },
+    { 0xFD755124, 0xFCBFC90 },
+    { 0xFD43BD68, 0xFC3B280 },
+    { 0xFD1244AC, 0xFBACCD0 },
+    { 0xFCE0E8F8, 0xFB14BE0 },
+    { 0xFCAFABF0, 0xFA73020 },
+    { 0xFC7E8FA0, 0xF9C79D0 },
+    { 0xFC4D95E8, 0xF912970 },
+    { 0xFC1CC0CC, 0xF853F80 },
+    { 0xFBEC11F0, 0xF78BC50 },
+    { 0xFBBB8B50, 0xF6BA070 },
+    { 0xFB8B2EF0, 0xF5DEC60 },
+    { 0xFB5AFE68, 0xF4FA0A0 },
+    { 0xFB2AFBB8, 0xF40BDD0 },
+    { 0xFAFB28E0, 0xF314470 },
+    { 0xFACB8768, 0xF213520 },
+    { 0xFA9C1950, 0xF109080 },
+    { 0xFA6CE070, 0xEFF5720 },
+    { 0xFA3DDEB0, 0xEED89E0 },
+    { 0xFA0F15A8, 0xEDB2930 },
+    { 0xF9E08740, 0xEC835E0 },
+    { 0xF9B23568, 0xEB4B0C0 },
+    { 0xF98421A8, 0xEA09A60 },
+    { 0xF9564E00, 0xE8BF3C0 },
+    { 0xF928BC00, 0xE76BD80 },
+    { 0xF8FB6D88, 0xE60F870 },
+    { 0xF8CE6450, 0xE4AA590 },
+    { 0xF8A1A210, 0xE33C590 },
+    { 0xF8752898, 0xE1C5970 },
+    { 0xF848F988, 0xE046200 },
+    { 0xF81D16D0, 0xDEBE060 },
+    { 0xF7F181C0, 0xDD2D530 },
+    { 0xF7C63C30, 0xDB941A0 },
+    { 0xF79B47D0, 0xD9F2690 },
+    { 0xF770A640, 0xD848520 },
+    { 0xF7465930, 0xD695E40 },
+    { 0xF71C6240, 0xD4DB300 },
+    { 0xF6F2C340, 0xD318490 },
+    { 0xF6C97D60, 0xD14D3D0 },
+    { 0xF6A09260, 0xCF7A1F0 },
+    { 0xF67803F0, 0xCD9F020 },
+    { 0xF64FD390, 0xCBBBF70 },
+    { 0xF62802D0, 0xC9D1110 },
+    { 0xF6009330, 0xC7DE630 },
+    { 0xF5D98670, 0xC5E4040 },
+    { 0xF5B2DDB0, 0xC3E2000 },
+    { 0xF58C9AA0, 0xC1D8700 },
+    { 0xF566BEB0, 0xBFC7660 },
+    { 0xF5414B50, 0xBDAEF80 },
+    { 0xF51C4200, 0xBB8F390 },
+    { 0xF4F7A430, 0xB968400 },
+    { 0xF4D37370, 0xB73A230 },
+    { 0xF4AFB0D0, 0xB504F30 },
+    { 0xF48C5DD0, 0xB2C8C90 },
+    { 0xF4697BD0, 0xB085BA0 },
+    { 0xF4470C40, 0xAE3BDD0 },
+    { 0xF4251050, 0xABEB480 },
+    { 0xF4038970, 0xA994120 },
+    { 0xF3E27900, 0xA736560 },
+    { 0xF3C1DFF0, 0xA4D2250 },
+    { 0xF3A1BFC0, 0xA267990 },
+    { 0xF38219A0, 0x9FF6CA0 },
+    { 0xF362EED0, 0x9D7FD00 },
+    { 0xF3444070, 0x9B02C40 },
+    { 0xF3260FC0, 0x987FBD0 },
+    { 0xF3085E10, 0x95F6D90 },
+    { 0xF2EB2C30, 0x93682A0 },
+    { 0xF2CE7B70, 0x90D3CC0 },
+    { 0xF2B24CE0, 0x8E39D90 },
+    { 0xF296A1A0, 0x8B9A690 },
+    { 0xF27B7AC0, 0x88F5980 },
+    { 0xF260D940, 0x864B800 },
+    { 0xF246BE60, 0x839C3D0 },
+    { 0xF22D2AD0, 0x80E7E40 },
+    { 0xF2141FA0, 0x7E2E928 },
+    { 0xF1FB9DE0, 0x7B70640 },
+    { 0xF1E3A670, 0x78AD730 },
+    { 0xF1CC3A50, 0x75E5DB0 },
+    { 0xF1B55A70, 0x7319BB0 },
+    { 0xF19F0780, 0x7049278 },
+    { 0xF1894280, 0x6D743F8 },
+    { 0xF1740C40, 0x6A9B1F8 },
+    { 0xF15F6590, 0x67BDE38 },
+    { 0xF14B4F40, 0x64DCA78 },
+    { 0xF137CA00, 0x61F7880 },
+    { 0xF124D6D0, 0x5F0EA58 },
+    { 0xF1127620, 0x5C22150 },
+    { 0xF100A8D0, 0x5931F70 },
+    { 0xF0EF6F70, 0x563E690 },
+    { 0xF0DECAD0, 0x5347878 },
+    { 0xF0CEBB80, 0x504D700 },
+    { 0xF0BF4220, 0x4D50408 },
+    { 0xF0B05F50, 0x4A50198 },
+    { 0xF0A213A0, 0x474D110 },
+    { 0xF0945F90, 0x4447490 },
+    { 0xF08743B0, 0x413EDF0 },
+    { 0xF07AC080, 0x3E33F14 },
+    { 0xF06ED680, 0x3B269D8 },
+    { 0xF0638620, 0x3817020 },
+    { 0xF058CFE0, 0x350540C },
+    { 0xF04EB410, 0x31F1704 },
+    { 0xF0453330, 0x2EDBB30 },
+    { 0xF03C4D80, 0x2BC4274 },
+    { 0xF0340370, 0x28AAEB8 },
+    { 0xF02C5540, 0x25901E8 },
+    { 0xF0254340, 0x2273DE8 },
+    { 0xF01ECDD0, 0x1F564EC },
+    { 0xF018F500, 0x1C3785A },
+    { 0xF013B930, 0x1917A60 },
+    { 0xF00F1A80, 0x15F6CEA },
+    { 0xF00B1920, 0x12D51EA },
+    { 0xF007B550, 0xFB2B4B },
+    { 0xF004EF10, 0xC8FAFD },
+    { 0xF002C690, 0x96C330 },
+    { 0xF0013BD0, 0x648553 },
+    { 0xF0004EF0, 0x324395 },
+    { 0x10000000, 0x0 },
+    { 0xFFEC430, 0x648558 },
+    { 0xFFB10F0, 0xC8FB30 },
+    { 0xFF4E6D0, 0x12D520A },
+    { 0xFEC46D0, 0x1917A6C },
+    { 0xFE13240, 0x1F564E6 },
+    { 0xFD3AAC0, 0x259020C },
+    { 0xFC3B280, 0x2BC428C },
+    { 0xFB14BE0, 0x31F1708 },
+    { 0xF9C79D0, 0x381704C },
+    { 0xF853F80, 0x3E33F34 },
+    { 0xF6BA070, 0x44474A0 },
+    { 0xF4FA0B0, 0x4A50188 },
+    { 0xF314470, 0x504D728 },
+    { 0xF109080, 0x563E6A0 },
+    { 0xEED89E0, 0x5C22150 },
+    { 0xEC835E0, 0x61F78B0 },
+    { 0xEA09A60, 0x67BDE58 },
+    { 0xE76BD80, 0x6D74400 },
+    { 0xE4AA590, 0x7319BA8 },
+    { 0xE1C5970, 0x78AD750 },
+    { 0xDEBE050, 0x7E2E940 },
+    { 0xDB941A0, 0x839C3D0 },
+    { 0xD848530, 0x88F59B0 },
+    { 0xD4DB310, 0x8E39DA0 },
+    { 0xD14D3D0, 0x93682B0 },
+    { 0xCD9F020, 0x987FC00 },
+    { 0xC9D1120, 0x9D7FD20 },
+    { 0xC5E4030, 0xA2679A0 },
+    { 0xC1D8700, 0xA736560 },
+    { 0xBDAEF90, 0xABEB4A0 },
+    { 0xB968420, 0xB085BB0 },
+    { 0xB504F30, 0xB504F30 },
+    { 0xB085BA0, 0xB968420 },
+    { 0xABEB490, 0xBDAEFA0 },
+    { 0xA736550, 0xC1D8710 },
+    { 0xA267990, 0xC5E4030 },
+    { 0x9D7FD10, 0xC9D1120 },
+    { 0x987FC00, 0xCD9F020 },
+    { 0x93682A0, 0xD14D3D0 },
+    { 0x8E39D90, 0xD4DB320 },
+    { 0x88F59B0, 0xD848530 },
+    { 0x839C3C0, 0xDB941B0 },
+    { 0x7E2E938, 0xDEBE050 },
+    { 0x78AD738, 0xE1C5980 },
+    { 0x7319BA0, 0xE4AA590 },
+    { 0x6D74408, 0xE76BD80 },
+    { 0x67BDE48, 0xEA09A70 },
+    { 0x61F78A8, 0xEC835E0 },
+    { 0x5C22138, 0xEED89E0 },
+    { 0x563E698, 0xF109080 },
+    { 0x504D710, 0xF314480 },
+    { 0x4A50180, 0xF4FA0B0 },
+    { 0x4447498, 0xF6BA070 },
+    { 0x3E33F20, 0xF853F80 },
+    { 0x3817048, 0xF9C79D0 },
+    { 0x31F16F0, 0xFB14BF0 },
+    { 0x2BC4280, 0xFC3B280 },
+    { 0x2590214, 0xFD3AAC0 },
+    { 0x1F564D8, 0xFE13240 },
+    { 0x1917A6A, 0xFEC46D0 },
+    { 0x12D51F6, 0xFF4E6D0 },
+    { 0xC8FB29, 0xFFB10F0 },
+    { 0x64853F, 0xFFEC430 },
+    { 0x10000000, 0x0 },
+    { 0xFFB10F0, 0xC8FB30 },
+    { 0xFEC46D0, 0x1917A6C },
+    { 0xFD3AAC0, 0x259020C },
+    { 0xFB14BE0, 0x31F1708 },
+    { 0xF853F80, 0x3E33F34 },
+    { 0xF4FA0B0, 0x4A50188 },
+    { 0xF109080, 0x563E6A0 },
+    { 0xEC835E0, 0x61F78B0 },
+    { 0xE76BD80, 0x6D74400 },
+    { 0xE1C5970, 0x78AD750 },
+    { 0xDB941A0, 0x839C3D0 },
+    { 0xD4DB310, 0x8E39DA0 },
+    { 0xCD9F020, 0x987FC00 },
+    { 0xC5E4030, 0xA2679A0 },
+    { 0xBDAEF90, 0xABEB4A0 },
+    { 0xB504F30, 0xB504F30 },
+    { 0xABEB490, 0xBDAEFA0 },
+    { 0xA267990, 0xC5E4030 },
+    { 0x987FC00, 0xCD9F020 },
+    { 0x8E39D90, 0xD4DB320 },
+    { 0x839C3C0, 0xDB941B0 },
+    { 0x78AD738, 0xE1C5980 },
+    { 0x6D74408, 0xE76BD80 },
+    { 0x61F78A8, 0xEC835E0 },
+    { 0x563E698, 0xF109080 },
+    { 0x4A50180, 0xF4FA0B0 },
+    { 0x3E33F20, 0xF853F80 },
+    { 0x31F16F0, 0xFB14BF0 },
+    { 0x2590214, 0xFD3AAC0 },
+    { 0x1917A6A, 0xFEC46D0 },
+    { 0xC8FB29, 0xFFB10F0 },
+    { 0xFFFFFFF5, 0x10000000 },
+    { 0xFF3704BF, 0xFFB10F0 },
+    { 0xFE6E857E, 0xFEC46D0 },
+    { 0xFDA6FDD8, 0xFD3AAC0 },
+    { 0xFCE0E8F8, 0xFB14BE0 },
+    { 0xFC1CC0CC, 0xF853F80 },
+    { 0xFB5AFE68, 0xF4FA0A0 },
+    { 0xFA9C1950, 0xF109080 },
+    { 0xF9E08740, 0xEC835E0 },
+    { 0xF928BC00, 0xE76BD80 },
+    { 0xF8752898, 0xE1C5970 },
+    { 0xF7C63C30, 0xDB941A0 },
+    { 0xF71C6240, 0xD4DB300 },
+    { 0xF67803F0, 0xCD9F020 },
+    { 0xF5D98670, 0xC5E4040 },
+    { 0xF5414B50, 0xBDAEF80 },
+    { 0xF4AFB0D0, 0xB504F30 },
+    { 0xF4251050, 0xABEB480 },
+    { 0xF3A1BFC0, 0xA267990 },
+    { 0xF3260FC0, 0x987FBD0 },
+    { 0xF2B24CE0, 0x8E39D90 },
+    { 0xF246BE60, 0x839C3D0 },
+    { 0xF1E3A670, 0x78AD730 },
+    { 0xF1894280, 0x6D743F8 },
+    { 0xF137CA00, 0x61F7880 },
+    { 0xF0EF6F70, 0x563E690 },
+    { 0xF0B05F50, 0x4A50198 },
+    { 0xF07AC080, 0x3E33F14 },
+    { 0xF04EB410, 0x31F1704 },
+    { 0xF02C5540, 0x25901E8 },
+    { 0xF013B930, 0x1917A60 },
+    { 0xF004EF10, 0xC8FAFD },
+    { 0x10000000, 0x0 },
+    { 0xFF4E6D0, 0x12D520A },
+    { 0xFD3AAC0, 0x259020C },
+    { 0xF9C79D0, 0x381704C },
+    { 0xF4FA0B0, 0x4A50188 },
+    { 0xEED89E0, 0x5C22150 },
+    { 0xE76BD80, 0x6D74400 },
+    { 0xDEBE050, 0x7E2E940 },
+    { 0xD4DB310, 0x8E39DA0 },
+    { 0xC9D1130, 0x9D7FD10 },
+    { 0xBDAEF90, 0xABEB4A0 },
+    { 0xB085BA0, 0xB968420 },
+    { 0xA267990, 0xC5E4030 },
+    { 0x93682B0, 0xD14D3D0 },
+    { 0x839C3C0, 0xDB941B0 },
+    { 0x7319BA0, 0xE4AA590 },
+    { 0x61F78A8, 0xEC835E0 },
+    { 0x504D728, 0xF314470 },
+    { 0x3E33F40, 0xF853F80 },
+    { 0x2BC4280, 0xFC3B280 },
+    { 0x1917A6A, 0xFEC46D0 },
+    { 0x64855F, 0xFFEC430 },
+    { 0xFF3704BF, 0xFFB10F0 },
+    { 0xFE0A9B12, 0xFE13230 },
+    { 0xFCE0E8F8, 0xFB14BE0 },
+    { 0xFBBB8B70, 0xF6BA070 },
+    { 0xFA9C1970, 0xF109080 },
+    { 0xF98421A8, 0xEA09A60 },
+    { 0xF8752898, 0xE1C5970 },
+    { 0xF770A640, 0xD848520 },
+    { 0xF67803F0, 0xCD9F020 },
+    { 0xF58C9AA0, 0xC1D8700 },
+    { 0xF4AFB0D0, 0xB504F30 },
+    { 0xF3E27900, 0xA736560 },
+    { 0xF3260FE0, 0x987FC10 },
+    { 0xF27B7AE0, 0x88F59C0 },
+    { 0xF1E3A690, 0x78AD768 },
+    { 0xF15F6590, 0x67BDE38 },
+    { 0xF0EF6F70, 0x563E690 },
+    { 0xF0945F90, 0x4447490 },
+    { 0xF04EB410, 0x31F1704 },
+    { 0xF01ECDD0, 0x1F564EC },
+    { 0xF004EF10, 0xC8FB3D },
+    { 0xF0013BD0, 0xFF9B7ABE },
+    { 0xF013B930, 0xFE6E8572 },
+    { 0xF03C4D80, 0xFD43BD5C },
+    { 0xF07AC080, 0xFC1CC0C0 },
+    { 0xF0CEBB90, 0xFAFB28D0 },
+    { 0xF137CA20, 0xF9E08758 },
+    { 0xF1B55A70, 0xF8CE6460 },
+    { 0xF246BE50, 0xF7C63C40 },
+    { 0xF2EB2C20, 0xF6C97D70 },
+    { 0xF3A1BFB0, 0xF5D98680 },
+    { 0xF4697BF0, 0xF4F7A440 },
+    { 0xF5414B70, 0xF4251060 },
+    { 0xF62802F0, 0xF362EED0 },
+    { 0xF71C62A0, 0xF2B24CC0 },
+    { 0xF81D16C8, 0xF2141FB0 },
+    { 0xF928BC28, 0xF1894270 },
+    { 0xFA3DDEA0, 0xF1127630 },
+    { 0xFB5AFE98, 0xF0B05F50 },
+    { 0xFC7E8F90, 0xF0638630 },
+    { 0xFDA6FE04, 0xF02C5540 },
+    { 0xFED2ADC2, 0xF00B1930 },
+    { 0x10000000, 0x0 },
+    { 0xFEC46D0, 0x1917A6C },
+    { 0xFB14BE0, 0x31F1708 },
+    { 0xF4FA0B0, 0x4A50188 },
+    { 0xEC835E0, 0x61F78B0 },
+    { 0xE1C5970, 0x78AD750 },
+    { 0xD4DB310, 0x8E39DA0 },
+    { 0xC5E4030, 0xA2679A0 },
+    { 0xB504F30, 0xB504F30 },
+    { 0xA267990, 0xC5E4030 },
+    { 0x8E39D90, 0xD4DB320 },
+    { 0x78AD738, 0xE1C5980 },
+    { 0x61F78A8, 0xEC835E0 },
+    { 0x4A50180, 0xF4FA0B0 },
+    { 0x31F16F0, 0xFB14BF0 },
+    { 0x1917A6A, 0xFEC46D0 },
+    { 0x10000000, 0x0 },
+    { 0xFB14BE0, 0x31F1708 },
+    { 0xEC835E0, 0x61F78B0 },
+    { 0xD4DB310, 0x8E39DA0 },
+    { 0xB504F30, 0xB504F30 },
+    { 0x8E39D90, 0xD4DB320 },
+    { 0x61F78A8, 0xEC835E0 },
+    { 0x31F16F0, 0xFB14BF0 },
+    { 0xFFFFFFF5, 0x10000000 },
+    { 0xFCE0E8F8, 0xFB14BE0 },
+    { 0xF9E08740, 0xEC835E0 },
+    { 0xF71C6240, 0xD4DB300 },
+    { 0xF4AFB0D0, 0xB504F30 },
+    { 0xF2B24CE0, 0x8E39D90 },
+    { 0xF137CA00, 0x61F7880 },
+    { 0xF04EB410, 0x31F1704 },
+    { 0x10000000, 0x0 },
+    { 0xF4FA0B0, 0x4A50188 },
+    { 0xD4DB310, 0x8E39DA0 },
+    { 0xA267990, 0xC5E4030 },
+    { 0x61F78A8, 0xEC835E0 },
+    { 0x1917A6A, 0xFEC46D0 },
+    { 0xFCE0E8F8, 0xFB14BE0 },
+    { 0xF8752898, 0xE1C5970 },
+    { 0xF4AFB0D0, 0xB504F30 },
+    { 0xF1E3A690, 0x78AD768 },
+    { 0xF04EB410, 0x31F1704 },
+    { 0xF013B930, 0xFE6E8572 },
+    { 0xF137CA20, 0xF9E08758 },
+    { 0xF3A1BFB0, 0xF5D98680 },
+    { 0xF71C62A0, 0xF2B24CC0 },
+    { 0xFB5AFE98, 0xF0B05F50 },
+    { 0x10000000, 0x0 },
+    { 0xEC835E0, 0x61F78B0 },
+    { 0xB504F30, 0xB504F30 },
+    { 0x61F78A8, 0xEC835E0 },
+    { 0x10000000, 0x0 },
+    { 0xB504F30, 0xB504F30 },
+    { 0xFFFFFFF5, 0x10000000 },
+    { 0xF4AFB0D0, 0xB504F30 },
+    { 0x10000000, 0x0 },
+    { 0x61F78A8, 0xEC835E0 },
+    { 0xF4AFB0D0, 0xB504F30 },
+    { 0xF137CA20, 0xF9E08758 },
+    { 0x10000000, 0x0 },
+    { 0x10000000, 0x0 },
+    { 0x10000000, 0x0 },
+    { 0x3, 0xF0000000 }
 };
 
-real_t cfft_tab_480[] =
+complex_t cfft_tab_480[] =
 {
-    0x10000000,
-    0x0,
-    0xFFFA62A,
-    0x359D6F,
-    0xFFE98AD,
-    0x6B3885,
-    0xFFCD795,
-    0xA0CEE6,
-    0xFFA62F6,
-    0xD65E3A,
-    0xFF73AEB,
-    0x10BE427,
-    0xFF35F97,
-    0x1415E53,
-    0xFEED125,
-    0x176CA67,
-    0xFE98FCA,
-    0x1AC260A,
-    0xFE39BBF,
-    0x1E16EE5,
-    0xFDCF549,
-    0x216A2A2,
-    0xFD59CB1,
-    0x24BBEEC,
-    0xFCD9249,
-    0x280C16E,
-    0xFC4D66D,
-    0x2B5A7D4,
-    0xFBB697F,
-    0x2EA6FCD,
-    0xFB14BE7,
-    0x31F1708,
-    0xFA67E18,
-    0x3539B37,
-    0xF9B008C,
-    0x387FA0A,
-    0xF8ED3C2,
-    0x3BC3136,
-    0xF81F844,
-    0x3F03E71,
-    0xF746EA3,
-    0x4241F72,
-    0xF663775,
-    0x457D1F2,
-    0xF57535C,
-    0x48B53AE,
-    0xF47C2FD,
-    0x4BEA263,
-    0xF378708,
-    0x4F1BBD0,
-    0xF26A034,
-    0x5249DB7,
-    0xF150F3D,
-    0x55745DE,
-    0xF02D4EA,
-    0x589B20C,
-    0xEEFF206,
-    0x5BBE00A,
-    0xEDC6766,
-    0x5EDCDA5,
-    0xEC835E6,
-    0x61F78AC,
-    0xEB35E68,
-    0x650DEF1,
-    0xE9DE1D6,
-    0x681FE4B,
-    0xE87C121,
-    0x6B2D490,
-    0xE70FD42,
-    0x6E35F9D,
-    0xE599739,
-    0x7139D51,
-    0xE41900D,
-    0x7438B8D,
-    0xE28E8CA,
-    0x7732839,
-    0xE0FA286,
-    0x7A2713C,
-    0xDF5BE5D,
-    0x7D16485,
-    0xDDB3D72,
-    0x8000003,
-    0xDC020ED,
-    0x82E41AC,
-    0xDA46A01,
-    0x85C2777,
-    0xD8819E3,
-    0x889AF63,
-    0xD6B31D1,
-    0x8B6D76F,
-    0xD4DB312,
-    0x8E39DA0,
-    0xD2F9EEE,
-    0x9100000,
-    0xD10F6B9,
-    0x93BFC9C,
-    0xCF1BBCB,
-    0x9679186,
-    0xCD1EF81,
-    0x992BCD4,
-    0xCB19342,
-    0x9BD7CA3,
-    0xC90A879,
-    0x9E7CF12,
-    0xC6F3097,
-    0xA11B246,
-    0xC4D2D14,
-    0xA3B2468,
-    0xC2A9F6E,
-    0xA6423A7,
-    0xC07892A,
-    0xA8CAE36,
-    0xBE3EBD0,
-    0xAB4C24F,
-    0xBBFC8F1,
-    0xADC5E2F,
-    0xB9B2224,
-    0xB03801A,
-    0xB75F902,
-    0xB2A2658,
-    0xB504F2F,
-    0xB504F37,
-    0xB2A2650,
-    0xB75F90A,
-    0xB038012,
-    0xB9B222C,
-    0xADC5E27,
-    0xBBFC8F9,
-    0xAB4C246,
-    0xBE3EBD8,
-    0xA8CAE2D,
-    0xC078931,
-    0xA64239E,
-    0xC2A9F76,
-    0xA3B245F,
-    0xC4D2D1B,
-    0xA11B23C,
-    0xC6F309E,
-    0x9E7CF09,
-    0xC90A880,
-    0x9BD7C9A,
-    0xCB19349,
-    0x992BCCB,
-    0xCD1EF88,
-    0x967917C,
-    0xCF1BBD1,
-    0x93BFC92,
-    0xD10F6C0,
-    0x90FFFF6,
-    0xD2F9EF5,
-    0x8E39D96,
-    0xD4DB318,
-    0x8B6D765,
-    0xD6B31D8,
-    0x889AF59,
-    0xD8819E9,
-    0x85C276D,
-    0xDA46A07,
-    0x82E41A2,
-    0xDC020F3,
-    0x7FFFFF9,
-    0xDDB3D78,
-    0x7D1647A,
-    0xDF5BE63,
-    0x7A27132,
-    0xE0FA28C,
-    0x773282E,
-    0xE28E8CF,
-    0x7438B83,
-    0xE419012,
-    0x7139D46,
-    0xE59973F,
-    0x6E35F92,
-    0xE70FD48,
-    0x6B2D485,
-    0xE87C126,
-    0x681FE40,
-    0xE9DE1DA,
-    0x650DEE7,
-    0xEB35E6C,
-    0x61F78A1,
-    0xEC835EA,
-    0x5EDCD9A,
-    0xEDC676B,
-    0x5BBDFFF,
-    0xEEFF20A,
-    0x589B201,
-    0xF02D4EE,
-    0x55745D3,
-    0xF150F41,
-    0x5249DAC,
-    0xF26A038,
-    0x4F1BBC4,
-    0xF37870C,
-    0x4BEA257,
-    0xF47C301,
-    0x48B53A3,
-    0xF57535F,
-    0x457D1E7,
-    0xF663778,
-    0x4241F66,
-    0xF746EA6,
-    0x3F03E65,
-    0xF81F847,
-    0x3BC312A,
-    0xF8ED3C5,
-    0x387F9FE,
-    0xF9B008E,
-    0x3539B2B,
-    0xFA67E1B,
-    0x31F16FD,
-    0xFB14BE9,
-    0x2EA6FC2,
-    0xFBB6981,
-    0x2B5A7C8,
-    0xFC4D66F,
-    0x280C162,
-    0xFCD924B,
-    0x24BBEE0,
-    0xFD59CB2,
-    0x216A297,
-    0xFDCF54A,
-    0x1E16EDA,
-    0xFE39BC1,
-    0x1AC25FE,
-    0xFE98FCB,
-    0x176CA5B,
-    0xFEED126,
-    0x1415E48,
-    0xFF35F97,
-    0x10BE41B,
-    0xFF73AEB,
-    0xD65E2E,
-    0xFFA62F7,
-    0xA0CEDB,
-    0xFFCD796,
-    0x6B3879,
-    0xFFE98AE,
-    0x359D63,
-    0xFFFA62A,
-    0xFFFFFFF5,
-    0xFFFFFFF,
-    0xFFCA6285,
-    0xFFFA62A,
-    0xFF94C770,
-    0xFFE98AD,
-    0xFF5F310E,
-    0xFFCD795,
-    0xFF29A1BA,
-    0xFFA62F5,
-    0xFEF41BCD,
-    0xFF73AEA,
-    0xFEBEA1A1,
-    0xFF35F96,
-    0xFE89358D,
-    0xFEED124,
-    0xFE53D9EA,
-    0xFE98FC9,
-    0xFE1E910F,
-    0xFE39BBE,
-    0xFDE95D52,
-    0xFDCF547,
-    0xFDB44108,
-    0xFD59CAF,
-    0xFD7F3E87,
-    0xFCD9248,
-    0xFD4A5820,
-    0xFC4D66B,
-    0xFD159027,
-    0xFBB697D,
-    0xFCE0E8EC,
-    0xFB14BE5,
-    0xFCAC64BE,
-    0xFA67E16,
-    0xFC7805EB,
-    0xF9B0089,
-    0xFC43CEBF,
-    0xF8ED3BF,
-    0xFC0FC184,
-    0xF81F841,
-    0xFBDBE083,
-    0xF746EA0,
-    0xFBA82E02,
-    0xF663772,
-    0xFB74AC47,
-    0xF575358,
-    0xFB415D92,
-    0xF47C2FA,
-    0xFB0E4425,
-    0xF378705,
-    0xFADB623E,
-    0xF26A030,
-    0xFAA8BA17,
-    0xF150F39,
-    0xFA764DE9,
-    0xF02D4E6,
-    0xFA441FEB,
-    0xEEFF202,
-    0xFA123250,
-    0xEDC6762,
-    0xF9E08749,
-    0xEC835E1,
-    0xF9AF2104,
-    0xEB35E63,
-    0xF97E01AB,
-    0xE9DE1D1,
-    0xF94D2B65,
-    0xE87C11C,
-    0xF91CA058,
-    0xE70FD3D,
-    0xF8EC62A5,
-    0xE599734,
-    0xF8BC7468,
-    0xE419007,
-    0xF88CD7BD,
-    0xE28E8C4,
-    0xF85D8EBA,
-    0xE0FA281,
-    0xF82E9B71,
-    0xDF5BE57,
-    0xF7FFFFF3,
-    0xDDB3D6C,
-    0xF7D1BE4A,
-    0xDC020E7,
-    0xF7A3D87F,
-    0xDA469FB,
-    0xF7765093,
-    0xD8819DC,
-    0xF7492887,
-    0xD6B31CB,
-    0xF71C6256,
-    0xD4DB30B,
-    0xF6EFFFF7,
-    0xD2F9EE8,
-    0xF6C4035B,
-    0xD10F6B2,
-    0xF6986E71,
-    0xCF1BBC4,
-    0xF66D4322,
-    0xCD1EF7A,
-    0xF6428354,
-    0xCB1933B,
-    0xF61830E5,
-    0xC90A872,
-    0xF5EE4DB1,
-    0xC6F308F,
-    0xF5C4DB8F,
-    0xC4D2D0C,
-    0xF59BDC51,
-    0xC2A9F67,
-    0xF57351C1,
-    0xC078922,
-    0xF54B3DA8,
-    0xBE3EBC8,
-    0xF523A1C8,
-    0xBBFC8E9,
-    0xF4FC7FDD,
-    0xB9B221C,
-    0xF4D5D9A0,
-    0xB75F8FA,
-    0xF4AFB0C1,
-    0xB504F26,
-    0xF48A06ED,
-    0xB2A2647,
-    0xF464DDCC,
-    0xB038009,
-    0xF44036FF,
-    0xADC5E1E,
-    0xF41C1420,
-    0xAB4C23E,
-    0xF3F876C7,
-    0xA8CAE24,
-    0xF3D56083,
-    0xA642395,
-    0xF3B2D2DD,
-    0xA3B2456,
-    0xF390CF5A,
-    0xA11B233,
-    0xF36F5779,
-    0x9E7CF00,
-    0xF34E6CB0,
-    0x9BD7C91,
-    0xF32E1071,
-    0x992BCC2,
-    0xF30E4428,
-    0x9679173,
-    0xF2EF0939,
-    0x93BFC88,
-    0xF2D06105,
-    0x90FFFEC,
-    0xF2B24CE1,
-    0x8E39D8C,
-    0xF294CE22,
-    0x8B6D75B,
-    0xF277E611,
-    0x889AF4F,
-    0xF25B95F3,
-    0x85C2763,
-    0xF23FDF07,
-    0x82E4197,
-    0xF224C283,
-    0x7FFFFEF,
-    0xF20A4197,
-    0x7D16470,
-    0xF1F05D6F,
-    0x7A27128,
-    0xF1D7172B,
-    0x7732824,
-    0xF1BE6FE9,
-    0x7438B79,
-    0xF1A668BC,
-    0x7139D3C,
-    0xF18F02B3,
-    0x6E35F88,
-    0xF1783ED5,
-    0x6B2D47B,
-    0xF1621E21,
-    0x681FE35,
-    0xF14CA18F,
-    0x650DEDC,
-    0xF137CA11,
-    0x61F7896,
-    0xF1239891,
-    0x5EDCD8F,
-    0xF1100DF2,
-    0x5BBDFF4,
-    0xF0FD2B0E,
-    0x589B1F6,
-    0xF0EAF0BB,
-    0x55745C8,
-    0xF0D95FC5,
-    0x5249DA1,
-    0xF0C878F0,
-    0x4F1BBB9,
-    0xF0B83CFC,
-    0x4BEA24C,
-    0xF0A8AC9E,
-    0x48B5398,
-    0xF099C884,
-    0x457D1DC,
-    0xF08B9157,
-    0x4241F5B,
-    0xF07E07B6,
-    0x3F03E5A,
-    0xF0712C38,
-    0x3BC311F,
-    0xF064FF6F,
-    0x387F9F3,
-    0xF05981E3,
-    0x3539B20,
-    0xF04EB414,
-    0x31F16F1,
-    0xF044967D,
-    0x2EA6FB6,
-    0xF03B298F,
-    0x2B5A7BD,
-    0xF0326DB3,
-    0x280C156,
-    0xF02A634C,
-    0x24BBED5,
-    0xF0230AB4,
-    0x216A28B,
-    0xF01C643E,
-    0x1E16ECE,
-    0xF0167034,
-    0x1AC25F3,
-    0xF0112ED9,
-    0x176CA50,
-    0xF00CA068,
-    0x1415E3C,
-    0xF008C514,
-    0x10BE40F,
-    0xF0059D09,
-    0xD65E23,
-    0xF003286A,
-    0xA0CECF,
-    0xF0016752,
-    0x6B386D,
-    0xF00059D6,
-    0x359D58,
-    0x10000000,
-    0x0,
-    0xFFE98AD,
-    0x6B3885,
-    0xFFA62F6,
-    0xD65E3A,
-    0xFF35F97,
-    0x1415E53,
-    0xFE98FCA,
-    0x1AC260A,
-    0xFDCF549,
-    0x216A2A2,
-    0xFCD9249,
-    0x280C16E,
-    0xFBB697F,
-    0x2EA6FCD,
-    0xFA67E18,
-    0x3539B37,
-    0xF8ED3C2,
-    0x3BC3136,
-    0xF746EA3,
-    0x4241F72,
-    0xF57535C,
-    0x48B53AE,
-    0xF378708,
-    0x4F1BBD0,
-    0xF150F3D,
-    0x55745DE,
-    0xEEFF206,
-    0x5BBE00A,
-    0xEC835E6,
-    0x61F78AC,
-    0xE9DE1D6,
-    0x681FE4B,
-    0xE70FD42,
-    0x6E35F9D,
-    0xE41900D,
-    0x7438B8D,
-    0xE0FA286,
-    0x7A2713C,
-    0xDDB3D72,
-    0x8000003,
-    0xDA46A01,
-    0x85C2777,
-    0xD6B31D1,
-    0x8B6D76F,
-    0xD2F9EEE,
-    0x9100000,
-    0xCF1BBCB,
-    0x9679186,
-    0xCB19342,
-    0x9BD7CA3,
-    0xC6F3097,
-    0xA11B246,
-    0xC2A9F6E,
-    0xA6423A7,
-    0xBE3EBD0,
-    0xAB4C24F,
-    0xB9B2224,
-    0xB03801A,
-    0xB504F2F,
-    0xB504F37,
-    0xB038012,
-    0xB9B222C,
-    0xAB4C246,
-    0xBE3EBD8,
-    0xA64239E,
-    0xC2A9F76,
-    0xA11B23C,
-    0xC6F309E,
-    0x9BD7C9A,
-    0xCB19349,
-    0x967917C,
-    0xCF1BBD1,
-    0x90FFFF6,
-    0xD2F9EF5,
-    0x8B6D765,
-    0xD6B31D8,
-    0x85C276D,
-    0xDA46A07,
-    0x7FFFFF9,
-    0xDDB3D78,
-    0x7A27132,
-    0xE0FA28C,
-    0x7438B83,
-    0xE419012,
-    0x6E35F92,
-    0xE70FD48,
-    0x681FE40,
-    0xE9DE1DA,
-    0x61F78A1,
-    0xEC835EA,
-    0x5BBDFFF,
-    0xEEFF20A,
-    0x55745D3,
-    0xF150F41,
-    0x4F1BBC4,
-    0xF37870C,
-    0x48B53A3,
-    0xF57535F,
-    0x4241F66,
-    0xF746EA6,
-    0x3BC312A,
-    0xF8ED3C5,
-    0x3539B2B,
-    0xFA67E1B,
-    0x2EA6FC2,
-    0xFBB6981,
-    0x280C162,
-    0xFCD924B,
-    0x216A297,
-    0xFDCF54A,
-    0x1AC25FE,
-    0xFE98FCB,
-    0x1415E48,
-    0xFF35F97,
-    0xD65E2E,
-    0xFFA62F7,
-    0x6B3879,
-    0xFFE98AE,
-    0xFFFFFFF5,
-    0xFFFFFFF,
-    0xFF94C770,
-    0xFFE98AD,
-    0xFF29A1BA,
-    0xFFA62F5,
-    0xFEBEA1A1,
-    0xFF35F96,
-    0xFE53D9EA,
-    0xFE98FC9,
-    0xFDE95D52,
-    0xFDCF547,
-    0xFD7F3E87,
-    0xFCD9248,
-    0xFD159027,
-    0xFBB697D,
-    0xFCAC64BE,
-    0xFA67E16,
-    0xFC43CEBF,
-    0xF8ED3BF,
-    0xFBDBE083,
-    0xF746EA0,
-    0xFB74AC47,
-    0xF575358,
-    0xFB0E4425,
-    0xF378705,
-    0xFAA8BA17,
-    0xF150F39,
-    0xFA441FEB,
-    0xEEFF202,
-    0xF9E08749,
-    0xEC835E1,
-    0xF97E01AB,
-    0xE9DE1D1,
-    0xF91CA058,
-    0xE70FD3D,
-    0xF8BC7468,
-    0xE419007,
-    0xF85D8EBA,
-    0xE0FA281,
-    0x10000000,
-    0x0,
-    0xFFA62F6,
-    0xD65E3A,
-    0xFE98FCA,
-    0x1AC260A,
-    0xFCD9249,
-    0x280C16E,
-    0xFA67E18,
-    0x3539B37,
-    0xF746EA3,
-    0x4241F72,
-    0xF378708,
-    0x4F1BBD0,
-    0xEEFF206,
-    0x5BBE00A,
-    0xE9DE1D6,
-    0x681FE4B,
-    0xE41900D,
-    0x7438B8D,
-    0xDDB3D72,
-    0x8000003,
-    0xD6B31D1,
-    0x8B6D76F,
-    0xCF1BBCB,
-    0x9679186,
-    0xC6F3097,
-    0xA11B246,
-    0xBE3EBD0,
-    0xAB4C24F,
-    0xB504F2F,
-    0xB504F37,
-    0xAB4C246,
-    0xBE3EBD8,
-    0xA11B23C,
-    0xC6F309E,
-    0x967917C,
-    0xCF1BBD1,
-    0x8B6D765,
-    0xD6B31D8,
-    0x7FFFFF9,
-    0xDDB3D78,
-    0x7438B83,
-    0xE419012,
-    0x681FE40,
-    0xE9DE1DA,
-    0x5BBDFFF,
-    0xEEFF20A,
-    0x4F1BBC4,
-    0xF37870C,
-    0x4241F66,
-    0xF746EA6,
-    0x3539B2B,
-    0xFA67E1B,
-    0x280C162,
-    0xFCD924B,
-    0x1AC25FE,
-    0xFE98FCB,
-    0xD65E2E,
-    0xFFA62F7,
-    0xFFFFFFF5,
-    0xFFFFFFF,
-    0xFF29A1BA,
-    0xFFA62F5,
-    0xFE53D9EA,
-    0xFE98FC9,
-    0xFD7F3E87,
-    0xFCD9248,
-    0xFCAC64BE,
-    0xFA67E16,
-    0xFBDBE083,
-    0xF746EA0,
-    0xFB0E4425,
-    0xF378705,
-    0xFA441FEB,
-    0xEEFF202,
-    0xF97E01AB,
-    0xE9DE1D1,
-    0xF8BC7468,
-    0xE419007,
-    0xF7FFFFF3,
-    0xDDB3D6C,
-    0xF7492887,
-    0xD6B31CB,
-    0xF6986E71,
-    0xCF1BBC4,
-    0xF5EE4DB1,
-    0xC6F308F,
-    0xF54B3DA8,
-    0xBE3EBC8,
-    0xF4AFB0C1,
-    0xB504F26,
-    0xF41C1420,
-    0xAB4C23E,
-    0xF390CF5A,
-    0xA11B233,
-    0xF30E4428,
-    0x9679173,
-    0xF294CE22,
-    0x8B6D75B,
-    0xF224C283,
-    0x7FFFFEF,
-    0xF1BE6FE9,
-    0x7438B79,
-    0xF1621E21,
-    0x681FE35,
-    0xF1100DF2,
-    0x5BBDFF4,
-    0xF0C878F0,
-    0x4F1BBB9,
-    0xF08B9157,
-    0x4241F5B,
-    0xF05981E3,
-    0x3539B20,
-    0xF0326DB3,
-    0x280C156,
-    0xF0167034,
-    0x1AC25F3,
-    0xF0059D09,
-    0xD65E23,
-    0xF0000001,
-    0xFFFFFFE9,
-    0xF0059D0B,
-    0xFF29A1AE,
-    0xF0167039,
-    0xFE53D9DF,
-    0xF0326DBA,
-    0xFD7F3E7B,
-    0xF05981EC,
-    0xFCAC64B2,
-    0xF08B9163,
-    0xFBDBE078,
-    0xF0C878FF,
-    0xFB0E441A,
-    0xF1100E02,
-    0xFA441FE0,
-    0xF1621E34,
-    0xF97E01A0,
-    0xF1BE6FFE,
-    0xF8BC745E,
-    0xF224C29A,
-    0xF7FFFFE9,
-    0xF294CE3B,
-    0xF749287D,
-    0xF30E4443,
-    0xF6986E67,
-    0xF390CF78,
-    0xF5EE4DA8,
-    0xF41C1440,
-    0xF54B3DA0,
-    0xF4AFB0E2,
-    0xF4AFB0B9,
-    0xF54B3DCB,
-    0xF41C1419,
-    0xF5EE4DD6,
-    0xF390CF53,
-    0xF6986E97,
-    0xF30E4421,
-    0xF74928AF,
-    0xF294CE1B,
-    0x10000000,
-    0x0,
-    0xFF35F97,
-    0x1415E53,
-    0xFCD9249,
-    0x280C16E,
-    0xF8ED3C2,
-    0x3BC3136,
-    0xF378708,
-    0x4F1BBD0,
-    0xEC835E6,
-    0x61F78AC,
-    0xE41900D,
-    0x7438B8D,
-    0xDA46A01,
-    0x85C2777,
-    0xCF1BBCB,
-    0x9679186,
-    0xC2A9F6E,
-    0xA6423A7,
-    0xB504F2F,
-    0xB504F37,
-    0xA64239E,
-    0xC2A9F76,
-    0x967917C,
-    0xCF1BBD1,
-    0x85C276D,
-    0xDA46A07,
-    0x7438B83,
-    0xE419012,
-    0x61F78A1,
-    0xEC835EA,
-    0x4F1BBC4,
-    0xF37870C,
-    0x3BC312A,
-    0xF8ED3C5,
-    0x280C162,
-    0xFCD924B,
-    0x1415E48,
-    0xFF35F97,
-    0x10000000,
-    0x0,
-    0xFCD9249,
-    0x280C16E,
-    0xF378708,
-    0x4F1BBD0,
-    0xE41900D,
-    0x7438B8D,
-    0xCF1BBCB,
-    0x9679186,
-    0xB504F2F,
-    0xB504F37,
-    0x967917C,
-    0xCF1BBD1,
-    0x7438B83,
-    0xE419012,
-    0x4F1BBC4,
-    0xF37870C,
-    0x280C162,
-    0xFCD924B,
-    0xFFFFFFF5,
-    0xFFFFFFF,
-    0xFD7F3E87,
-    0xFCD9248,
-    0xFB0E4425,
-    0xF378705,
-    0xF8BC7468,
-    0xE419007,
-    0xF6986E71,
-    0xCF1BBC4,
-    0xF4AFB0C1,
-    0xB504F26,
-    0xF30E4428,
-    0x9679173,
-    0xF1BE6FE9,
-    0x7438B79,
-    0xF0C878F0,
-    0x4F1BBB9,
-    0xF0326DB3,
-    0x280C156,
-    0x10000000,
-    0x0,
-    0xF8ED3C2,
-    0x3BC3136,
-    0xE41900D,
-    0x7438B8D,
-    0xC2A9F6E,
-    0xA6423A7,
-    0x967917C,
-    0xCF1BBD1,
-    0x61F78A1,
-    0xEC835EA,
-    0x280C162,
-    0xFCD924B,
-    0xFEBEA1A1,
-    0xFF35F96,
-    0xFB0E4425,
-    0xF378705,
-    0xF7A3D87F,
-    0xDA469FB,
-    0xF4AFB0C1,
-    0xB504F26,
-    0xF25B95F3,
-    0x85C2763,
-    0xF0C878F0,
-    0x4F1BBB9,
-    0xF00CA068,
-    0x1415E3C,
-    0xF0326DBA,
-    0xFD7F3E7B,
-    0xF137CA23,
-    0xF9E0873E,
-    0xF30E4443,
-    0xF6986E67,
-    0xF59BDC74,
-    0xF3D5607B,
-    0xF8BC7492,
-    0xF1BE6FE3,
-    0xFC43CEEC,
-    0xF0712C36,
-    0x10000000,
-    0x0,
-    0xF378708,
-    0x4F1BBD0,
-    0xCF1BBCB,
-    0x9679186,
-    0x967917C,
-    0xCF1BBD1,
-    0x4F1BBC4,
-    0xF37870C,
-    0x10000000,
-    0x0,
-    0xCF1BBCB,
-    0x9679186,
-    0x4F1BBC4,
-    0xF37870C,
-    0xFB0E4425,
-    0xF378705,
-    0xF30E4428,
-    0x9679173,
-    0x10000000,
-    0x0,
-    0x967917C,
-    0xCF1BBD1,
-    0xFB0E4425,
-    0xF378705,
-    0xF0C878F0,
-    0x4F1BBB9,
-    0xF30E4443,
-    0xF6986E67,
-    0x10000000,
-    0x0,
-    0x10000000,
-    0x0,
-    0x10000000,
-    0x0,
-    0x10000000,
-    0x0,
-    0x4F1BBF1,
-    0xF0C87902,
+    { 0x10000000, 0x0 },
+    { 0xFFFA630, 0x359D6F },
+    { 0xFFE98B0, 0x6B3885 },
+    { 0xFFCD790, 0xA0CEE7 },
+    { 0xFFA62F0, 0xD65E3B },
+    { 0xFF73AF0, 0x10BE428 },
+    { 0xFF35F90, 0x1415E54 },
+    { 0xFEED120, 0x176CA68 },
+    { 0xFE98FD0, 0x1AC260A },
+    { 0xFE39BC0, 0x1E16EE6 },
+    { 0xFDCF550, 0x216A2A4 },
+    { 0xFD59CB0, 0x24BBEEC },
+    { 0xFCD9250, 0x280C170 },
+    { 0xFC4D670, 0x2B5A7D4 },
+    { 0xFBB6980, 0x2EA6FCC },
+    { 0xFB14BE0, 0x31F1708 },
+    { 0xFA67E20, 0x3539B38 },
+    { 0xF9B0090, 0x387FA0C },
+    { 0xF8ED3C0, 0x3BC3138 },
+    { 0xF81F840, 0x3F03E70 },
+    { 0xF746EA0, 0x4241F70 },
+    { 0xF663770, 0x457D1F0 },
+    { 0xF575360, 0x48B53B0 },
+    { 0xF47C300, 0x4BEA268 },
+    { 0xF378710, 0x4F1BBD0 },
+    { 0xF26A030, 0x5249DB0 },
+    { 0xF150F40, 0x55745E0 },
+    { 0xF02D4F0, 0x589B210 },
+    { 0xEEFF200, 0x5BBE008 },
+    { 0xEDC6770, 0x5EDCDA0 },
+    { 0xEC835E0, 0x61F78B0 },
+    { 0xEB35E60, 0x650DEF8 },
+    { 0xE9DE1D0, 0x681FE48 },
+    { 0xE87C120, 0x6B2D490 },
+    { 0xE70FD40, 0x6E35FA0 },
+    { 0xE599740, 0x7139D58 },
+    { 0xE419010, 0x7438B90 },
+    { 0xE28E8D0, 0x7732838 },
+    { 0xE0FA280, 0x7A27140 },
+    { 0xDF5BE60, 0x7D16488 },
+    { 0xDDB3D70, 0x8000000 },
+    { 0xDC020F0, 0x82E41B0 },
+    { 0xDA46A00, 0x85C2770 },
+    { 0xD8819E0, 0x889AF60 },
+    { 0xD6B31D0, 0x8B6D770 },
+    { 0xD4DB310, 0x8E39DA0 },
+    { 0xD2F9EF0, 0x9100000 },
+    { 0xD10F6B0, 0x93BFCA0 },
+    { 0xCF1BBD0, 0x9679180 },
+    { 0xCD1EF80, 0x992BCD0 },
+    { 0xCB19340, 0x9BD7CA0 },
+    { 0xC90A870, 0x9E7CF10 },
+    { 0xC6F3090, 0xA11B240 },
+    { 0xC4D2D10, 0xA3B2460 },
+    { 0xC2A9F70, 0xA6423B0 },
+    { 0xC078920, 0xA8CAE40 },
+    { 0xBE3EBD0, 0xAB4C250 },
+    { 0xBBFC8F0, 0xADC5E30 },
+    { 0xB9B2230, 0xB038010 },
+    { 0xB75F900, 0xB2A2660 },
+    { 0xB504F30, 0xB504F30 },
+    { 0xB2A2650, 0xB75F910 },
+    { 0xB038010, 0xB9B2230 },
+    { 0xADC5E20, 0xBBFC900 },
+    { 0xAB4C240, 0xBE3EBE0 },
+    { 0xA8CAE30, 0xC078930 },
+    { 0xA6423A0, 0xC2A9F70 },
+    { 0xA3B2460, 0xC4D2D20 },
+    { 0xA11B240, 0xC6F30A0 },
+    { 0x9E7CF10, 0xC90A880 },
+    { 0x9BD7C90, 0xCB19350 },
+    { 0x992BCD0, 0xCD1EF90 },
+    { 0x9679180, 0xCF1BBD0 },
+    { 0x93BFC90, 0xD10F6C0 },
+    { 0x9100000, 0xD2F9EF0 },
+    { 0x8E39D90, 0xD4DB320 },
+    { 0x8B6D760, 0xD6B31E0 },
+    { 0x889AF60, 0xD8819E0 },
+    { 0x85C2760, 0xDA46A10 },
+    { 0x82E41B0, 0xDC020F0 },
+    { 0x7FFFFF8, 0xDDB3D80 },
+    { 0x7D16470, 0xDF5BE70 },
+    { 0x7A27138, 0xE0FA290 },
+    { 0x7732828, 0xE28E8D0 },
+    { 0x7438B90, 0xE419010 },
+    { 0x7139D48, 0xE599740 },
+    { 0x6E35F88, 0xE70FD50 },
+    { 0x6B2D490, 0xE87C120 },
+    { 0x681FE40, 0xE9DE1E0 },
+    { 0x650DEE0, 0xEB35E70 },
+    { 0x61F78A8, 0xEC835E0 },
+    { 0x5EDCD98, 0xEDC6770 },
+    { 0x5BBDFF0, 0xEEFF210 },
+    { 0x589B208, 0xF02D4F0 },
+    { 0x55745D0, 0xF150F40 },
+    { 0x5249DB8, 0xF26A030 },
+    { 0x4F1BBC8, 0xF378710 },
+    { 0x4BEA250, 0xF47C300 },
+    { 0x48B53A8, 0xF575360 },
+    { 0x457D1E0, 0xF663780 },
+    { 0x4241F78, 0xF746EA0 },
+    { 0x3F03E68, 0xF81F840 },
+    { 0x3BC3124, 0xF8ED3C0 },
+    { 0x387FA0C, 0xF9B0090 },
+    { 0x3539B2C, 0xFA67E20 },
+    { 0x31F16F0, 0xFB14BF0 },
+    { 0x2EA6FCC, 0xFBB6980 },
+    { 0x2B5A7C4, 0xFC4D670 },
+    { 0x280C154, 0xFCD9250 },
+    { 0x24BBEE4, 0xFD59CB0 },
+    { 0x216A290, 0xFDCF550 },
+    { 0x1E16EE6, 0xFE39BC0 },
+    { 0x1AC25FE, 0xFE98FD0 },
+    { 0x176CA50, 0xFEED120 },
+    { 0x1415E50, 0xFF35F90 },
+    { 0x10BE418, 0xFF73AF0 },
+    { 0xD65E3F, 0xFFA62F0 },
+    { 0xA0CEDF, 0xFFCD790 },
+    { 0x6B3871, 0xFFE98B0 },
+    { 0x359D70, 0xFFFA630 },
+    { 0xFFFFFFF5, 0x10000000 },
+    { 0xFFCA6279, 0xFFFA630 },
+    { 0xFF94C777, 0xFFE98B0 },
+    { 0xFF5F3109, 0xFFCD790 },
+    { 0xFF29A1AA, 0xFFA62F0 },
+    { 0xFEF41BD0, 0xFF73AF0 },
+    { 0xFEBEA198, 0xFF35F90 },
+    { 0xFE893598, 0xFEED120 },
+    { 0xFE53D9EA, 0xFE98FD0 },
+    { 0xFE1E9102, 0xFE39BC0 },
+    { 0xFDE95D58, 0xFDCF550 },
+    { 0xFDB44104, 0xFD59CB0 },
+    { 0xFD7F3E98, 0xFCD9250 },
+    { 0xFD4A5824, 0xFC4D670 },
+    { 0xFD159020, 0xFBB6980 },
+    { 0xFCE0E8F8, 0xFB14BE0 },
+    { 0xFCAC64BC, 0xFA67E10 },
+    { 0xFC7805E0, 0xF9B0080 },
+    { 0xFC43CEC4, 0xF8ED3C0 },
+    { 0xFC0FC180, 0xF81F840 },
+    { 0xFBDBE070, 0xF746EA0 },
+    { 0xFBA82E08, 0xF663770 },
+    { 0xFB74AC40, 0xF575350 },
+    { 0xFB415DA0, 0xF47C300 },
+    { 0xFB0E4428, 0xF378700 },
+    { 0xFADB6230, 0xF26A030 },
+    { 0xFAA8BA20, 0xF150F40 },
+    { 0xFA764DE8, 0xF02D4E0 },
+    { 0xFA441FF8, 0xEEFF210 },
+    { 0xFA123250, 0xEDC6760 },
+    { 0xF9E08740, 0xEC835E0 },
+    { 0xF9AF2110, 0xEB35E70 },
+    { 0xF97E01A8, 0xE9DE1D0 },
+    { 0xF94D2B58, 0xE87C110 },
+    { 0xF91CA060, 0xE70FD40 },
+    { 0xF8EC62C0, 0xE599740 },
+    { 0xF8BC7458, 0xE419000 },
+    { 0xF88CD7C0, 0xE28E8C0 },
+    { 0xF85D8ED0, 0xE0FA290 },
+    { 0xF82E9B60, 0xDF5BE50 },
+    { 0xF7FFFFF0, 0xDDB3D70 },
+    { 0xF7D1BE60, 0xDC020F0 },
+    { 0xF7A3D870, 0xDA469F0 },
+    { 0xF7765090, 0xD8819E0 },
+    { 0xF7492890, 0xD6B31D0 },
+    { 0xF71C6240, 0xD4DB300 },
+    { 0xF6EFFFF0, 0xD2F9EE0 },
+    { 0xF6C40360, 0xD10F6C0 },
+    { 0xF6986E90, 0xCF1BBD0 },
+    { 0xF66D4320, 0xCD1EF70 },
+    { 0xF6428360, 0xCB19340 },
+    { 0xF6183100, 0xC90A880 },
+    { 0xF5EE4DA0, 0xC6F3080 },
+    { 0xF5C4DB90, 0xC4D2D10 },
+    { 0xF59BDC60, 0xC2A9F70 },
+    { 0xF57351B0, 0xC078910 },
+    { 0xF54B3DA0, 0xBE3EBD0 },
+    { 0xF523A1D0, 0xBBFC8F0 },
+    { 0xF4FC7FD0, 0xB9B2210 },
+    { 0xF4D5D9A0, 0xB75F8F0 },
+    { 0xF4AFB0D0, 0xB504F30 },
+    { 0xF48A06E0, 0xB2A2630 },
+    { 0xF464DDC0, 0xB038000 },
+    { 0xF4403700, 0xADC5E20 },
+    { 0xF41C1410, 0xAB4C220 },
+    { 0xF3F876C0, 0xA8CAE20 },
+    { 0xF3D56080, 0xA6423A0 },
+    { 0xF3B2D2F0, 0xA3B2470 },
+    { 0xF390CF50, 0xA11B220 },
+    { 0xF36F5780, 0x9E7CF00 },
+    { 0xF34E6CC0, 0x9BD7CA0 },
+    { 0xF32E1060, 0x992BCB0 },
+    { 0xF30E4420, 0x9679170 },
+    { 0xF2EF0940, 0x93BFCA0 },
+    { 0xF2D060F0, 0x90FFFE0 },
+    { 0xF2B24CE0, 0x8E39D90 },
+    { 0xF294CE30, 0x8B6D770 },
+    { 0xF277E600, 0x889AF30 },
+    { 0xF25B95F0, 0x85C2760 },
+    { 0xF23FDF10, 0x82E41A0 },
+    { 0xF224C290, 0x8000010 },
+    { 0xF20A4190, 0x7D16468 },
+    { 0xF1F05D70, 0x7A27130 },
+    { 0xF1D71730, 0x7732840 },
+    { 0xF1BE6FE0, 0x7438B68 },
+    { 0xF1A668C0, 0x7139D40 },
+    { 0xF18F02C0, 0x6E35FA0 },
+    { 0xF1783ED0, 0x6B2D468 },
+    { 0xF1621E20, 0x681FE38 },
+    { 0xF14CA190, 0x650DEF0 },
+    { 0xF137CA00, 0x61F7880 },
+    { 0xF1239890, 0x5EDCD88 },
+    { 0xF1100DF0, 0x5BBE000 },
+    { 0xF0FD2B00, 0x589B1E0 },
+    { 0xF0EAF0B0, 0x55745C0 },
+    { 0xF0D95FC0, 0x5249DB0 },
+    { 0xF0C878E0, 0x4F1BB98 },
+    { 0xF0B83CF0, 0x4BEA240 },
+    { 0xF0A8ACA0, 0x48B53A0 },
+    { 0xF099C890, 0x457D1F8 },
+    { 0xF08B9150, 0x4241F50 },
+    { 0xF07E07B0, 0x3F03E60 },
+    { 0xF0712C40, 0x3BC3138 },
+    { 0xF064FF70, 0x387F9E0 },
+    { 0xF05981E0, 0x3539B20 },
+    { 0xF04EB410, 0x31F1704 },
+    { 0xF0449680, 0x2EA6FA0 },
+    { 0xF03B2990, 0x2B5A7B8 },
+    { 0xF0326DB0, 0x280C168 },
+    { 0xF02A6340, 0x24BBEB8 },
+    { 0xF0230AB0, 0x216A284 },
+    { 0xF01C6440, 0x1E16EDA },
+    { 0xF0167030, 0x1AC2612 },
+    { 0xF0112ED0, 0x176CA44 },
+    { 0xF00CA060, 0x1415E44 },
+    { 0xF008C510, 0x10BE42C },
+    { 0xF0059D00, 0xD65E13 },
+    { 0xF0032870, 0xA0CED3 },
+    { 0xF0016750, 0x6B3886 },
+    { 0xF00059D0, 0x359D44 },
+    { 0x10000000, 0x0 },
+    { 0xFFE98B0, 0x6B3885 },
+    { 0xFFA62F0, 0xD65E3B },
+    { 0xFF35F90, 0x1415E54 },
+    { 0xFE98FD0, 0x1AC260A },
+    { 0xFDCF550, 0x216A2A4 },
+    { 0xFCD9250, 0x280C170 },
+    { 0xFBB6980, 0x2EA6FCC },
+    { 0xFA67E20, 0x3539B38 },
+    { 0xF8ED3C0, 0x3BC3138 },
+    { 0xF746EA0, 0x4241F70 },
+    { 0xF575360, 0x48B53B0 },
+    { 0xF378710, 0x4F1BBD0 },
+    { 0xF150F40, 0x55745E0 },
+    { 0xEEFF200, 0x5BBE008 },
+    { 0xEC835E0, 0x61F78B0 },
+    { 0xE9DE1D0, 0x681FE48 },
+    { 0xE70FD40, 0x6E35FA0 },
+    { 0xE419010, 0x7438B90 },
+    { 0xE0FA280, 0x7A27140 },
+    { 0xDDB3D70, 0x8000000 },
+    { 0xDA46A00, 0x85C2770 },
+    { 0xD6B31D0, 0x8B6D770 },
+    { 0xD2F9EF0, 0x9100000 },
+    { 0xCF1BBD0, 0x9679180 },
+    { 0xCB19340, 0x9BD7CA0 },
+    { 0xC6F3090, 0xA11B240 },
+    { 0xC2A9F70, 0xA6423B0 },
+    { 0xBE3EBD0, 0xAB4C250 },
+    { 0xB9B2230, 0xB038010 },
+    { 0xB504F30, 0xB504F30 },
+    { 0xB038010, 0xB9B2230 },
+    { 0xAB4C240, 0xBE3EBE0 },
+    { 0xA6423A0, 0xC2A9F70 },
+    { 0xA11B240, 0xC6F30A0 },
+    { 0x9BD7C90, 0xCB19350 },
+    { 0x9679180, 0xCF1BBD0 },
+    { 0x9100000, 0xD2F9EF0 },
+    { 0x8B6D760, 0xD6B31E0 },
+    { 0x85C2760, 0xDA46A10 },
+    { 0x7FFFFF8, 0xDDB3D80 },
+    { 0x7A27138, 0xE0FA290 },
+    { 0x7438B90, 0xE419010 },
+    { 0x6E35F88, 0xE70FD50 },
+    { 0x681FE40, 0xE9DE1E0 },
+    { 0x61F78A8, 0xEC835E0 },
+    { 0x5BBDFF0, 0xEEFF210 },
+    { 0x55745D0, 0xF150F40 },
+    { 0x4F1BBC8, 0xF378710 },
+    { 0x48B53A8, 0xF575360 },
+    { 0x4241F78, 0xF746EA0 },
+    { 0x3BC3124, 0xF8ED3C0 },
+    { 0x3539B2C, 0xFA67E20 },
+    { 0x2EA6FCC, 0xFBB6980 },
+    { 0x280C154, 0xFCD9250 },
+    { 0x216A290, 0xFDCF550 },
+    { 0x1AC25FE, 0xFE98FD0 },
+    { 0x1415E50, 0xFF35F90 },
+    { 0xD65E3F, 0xFFA62F0 },
+    { 0x6B3871, 0xFFE98B0 },
+    { 0xFFFFFFF5, 0x10000000 },
+    { 0xFF94C777, 0xFFE98B0 },
+    { 0xFF29A1AA, 0xFFA62F0 },
+    { 0xFEBEA198, 0xFF35F90 },
+    { 0xFE53D9EA, 0xFE98FD0 },
+    { 0xFDE95D58, 0xFDCF550 },
+    { 0xFD7F3E98, 0xFCD9250 },
+    { 0xFD159020, 0xFBB6980 },
+    { 0xFCAC64BC, 0xFA67E10 },
+    { 0xFC43CEC4, 0xF8ED3C0 },
+    { 0xFBDBE070, 0xF746EA0 },
+    { 0xFB74AC40, 0xF575350 },
+    { 0xFB0E4428, 0xF378700 },
+    { 0xFAA8BA20, 0xF150F40 },
+    { 0xFA441FF8, 0xEEFF210 },
+    { 0xF9E08740, 0xEC835E0 },
+    { 0xF97E01A8, 0xE9DE1D0 },
+    { 0xF91CA060, 0xE70FD40 },
+    { 0xF8BC7458, 0xE419000 },
+    { 0xF85D8ED0, 0xE0FA290 },
+    { 0x10000000, 0x0 },
+    { 0xFFA62F0, 0xD65E3B },
+    { 0xFE98FD0, 0x1AC260A },
+    { 0xFCD9250, 0x280C170 },
+    { 0xFA67E20, 0x3539B38 },
+    { 0xF746EA0, 0x4241F70 },
+    { 0xF378710, 0x4F1BBD0 },
+    { 0xEEFF200, 0x5BBE008 },
+    { 0xE9DE1D0, 0x681FE48 },
+    { 0xE419010, 0x7438B90 },
+    { 0xDDB3D70, 0x8000000 },
+    { 0xD6B31D0, 0x8B6D770 },
+    { 0xCF1BBD0, 0x9679180 },
+    { 0xC6F3090, 0xA11B240 },
+    { 0xBE3EBD0, 0xAB4C250 },
+    { 0xB504F30, 0xB504F30 },
+    { 0xAB4C240, 0xBE3EBE0 },
+    { 0xA11B240, 0xC6F30A0 },
+    { 0x9679180, 0xCF1BBD0 },
+    { 0x8B6D760, 0xD6B31E0 },
+    { 0x7FFFFF8, 0xDDB3D80 },
+    { 0x7438B90, 0xE419010 },
+    { 0x681FE40, 0xE9DE1E0 },
+    { 0x5BBDFF0, 0xEEFF210 },
+    { 0x4F1BBC8, 0xF378710 },
+    { 0x4241F78, 0xF746EA0 },
+    { 0x3539B2C, 0xFA67E20 },
+    { 0x280C154, 0xFCD9250 },
+    { 0x1AC25FE, 0xFE98FD0 },
+    { 0xD65E3F, 0xFFA62F0 },
+    { 0xFFFFFFF5, 0x10000000 },
+    { 0xFF29A1AA, 0xFFA62F0 },
+    { 0xFE53D9EA, 0xFE98FD0 },
+    { 0xFD7F3E98, 0xFCD9250 },
+    { 0xFCAC64BC, 0xFA67E10 },
+    { 0xFBDBE070, 0xF746EA0 },
+    { 0xFB0E4428, 0xF378700 },
+    { 0xFA441FF8, 0xEEFF210 },
+    { 0xF97E01A8, 0xE9DE1D0 },
+    { 0xF8BC7458, 0xE419000 },
+    { 0xF7FFFFF0, 0xDDB3D70 },
+    { 0xF7492890, 0xD6B31D0 },
+    { 0xF6986E90, 0xCF1BBD0 },
+    { 0xF5EE4DA0, 0xC6F3080 },
+    { 0xF54B3DA0, 0xBE3EBD0 },
+    { 0xF4AFB0D0, 0xB504F30 },
+    { 0xF41C1410, 0xAB4C220 },
+    { 0xF390CF50, 0xA11B220 },
+    { 0xF30E4420, 0x9679170 },
+    { 0xF294CE30, 0x8B6D770 },
+    { 0xF224C290, 0x8000010 },
+    { 0xF1BE6FE0, 0x7438B68 },
+    { 0xF1621E20, 0x681FE38 },
+    { 0xF1100DF0, 0x5BBE000 },
+    { 0xF0C878E0, 0x4F1BB98 },
+    { 0xF08B9150, 0x4241F50 },
+    { 0xF05981E0, 0x3539B20 },
+    { 0xF0326DB0, 0x280C168 },
+    { 0xF0167030, 0x1AC2612 },
+    { 0xF0059D00, 0xD65E13 },
+    { 0xF0000000, 0xFFFFFFE9 },
+    { 0xF0059D10, 0xFF29A1BE },
+    { 0xF0167040, 0xFE53D9BE },
+    { 0xF0326DC0, 0xFD7F3E6C },
+    { 0xF05981F0, 0xFCAC64B0 },
+    { 0xF08B9160, 0xFBDBE088 },
+    { 0xF0C878F0, 0xFB0E4438 },
+    { 0xF1100E00, 0xFA441FD0 },
+    { 0xF1621E30, 0xF97E01A0 },
+    { 0xF1BE6FF0, 0xF8BC7468 },
+    { 0xF224C2B0, 0xF7FFFFD0 },
+    { 0xF294CE40, 0xF7492870 },
+    { 0xF30E4440, 0xF6986E60 },
+    { 0xF390CF70, 0xF5EE4DB0 },
+    { 0xF41C1430, 0xF54B3DB0 },
+    { 0xF4AFB0F0, 0xF4AFB0B0 },
+    { 0xF54B3DD0, 0xF41C1420 },
+    { 0xF5EE4DD0, 0xF390CF60 },
+    { 0xF6986EB0, 0xF30E4410 },
+    { 0xF7492880, 0xF294CE30 },
+    { 0x10000000, 0x0 },
+    { 0xFF35F90, 0x1415E54 },
+    { 0xFCD9250, 0x280C170 },
+    { 0xF8ED3C0, 0x3BC3138 },
+    { 0xF378710, 0x4F1BBD0 },
+    { 0xEC835E0, 0x61F78B0 },
+    { 0xE419010, 0x7438B90 },
+    { 0xDA46A00, 0x85C2770 },
+    { 0xCF1BBD0, 0x9679180 },
+    { 0xC2A9F70, 0xA6423B0 },
+    { 0xB504F30, 0xB504F30 },
+    { 0xA6423A0, 0xC2A9F70 },
+    { 0x9679180, 0xCF1BBD0 },
+    { 0x85C2760, 0xDA46A10 },
+    { 0x7438B90, 0xE419010 },
+    { 0x61F78A8, 0xEC835E0 },
+    { 0x4F1BBC8, 0xF378710 },
+    { 0x3BC3124, 0xF8ED3C0 },
+    { 0x280C154, 0xFCD9250 },
+    { 0x1415E50, 0xFF35F90 },
+    { 0x10000000, 0x0 },
+    { 0xFCD9250, 0x280C170 },
+    { 0xF378710, 0x4F1BBD0 },
+    { 0xE419010, 0x7438B90 },
+    { 0xCF1BBD0, 0x9679180 },
+    { 0xB504F30, 0xB504F30 },
+    { 0x9679180, 0xCF1BBD0 },
+    { 0x7438B90, 0xE419010 },
+    { 0x4F1BBC8, 0xF378710 },
+    { 0x280C154, 0xFCD9250 },
+    { 0xFFFFFFF5, 0x10000000 },
+    { 0xFD7F3E98, 0xFCD9250 },
+    { 0xFB0E4428, 0xF378700 },
+    { 0xF8BC7458, 0xE419000 },
+    { 0xF6986E90, 0xCF1BBD0 },
+    { 0xF4AFB0D0, 0xB504F30 },
+    { 0xF30E4420, 0x9679170 },
+    { 0xF1BE6FE0, 0x7438B68 },
+    { 0xF0C878E0, 0x4F1BB98 },
+    { 0xF0326DB0, 0x280C168 },
+    { 0x10000000, 0x0 },
+    { 0xF8ED3C0, 0x3BC3138 },
+    { 0xE419010, 0x7438B90 },
+    { 0xC2A9F70, 0xA6423B0 },
+    { 0x9679180, 0xCF1BBD0 },
+    { 0x61F78A8, 0xEC835E0 },
+    { 0x280C154, 0xFCD9250 },
+    { 0xFEBEA198, 0xFF35F90 },
+    { 0xFB0E4428, 0xF378700 },
+    { 0xF7A3D870, 0xDA469F0 },
+    { 0xF4AFB0D0, 0xB504F30 },
+    { 0xF25B95F0, 0x85C2760 },
+    { 0xF0C878E0, 0x4F1BB98 },
+    { 0xF00CA060, 0x1415E44 },
+    { 0xF0326DC0, 0xFD7F3E6C },
+    { 0xF137CA20, 0xF9E08758 },
+    { 0xF30E4440, 0xF6986E60 },
+    { 0xF59BDC80, 0xF3D56070 },
+    { 0xF8BC74C0, 0xF1BE6FD0 },
+    { 0xFC43CEB4, 0xF0712C40 },
+    { 0x10000000, 0x0 },
+    { 0xF378710, 0x4F1BBD0 },
+    { 0xCF1BBD0, 0x9679180 },
+    { 0x9679180, 0xCF1BBD0 },
+    { 0x4F1BBC8, 0xF378710 },
+    { 0x10000000, 0x0 },
+    { 0xCF1BBD0, 0x9679180 },
+    { 0x4F1BBC8, 0xF378710 },
+    { 0xFB0E4428, 0xF378700 },
+    { 0xF30E4420, 0x9679170 },
+    { 0x10000000, 0x0 },
+    { 0x9679180, 0xCF1BBD0 },
+    { 0xFB0E4428, 0xF378700 },
+    { 0xF0C878E0, 0x4F1BB98 },
+    { 0xF30E4440, 0xF6986E60 },
+    { 0x10000000, 0x0 },
+    { 0x10000000, 0x0 },
+    { 0x10000000, 0x0 },
+    { 0x10000000, 0x0 },
+    { 0x4F1BBF0, 0xF0C87900 }
 };
 
-real_t cfft_tab_64[] =
+complex_t cfft_tab_64[] =
 {
-    0x10000000,
-    0x0,
-    0xFEC46D1,
-    0x1917A6C,
-    0xFB14BE7,
-    0x31F1708,
-    0xF4FA0AA,
-    0x4A5018D,
-    0xEC835E6,
-    0x61F78AC,
-    0xE1C5977,
-    0x78AD751,
-    0xD4DB312,
-    0x8E39DA0,
-    0xC5E4032,
-    0xA267996,
-    0xB504F2F,
-    0xB504F37,
-    0xA26798D,
-    0xC5E4039,
-    0x8E39D96,
-    0xD4DB318,
-    0x78AD746,
-    0xE1C597C,
-    0x61F78A1,
-    0xEC835EA,
-    0x4A50182,
-    0xF4FA0AE,
-    0x31F16FD,
-    0xFB14BE9,
-    0x1917A60,
-    0xFEC46D2,
-    0x10000000,
-    0x0,
-    0xFB14BE7,
-    0x31F1708,
-    0xEC835E6,
-    0x61F78AC,
-    0xD4DB312,
-    0x8E39DA0,
-    0xB504F2F,
-    0xB504F37,
-    0x8E39D96,
-    0xD4DB318,
-    0x61F78A1,
-    0xEC835EA,
-    0x31F16FD,
-    0xFB14BE9,
-    0xFFFFFFF5,
-    0xFFFFFFF,
-    0xFCE0E8EC,
-    0xFB14BE5,
-    0xF9E08749,
-    0xEC835E1,
-    0xF71C6256,
-    0xD4DB30B,
-    0xF4AFB0C1,
-    0xB504F26,
-    0xF2B24CE1,
-    0x8E39D8C,
-    0xF137CA11,
-    0x61F7896,
-    0xF04EB414,
-    0x31F16F1,
-    0x10000000,
-    0x0,
-    0xF4FA0AB,
-    0x4A5018B,
-    0xD4DB314,
-    0x8E39D9D,
-    0xA267992,
-    0xC5E4035,
-    0x61F78A8,
-    0xEC835E7,
-    0x1917A6A,
-    0xFEC46D2,
-    0xFCE0E8F8,
-    0xFB14BE7,
-    0xF87528B1,
-    0xE1C5978,
-    0xF4AFB0CC,
-    0xB504F32,
-    0xF1E3A687,
-    0x78AD74C,
-    0xF04EB418,
-    0x31F1705,
-    0xF013B92F,
-    0xFE6E8593,
-    0xF137CA1A,
-    0xF9E08755,
-    0xF3A1BFCD,
-    0xF5D9866C,
-    0xF71C6266,
-    0xF2B24CEA,
-    0xFB5AFE78,
-    0xF0B05F54,
-    0x10000000,
-    0x0,
-    0xEC835E6,
-    0x61F78AC,
-    0xB504F2F,
-    0xB504F37,
-    0x61F78A1,
-    0xEC835EA,
-    0x10000000,
-    0x0,
-    0xB504F2F,
-    0xB504F37,
-    0xFFFFFFF5,
-    0xFFFFFFF,
-    0xF4AFB0C1,
-    0xB504F26,
-    0x10000000,
-    0x0,
-    0x61F78A8,
-    0xEC835E7,
-    0xF4AFB0CC,
-    0xB504F32,
-    0xF137CA1A,
-    0xF9E08755,
-    0x10000000,
-    0x0,
-    0x10000000,
-    0x0,
-    0x10000000,
-    0x0,
-    0x3,
-    0xF0000001,
+    { 0x10000000, 0x0 },
+    { 0xFEC46D0, 0x1917A6C },
+    { 0xFB14BE0, 0x31F1708 },
+    { 0xF4FA0B0, 0x4A50188 },
+    { 0xEC835E0, 0x61F78B0 },
+    { 0xE1C5970, 0x78AD750 },
+    { 0xD4DB310, 0x8E39DA0 },
+    { 0xC5E4030, 0xA2679A0 },
+    { 0xB504F30, 0xB504F30 },
+    { 0xA267990, 0xC5E4030 },
+    { 0x8E39D90, 0xD4DB320 },
+    { 0x78AD738, 0xE1C5980 },
+    { 0x61F78A8, 0xEC835E0 },
+    { 0x4A50180, 0xF4FA0B0 },
+    { 0x31F16F0, 0xFB14BF0 },
+    { 0x1917A6A, 0xFEC46D0 },
+    { 0x10000000, 0x0 },
+    { 0xFB14BE0, 0x31F1708 },
+    { 0xEC835E0, 0x61F78B0 },
+    { 0xD4DB310, 0x8E39DA0 },
+    { 0xB504F30, 0xB504F30 },
+    { 0x8E39D90, 0xD4DB320 },
+    { 0x61F78A8, 0xEC835E0 },
+    { 0x31F16F0, 0xFB14BF0 },
+    { 0xFFFFFFF5, 0x10000000 },
+    { 0xFCE0E8F8, 0xFB14BE0 },
+    { 0xF9E08740, 0xEC835E0 },
+    { 0xF71C6240, 0xD4DB300 },
+    { 0xF4AFB0D0, 0xB504F30 },
+    { 0xF2B24CE0, 0x8E39D90 },
+    { 0xF137CA00, 0x61F7880 },
+    { 0xF04EB410, 0x31F1704 },
+    { 0x10000000, 0x0 },
+    { 0xF4FA0B0, 0x4A50188 },
+    { 0xD4DB310, 0x8E39DA0 },
+    { 0xA267990, 0xC5E4030 },
+    { 0x61F78A8, 0xEC835E0 },
+    { 0x1917A6A, 0xFEC46D0 },
+    { 0xFCE0E8F8, 0xFB14BE0 },
+    { 0xF8752898, 0xE1C5970 },
+    { 0xF4AFB0D0, 0xB504F30 },
+    { 0xF1E3A690, 0x78AD768 },
+    { 0xF04EB410, 0x31F1704 },
+    { 0xF013B930, 0xFE6E8572 },
+    { 0xF137CA20, 0xF9E08758 },
+    { 0xF3A1BFB0, 0xF5D98680 },
+    { 0xF71C62A0, 0xF2B24CC0 },
+    { 0xFB5AFE98, 0xF0B05F50 },
+    { 0x10000000, 0x0 },
+    { 0xEC835E0, 0x61F78B0 },
+    { 0xB504F30, 0xB504F30 },
+    { 0x61F78A8, 0xEC835E0 },
+    { 0x10000000, 0x0 },
+    { 0xB504F30, 0xB504F30 },
+    { 0xFFFFFFF5, 0x10000000 },
+    { 0xF4AFB0D0, 0xB504F30 },
+    { 0x10000000, 0x0 },
+    { 0x61F78A8, 0xEC835E0 },
+    { 0xF4AFB0D0, 0xB504F30 },
+    { 0xF137CA20, 0xF9E08758 },
+    { 0x10000000, 0x0 },
+    { 0x10000000, 0x0 },
+    { 0x10000000, 0x0 },
+    { 0x3, 0xF0000000 }
 };
 
-real_t cfft_tab_60[] =
+complex_t cfft_tab_60[] =
 {
-    0x10000000,
-    0x0,
-    0xFE98FCA,
-    0x1AC260A,
-    0xFA67E18,
-    0x3539B37,
-    0xF378708,
-    0x4F1BBD0,
-    0xE9DE1D6,
-    0x681FE4B,
-    0xDDB3D72,
-    0x8000003,
-    0xCF1BBCB,
-    0x9679186,
-    0xBE3EBD0,
-    0xAB4C24F,
-    0xAB4C246,
-    0xBE3EBD8,
-    0x967917C,
-    0xCF1BBD1,
-    0x7FFFFF9,
-    0xDDB3D78,
-    0x681FE40,
-    0xE9DE1DA,
-    0x4F1BBC4,
-    0xF37870C,
-    0x3539B2B,
-    0xFA67E1B,
-    0x1AC25FE,
-    0xFE98FCB,
-    0xFFFFFFF5,
-    0xFFFFFFF,
-    0xFE53D9EA,
-    0xFE98FC9,
-    0xFCAC64BE,
-    0xFA67E16,
-    0xFB0E4425,
-    0xF378705,
-    0xF97E01AB,
-    0xE9DE1D1,
-    0x10000000,
-    0x0,
-    0xFA67E18,
-    0x3539B37,
-    0xE9DE1D6,
-    0x681FE4B,
-    0xCF1BBCB,
-    0x9679186,
-    0xAB4C246,
-    0xBE3EBD8,
-    0x7FFFFF9,
-    0xDDB3D78,
-    0x4F1BBC4,
-    0xF37870C,
-    0x1AC25FE,
-    0xFE98FCB,
-    0xFE53D9EA,
-    0xFE98FC9,
-    0xFB0E4425,
-    0xF378705,
-    0xF7FFFFF3,
-    0xDDB3D6C,
-    0xF54B3DA8,
-    0xBE3EBC8,
-    0xF30E4428,
-    0x9679173,
-    0xF1621E21,
-    0x681FE35,
-    0xF05981E3,
-    0x3539B20,
-    0xF0000001,
-    0xFFFFFFE9,
-    0xF05981EC,
-    0xFCAC64B2,
-    0xF1621E34,
-    0xF97E01A0,
-    0xF30E4443,
-    0xF6986E67,
-    0xF54B3DCB,
-    0xF41C1419,
-    0x10000000,
-    0x0,
-    0xF378708,
-    0x4F1BBD0,
-    0xCF1BBCB,
-    0x9679186,
-    0x967917C,
-    0xCF1BBD1,
-    0x4F1BBC4,
-    0xF37870C,
-    0x10000000,
-    0x0,
-    0xCF1BBCB,
-    0x9679186,
-    0x4F1BBC4,
-    0xF37870C,
-    0xFB0E4425,
-    0xF378705,
-    0xF30E4428,
-    0x9679173,
-    0x10000000,
-    0x0,
-    0x967917C,
-    0xCF1BBD1,
-    0xFB0E4425,
-    0xF378705,
-    0xF0C878F0,
-    0x4F1BBB9,
-    0xF30E4443,
-    0xF6986E67,
-    0x10000000,
-    0x0,
-    0x10000000,
-    0x0,
-    0x10000000,
-    0x0,
-    0x10000000,
-    0x0,
-    0x4F1BBF1,
-    0xF0C87902,
+    { 0x10000000, 0x0 },
+    { 0xFE98FD0, 0x1AC260A },
+    { 0xFA67E20, 0x3539B38 },
+    { 0xF378710, 0x4F1BBD0 },
+    { 0xE9DE1D0, 0x681FE48 },
+    { 0xDDB3D70, 0x8000000 },
+    { 0xCF1BBD0, 0x9679180 },
+    { 0xBE3EBD0, 0xAB4C250 },
+    { 0xAB4C240, 0xBE3EBE0 },
+    { 0x9679180, 0xCF1BBD0 },
+    { 0x7FFFFF8, 0xDDB3D80 },
+    { 0x681FE40, 0xE9DE1E0 },
+    { 0x4F1BBC8, 0xF378710 },
+    { 0x3539B2C, 0xFA67E20 },
+    { 0x1AC25FE, 0xFE98FD0 },
+    { 0xFFFFFFF5, 0x10000000 },
+    { 0xFE53D9EA, 0xFE98FD0 },
+    { 0xFCAC64BC, 0xFA67E10 },
+    { 0xFB0E4428, 0xF378700 },
+    { 0xF97E01A8, 0xE9DE1D0 },
+    { 0x10000000, 0x0 },
+    { 0xFA67E20, 0x3539B38 },
+    { 0xE9DE1D0, 0x681FE48 },
+    { 0xCF1BBD0, 0x9679180 },
+    { 0xAB4C240, 0xBE3EBE0 },
+    { 0x7FFFFF8, 0xDDB3D80 },
+    { 0x4F1BBC8, 0xF378710 },
+    { 0x1AC25FE, 0xFE98FD0 },
+    { 0xFE53D9EA, 0xFE98FD0 },
+    { 0xFB0E4428, 0xF378700 },
+    { 0xF7FFFFF0, 0xDDB3D70 },
+    { 0xF54B3DA0, 0xBE3EBD0 },
+    { 0xF30E4420, 0x9679170 },
+    { 0xF1621E20, 0x681FE38 },
+    { 0xF05981E0, 0x3539B20 },
+    { 0xF0000000, 0xFFFFFFE9 },
+    { 0xF05981F0, 0xFCAC64B0 },
+    { 0xF1621E30, 0xF97E01A0 },
+    { 0xF30E4440, 0xF6986E60 },
+    { 0xF54B3DD0, 0xF41C1420 },
+    { 0x10000000, 0x0 },
+    { 0xF378710, 0x4F1BBD0 },
+    { 0xCF1BBD0, 0x9679180 },
+    { 0x9679180, 0xCF1BBD0 },
+    { 0x4F1BBC8, 0xF378710 },
+    { 0x10000000, 0x0 },
+    { 0xCF1BBD0, 0x9679180 },
+    { 0x4F1BBC8, 0xF378710 },
+    { 0xFB0E4428, 0xF378700 },
+    { 0xF30E4420, 0x9679170 },
+    { 0x10000000, 0x0 },
+    { 0x9679180, 0xCF1BBD0 },
+    { 0xFB0E4428, 0xF378700 },
+    { 0xF0C878E0, 0x4F1BB98 },
+    { 0xF30E4440, 0xF6986E60 },
+    { 0x10000000, 0x0 },
+    { 0x10000000, 0x0 },
+    { 0x10000000, 0x0 },
+    { 0x10000000, 0x0 },
+    { 0x4F1BBF0, 0xF0C87900 }
 };
 
 #ifdef LD_DEC
 
-real_t cfft_tab_256[] =
+complex_t cfft_tab_256[] =
 {
-    0x10000000,
-    0x0,
-    0xFFEC430,
-    0x648558,
-    0xFFB10F1,
-    0xC8FB2F,
-    0xFF4E6D6,
-    0x12D5209,
-    0xFEC46D1,
-    0x1917A6C,
-    0xFE13238,
-    0x1F564E6,
-    0xFD3AABF,
-    0x259020E,
-    0xFC3B27D,
-    0x2BC4289,
-    0xFB14BE7,
-    0x31F1708,
-    0xF9C79D5,
-    0x381704E,
-    0xF853F7D,
-    0x3E33F31,
-    0xF6BA073,
-    0x444749A,
-    0xF4FA0AA,
-    0x4A5018D,
-    0xF314475,
-    0x504D727,
-    0xF109081,
-    0x563E69F,
-    0xEED89DA,
-    0x5C2214E,
-    0xEC835E6,
-    0x61F78AC,
-    0xEA09A67,
-    0x67BDE53,
-    0xE76BD78,
-    0x6D74405,
-    0xE4AA58F,
-    0x7319BA9,
-    0xE1C5977,
-    0x78AD751,
-    0xDEBE054,
-    0x7E2E93A,
-    0xDB941A0,
-    0x839C3D0,
-    0xD848529,
-    0x88F59AD,
-    0xD4DB312,
-    0x8E39DA0,
-    0xD14D3CD,
-    0x93682AA,
-    0xCD9F021,
-    0x987FC02,
-    0xC9D1121,
-    0x9D7FD18,
-    0xC5E4032,
-    0xA267996,
-    0xC1D8702,
-    0xA736561,
-    0xBDAEF8D,
-    0xABEB49E,
-    0xB968418,
-    0xB085BAE,
-    0xB504F2F,
-    0xB504F37,
-    0xB085BA6,
-    0xB968420,
-    0xABEB495,
-    0xBDAEF95,
-    0xA736559,
-    0xC1D870A,
-    0xA26798D,
-    0xC5E4039,
-    0x9D7FD0F,
-    0xC9D1128,
-    0x987FBF8,
-    0xCD9F028,
-    0x93682A0,
-    0xD14D3D4,
-    0x8E39D96,
-    0xD4DB318,
-    0x88F59A3,
-    0xD848530,
-    0x839C3C5,
-    0xDB941A6,
-    0x7E2E930,
-    0xDEBE05A,
-    0x78AD746,
-    0xE1C597C,
-    0x7319B9E,
-    0xE4AA594,
-    0x6D743FA,
-    0xE76BD7D,
-    0x67BDE49,
-    0xEA09A6C,
-    0x61F78A1,
-    0xEC835EA,
-    0x5C22143,
-    0xEED89DE,
-    0x563E694,
-    0xF109085,
-    0x504D71C,
-    0xF314479,
-    0x4A50182,
-    0xF4FA0AE,
-    0x444748F,
-    0xF6BA076,
-    0x3E33F25,
-    0xF853F80,
-    0x3817043,
-    0xF9C79D8,
-    0x31F16FD,
-    0xFB14BE9,
-    0x2BC427E,
-    0xFC3B27F,
-    0x2590203,
-    0xFD3AAC1,
-    0x1F564DA,
-    0xFE13239,
-    0x1917A60,
-    0xFEC46D2,
-    0x12D51FE,
-    0xFF4E6D7,
-    0xC8FB24,
-    0xFFB10F2,
-    0x64854C,
-    0xFFEC430,
-    0x10000000,
-    0x0,
-    0xFFB10F1,
-    0xC8FB2F,
-    0xFEC46D1,
-    0x1917A6C,
-    0xFD3AABF,
-    0x259020E,
-    0xFB14BE7,
-    0x31F1708,
-    0xF853F7D,
-    0x3E33F31,
-    0xF4FA0AA,
-    0x4A5018D,
-    0xF109081,
-    0x563E69F,
-    0xEC835E6,
-    0x61F78AC,
-    0xE76BD78,
-    0x6D74405,
-    0xE1C5977,
-    0x78AD751,
-    0xDB941A0,
-    0x839C3D0,
-    0xD4DB312,
-    0x8E39DA0,
-    0xCD9F021,
-    0x987FC02,
-    0xC5E4032,
-    0xA267996,
-    0xBDAEF8D,
-    0xABEB49E,
-    0xB504F2F,
-    0xB504F37,
-    0xABEB495,
-    0xBDAEF95,
-    0xA26798D,
-    0xC5E4039,
-    0x987FBF8,
-    0xCD9F028,
-    0x8E39D96,
-    0xD4DB318,
-    0x839C3C5,
-    0xDB941A6,
-    0x78AD746,
-    0xE1C597C,
-    0x6D743FA,
-    0xE76BD7D,
-    0x61F78A1,
-    0xEC835EA,
-    0x563E694,
-    0xF109085,
-    0x4A50182,
-    0xF4FA0AE,
-    0x3E33F25,
-    0xF853F80,
-    0x31F16FD,
-    0xFB14BE9,
-    0x2590203,
-    0xFD3AAC1,
-    0x1917A60,
-    0xFEC46D2,
-    0xC8FB24,
-    0xFFB10F2,
-    0xFFFFFFF5,
-    0xFFFFFFF,
-    0xFF3704C5,
-    0xFFB10F1,
-    0xFE6E8588,
-    0xFEC46D0,
-    0xFDA6FDE6,
-    0xFD3AABD,
-    0xFCE0E8EC,
-    0xFB14BE5,
-    0xFC1CC0C4,
-    0xF853F7A,
-    0xFB5AFE67,
-    0xF4FA0A7,
-    0xFA9C1956,
-    0xF10907D,
-    0xF9E08749,
-    0xEC835E1,
-    0xF928BBF0,
-    0xE76BD73,
-    0xF87528A5,
-    0xE1C5971,
-    0xF7C63C26,
-    0xDB9419A,
-    0xF71C6256,
-    0xD4DB30B,
-    0xF67803F5,
-    0xCD9F01A,
-    0xF5D98661,
-    0xC5E402A,
-    0xF5414B59,
-    0xBDAEF85,
-    0xF4AFB0C1,
-    0xB504F26,
-    0xF4251063,
-    0xABEB48C,
-    0xF3A1BFBF,
-    0xA267984,
-    0xF3260FD1,
-    0x987FBEF,
-    0xF2B24CE1,
-    0x8E39D8C,
-    0xF246BE54,
-    0x839C3BB,
-    0xF1E3A67E,
-    0x78AD73C,
-    0xF189427E,
-    0x6D743F0,
-    0xF137CA11,
-    0x61F7896,
-    0xF0EF6F77,
-    0x563E689,
-    0xF0B05F4F,
-    0x4A50177,
-    0xF07AC07D,
-    0x3E33F1A,
-    0xF04EB414,
-    0x31F16F1,
-    0xF02C553E,
-    0x25901F7,
-    0xF013B92C,
-    0x1917A55,
-    0xF004EF0E,
-    0xC8FB18,
-    0x10000000,
-    0x0,
-    0xFF4E6D6,
-    0x12D5209,
-    0xFD3AABF,
-    0x259020D,
-    0xF9C79D6,
-    0x381704D,
-    0xF4FA0AB,
-    0x4A5018B,
-    0xEED89DB,
-    0x5C2214C,
-    0xE76BD79,
-    0x6D74402,
-    0xDEBE056,
-    0x7E2E937,
-    0xD4DB314,
-    0x8E39D9D,
-    0xC9D1124,
-    0x9D7FD14,
-    0xBDAEF90,
-    0xABEB49A,
-    0xB085BAA,
-    0xB96841C,
-    0xA267992,
-    0xC5E4035,
-    0x93682A5,
-    0xD14D3D0,
-    0x839C3CB,
-    0xDB941A2,
-    0x7319BA5,
-    0xE4AA590,
-    0x61F78A8,
-    0xEC835E7,
-    0x504D724,
-    0xF314476,
-    0x3E33F2E,
-    0xF853F7E,
-    0x2BC4287,
-    0xFC3B27D,
-    0x1917A6A,
-    0xFEC46D2,
-    0x648556,
-    0xFFEC430,
-    0xFF3704D0,
-    0xFFB10F1,
-    0xFE0A9B1A,
-    0xFE13238,
-    0xFCE0E8F8,
-    0xFB14BE7,
-    0xFBBB8B67,
-    0xF6BA073,
-    0xFA9C1962,
-    0xF109082,
-    0xF98421AE,
-    0xEA09A68,
-    0xF87528B1,
-    0xE1C5978,
-    0xF770A655,
-    0xD84852B,
-    0xF6780401,
-    0xCD9F023,
-    0xF58C9AA1,
-    0xC1D8704,
-    0xF4AFB0CC,
-    0xB504F32,
-    0xF3E278F9,
-    0xA73655C,
-    0xF3260FDC,
-    0x987FBFD,
-    0xF27B7AD4,
-    0x88F59A8,
-    0xF1E3A687,
-    0x78AD74C,
-    0xF15F6597,
-    0x67BDE4F,
-    0xF0EF6F7D,
-    0x563E69B,
-    0xF0945F8C,
-    0x4447496,
-    0xF04EB418,
-    0x31F1705,
-    0xF01ECDC8,
-    0x1F564E3,
-    0xF004EF0F,
-    0xC8FB2D,
-    0xF0013BD0,
-    0xFF9B7AA6,
-    0xF013B92F,
-    0xFE6E8593,
-    0xF03C4D84,
-    0xFD43BD76,
-    0xF07AC083,
-    0xFC1CC0CF,
-    0xF0CEBB8B,
-    0xFAFB28D9,
-    0xF137CA1A,
-    0xF9E08755,
-    0xF1B55A71,
-    0xF8CE6458,
-    0xF246BE5F,
-    0xF7C63C32,
-    0xF2EB2C32,
-    0xF6C97D58,
-    0xF3A1BFCD,
-    0xF5D9866C,
-    0xF4697BE6,
-    0xF4F7A454,
-    0xF5414B68,
-    0xF425106D,
-    0xF62802EE,
-    0xF362EEDA,
-    0xF71C6266,
-    0xF2B24CEA,
-    0xF81D16CC,
-    0xF2141FA9,
-    0xF928BC01,
-    0xF1894285,
-    0xFA3DDEB7,
-    0xF1127624,
-    0xFB5AFE78,
-    0xF0B05F54,
-    0xFC7E8FB6,
-    0xF063862A,
-    0xFDA6FDF6,
-    0xF02C5541,
-    0xFED2ADFA,
-    0xF00B192A,
-    0x10000000,
-    0x0,
-    0xFEC46D1,
-    0x1917A6C,
-    0xFB14BE7,
-    0x31F1708,
-    0xF4FA0AA,
-    0x4A5018D,
-    0xEC835E6,
-    0x61F78AC,
-    0xE1C5977,
-    0x78AD751,
-    0xD4DB312,
-    0x8E39DA0,
-    0xC5E4032,
-    0xA267996,
-    0xB504F2F,
-    0xB504F37,
-    0xA26798D,
-    0xC5E4039,
-    0x8E39D96,
-    0xD4DB318,
-    0x78AD746,
-    0xE1C597C,
-    0x61F78A1,
-    0xEC835EA,
-    0x4A50182,
-    0xF4FA0AE,
-    0x31F16FD,
-    0xFB14BE9,
-    0x1917A60,
-    0xFEC46D2,
-    0x10000000,
-    0x0,
-    0xFB14BE7,
-    0x31F1708,
-    0xEC835E6,
-    0x61F78AC,
-    0xD4DB312,
-    0x8E39DA0,
-    0xB504F2F,
-    0xB504F37,
-    0x8E39D96,
-    0xD4DB318,
-    0x61F78A1,
-    0xEC835EA,
-    0x31F16FD,
-    0xFB14BE9,
-    0xFFFFFFF5,
-    0xFFFFFFF,
-    0xFCE0E8EC,
-    0xFB14BE5,
-    0xF9E08749,
-    0xEC835E1,
-    0xF71C6256,
-    0xD4DB30B,
-    0xF4AFB0C1,
-    0xB504F26,
-    0xF2B24CE1,
-    0x8E39D8C,
-    0xF137CA11,
-    0x61F7896,
-    0xF04EB414,
-    0x31F16F1,
-    0x10000000,
-    0x0,
-    0xF4FA0AB,
-    0x4A5018B,
-    0xD4DB314,
-    0x8E39D9D,
-    0xA267992,
-    0xC5E4035,
-    0x61F78A8,
-    0xEC835E7,
-    0x1917A6A,
-    0xFEC46D2,
-    0xFCE0E8F8,
-    0xFB14BE7,
-    0xF87528B1,
-    0xE1C5978,
-    0xF4AFB0CC,
-    0xB504F32,
-    0xF1E3A687,
-    0x78AD74C,
-    0xF04EB418,
-    0x31F1705,
-    0xF013B92F,
-    0xFE6E8593,
-    0xF137CA1A,
-    0xF9E08755,
-    0xF3A1BFCD,
-    0xF5D9866C,
-    0xF71C6266,
-    0xF2B24CEA,
-    0xFB5AFE78,
-    0xF0B05F54,
-    0x10000000,
-    0x0,
-    0xEC835E6,
-    0x61F78AC,
-    0xB504F2F,
-    0xB504F37,
-    0x61F78A1,
-    0xEC835EA,
-    0x10000000,
-    0x0,
-    0xB504F2F,
-    0xB504F37,
-    0xFFFFFFF5,
-    0xFFFFFFF,
-    0xF4AFB0C1,
-    0xB504F26,
-    0x10000000,
-    0x0,
-    0x61F78A8,
-    0xEC835E7,
-    0xF4AFB0CC,
-    0xB504F32,
-    0xF137CA1A,
-    0xF9E08755,
-    0x10000000,
-    0x0,
-    0x10000000,
-    0x0,
-    0x10000000,
-    0x0,
-    0x3,
-    0xF0000001,
+    { 0x10000000, 0x0 },
+    { 0xFFEC430, 0x648558 },
+    { 0xFFB10F0, 0xC8FB30 },
+    { 0xFF4E6D0, 0x12D520A },
+    { 0xFEC46D0, 0x1917A6C },
+    { 0xFE13240, 0x1F564E6 },
+    { 0xFD3AAC0, 0x259020C },
+    { 0xFC3B280, 0x2BC428C },
+    { 0xFB14BE0, 0x31F1708 },
+    { 0xF9C79D0, 0x381704C },
+    { 0xF853F80, 0x3E33F34 },
+    { 0xF6BA070, 0x44474A0 },
+    { 0xF4FA0B0, 0x4A50188 },
+    { 0xF314470, 0x504D728 },
+    { 0xF109080, 0x563E6A0 },
+    { 0xEED89E0, 0x5C22150 },
+    { 0xEC835E0, 0x61F78B0 },
+    { 0xEA09A60, 0x67BDE58 },
+    { 0xE76BD80, 0x6D74400 },
+    { 0xE4AA590, 0x7319BA8 },
+    { 0xE1C5970, 0x78AD750 },
+    { 0xDEBE050, 0x7E2E940 },
+    { 0xDB941A0, 0x839C3D0 },
+    { 0xD848530, 0x88F59B0 },
+    { 0xD4DB310, 0x8E39DA0 },
+    { 0xD14D3D0, 0x93682B0 },
+    { 0xCD9F020, 0x987FC00 },
+    { 0xC9D1120, 0x9D7FD20 },
+    { 0xC5E4030, 0xA2679A0 },
+    { 0xC1D8700, 0xA736560 },
+    { 0xBDAEF90, 0xABEB4A0 },
+    { 0xB968420, 0xB085BB0 },
+    { 0xB504F30, 0xB504F30 },
+    { 0xB085BA0, 0xB968420 },
+    { 0xABEB490, 0xBDAEFA0 },
+    { 0xA736550, 0xC1D8710 },
+    { 0xA267990, 0xC5E4030 },
+    { 0x9D7FD10, 0xC9D1120 },
+    { 0x987FC00, 0xCD9F020 },
+    { 0x93682A0, 0xD14D3D0 },
+    { 0x8E39D90, 0xD4DB320 },
+    { 0x88F59B0, 0xD848530 },
+    { 0x839C3C0, 0xDB941B0 },
+    { 0x7E2E938, 0xDEBE050 },
+    { 0x78AD738, 0xE1C5980 },
+    { 0x7319BA0, 0xE4AA590 },
+    { 0x6D74408, 0xE76BD80 },
+    { 0x67BDE48, 0xEA09A70 },
+    { 0x61F78A8, 0xEC835E0 },
+    { 0x5C22138, 0xEED89E0 },
+    { 0x563E698, 0xF109080 },
+    { 0x504D710, 0xF314480 },
+    { 0x4A50180, 0xF4FA0B0 },
+    { 0x4447498, 0xF6BA070 },
+    { 0x3E33F20, 0xF853F80 },
+    { 0x3817048, 0xF9C79D0 },
+    { 0x31F16F0, 0xFB14BF0 },
+    { 0x2BC4280, 0xFC3B280 },
+    { 0x2590214, 0xFD3AAC0 },
+    { 0x1F564D8, 0xFE13240 },
+    { 0x1917A6A, 0xFEC46D0 },
+    { 0x12D51F6, 0xFF4E6D0 },
+    { 0xC8FB29, 0xFFB10F0 },
+    { 0x64853F, 0xFFEC430 },
+    { 0x10000000, 0x0 },
+    { 0xFFB10F0, 0xC8FB30 },
+    { 0xFEC46D0, 0x1917A6C },
+    { 0xFD3AAC0, 0x259020C },
+    { 0xFB14BE0, 0x31F1708 },
+    { 0xF853F80, 0x3E33F34 },
+    { 0xF4FA0B0, 0x4A50188 },
+    { 0xF109080, 0x563E6A0 },
+    { 0xEC835E0, 0x61F78B0 },
+    { 0xE76BD80, 0x6D74400 },
+    { 0xE1C5970, 0x78AD750 },
+    { 0xDB941A0, 0x839C3D0 },
+    { 0xD4DB310, 0x8E39DA0 },
+    { 0xCD9F020, 0x987FC00 },
+    { 0xC5E4030, 0xA2679A0 },
+    { 0xBDAEF90, 0xABEB4A0 },
+    { 0xB504F30, 0xB504F30 },
+    { 0xABEB490, 0xBDAEFA0 },
+    { 0xA267990, 0xC5E4030 },
+    { 0x987FC00, 0xCD9F020 },
+    { 0x8E39D90, 0xD4DB320 },
+    { 0x839C3C0, 0xDB941B0 },
+    { 0x78AD738, 0xE1C5980 },
+    { 0x6D74408, 0xE76BD80 },
+    { 0x61F78A8, 0xEC835E0 },
+    { 0x563E698, 0xF109080 },
+    { 0x4A50180, 0xF4FA0B0 },
+    { 0x3E33F20, 0xF853F80 },
+    { 0x31F16F0, 0xFB14BF0 },
+    { 0x2590214, 0xFD3AAC0 },
+    { 0x1917A6A, 0xFEC46D0 },
+    { 0xC8FB29, 0xFFB10F0 },
+    { 0xFFFFFFF5, 0x10000000 },
+    { 0xFF3704BF, 0xFFB10F0 },
+    { 0xFE6E857E, 0xFEC46D0 },
+    { 0xFDA6FDD8, 0xFD3AAC0 },
+    { 0xFCE0E8F8, 0xFB14BE0 },
+    { 0xFC1CC0CC, 0xF853F80 },
+    { 0xFB5AFE68, 0xF4FA0A0 },
+    { 0xFA9C1950, 0xF109080 },
+    { 0xF9E08740, 0xEC835E0 },
+    { 0xF928BC00, 0xE76BD80 },
+    { 0xF8752898, 0xE1C5970 },
+    { 0xF7C63C30, 0xDB941A0 },
+    { 0xF71C6240, 0xD4DB300 },
+    { 0xF67803F0, 0xCD9F020 },
+    { 0xF5D98670, 0xC5E4040 },
+    { 0xF5414B50, 0xBDAEF80 },
+    { 0xF4AFB0D0, 0xB504F30 },
+    { 0xF4251050, 0xABEB480 },
+    { 0xF3A1BFC0, 0xA267990 },
+    { 0xF3260FC0, 0x987FBD0 },
+    { 0xF2B24CE0, 0x8E39D90 },
+    { 0xF246BE60, 0x839C3D0 },
+    { 0xF1E3A670, 0x78AD730 },
+    { 0xF1894280, 0x6D743F8 },
+    { 0xF137CA00, 0x61F7880 },
+    { 0xF0EF6F70, 0x563E690 },
+    { 0xF0B05F50, 0x4A50198 },
+    { 0xF07AC080, 0x3E33F14 },
+    { 0xF04EB410, 0x31F1704 },
+    { 0xF02C5540, 0x25901E8 },
+    { 0xF013B930, 0x1917A60 },
+    { 0xF004EF10, 0xC8FAFD },
+    { 0x10000000, 0x0 },
+    { 0xFF4E6D0, 0x12D520A },
+    { 0xFD3AAC0, 0x259020C },
+    { 0xF9C79D0, 0x381704C },
+    { 0xF4FA0B0, 0x4A50188 },
+    { 0xEED89E0, 0x5C22150 },
+    { 0xE76BD80, 0x6D74400 },
+    { 0xDEBE050, 0x7E2E940 },
+    { 0xD4DB310, 0x8E39DA0 },
+    { 0xC9D1130, 0x9D7FD10 },
+    { 0xBDAEF90, 0xABEB4A0 },
+    { 0xB085BA0, 0xB968420 },
+    { 0xA267990, 0xC5E4030 },
+    { 0x93682B0, 0xD14D3D0 },
+    { 0x839C3C0, 0xDB941B0 },
+    { 0x7319BA0, 0xE4AA590 },
+    { 0x61F78A8, 0xEC835E0 },
+    { 0x504D728, 0xF314470 },
+    { 0x3E33F40, 0xF853F80 },
+    { 0x2BC4280, 0xFC3B280 },
+    { 0x1917A6A, 0xFEC46D0 },
+    { 0x64855F, 0xFFEC430 },
+    { 0xFF3704BF, 0xFFB10F0 },
+    { 0xFE0A9B12, 0xFE13230 },
+    { 0xFCE0E8F8, 0xFB14BE0 },
+    { 0xFBBB8B70, 0xF6BA070 },
+    { 0xFA9C1970, 0xF109080 },
+    { 0xF98421A8, 0xEA09A60 },
+    { 0xF8752898, 0xE1C5970 },
+    { 0xF770A640, 0xD848520 },
+    { 0xF67803F0, 0xCD9F020 },
+    { 0xF58C9AA0, 0xC1D8700 },
+    { 0xF4AFB0D0, 0xB504F30 },
+    { 0xF3E27900, 0xA736560 },
+    { 0xF3260FE0, 0x987FC10 },
+    { 0xF27B7AE0, 0x88F59C0 },
+    { 0xF1E3A690, 0x78AD768 },
+    { 0xF15F6590, 0x67BDE38 },
+    { 0xF0EF6F70, 0x563E690 },
+    { 0xF0945F90, 0x4447490 },
+    { 0xF04EB410, 0x31F1704 },
+    { 0xF01ECDD0, 0x1F564EC },
+    { 0xF004EF10, 0xC8FB3D },
+    { 0xF0013BD0, 0xFF9B7ABE },
+    { 0xF013B930, 0xFE6E8572 },
+    { 0xF03C4D80, 0xFD43BD5C },
+    { 0xF07AC080, 0xFC1CC0C0 },
+    { 0xF0CEBB90, 0xFAFB28D0 },
+    { 0xF137CA20, 0xF9E08758 },
+    { 0xF1B55A70, 0xF8CE6460 },
+    { 0xF246BE50, 0xF7C63C40 },
+    { 0xF2EB2C20, 0xF6C97D70 },
+    { 0xF3A1BFB0, 0xF5D98680 },
+    { 0xF4697BF0, 0xF4F7A440 },
+    { 0xF5414B70, 0xF4251060 },
+    { 0xF62802F0, 0xF362EED0 },
+    { 0xF71C62A0, 0xF2B24CC0 },
+    { 0xF81D16C8, 0xF2141FB0 },
+    { 0xF928BC28, 0xF1894270 },
+    { 0xFA3DDEA0, 0xF1127630 },
+    { 0xFB5AFE98, 0xF0B05F50 },
+    { 0xFC7E8F90, 0xF0638630 },
+    { 0xFDA6FE04, 0xF02C5540 },
+    { 0xFED2ADC2, 0xF00B1930 },
+    { 0x10000000, 0x0 },
+    { 0xFEC46D0, 0x1917A6C },
+    { 0xFB14BE0, 0x31F1708 },
+    { 0xF4FA0B0, 0x4A50188 },
+    { 0xEC835E0, 0x61F78B0 },
+    { 0xE1C5970, 0x78AD750 },
+    { 0xD4DB310, 0x8E39DA0 },
+    { 0xC5E4030, 0xA2679A0 },
+    { 0xB504F30, 0xB504F30 },
+    { 0xA267990, 0xC5E4030 },
+    { 0x8E39D90, 0xD4DB320 },
+    { 0x78AD738, 0xE1C5980 },
+    { 0x61F78A8, 0xEC835E0 },
+    { 0x4A50180, 0xF4FA0B0 },
+    { 0x31F16F0, 0xFB14BF0 },
+    { 0x1917A6A, 0xFEC46D0 },
+    { 0x10000000, 0x0 },
+    { 0xFB14BE0, 0x31F1708 },
+    { 0xEC835E0, 0x61F78B0 },
+    { 0xD4DB310, 0x8E39DA0 },
+    { 0xB504F30, 0xB504F30 },
+    { 0x8E39D90, 0xD4DB320 },
+    { 0x61F78A8, 0xEC835E0 },
+    { 0x31F16F0, 0xFB14BF0 },
+    { 0xFFFFFFF5, 0x10000000 },
+    { 0xFCE0E8F8, 0xFB14BE0 },
+    { 0xF9E08740, 0xEC835E0 },
+    { 0xF71C6240, 0xD4DB300 },
+    { 0xF4AFB0D0, 0xB504F30 },
+    { 0xF2B24CE0, 0x8E39D90 },
+    { 0xF137CA00, 0x61F7880 },
+    { 0xF04EB410, 0x31F1704 },
+    { 0x10000000, 0x0 },
+    { 0xF4FA0B0, 0x4A50188 },
+    { 0xD4DB310, 0x8E39DA0 },
+    { 0xA267990, 0xC5E4030 },
+    { 0x61F78A8, 0xEC835E0 },
+    { 0x1917A6A, 0xFEC46D0 },
+    { 0xFCE0E8F8, 0xFB14BE0 },
+    { 0xF8752898, 0xE1C5970 },
+    { 0xF4AFB0D0, 0xB504F30 },
+    { 0xF1E3A690, 0x78AD768 },
+    { 0xF04EB410, 0x31F1704 },
+    { 0xF013B930, 0xFE6E8572 },
+    { 0xF137CA20, 0xF9E08758 },
+    { 0xF3A1BFB0, 0xF5D98680 },
+    { 0xF71C62A0, 0xF2B24CC0 },
+    { 0xFB5AFE98, 0xF0B05F50 },
+    { 0x10000000, 0x0 },
+    { 0xEC835E0, 0x61F78B0 },
+    { 0xB504F30, 0xB504F30 },
+    { 0x61F78A8, 0xEC835E0 },
+    { 0x10000000, 0x0 },
+    { 0xB504F30, 0xB504F30 },
+    { 0xFFFFFFF5, 0x10000000 },
+    { 0xF4AFB0D0, 0xB504F30 },
+    { 0x10000000, 0x0 },
+    { 0x61F78A8, 0xEC835E0 },
+    { 0xF4AFB0D0, 0xB504F30 },
+    { 0xF137CA20, 0xF9E08758 },
+    { 0x10000000, 0x0 },
+    { 0x10000000, 0x0 },
+    { 0x10000000, 0x0 },
+    { 0x3, 0xF0000000 }
 };
 
-real_t cfft_tab_240[] =
+complex_t cfft_tab_240[] =
 {
-    0x10000000,
-    0x0,
-    0xFFE98AD,
-    0x6B3885,
-    0xFFA62F6,
-    0xD65E3A,
-    0xFF35F97,
-    0x1415E53,
-    0xFE98FCA,
-    0x1AC260A,
-    0xFDCF549,
-    0x216A2A2,
-    0xFCD9249,
-    0x280C16E,
-    0xFBB697F,
-    0x2EA6FCD,
-    0xFA67E18,
-    0x3539B37,
-    0xF8ED3C2,
-    0x3BC3136,
-    0xF746EA3,
-    0x4241F72,
-    0xF57535C,
-    0x48B53AE,
-    0xF378708,
-    0x4F1BBD0,
-    0xF150F3D,
-    0x55745DE,
-    0xEEFF206,
-    0x5BBE00A,
-    0xEC835E6,
-    0x61F78AC,
-    0xE9DE1D6,
-    0x681FE4B,
-    0xE70FD42,
-    0x6E35F9D,
-    0xE41900D,
-    0x7438B8D,
-    0xE0FA286,
-    0x7A2713C,
-    0xDDB3D72,
-    0x8000003,
-    0xDA46A01,
-    0x85C2777,
-    0xD6B31D1,
-    0x8B6D76F,
-    0xD2F9EEE,
-    0x9100000,
-    0xCF1BBCB,
-    0x9679186,
-    0xCB19342,
-    0x9BD7CA3,
-    0xC6F3097,
-    0xA11B246,
-    0xC2A9F6E,
-    0xA6423A7,
-    0xBE3EBD0,
-    0xAB4C24F,
-    0xB9B2224,
-    0xB03801A,
-    0xB504F2F,
-    0xB504F37,
-    0xB038012,
-    0xB9B222C,
-    0xAB4C246,
-    0xBE3EBD8,
-    0xA64239E,
-    0xC2A9F76,
-    0xA11B23C,
-    0xC6F309E,
-    0x9BD7C9A,
-    0xCB19349,
-    0x967917C,
-    0xCF1BBD1,
-    0x90FFFF6,
-    0xD2F9EF5,
-    0x8B6D765,
-    0xD6B31D8,
-    0x85C276D,
-    0xDA46A07,
-    0x7FFFFF9,
-    0xDDB3D78,
-    0x7A27132,
-    0xE0FA28C,
-    0x7438B83,
-    0xE419012,
-    0x6E35F92,
-    0xE70FD48,
-    0x681FE40,
-    0xE9DE1DA,
-    0x61F78A1,
-    0xEC835EA,
-    0x5BBDFFF,
-    0xEEFF20A,
-    0x55745D3,
-    0xF150F41,
-    0x4F1BBC4,
-    0xF37870C,
-    0x48B53A3,
-    0xF57535F,
-    0x4241F66,
-    0xF746EA6,
-    0x3BC312A,
-    0xF8ED3C5,
-    0x3539B2B,
-    0xFA67E1B,
-    0x2EA6FC2,
-    0xFBB6981,
-    0x280C162,
-    0xFCD924B,
-    0x216A297,
-    0xFDCF54A,
-    0x1AC25FE,
-    0xFE98FCB,
-    0x1415E48,
-    0xFF35F97,
-    0xD65E2E,
-    0xFFA62F7,
-    0x6B3879,
-    0xFFE98AE,
-    0xFFFFFFF5,
-    0xFFFFFFF,
-    0xFF94C770,
-    0xFFE98AD,
-    0xFF29A1BA,
-    0xFFA62F5,
-    0xFEBEA1A1,
-    0xFF35F96,
-    0xFE53D9EA,
-    0xFE98FC9,
-    0xFDE95D52,
-    0xFDCF547,
-    0xFD7F3E87,
-    0xFCD9248,
-    0xFD159027,
-    0xFBB697D,
-    0xFCAC64BE,
-    0xFA67E16,
-    0xFC43CEBF,
-    0xF8ED3BF,
-    0xFBDBE083,
-    0xF746EA0,
-    0xFB74AC47,
-    0xF575358,
-    0xFB0E4425,
-    0xF378705,
-    0xFAA8BA17,
-    0xF150F39,
-    0xFA441FEB,
-    0xEEFF202,
-    0xF9E08749,
-    0xEC835E1,
-    0xF97E01AB,
-    0xE9DE1D1,
-    0xF91CA058,
-    0xE70FD3D,
-    0xF8BC7468,
-    0xE419007,
-    0xF85D8EBA,
-    0xE0FA281,
-    0x10000000,
-    0x0,
-    0xFFA62F6,
-    0xD65E3A,
-    0xFE98FCA,
-    0x1AC260A,
-    0xFCD9249,
-    0x280C16E,
-    0xFA67E18,
-    0x3539B37,
-    0xF746EA3,
-    0x4241F72,
-    0xF378708,
-    0x4F1BBD0,
-    0xEEFF206,
-    0x5BBE00A,
-    0xE9DE1D6,
-    0x681FE4B,
-    0xE41900D,
-    0x7438B8D,
-    0xDDB3D72,
-    0x8000003,
-    0xD6B31D1,
-    0x8B6D76F,
-    0xCF1BBCB,
-    0x9679186,
-    0xC6F3097,
-    0xA11B246,
-    0xBE3EBD0,
-    0xAB4C24F,
-    0xB504F2F,
-    0xB504F37,
-    0xAB4C246,
-    0xBE3EBD8,
-    0xA11B23C,
-    0xC6F309E,
-    0x967917C,
-    0xCF1BBD1,
-    0x8B6D765,
-    0xD6B31D8,
-    0x7FFFFF9,
-    0xDDB3D78,
-    0x7438B83,
-    0xE419012,
-    0x681FE40,
-    0xE9DE1DA,
-    0x5BBDFFF,
-    0xEEFF20A,
-    0x4F1BBC4,
-    0xF37870C,
-    0x4241F66,
-    0xF746EA6,
-    0x3539B2B,
-    0xFA67E1B,
-    0x280C162,
-    0xFCD924B,
-    0x1AC25FE,
-    0xFE98FCB,
-    0xD65E2E,
-    0xFFA62F7,
-    0xFFFFFFF5,
-    0xFFFFFFF,
-    0xFF29A1BA,
-    0xFFA62F5,
-    0xFE53D9EA,
-    0xFE98FC9,
-    0xFD7F3E87,
-    0xFCD9248,
-    0xFCAC64BE,
-    0xFA67E16,
-    0xFBDBE083,
-    0xF746EA0,
-    0xFB0E4425,
-    0xF378705,
-    0xFA441FEB,
-    0xEEFF202,
-    0xF97E01AB,
-    0xE9DE1D1,
-    0xF8BC7468,
-    0xE419007,
-    0xF7FFFFF3,
-    0xDDB3D6C,
-    0xF7492887,
-    0xD6B31CB,
-    0xF6986E71,
-    0xCF1BBC4,
-    0xF5EE4DB1,
-    0xC6F308F,
-    0xF54B3DA8,
-    0xBE3EBC8,
-    0xF4AFB0C1,
-    0xB504F26,
-    0xF41C1420,
-    0xAB4C23E,
-    0xF390CF5A,
-    0xA11B233,
-    0xF30E4428,
-    0x9679173,
-    0xF294CE22,
-    0x8B6D75B,
-    0xF224C283,
-    0x7FFFFEF,
-    0xF1BE6FE9,
-    0x7438B79,
-    0xF1621E21,
-    0x681FE35,
-    0xF1100DF2,
-    0x5BBDFF4,
-    0xF0C878F0,
-    0x4F1BBB9,
-    0xF08B9157,
-    0x4241F5B,
-    0xF05981E3,
-    0x3539B20,
-    0xF0326DB3,
-    0x280C156,
-    0xF0167034,
-    0x1AC25F3,
-    0xF0059D09,
-    0xD65E23,
-    0xF0000001,
-    0xFFFFFFE9,
-    0xF0059D0B,
-    0xFF29A1AE,
-    0xF0167039,
-    0xFE53D9DF,
-    0xF0326DBA,
-    0xFD7F3E7B,
-    0xF05981EC,
-    0xFCAC64B2,
-    0xF08B9163,
-    0xFBDBE078,
-    0xF0C878FF,
-    0xFB0E441A,
-    0xF1100E02,
-    0xFA441FE0,
-    0xF1621E34,
-    0xF97E01A0,
-    0xF1BE6FFE,
-    0xF8BC745E,
-    0xF224C29A,
-    0xF7FFFFE9,
-    0xF294CE3B,
-    0xF749287D,
-    0xF30E4443,
-    0xF6986E67,
-    0xF390CF78,
-    0xF5EE4DA8,
-    0xF41C1440,
-    0xF54B3DA0,
-    0xF4AFB0E2,
-    0xF4AFB0B9,
-    0xF54B3DCB,
-    0xF41C1419,
-    0xF5EE4DD6,
-    0xF390CF53,
-    0xF6986E97,
-    0xF30E4421,
-    0xF74928AF,
-    0xF294CE1B,
-    0x10000000,
-    0x0,
-    0xFF35F97,
-    0x1415E53,
-    0xFCD9249,
-    0x280C16E,
-    0xF8ED3C2,
-    0x3BC3136,
-    0xF378708,
-    0x4F1BBD0,
-    0xEC835E6,
-    0x61F78AC,
-    0xE41900D,
-    0x7438B8D,
-    0xDA46A01,
-    0x85C2777,
-    0xCF1BBCB,
-    0x9679186,
-    0xC2A9F6E,
-    0xA6423A7,
-    0xB504F2F,
-    0xB504F37,
-    0xA64239E,
-    0xC2A9F76,
-    0x967917C,
-    0xCF1BBD1,
-    0x85C276D,
-    0xDA46A07,
-    0x7438B83,
-    0xE419012,
-    0x61F78A1,
-    0xEC835EA,
-    0x4F1BBC4,
-    0xF37870C,
-    0x3BC312A,
-    0xF8ED3C5,
-    0x280C162,
-    0xFCD924B,
-    0x1415E48,
-    0xFF35F97,
-    0x10000000,
-    0x0,
-    0xFCD9249,
-    0x280C16E,
-    0xF378708,
-    0x4F1BBD0,
-    0xE41900D,
-    0x7438B8D,
-    0xCF1BBCB,
-    0x9679186,
-    0xB504F2F,
-    0xB504F37,
-    0x967917C,
-    0xCF1BBD1,
-    0x7438B83,
-    0xE419012,
-    0x4F1BBC4,
-    0xF37870C,
-    0x280C162,
-    0xFCD924B,
-    0xFFFFFFF5,
-    0xFFFFFFF,
-    0xFD7F3E87,
-    0xFCD9248,
-    0xFB0E4425,
-    0xF378705,
-    0xF8BC7468,
-    0xE419007,
-    0xF6986E71,
-    0xCF1BBC4,
-    0xF4AFB0C1,
-    0xB504F26,
-    0xF30E4428,
-    0x9679173,
-    0xF1BE6FE9,
-    0x7438B79,
-    0xF0C878F0,
-    0x4F1BBB9,
-    0xF0326DB3,
-    0x280C156,
-    0x10000000,
-    0x0,
-    0xF8ED3C2,
-    0x3BC3136,
-    0xE41900D,
-    0x7438B8D,
-    0xC2A9F6E,
-    0xA6423A7,
-    0x967917C,
-    0xCF1BBD1,
-    0x61F78A1,
-    0xEC835EA,
-    0x280C162,
-    0xFCD924B,
-    0xFEBEA1A1,
-    0xFF35F96,
-    0xFB0E4425,
-    0xF378705,
-    0xF7A3D87F,
-    0xDA469FB,
-    0xF4AFB0C1,
-    0xB504F26,
-    0xF25B95F3,
-    0x85C2763,
-    0xF0C878F0,
-    0x4F1BBB9,
-    0xF00CA068,
-    0x1415E3C,
-    0xF0326DBA,
-    0xFD7F3E7B,
-    0xF137CA23,
-    0xF9E0873E,
-    0xF30E4443,
-    0xF6986E67,
-    0xF59BDC74,
-    0xF3D5607B,
-    0xF8BC7492,
-    0xF1BE6FE3,
-    0xFC43CEEC,
-    0xF0712C36,
-    0x10000000,
-    0x0,
-    0xF378708,
-    0x4F1BBD0,
-    0xCF1BBCB,
-    0x9679186,
-    0x967917C,
-    0xCF1BBD1,
-    0x4F1BBC4,
-    0xF37870C,
-    0x10000000,
-    0x0,
-    0xCF1BBCB,
-    0x9679186,
-    0x4F1BBC4,
-    0xF37870C,
-    0xFB0E4425,
-    0xF378705,
-    0xF30E4428,
-    0x9679173,
-    0x10000000,
-    0x0,
-    0x967917C,
-    0xCF1BBD1,
-    0xFB0E4425,
-    0xF378705,
-    0xF0C878F0,
-    0x4F1BBB9,
-    0xF30E4443,
-    0xF6986E67,
-    0x10000000,
-    0x0,
-    0x10000000,
-    0x0,
-    0x10000000,
-    0x0,
-    0x10000000,
-    0x0,
-    0x4F1BBF1,
-    0xF0C87902,
+    { 0x10000000, 0x0 },
+    { 0xFFE98B0, 0x6B3885 },
+    { 0xFFA62F0, 0xD65E3B },
+    { 0xFF35F90, 0x1415E54 },
+    { 0xFE98FD0, 0x1AC260A },
+    { 0xFDCF550, 0x216A2A4 },
+    { 0xFCD9250, 0x280C170 },
+    { 0xFBB6980, 0x2EA6FCC },
+    { 0xFA67E20, 0x3539B38 },
+    { 0xF8ED3C0, 0x3BC3138 },
+    { 0xF746EA0, 0x4241F70 },
+    { 0xF575360, 0x48B53B0 },
+    { 0xF378710, 0x4F1BBD0 },
+    { 0xF150F40, 0x55745E0 },
+    { 0xEEFF200, 0x5BBE008 },
+    { 0xEC835E0, 0x61F78B0 },
+    { 0xE9DE1D0, 0x681FE48 },
+    { 0xE70FD40, 0x6E35FA0 },
+    { 0xE419010, 0x7438B90 },
+    { 0xE0FA280, 0x7A27140 },
+    { 0xDDB3D70, 0x8000000 },
+    { 0xDA46A00, 0x85C2770 },
+    { 0xD6B31D0, 0x8B6D770 },
+    { 0xD2F9EF0, 0x9100000 },
+    { 0xCF1BBD0, 0x9679180 },
+    { 0xCB19340, 0x9BD7CA0 },
+    { 0xC6F3090, 0xA11B240 },
+    { 0xC2A9F70, 0xA6423B0 },
+    { 0xBE3EBD0, 0xAB4C250 },
+    { 0xB9B2230, 0xB038010 },
+    { 0xB504F30, 0xB504F30 },
+    { 0xB038010, 0xB9B2230 },
+    { 0xAB4C240, 0xBE3EBE0 },
+    { 0xA6423A0, 0xC2A9F70 },
+    { 0xA11B240, 0xC6F30A0 },
+    { 0x9BD7C90, 0xCB19350 },
+    { 0x9679180, 0xCF1BBD0 },
+    { 0x9100000, 0xD2F9EF0 },
+    { 0x8B6D760, 0xD6B31E0 },
+    { 0x85C2760, 0xDA46A10 },
+    { 0x7FFFFF8, 0xDDB3D80 },
+    { 0x7A27138, 0xE0FA290 },
+    { 0x7438B90, 0xE419010 },
+    { 0x6E35F88, 0xE70FD50 },
+    { 0x681FE40, 0xE9DE1E0 },
+    { 0x61F78A8, 0xEC835E0 },
+    { 0x5BBDFF0, 0xEEFF210 },
+    { 0x55745D0, 0xF150F40 },
+    { 0x4F1BBC8, 0xF378710 },
+    { 0x48B53A8, 0xF575360 },
+    { 0x4241F78, 0xF746EA0 },
+    { 0x3BC3124, 0xF8ED3C0 },
+    { 0x3539B2C, 0xFA67E20 },
+    { 0x2EA6FCC, 0xFBB6980 },
+    { 0x280C154, 0xFCD9250 },
+    { 0x216A290, 0xFDCF550 },
+    { 0x1AC25FE, 0xFE98FD0 },
+    { 0x1415E50, 0xFF35F90 },
+    { 0xD65E3F, 0xFFA62F0 },
+    { 0x6B3871, 0xFFE98B0 },
+    { 0xFFFFFFF5, 0x10000000 },
+    { 0xFF94C777, 0xFFE98B0 },
+    { 0xFF29A1AA, 0xFFA62F0 },
+    { 0xFEBEA198, 0xFF35F90 },
+    { 0xFE53D9EA, 0xFE98FD0 },
+    { 0xFDE95D58, 0xFDCF550 },
+    { 0xFD7F3E98, 0xFCD9250 },
+    { 0xFD159020, 0xFBB6980 },
+    { 0xFCAC64BC, 0xFA67E10 },
+    { 0xFC43CEC4, 0xF8ED3C0 },
+    { 0xFBDBE070, 0xF746EA0 },
+    { 0xFB74AC40, 0xF575350 },
+    { 0xFB0E4428, 0xF378700 },
+    { 0xFAA8BA20, 0xF150F40 },
+    { 0xFA441FF8, 0xEEFF210 },
+    { 0xF9E08740, 0xEC835E0 },
+    { 0xF97E01A8, 0xE9DE1D0 },
+    { 0xF91CA060, 0xE70FD40 },
+    { 0xF8BC7458, 0xE419000 },
+    { 0xF85D8ED0, 0xE0FA290 },
+    { 0x10000000, 0x0 },
+    { 0xFFA62F0, 0xD65E3B },
+    { 0xFE98FD0, 0x1AC260A },
+    { 0xFCD9250, 0x280C170 },
+    { 0xFA67E20, 0x3539B38 },
+    { 0xF746EA0, 0x4241F70 },
+    { 0xF378710, 0x4F1BBD0 },
+    { 0xEEFF200, 0x5BBE008 },
+    { 0xE9DE1D0, 0x681FE48 },
+    { 0xE419010, 0x7438B90 },
+    { 0xDDB3D70, 0x8000000 },
+    { 0xD6B31D0, 0x8B6D770 },
+    { 0xCF1BBD0, 0x9679180 },
+    { 0xC6F3090, 0xA11B240 },
+    { 0xBE3EBD0, 0xAB4C250 },
+    { 0xB504F30, 0xB504F30 },
+    { 0xAB4C240, 0xBE3EBE0 },
+    { 0xA11B240, 0xC6F30A0 },
+    { 0x9679180, 0xCF1BBD0 },
+    { 0x8B6D760, 0xD6B31E0 },
+    { 0x7FFFFF8, 0xDDB3D80 },
+    { 0x7438B90, 0xE419010 },
+    { 0x681FE40, 0xE9DE1E0 },
+    { 0x5BBDFF0, 0xEEFF210 },
+    { 0x4F1BBC8, 0xF378710 },
+    { 0x4241F78, 0xF746EA0 },
+    { 0x3539B2C, 0xFA67E20 },
+    { 0x280C154, 0xFCD9250 },
+    { 0x1AC25FE, 0xFE98FD0 },
+    { 0xD65E3F, 0xFFA62F0 },
+    { 0xFFFFFFF5, 0x10000000 },
+    { 0xFF29A1AA, 0xFFA62F0 },
+    { 0xFE53D9EA, 0xFE98FD0 },
+    { 0xFD7F3E98, 0xFCD9250 },
+    { 0xFCAC64BC, 0xFA67E10 },
+    { 0xFBDBE070, 0xF746EA0 },
+    { 0xFB0E4428, 0xF378700 },
+    { 0xFA441FF8, 0xEEFF210 },
+    { 0xF97E01A8, 0xE9DE1D0 },
+    { 0xF8BC7458, 0xE419000 },
+    { 0xF7FFFFF0, 0xDDB3D70 },
+    { 0xF7492890, 0xD6B31D0 },
+    { 0xF6986E90, 0xCF1BBD0 },
+    { 0xF5EE4DA0, 0xC6F3080 },
+    { 0xF54B3DA0, 0xBE3EBD0 },
+    { 0xF4AFB0D0, 0xB504F30 },
+    { 0xF41C1410, 0xAB4C220 },
+    { 0xF390CF50, 0xA11B220 },
+    { 0xF30E4420, 0x9679170 },
+    { 0xF294CE30, 0x8B6D770 },
+    { 0xF224C290, 0x8000010 },
+    { 0xF1BE6FE0, 0x7438B68 },
+    { 0xF1621E20, 0x681FE38 },
+    { 0xF1100DF0, 0x5BBE000 },
+    { 0xF0C878E0, 0x4F1BB98 },
+    { 0xF08B9150, 0x4241F50 },
+    { 0xF05981E0, 0x3539B20 },
+    { 0xF0326DB0, 0x280C168 },
+    { 0xF0167030, 0x1AC2612 },
+    { 0xF0059D00, 0xD65E13 },
+    { 0xF0000000, 0xFFFFFFE9 },
+    { 0xF0059D10, 0xFF29A1BE },
+    { 0xF0167040, 0xFE53D9BE },
+    { 0xF0326DC0, 0xFD7F3E6C },
+    { 0xF05981F0, 0xFCAC64B0 },
+    { 0xF08B9160, 0xFBDBE088 },
+    { 0xF0C878F0, 0xFB0E4438 },
+    { 0xF1100E00, 0xFA441FD0 },
+    { 0xF1621E30, 0xF97E01A0 },
+    { 0xF1BE6FF0, 0xF8BC7468 },
+    { 0xF224C2B0, 0xF7FFFFD0 },
+    { 0xF294CE40, 0xF7492870 },
+    { 0xF30E4440, 0xF6986E60 },
+    { 0xF390CF70, 0xF5EE4DB0 },
+    { 0xF41C1430, 0xF54B3DB0 },
+    { 0xF4AFB0F0, 0xF4AFB0B0 },
+    { 0xF54B3DD0, 0xF41C1420 },
+    { 0xF5EE4DD0, 0xF390CF60 },
+    { 0xF6986EB0, 0xF30E4410 },
+    { 0xF7492880, 0xF294CE30 },
+    { 0x10000000, 0x0 },
+    { 0xFF35F90, 0x1415E54 },
+    { 0xFCD9250, 0x280C170 },
+    { 0xF8ED3C0, 0x3BC3138 },
+    { 0xF378710, 0x4F1BBD0 },
+    { 0xEC835E0, 0x61F78B0 },
+    { 0xE419010, 0x7438B90 },
+    { 0xDA46A00, 0x85C2770 },
+    { 0xCF1BBD0, 0x9679180 },
+    { 0xC2A9F70, 0xA6423B0 },
+    { 0xB504F30, 0xB504F30 },
+    { 0xA6423A0, 0xC2A9F70 },
+    { 0x9679180, 0xCF1BBD0 },
+    { 0x85C2760, 0xDA46A10 },
+    { 0x7438B90, 0xE419010 },
+    { 0x61F78A8, 0xEC835E0 },
+    { 0x4F1BBC8, 0xF378710 },
+    { 0x3BC3124, 0xF8ED3C0 },
+    { 0x280C154, 0xFCD9250 },
+    { 0x1415E50, 0xFF35F90 },
+    { 0x10000000, 0x0 },
+    { 0xFCD9250, 0x280C170 },
+    { 0xF378710, 0x4F1BBD0 },
+    { 0xE419010, 0x7438B90 },
+    { 0xCF1BBD0, 0x9679180 },
+    { 0xB504F30, 0xB504F30 },
+    { 0x9679180, 0xCF1BBD0 },
+    { 0x7438B90, 0xE419010 },
+    { 0x4F1BBC8, 0xF378710 },
+    { 0x280C154, 0xFCD9250 },
+    { 0xFFFFFFF5, 0x10000000 },
+    { 0xFD7F3E98, 0xFCD9250 },
+    { 0xFB0E4428, 0xF378700 },
+    { 0xF8BC7458, 0xE419000 },
+    { 0xF6986E90, 0xCF1BBD0 },
+    { 0xF4AFB0D0, 0xB504F30 },
+    { 0xF30E4420, 0x9679170 },
+    { 0xF1BE6FE0, 0x7438B68 },
+    { 0xF0C878E0, 0x4F1BB98 },
+    { 0xF0326DB0, 0x280C168 },
+    { 0x10000000, 0x0 },
+    { 0xF8ED3C0, 0x3BC3138 },
+    { 0xE419010, 0x7438B90 },
+    { 0xC2A9F70, 0xA6423B0 },
+    { 0x9679180, 0xCF1BBD0 },
+    { 0x61F78A8, 0xEC835E0 },
+    { 0x280C154, 0xFCD9250 },
+    { 0xFEBEA198, 0xFF35F90 },
+    { 0xFB0E4428, 0xF378700 },
+    { 0xF7A3D870, 0xDA469F0 },
+    { 0xF4AFB0D0, 0xB504F30 },
+    { 0xF25B95F0, 0x85C2760 },
+    { 0xF0C878E0, 0x4F1BB98 },
+    { 0xF00CA060, 0x1415E44 },
+    { 0xF0326DC0, 0xFD7F3E6C },
+    { 0xF137CA20, 0xF9E08758 },
+    { 0xF30E4440, 0xF6986E60 },
+    { 0xF59BDC80, 0xF3D56070 },
+    { 0xF8BC74C0, 0xF1BE6FD0 },
+    { 0xFC43CEB4, 0xF0712C40 },
+    { 0x10000000, 0x0 },
+    { 0xF378710, 0x4F1BBD0 },
+    { 0xCF1BBD0, 0x9679180 },
+    { 0x9679180, 0xCF1BBD0 },
+    { 0x4F1BBC8, 0xF378710 },
+    { 0x10000000, 0x0 },
+    { 0xCF1BBD0, 0x9679180 },
+    { 0x4F1BBC8, 0xF378710 },
+    { 0xFB0E4428, 0xF378700 },
+    { 0xF30E4420, 0x9679170 },
+    { 0x10000000, 0x0 },
+    { 0x9679180, 0xCF1BBD0 },
+    { 0xFB0E4428, 0xF378700 },
+    { 0xF0C878E0, 0x4F1BB98 },
+    { 0xF30E4440, 0xF6986E60 },
+    { 0x10000000, 0x0 },
+    { 0x10000000, 0x0 },
+    { 0x10000000, 0x0 },
+    { 0x10000000, 0x0 },
+    { 0x4F1BBF0, 0xF0C87900 }
 };
 
 #endif
--- a/libfaad/common.h
+++ b/libfaad/common.h
@@ -16,7 +16,7 @@
 ** along with this program; if not, write to the Free Software
 ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 **
-** $Id: common.h,v 1.21 2002/09/13 13:08:45 menno Exp $
+** $Id: common.h,v 1.22 2002/09/26 19:01:45 menno Exp $
 **/
 
 #ifndef __COMMON_H__
@@ -196,10 +196,9 @@
 
 #endif
 
-typedef struct {
-    real_t re;
-    real_t im;
-} complex_t;
+typedef real_t complex_t[2];
+#define RE(A) A[0]
+#define IM(A) A[1]
 
 
 /* common functions */
--- a/libfaad/decoder.c
+++ b/libfaad/decoder.c
@@ -16,7 +16,7 @@
 ** along with this program; if not, write to the Free Software 
 ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 **
-** $Id: decoder.c,v 1.34 2002/09/16 11:07:04 menno Exp $
+** $Id: decoder.c,v 1.35 2002/09/26 19:01:45 menno Exp $
 **/
 
 #include <stdlib.h>
@@ -684,7 +684,7 @@
             } else if (syntax_elements[i]->paired_channel == ch) {
                 ics = &(syntax_elements[i]->ics2);
                 if (syntax_elements[i]->common_window)
-                    ltp = &(ics->ltp2);
+                    ltp = &(syntax_elements[i]->ics1.ltp2);
                 else
                     ltp = &(ics->ltp);
                 right_channel = 1;
--- a/libfaad/huffman.h
+++ b/libfaad/huffman.h
@@ -16,7 +16,7 @@
 ** along with this program; if not, write to the Free Software 
 ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 **
-** $Id: huffman.h,v 1.10 2002/09/16 20:43:37 menno Exp $
+** $Id: huffman.h,v 1.11 2002/09/26 19:01:45 menno Exp $
 **/
 
 #ifndef __HUFFMAN_H__
@@ -73,205 +73,258 @@
 
 static uint8_t hcbN[] = { 0, 5, 5, 0, 5, 0, 5, 0, 5, 0, 6, 5 };
 
+/* defines whether a huffman codebook is unsigned or not */
+/* Table 4.6.2 */
+static uint8_t unsigned_cb[] = { 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0,
+         /* codebook 16 to 31 */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
+};
+
 static int hcb_2_quad_table_size[] = { 0, 114, 86, 0, 185, 0, 0, 0, 0, 0, 0, 0 };
 static int hcb_2_pair_table_size[] = { 0, 0, 0, 0, 0, 0, 126, 0, 83, 0, 210, 373 };
 static int hcb_bin_table_size[] = { 0, 0, 0, 161, 0, 161, 0, 127, 0, 337, 0, 0 };
 
-static INLINE uint8_t huffman_spectral_data(uint8_t cb, bitfile *ld, int16_t *sp)
+static INLINE void huffman_sign_bits(bitfile *ld, int16_t *sp, uint8_t len)
 {
-    uint32_t cw;
-    uint16_t offset = 0;
-    uint8_t extra_bits;
+    uint8_t i;
 
-    switch (cb)
+    for(i = 0; i < len; i++)
     {
-    case 1: /* 2-step method for data quadruples */
-    case 2:
-    case 4:
-
-        cw = faad_showbits(ld, hcbN[cb]);
-        offset = hcb_table[cb][cw].offset;
-        extra_bits = hcb_table[cb][cw].extra_bits;
-
-        if (extra_bits)
+        if(sp[i])
         {
-            /* we know for sure it's more than hcbN[cb] bits long */
-            faad_flushbits(ld, hcbN[cb]);
-            offset += (uint16_t)faad_showbits(ld, extra_bits);
-            faad_flushbits(ld, hcb_2_quad_table[cb][offset].bits - hcbN[cb]);
-        } else {
-            faad_flushbits(ld, hcb_2_quad_table[cb][offset].bits);
+            if(faad_get1bit(ld
+                DEBUGVAR(1,5,"huffman_sign_bits(): sign bit")) & 1)
+            {
+                sp[i] = -sp[i];
+            }
         }
+    }
+}
 
-        if (offset > hcb_2_quad_table_size[cb])
+static INLINE int16_t huffman_getescape(bitfile *ld, int16_t sp)
+{
+    uint8_t neg, i;
+    int16_t j;
+	int32_t off;
+
+    if (sp < 0) {
+        if(sp != -16)
+            return sp;
+        neg = 1;
+    } else {
+        if(sp != 16)
+            return sp;
+        neg = 0;
+    }
+
+    for (i = 4; ; i++)
+    {
+        if (faad_get1bit(ld
+            DEBUGVAR(1,6,"huffman_getescape(): escape size")) == 0)
         {
-            /* printf("ERROR: offset into hcb_2_quad_table = %d >%d!\n", offset,
-                hcb_2_quad_table_size[cb]); */
-            return 10;
+            break;
         }
+    }
 
-        sp[0] = hcb_2_quad_table[cb][offset].x;
-        sp[1] = hcb_2_quad_table[cb][offset].y;
-        sp[2] = hcb_2_quad_table[cb][offset].v;
-        sp[3] = hcb_2_quad_table[cb][offset].w;
+    off = faad_getbits(ld, i
+        DEBUGVAR(1,9,"huffman_getescape(): escape"));
 
-        return 0;
+    j = off + (1<<i);
+    if (neg)
+        j = -j;
 
-    case 6: /* 2-step method for data pairs */
-    case 8:
-    case 10:
-    case 11:
-#ifdef ERROR_RESILIENCE
-    /* VCB11 uses codebook 11 */
-    case 16: case 17: case 18: case 19: case 20: case 21: case 22: case 23:
-    case 24: case 25: case 26: case 27: case 28: case 29: case 30: case 31:
+    return j;
+}
 
-        /* TODO: If ER is used, some extra error checking should be done */
-        if (cb >= 16)
-            cb = 11;
-#endif
+static uint8_t huffman_2step_quad(uint8_t cb, bitfile *ld, int16_t *sp)
+{
+    uint32_t cw;
+    uint16_t offset = 0;
+    uint8_t extra_bits;
 
-        cw = faad_showbits(ld, hcbN[cb]);
-        offset = hcb_table[cb][cw].offset;
-        extra_bits = hcb_table[cb][cw].extra_bits;
+    cw = faad_showbits(ld, hcbN[cb]);
+    offset = hcb_table[cb][cw].offset;
+    extra_bits = hcb_table[cb][cw].extra_bits;
 
-        if (extra_bits)
-        {
-            /* we know for sure it's more than hcbN[cb] bits long */
-            faad_flushbits(ld, hcbN[cb]);
-            offset += (uint16_t)faad_showbits(ld, extra_bits);
-            faad_flushbits(ld, hcb_2_pair_table[cb][offset].bits - hcbN[cb]);
-        } else {
-            faad_flushbits(ld, hcb_2_pair_table[cb][offset].bits);
-        }
+    if (extra_bits)
+    {
+        /* we know for sure it's more than hcbN[cb] bits long */
+        faad_flushbits(ld, hcbN[cb]);
+        offset += (uint16_t)faad_showbits(ld, extra_bits);
+        faad_flushbits(ld, hcb_2_quad_table[cb][offset].bits - hcbN[cb]);
+    } else {
+        faad_flushbits(ld, hcb_2_quad_table[cb][offset].bits);
+    }
 
-        if (offset > hcb_2_pair_table_size[cb])
-        {
-            /* printf("ERROR: offset into hcb_2_pair_table = %d >%d!\n", offset,
-                hcb_2_pair_table_size[cb]); */
-            return 10;
-        }
+    if (offset > hcb_2_quad_table_size[cb])
+    {
+        /* printf("ERROR: offset into hcb_2_quad_table = %d >%d!\n", offset,
+           hcb_2_quad_table_size[cb]); */
+        return 10;
+    }
 
-        sp[0] = hcb_2_pair_table[cb][offset].x;
-        sp[1] = hcb_2_pair_table[cb][offset].y;
+    sp[0] = hcb_2_quad_table[cb][offset].x;
+    sp[1] = hcb_2_quad_table[cb][offset].y;
+    sp[2] = hcb_2_quad_table[cb][offset].v;
+    sp[3] = hcb_2_quad_table[cb][offset].w;
 
-        return 0;
+    return 0;
+}
 
-    case 3: /* binary search for data quadruples */
+static uint8_t huffman_2step_quad_sign(uint8_t cb, bitfile *ld, int16_t *sp)
+{
+    uint8_t err = huffman_2step_quad(cb, ld, sp);
+    huffman_sign_bits(ld, sp, QUAD_LEN);
 
-        while (!hcb3[offset].is_leaf)
-        {
-            uint8_t b = faad_get1bit(ld
-                DEBUGVAR(1,255,"huffman_spectral_data():3"));
-            offset += hcb3[offset].data[b];
-        }
+    return err;
+}
 
-        if (offset > hcb_bin_table_size[cb])
-        {
-            /* printf("ERROR: offset into hcb_bin_table = %d >%d!\n", offset,
-                hcb_bin_table_size[cb]); */
-            return 10;
-        }
+static uint8_t huffman_2step_pair(uint8_t cb, bitfile *ld, int16_t *sp)
+{
+    uint32_t cw;
+    uint16_t offset = 0;
+    uint8_t extra_bits;
 
-        sp[0] = hcb3[offset].data[0];
-        sp[1] = hcb3[offset].data[1];
-        sp[2] = hcb3[offset].data[2];
-        sp[3] = hcb3[offset].data[3];
+    cw = faad_showbits(ld, hcbN[cb]);
+    offset = hcb_table[cb][cw].offset;
+    extra_bits = hcb_table[cb][cw].extra_bits;
 
-        return 0;
+    if (extra_bits)
+    {
+        /* we know for sure it's more than hcbN[cb] bits long */
+        faad_flushbits(ld, hcbN[cb]);
+        offset += (uint16_t)faad_showbits(ld, extra_bits);
+        faad_flushbits(ld, hcb_2_pair_table[cb][offset].bits - hcbN[cb]);
+    } else {
+        faad_flushbits(ld, hcb_2_pair_table[cb][offset].bits);
+    }
 
-    case 5: /* binary search for data pairs */
-    case 7:
-    case 9:
+    if (offset > hcb_2_pair_table_size[cb])
+    {
+        /* printf("ERROR: offset into hcb_2_pair_table = %d >%d!\n", offset,
+           hcb_2_pair_table_size[cb]); */
+        return 10;
+    }
 
-        while (!hcb_bin_table[cb][offset].is_leaf)
-        {
-            uint8_t b = faad_get1bit(ld
-                DEBUGVAR(1,255,"huffman_spectral_data():9"));
-            offset += hcb_bin_table[cb][offset].data[b];
-        }
+    sp[0] = hcb_2_pair_table[cb][offset].x;
+    sp[1] = hcb_2_pair_table[cb][offset].y;
 
-        if (offset > hcb_bin_table_size[cb])
-        {
-            /* printf("ERROR: offset into hcb_bin_table = %d >%d!\n", offset,
-                hcb_bin_table_size[cb]); */
-            return 10;
-        }
+    return 0;
+}
 
-        sp[0] = hcb_bin_table[cb][offset].data[0];
-        sp[1] = hcb_bin_table[cb][offset].data[1];
+static huffman_2step_pair_sign(uint8_t cb, bitfile *ld, int16_t *sp)
+{
+    uint8_t err = huffman_2step_pair(cb, ld, sp);
+    huffman_sign_bits(ld, sp, PAIR_LEN);
 
-        return 0;
+    return err;
+}
 
-    default:
-        /* Non existent codebook number, something went wrong */
-        return 11;
+static uint8_t huffman_binary_quad(uint8_t cb, bitfile *ld, int16_t *sp)
+{
+    uint16_t offset = 0;
+
+    while (!hcb3[offset].is_leaf)
+    {
+        uint8_t b = faad_get1bit(ld
+            DEBUGVAR(1,255,"huffman_spectral_data():3"));
+        offset += hcb3[offset].data[b];
     }
 
+    if (offset > hcb_bin_table_size[cb])
+    {
+        /* printf("ERROR: offset into hcb_bin_table = %d >%d!\n", offset,
+           hcb_bin_table_size[cb]); */
+        return 10;
+    }
+
+    sp[0] = hcb3[offset].data[0];
+    sp[1] = hcb3[offset].data[1];
+    sp[2] = hcb3[offset].data[2];
+    sp[3] = hcb3[offset].data[3];
+
     return 0;
 }
 
-static INLINE void huffman_sign_bits(bitfile *ld, int16_t *sp, uint8_t len)
+static uint8_t huffman_binary_quad_sign(uint8_t cb, bitfile *ld, int16_t *sp)
 {
-    uint8_t i;
+    uint8_t err = huffman_binary_quad(cb, ld, sp);
+    huffman_sign_bits(ld, sp, QUAD_LEN);
 
-    for(i = 0; i < len; i++)
-    {
-        if(sp[i])
-        {
-            if(faad_get1bit(ld
-                DEBUGVAR(1,5,"huffman_sign_bits(): sign bit")) & 1)
-            {
-                sp[i] = -sp[i];
-            }
-        }
-    }
+    return err;
 }
 
-static INLINE int32_t huffman_getescape(bitfile *ld, int16_t sp)
+static uint8_t huffman_binary_pair(uint8_t cb, bitfile *ld, int16_t *sp)
 {
-    uint8_t neg, i;
-    int32_t j, off;
+    uint16_t offset = 0;
 
-    if (sp < 0) {
-        if(sp != -16)
-            return sp;
-        neg = 1;
-    } else {
-        if(sp != 16)
-            return sp;
-        neg = 0;
+    while (!hcb_bin_table[cb][offset].is_leaf)
+    {
+        uint8_t b = faad_get1bit(ld
+            DEBUGVAR(1,255,"huffman_spectral_data():9"));
+        offset += hcb_bin_table[cb][offset].data[b];
     }
 
-    for (i = 4; ; i++)
+    if (offset > hcb_bin_table_size[cb])
     {
-        if (faad_get1bit(ld
-            DEBUGVAR(1,6,"huffman_getescape(): escape size")) == 0)
-        {
-            break;
-        }
+        /* printf("ERROR: offset into hcb_bin_table = %d >%d!\n", offset,
+           hcb_bin_table_size[cb]); */
+        return 10;
     }
 
-#if 0
-    if (i > 16)
+    sp[0] = hcb_bin_table[cb][offset].data[0];
+    sp[1] = hcb_bin_table[cb][offset].data[1];
+
+    return 0;
+}
+
+static uint8_t huffman_binary_pair_sign(uint8_t cb, bitfile *ld, int16_t *sp)
+{
+    uint8_t err = huffman_binary_pair(cb, ld, sp);
+    huffman_sign_bits(ld, sp, PAIR_LEN);
+
+    return err;
+}
+
+static INLINE uint8_t huffman_spectral_data(uint8_t cb, bitfile *ld, int16_t *sp)
+{
+    switch (cb)
     {
-        off = faad_getbits(ld, i-16
-            DEBUGVAR(1,7,"huffman_getescape(): escape, first part")) << 16;
-        off |= faad_getbits(ld, 16
-            DEBUGVAR(1,8,"huffman_getescape(): escape, second part"));
-    } else {
+    case 1: /* 2-step method for data quadruples */
+    case 2:
+        return huffman_2step_quad(cb, ld, sp);
+    case 3: /* binary search for data quadruples */
+        return huffman_binary_quad_sign(cb, ld, sp);
+    case 4: /* 2-step method for data quadruples */
+        return huffman_2step_quad_sign(cb, ld, sp);
+    case 5: /* binary search for data pairs */
+        return huffman_binary_pair(cb, ld, sp);
+    case 6: /* 2-step method for data pairs */
+        return huffman_2step_pair(cb, ld, sp);
+    case 7: /* binary search for data pairs */
+    case 9:
+        return huffman_binary_pair_sign(cb, ld, sp);
+    case 8: /* 2-step method for data pairs */
+    case 10:
+        return huffman_2step_pair_sign(cb, ld, sp);
+    case 11:
+#ifdef ERROR_RESILIENCE
+    /* VCB11 uses codebook 11 */
+    case 16: case 17: case 18: case 19: case 20: case 21: case 22: case 23:
+    case 24: case 25: case 26: case 27: case 28: case 29: case 30: case 31:
+    {
+        /* TODO: If ER is used, some extra error checking should be done */
 #endif
-        off = faad_getbits(ld, i
-            DEBUGVAR(1,9,"huffman_getescape(): escape"));
-#if 0
+        uint8_t err = huffman_2step_pair_sign(11, ld, sp);
+        sp[0] = huffman_getescape(ld, sp[0]);
+        sp[1] = huffman_getescape(ld, sp[1]);
+        return err;
     }
-#endif
+    default:
+        /* Non existent codebook number, something went wrong */
+        return 11;
+    }
 
-    j = off + (1<<i);
-    if (neg)
-        j = -j;
-
-    return j;
+    return 0;
 }
 
 #ifdef __cplusplus
--- a/libfaad/libfaad.vcproj
+++ b/libfaad/libfaad.vcproj
@@ -244,6 +244,9 @@
 				RelativePath=".\cfft.h">
 			</File>
 			<File
+				RelativePath="cfft_tab.h">
+			</File>
+			<File
 				RelativePath=".\common.h">
 			</File>
 			<File
--- a/libfaad/mdct.c
+++ b/libfaad/mdct.c
@@ -16,7 +16,7 @@
 ** along with this program; if not, write to the Free Software 
 ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 **
-** $Id: mdct.c,v 1.20 2002/09/13 13:08:45 menno Exp $
+** $Id: mdct.c,v 1.21 2002/09/26 19:01:45 menno Exp $
 **/
 
 /*
@@ -101,9 +101,8 @@
     assert(N % 8 == 0);
 
     mdct->N = N;
-    mdct->sincos = (faad_sincos*)malloc(N/4*sizeof(faad_sincos));
-    mdct->Z1 = (real_t*)malloc(N/2*sizeof(real_t));
-    mdct->Z2 = (complex_t*)malloc(N/4*sizeof(complex_t));
+    mdct->sincos = (complex_t*)malloc(N/4*sizeof(complex_t));
+    mdct->Z1 = (complex_t*)malloc(N/4*sizeof(complex_t));
 
     N_idx = map_N_to_idx(N);
 
@@ -115,8 +114,8 @@
 
     for (k = 0; k < N/4; k++)
     {
-        mdct->sincos[k].sin = -1*MUL_C_C(s,scale);
-        mdct->sincos[k].cos = -1*MUL_C_C(c,scale);
+        RE(mdct->sincos[k]) = -1*MUL_C_C(c,scale);
+        IM(mdct->sincos[k]) = -1*MUL_C_C(s,scale);
 
         cold = c;
         c = MUL_C_C(c,cangle) - MUL_C_C(s,sangle);
@@ -133,7 +132,6 @@
 {
     cfftu(mdct->cfft);
 
-    if (mdct->Z2) free(mdct->Z2);
     if (mdct->Z1) free(mdct->Z1);
     if (mdct->sincos) free(mdct->sincos);
 
@@ -144,9 +142,9 @@
 {
     uint16_t k;
 
-    real_t *Z1    = mdct->Z1;
-    complex_t *Z2 = mdct->Z2;
-    faad_sincos *sincos = mdct->sincos;
+    complex_t x;
+    complex_t *Z1 = mdct->Z1;
+    complex_t *sincos = mdct->sincos;
 
     uint16_t N  = mdct->N;
     uint16_t N2 = N >> 1;
@@ -157,10 +155,10 @@
     for (k = 0; k < N4; k++)
     {
         uint16_t n = k << 1;
-        real_t x0 = X_in[         n];
-        real_t x1 = X_in[N2 - 1 - n];
-        Z1[n]   = MUL_R_C(x1, sincos[k].cos) - MUL_R_C(x0, sincos[k].sin);
-        Z1[n+1] = MUL_R_C(x0, sincos[k].cos) + MUL_R_C(x1, sincos[k].sin);
+        RE(x) = X_in[         n];
+        IM(x) = X_in[N2 - 1 - n];
+        RE(Z1[k]) = MUL_R_C(IM(x), RE(sincos[k])) - MUL_R_C(RE(x), IM(sincos[k]));
+        IM(Z1[k]) = MUL_R_C(RE(x), RE(sincos[k])) + MUL_R_C(IM(x), IM(sincos[k]));
     }
 
     /* complex IFFT */
@@ -170,11 +168,11 @@
     for (k = 0; k < N4; k++)
     {
         uint16_t n = k << 1;
-        real_t zr = Z1[n];
-        real_t zi = Z1[n+1];
+        RE(x) = RE(Z1[k]);
+        IM(x) = IM(Z1[k]);
 
-        Z2[k].re  = MUL_R_C(zr, sincos[k].cos) - MUL_R_C(zi, sincos[k].sin);
-        Z2[k].im  = MUL_R_C(zi, sincos[k].cos) + MUL_R_C(zr, sincos[k].sin);
+        RE(Z1[k]) = MUL_R_C(RE(x), RE(sincos[k])) - MUL_R_C(IM(x), IM(sincos[k]));
+        IM(Z1[k]) = MUL_R_C(IM(x), RE(sincos[k])) + MUL_R_C(RE(x), IM(sincos[k]));
     }
 
     /* reordering */
@@ -181,14 +179,14 @@
     for (k = 0; k < N8; k++)
     {
         uint16_t n = k << 1;
-        X_out[              n] =  Z2[N8 +     k].im;
-        X_out[          1 + n] = -Z2[N8 - 1 - k].re;
-        X_out[N4 +          n] =  Z2[         k].re;
-        X_out[N4 +      1 + n] = -Z2[N4 - 1 - k].im;
-        X_out[N2 +          n] =  Z2[N8 +     k].re;
-        X_out[N2 +      1 + n] = -Z2[N8 - 1 - k].im;
-        X_out[N2 + N4 +     n] = -Z2[         k].im;
-        X_out[N2 + N4 + 1 + n] =  Z2[N4 - 1 - k].re;
+        X_out[              n] =  IM(Z1[N8 +     k]);
+        X_out[          1 + n] = -RE(Z1[N8 - 1 - k]);
+        X_out[N4 +          n] =  RE(Z1[         k]);
+        X_out[N4 +      1 + n] = -IM(Z1[N4 - 1 - k]);
+        X_out[N2 +          n] =  RE(Z1[N8 +     k]);
+        X_out[N2 +      1 + n] = -IM(Z1[N8 - 1 - k]);
+        X_out[N2 + N4 +     n] = -IM(Z1[         k]);
+        X_out[N2 + N4 + 1 + n] =  RE(Z1[N4 - 1 - k]);
     }
 }
 
@@ -197,8 +195,9 @@
 {
     uint16_t k;
 
-    real_t *Z1 = mdct->Z1;
-    faad_sincos *sincos = mdct->sincos;
+    complex_t x;
+    complex_t *Z1 = mdct->Z1;
+    complex_t *sincos = mdct->sincos;
 
     uint16_t N  = mdct->N;
     uint16_t N2 = N >> 1;
@@ -211,17 +210,17 @@
     for (k = 0; k < N8; k++)
     {
         uint16_t n = k << 1;
-        real_t zr =  X_in[N - N4 - 1 - n] + X_in[N - N4 +     n];
-        real_t zi =  X_in[    N4 +     n] - X_in[    N4 - 1 - n];
+        RE(x) = X_in[N - N4 - 1 - n] + X_in[N - N4 +     n];
+        IM(x) = X_in[    N4 +     n] - X_in[    N4 - 1 - n];
 
-        Z1[n]   = -MUL_R_C(zr, sincos[k].cos) - MUL_R_C(zi, sincos[k].sin);
-        Z1[n+1] = -MUL_R_C(zi, sincos[k].cos) + MUL_R_C(zr, sincos[k].sin);
+        RE(Z1[k]) = -MUL_R_C(RE(x), RE(sincos[k])) - MUL_R_C(IM(x), IM(sincos[k]));
+        IM(Z1[k]) = -MUL_R_C(IM(x), RE(sincos[k])) + MUL_R_C(RE(x), IM(sincos[k]));
 
-        zr =  X_in[N2 - 1 - n] - X_in[        n];
-        zi =  X_in[N2 +     n] + X_in[N - 1 - n];
+        RE(x) =  X_in[N2 - 1 - n] - X_in[        n];
+        IM(x) =  X_in[N2 +     n] + X_in[N - 1 - n];
 
-        Z1[n   + N4] = -MUL_R_C(zr, sincos[k + N8].cos) - MUL_R_C(zi, sincos[k + N8].sin);
-        Z1[n+1 + N4] = -MUL_R_C(zi, sincos[k + N8].cos) + MUL_R_C(zr, sincos[k + N8].sin);
+        RE(Z1[k + N8]) = -MUL_R_C(RE(x), RE(sincos[k + N8])) - MUL_R_C(IM(x), IM(sincos[k + N8]));
+        IM(Z1[k + N8]) = -MUL_R_C(IM(x), RE(sincos[k + N8])) + MUL_R_C(RE(x), IM(sincos[k + N8]));
     }
 
     /* complex FFT */
@@ -231,13 +230,13 @@
     for (k = 0; k < N4; k++)
     {
         uint16_t n = k << 1;
-        real_t zr = MUL(MUL_R_C(Z1[n], sincos[k].cos) + MUL_R_C(Z1[n+1], sincos[k].sin), scale);
-        real_t zi = MUL(MUL_R_C(Z1[n+1], sincos[k].cos) - MUL_R_C(Z1[n], sincos[k].sin), scale);
+        RE(x) = MUL(MUL_R_C(RE(Z1[k]), RE(sincos[k])) + MUL_R_C(IM(Z1[k]), IM(sincos[k])), scale);
+        IM(x) = MUL(MUL_R_C(IM(Z1[k]), RE(sincos[k])) - MUL_R_C(RE(Z1[k]), IM(sincos[k])), scale);
 
-        X_out[         n] =  zr;
-        X_out[N2 - 1 - n] = -zi;
-        X_out[N2 +     n] =  zi;
-        X_out[N  - 1 - n] = -zr;
+        X_out[         n] =  RE(x);
+        X_out[N2 - 1 - n] = -IM(x);
+        X_out[N2 +     n] =  IM(x);
+        X_out[N  - 1 - n] = -RE(x);
     }
 }
 #endif
--- a/libfaad/mdct.h
+++ b/libfaad/mdct.h
@@ -16,7 +16,7 @@
 ** along with this program; if not, write to the Free Software 
 ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 **
-** $Id: mdct.h,v 1.11 2002/09/08 18:14:37 menno Exp $
+** $Id: mdct.h,v 1.12 2002/09/26 19:01:45 menno Exp $
 **/
 
 #ifndef __MDCT_H__
@@ -29,16 +29,10 @@
 #include "cfft.h"
 
 typedef struct {
-    real_t sin;
-    real_t cos;
-} faad_sincos;
-
-typedef struct {
-    faad_sincos *sincos;
-    real_t *Z1;
-    complex_t *Z2;
-    cfft_info *cfft;
     uint16_t N;
+    cfft_info *cfft;
+    complex_t *sincos;
+    complex_t *Z1;
 } mdct_info;
 
 mdct_info *faad_mdct_init(uint16_t N);
--- a/libfaad/syntax.c
+++ b/libfaad/syntax.c
@@ -16,7 +16,7 @@
 ** along with this program; if not, write to the Free Software 
 ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 **
-** $Id: syntax.c,v 1.27 2002/09/18 11:22:36 menno Exp $
+** $Id: syntax.c,v 1.28 2002/09/26 19:01:45 menno Exp $
 **/
 
 /*
@@ -467,11 +467,11 @@
         DEBUGVAR(1,60,"data_stream_element(): element_instance_tag"));
     byte_aligned = faad_get1bit(ld
         DEBUGVAR(1,61,"data_stream_element(): byte_aligned"));
-    count = faad_getbits(ld, 8
+    count = (uint16_t)faad_getbits(ld, 8
         DEBUGVAR(1,62,"data_stream_element(): count"));
     if (count == 255)
     {
-        count += faad_getbits(ld, 8
+        count += (uint16_t)faad_getbits(ld, 8
             DEBUGVAR(1,63,"data_stream_element(): extra count"));
     }
     if (byte_aligned)
@@ -885,7 +885,7 @@
 static uint8_t decode_scale_factors(ic_stream *ics, bitfile *ld)
 {
     uint8_t g, sfb;
-    int8_t t;
+    int16_t t;
     int8_t noise_pcm_flag = 1;
 
     int16_t scale_factor = ics->global_gain;
@@ -918,7 +918,7 @@
                 if (noise_pcm_flag)
                 {
                     noise_pcm_flag = 0;
-                    t = faad_getbits(ld, 9
+                    t = (int16_t)faad_getbits(ld, 9
                         DEBUGVAR(1,73,"scale_factor_data(): first noise")) - 256;
                 } else {
                     t = huffman_scale_factor(ld);
@@ -1089,18 +1089,12 @@
 }
 #endif
 
-/* defines whether a huffman codebook is unsigned or not */
-/* Table 4.6.2 */
-static uint8_t unsigned_cb[] = { 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0,
-         /* codebook 16 to 31 */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
-};
-
 /* Table 4.4.29 */
 static uint8_t spectral_data(ic_stream *ics, bitfile *ld, int16_t *spectral_data,
                              uint16_t frame_len)
 {
     int8_t i;
-    uint8_t g, inc;
+    uint8_t g;
     int16_t *sp;
     uint16_t k, p = 0;
     uint8_t groups = 0;
@@ -1125,33 +1119,34 @@
         {
             sect_cb = ics->sect_cb[g][i];
 
-            if ((sect_cb == ZERO_HCB) ||
-                (sect_cb == NOISE_HCB) ||
-                (sect_cb == INTENSITY_HCB) ||
-                (sect_cb == INTENSITY_HCB2))
+            switch (sect_cb)
             {
+            case ZERO_HCB:
+            case NOISE_HCB:
+            case INTENSITY_HCB:
+            case INTENSITY_HCB2:
                 p += (ics->sect_sfb_offset[g][ics->sect_end[g][i]] -
                     ics->sect_sfb_offset[g][ics->sect_start[g][i]]);
-            } else {
+                break;
+            default:
                 for (k = ics->sect_sfb_offset[g][ics->sect_start[g][i]];
-                     k < ics->sect_sfb_offset[g][ics->sect_end[g][i]]; )
+                     k < ics->sect_sfb_offset[g][ics->sect_end[g][i]]; k += 4)
                 {
                     sp = spectral_data + p;
 
-                    inc = (sect_cb < FIRST_PAIR_HCB) ? QUAD_LEN : PAIR_LEN;
-
-                    if ((result = huffman_spectral_data(sect_cb, ld, sp)) > 0)
-                        return result;
-                    if (unsigned_cb[sect_cb])
-                        huffman_sign_bits(ld, sp, inc);
-                    k += inc;
-                    p += inc;
-                    if ((sect_cb == ESC_HCB) || (sect_cb >= 16))
+                    if (sect_cb < FIRST_PAIR_HCB)
                     {
-                        sp[0] = huffman_getescape(ld, sp[0]);
-                        sp[1] = huffman_getescape(ld, sp[1]);
+                        if ((result = huffman_spectral_data(sect_cb, ld, sp)) > 0)
+                            return result;
+                    } else {
+                        if ((result = huffman_spectral_data(sect_cb, ld, sp)) > 0)
+                            return result;
+                        if ((result = huffman_spectral_data(sect_cb, ld, sp+2)) > 0)
+                            return result;
                     }
+                    p += 4;
                 }
+                break;
             }
         }
         groups += ics->window_group_length[g];
@@ -1164,7 +1159,7 @@
 static uint16_t extension_payload(bitfile *ld, drc_info *drc, uint16_t count)
 {
     uint16_t i, n;
-    uint8_t extension_type = faad_getbits(ld, 4
+    uint8_t extension_type = (uint8_t)faad_getbits(ld, 4
         DEBUGVAR(1,87,"extension_payload(): extension_type"));
 
     switch (extension_type)
@@ -1222,7 +1217,7 @@
     if (faad_get1bit(ld
         DEBUGVAR(1,94,"dynamic_range_info(): has bands data")) & 1)
     {
-        band_incr = faad_getbits(ld, 4
+        band_incr = (uint8_t)faad_getbits(ld, 4
             DEBUGVAR(1,95,"dynamic_range_info(): band_incr"));
         /* drc->drc_bands_reserved_bits = */ faad_getbits(ld, 4
             DEBUGVAR(1,96,"dynamic_range_info(): drc_bands_reserved_bits"));