fft.c
上传用户:alisonmail
上传日期:2013-02-28
资源大小:500k
文件大小:3k
源码类别:

图片显示

开发平台:

Visual C++

  1. /****************************************************
  2. Pitch/Time Change using Sinusoidal Model
  3.     C code for floating point implementation
  4. Version 1.0
  5. 1999
  6.   Author Luo Xin
  7.   University of Science and Technology of China
  8. ****************************************************/
  9. /****************************************************
  10. File : fft.c
  11. Description:
  12. process the FFT and Inverse FFT.
  13. Function:
  14. global:
  15. fft(): process the FFT and Inverse FFT.
  16. ****************************************************/
  17. #include <math.h>
  18. #include "typedef.h"
  19. #include "const.h"
  20. /****************************************************
  21. Function: fft()
  22. Description:process the FFT and Inverse FFT.
  23. Inputs:
  24. FLOAT * datam1: Data to be used in FFT or IFFT
  25. int nn: the FFT SIZE
  26. int isign: the sign index of FFT or IFFT
  27. -1:----- FFT
  28. 1 :----- IFFT
  29. Outputs:
  30. FLOAT * datam1: Data after FFT or IFFT transform
  31. Return Value:
  32. none
  33. Algorithm Description:
  34. Subroutine FFT: Fast Fourier Transform 
  35. * Replaces data by its DFT, if isign is 1, or replaces data   *
  36. * by inverse DFT times nn if isign is -1.  data is a complex  *
  37. * array of length nn, input as a real array of length 2*nn.   *
  38. * nn MUST be an integer power of two.  This is not checked    *
  39. * The real part of the number should be in the zeroeth        *
  40. * of data , and the imaginary part should be in the next      *
  41. * element.  Hence all the real parts should have even indeces *
  42. * and the imaginary parts, odd indeces.       *
  43. * Data is passed in an array starting in position 0, but the  *
  44. * code is copied from Fortran so uses an internal pointer     *
  45. * which accesses position 0 as position 1, etc.       *
  46. Improtance:!!!
  47. * This code uses e+jwt sign convention, so isign should be    *
  48. * reversed for e-jwt.                                         *
  49. ****************************************************/
  50. #define SWAP(a,b) tempr = (a);(a) = (b); (b) = tempr
  51. void fft(FLOAT *datam1,int nn,int isign)
  52. {
  53. int n,mmax,m,j,istep,i;
  54. double wtemp,wr,wpr,wpi,wi,theta;
  55. FLOAT register tempr,tempi;
  56. FLOAT *data;
  57. /*  Use pointer indexed from 1 instead of 0 */
  58. data = &datam1[-1];
  59. n = nn << 1;
  60. j = 1;
  61. for( i = 1; i < n; i+=2 ) {
  62.   if ( j > i) {
  63. SWAP(data[j],data[i]);
  64. SWAP(data[j+1],data[i+1]);
  65.   }
  66.   m = n >> 1;
  67.   while ( m >= 2 && j > m ) {
  68. j -= m;
  69. m >>= 1;
  70.   }
  71.   j += m;
  72. }
  73. mmax = 2;
  74. while ( n > mmax) {
  75.   istep = 2 * mmax;
  76.   theta = 6.28318530717959/(isign*mmax);
  77.   wtemp = sin(0.5*theta);
  78.   wpr   = -2.0*wtemp*wtemp;
  79.   wpi   = sin(theta);
  80.   wr = 1.0;
  81.   wi = 0.0;
  82.   for ( m = 1; m < mmax;m+=2) {
  83.     for ( i = m; i <= n; i += istep) {
  84.            j = i + mmax;
  85. tempr = wr * data[j] - wi * data[j+1];
  86.        tempi = wr * data[j+1] + wi * data[j];
  87.     data[j] = data[i] - tempr;
  88. data[j+1] = data[i+1] - tempi;
  89. data[i] += tempr;
  90. data[i+1] += tempi;
  91.     }
  92.     wr = (wtemp=wr)*wpr-wi*wpi+wr;
  93.     wi = wi*wpr+wtemp*wpi+wi;
  94.   }
  95.   mmax = istep;
  96. }
  97. }