home *** CD-ROM | disk | FTP | other *** search
/ ftp.ee.lbl.gov / 2014.05.ftp.ee.lbl.gov.tar / ftp.ee.lbl.gov / sst.tar.Z / sst.tar / sst / libfft.c < prev    next >
C/C++ Source or Header  |  1990-01-10  |  4KB  |  230 lines

  1. /* libfft.c - fast Fourier transform library
  2. **
  3. ** Copyright (C) 1989 by Jef Poskanzer.
  4. **
  5. ** Permission to use, copy, modify, and distribute this software and its
  6. ** documentation for any purpose and without fee is hereby granted, provided
  7. ** that the above copyright notice appear in all copies and that both that
  8. ** copyright notice and this permission notice appear in supporting
  9. ** documentation.  This software is provided "as is" without express or
  10. ** implied warranty.
  11. */
  12.  
  13. #include <stdio.h>
  14. #include <math.h>
  15. #include "libfft.h"
  16.  
  17. #define MAXFFTSIZE 32768
  18. #define LOG2_MAXFFTSIZE 15
  19.  
  20. static int bitreverse[MAXFFTSIZE], bits, n;
  21. static complex w[MAXFFTSIZE];
  22.  
  23. /* initfft - initialize for fast Fourier transform
  24. **
  25. ** b    power of two such that 2**nu = number of samples
  26. */
  27. void
  28. initfft( b )
  29. int b;
  30.     {
  31.     register int n2, i, i0, j, k;
  32.     float ws;
  33.     complex u[32];
  34.     register complex *wP, *v1;
  35.  
  36.     bits = b;
  37.     if ( bits > LOG2_MAXFFTSIZE )
  38.     {
  39.     fprintf(
  40.         stderr, "%d is too many bits, max is %d\n", bits, LOG2_MAXFFTSIZE );
  41.     exit( 1 );
  42.     }
  43.     n = 1 << bits;
  44.  
  45.     /* Precompute the bitreverse array. */
  46.     for ( i0 = ( 1 << bits ) - 1; i0 >= 0; --i0 )
  47.     {
  48.     k = 0;
  49.     for ( j = 0; j < bits; ++j )
  50.         {
  51.         k *= 2;
  52.         if ( i0 & ( 1 << j ) )
  53.         k += 1;
  54.         }
  55.     bitreverse[i0] = k;
  56.     }
  57.  
  58.     /* Precompute the u and w arrays - the "twiddle factors". */
  59.     u[0].r = 0.;
  60.     u[0].i = 1.;
  61.     for ( i0 = 1; i0 < 32; ++i0 )
  62.     {
  63.     u[i0].r = sqrt( ( 1.0 + u[i0 - 1].r ) / 2.0 );
  64.     u[i0].i = u[i0 - 1].i / ( 2.0 * u[i0].r );
  65.     }
  66.     n2 = n / 2;
  67.     wP = w;
  68.     for ( i0 = bits; --i0 >= 0; )
  69.     {
  70.     for ( k = 0; k < n2; ++k )
  71.         {
  72.         wP->r = 1.0;
  73.         wP->i = 0.0;
  74.         for ( i = k, v1 = &u[i0 - 1]; i; i >>= 1, --v1 )
  75.         {
  76.         if ( i & 1 )
  77.             {
  78.             ws    = wP->r * v1->r - wP->i * v1->i;
  79.             wP->i = wP->r * v1->i + wP->i * v1->r;
  80.             wP->r = ws;
  81.             }
  82.         }
  83.         ++wP;
  84.         }
  85.     n2 /= 2;
  86.     }
  87.     }
  88.  
  89. /* fft - a fast Fourier transform routine
  90. **
  91. ** x    data to be transformed
  92. ** inv  flag for inverse
  93. */
  94.  
  95. void
  96. fft( x, inv )
  97. complex x[];
  98. int inv;
  99.     {
  100.     register complex *xP, *wP, *v1, *v2, *v3;
  101.     register int i, i0, n2, j, k;
  102.  
  103.     n2 = n / 2;
  104.     wP = w;
  105.     for ( i0 = bits; --i0 >= 0; )
  106.     {
  107.     for ( k = 0; k < n2; ++k )
  108.         {
  109.         /* Transform the kth subseries. */
  110.         v1 = &x[k];
  111.         v3 = &x[n];
  112.         while ( v1 < v3 )
  113.         {
  114.         register float tr, ti, z;
  115.  
  116.         v2 = v1 + n2;
  117.         tr = v1->r + v2->r;
  118.         ti = v1->i + v2->i;
  119.         if ( inv )
  120.             {
  121.             z =     wP->r * (v1->r - v2->r) - wP->i * (v1->i - v2->i);
  122.             v2->i = wP->r * (v1->i - v2->i) + wP->i * (v1->r - v2->r);
  123.             }
  124.         else
  125.             {
  126.             z =     wP->r * (v1->r - v2->r) + wP->i * (v1->i - v2->i);
  127.             v2->i = wP->r * (v1->i - v2->i) - wP->i * (v1->r - v2->r);
  128.             }
  129.         v2->r = z;
  130.         v1->r = tr;
  131.         v1->i = ti;
  132.         v1 = v2 + n2;
  133.         }
  134.         ++wP;
  135.         }
  136.     n2 /= 2;
  137.     }
  138.  
  139.     /* Unscramble the data. */
  140.     xP = x;
  141.     for ( j = 0; j < n ; ++j )
  142.     {
  143.     k = bitreverse[j];
  144.     if ( k > j )
  145.         {
  146.         complex t;
  147.  
  148.         t = *xP;
  149.         *xP = x[k];
  150.         x[k] = t;
  151.         }
  152.     ++xP;
  153.     }
  154.  
  155.     /* Finally, divide each value by n, if this is the forward transform. */
  156.     if ( ! inv )
  157.     {
  158.     register float f;
  159.  
  160.     f = 1.0 / n;
  161.     xP = x;
  162.     for ( j = 0; j < n ; ++j )
  163.         {
  164.         xP->r *= f;
  165.         xP->i *= f;
  166.         ++xP;
  167.         }
  168.     }
  169.     }
  170.  
  171. /* fft_real_inverse - a fast Fourier transform routine
  172. **
  173. ** x    data to be transformed
  174. **
  175. ** Does an inverse transform without bothering to compute the imaginary
  176. ** values.  This is somewhat faster
  177. */
  178.  
  179. void
  180. fft_real_inverse( x )
  181. complex x[];
  182.     {
  183.     register complex *xP, *wP, *v1, *v2, *v3;
  184.     register int i, i0, n2, j, k, wind;
  185.  
  186.     n2 = n / 2;
  187.     wP = w;
  188.     for ( i0 = bits; --i0 >= 0; )
  189.     {
  190.     for ( k = 0; k < n2; ++k )
  191.         {
  192.         /* Transform the kth subseries. */
  193.         v1 = &x[k];
  194.         v3 = &x[n];
  195.         while ( v1 < v3 )
  196.         {
  197.         register float tr, ti, z;
  198.  
  199.         v2 = v1 + n2;
  200.         tr = v1->r + v2->r;
  201.         ti = v1->i + v2->i;
  202.         z =     wP->r * ( v1->r - v2->r ) - wP->i * ( v1->i - v2->i );
  203.         v2->i = wP->r * ( v1->i - v2->i ) + wP->i * ( v1->r - v2->r );
  204.         v2->r = z;
  205.         v1->r = tr;
  206.         v1->i = ti;
  207.         v1 = v2 + n2;
  208.         }
  209.         ++wP;
  210.         }
  211.     n2 /= 2;
  212.     }
  213.  
  214.     /* Unscramble the data. */
  215.     xP = x;
  216.     for ( j = 0; j < n ; ++j )
  217.     {
  218.     k = bitreverse[j];
  219.     if ( k > j )
  220.         {
  221.         register float tr;
  222.  
  223.         tr = xP->r;
  224.         xP->r = x[k].r;
  225.         x[k].r = tr;
  226.         }
  227.     ++xP;
  228.     }
  229.     }
  230.