You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

133 lines
3.2KB

  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. * minor midifications July 2012 Bjorn Roche
  13. */
  14. #ifndef __LIBFFT_C_
  15. #include "libfft.h"
  16. #include <stdlib.h>
  17. #include <stdio.h>
  18. #include <math.h>
  19. #define MAXFFTSIZE 32768
  20. #define LOG2_MAXFFTSIZE 15
  21. struct fft_s {
  22. int bitreverse[MAXFFTSIZE];
  23. int bits;
  24. } ;
  25. /* initfft - initialize for fast Fourier transform
  26. *
  27. * b power of two such that 2**nu = number of samples
  28. */
  29. void *initfft( int b ) {
  30. int i, j, k;
  31. struct fft_s *fft;
  32. fft = (struct fft_s *) malloc( sizeof( struct fft_s ) );
  33. if( !fft ) {
  34. fprintf( stderr, "Could not allocate for FFT.\n" );
  35. exit(1);
  36. }
  37. fft->bits = b;
  38. if ( fft->bits > LOG2_MAXFFTSIZE ) {
  39. fprintf( stderr, "%d is too many bits, max is %d\n", fft->bits, LOG2_MAXFFTSIZE );
  40. exit( 1 );
  41. }
  42. for ( i = ( 1 << fft->bits ) - 1; i >= 0; --i ) {
  43. k = 0;
  44. for ( j = 0; j < fft->bits; ++j ) {
  45. k *= 2;
  46. if ( i & ( 1 << j ) )
  47. k += 1;
  48. }
  49. fft->bitreverse[i] = k;
  50. }
  51. return fft;
  52. }
  53. void destroyfft( void *fft ) {
  54. free( fft );
  55. }
  56. /* applyfft - a fast Fourier transform routine
  57. *
  58. * xr real part of data to be transformed
  59. * xi imaginary part (normally zero, unless inverse transform in effect)
  60. * inv flag for inverse
  61. */
  62. void applyfft( void * fft, float *xr, float *xi, bool inv ) {
  63. int n, n2, i, k, kn2, l, p;
  64. float ang, s, c, tr, ti;
  65. //double ds, dc;
  66. struct fft_s *mfft = (struct fft_s *) fft ;
  67. n = 1 << mfft->bits;
  68. n2 = n / 2;
  69. for ( l = 0; l < mfft->bits; ++l ) {
  70. for ( k = 0; k < n; k += n2 ) {
  71. for( i = 0; i < n2; ++i, ++k ) {
  72. p = mfft->bitreverse[k / n2];
  73. ang = 6.283185 * p / n;
  74. c = cos( ang );
  75. s = sin( ang );
  76. /*
  77. sincos( ang, &ds, &dc );
  78. s = ds;
  79. c = dc;
  80. */
  81. kn2 = k + n2;
  82. if ( inv )
  83. s = -s;
  84. tr = xr[kn2] * c + xi[kn2] * s;
  85. ti = xi[kn2] * c - xr[kn2] * s;
  86. xr[kn2] = xr[k] - tr;
  87. xi[kn2] = xi[k] - ti;
  88. xr[k] += tr;
  89. xi[k] += ti;
  90. }
  91. }
  92. n2 /= 2;
  93. }
  94. for ( k = 0; k < n; ++k ) {
  95. i = mfft->bitreverse[k];
  96. if ( i <= k )
  97. continue;
  98. tr = xr[k];
  99. ti = xi[k];
  100. xr[k] = xr[i];
  101. xi[k] = xi[i];
  102. xr[i] = tr;
  103. xi[i] = ti;
  104. }
  105. /* Finally, multiply each value by 1/n, if this is the forward transform. */
  106. if ( ! inv ) {
  107. float f;
  108. f = 1.0 / n;
  109. for( i = 0; i < n ; ++i ) {
  110. xr[i] *= f;
  111. xi[i] *= f;
  112. }
  113. }
  114. }
  115. #endif // __LIBFFT_C_