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

图片显示

开发平台:

Visual C++

  1. //#include "stdafx.h"
  2. //#include "complex"
  3. #include <math.h>
  4. //using namespace std;
  5. #define PI 3.1415926535
  6. void fft(double y[][2], double * pCos, double *pSin, int * l, int N) //N is the power of 2 (as 8,64, 1024)
  7. {
  8. double t1[2], t2[2], t[2];
  9. int u,mu,i,j,k,/*l,*/s;
  10. mu=0; u=N-1;
  11. while (u>0) {mu++; u/=2;}
  12. for (i=0; i<N; i++) { //sort input number array
  13.   if (l[i]>i) {
  14. t[0] = y[i][0]; t[1] = y[i][1];
  15. y[i][0] = y[l[i]][0]; y[i][1] = y[l[i]][1];
  16. y[l[i]][0] = t[0]; y[l[i]][1] = t[1];
  17.   }
  18. }
  19. s=1;
  20. for (i=0; i<mu; i++) { //fft by binary dividing
  21.   for (j=0; j<N; j+=s*2) {
  22. for (k=0; k<s; k++) {
  23.   t[0] = y[j+k+s][0]*pCos[k*N/s/2] - y[j+k+s][1]*pSin[k*N/s/2];
  24.   t[1] = y[j+k+s][0]*pSin[k*N/s/2] + y[j+k+s][1]*pCos[k*N/s/2];
  25.   t1[0] = y[j+k][0] + t[0]; t1[1] = y[j+k][1] + t[1];
  26.   t2[0] = y[j+k][0] - t[0]; t2[1] = y[j+k][1] - t[1];
  27.   y[j+k][0]=t1[0]; y[j+k][1]=t1[1];
  28.   y[j+k+s][0]=t2[0]; y[j+k+s][1]=t2[1];
  29. }
  30.   }
  31.   s*=2;
  32. }
  33. }
  34. void calW(double * pCos, double * pSin, int * l, int N)
  35. {
  36.   int i,j,k;
  37.   for(i=0; i<N/2; i++)
  38.   {
  39.   double theta = 2*PI/N*i;
  40.   pCos[i] = cos(theta);
  41.   pSin[i] = sin(theta);
  42.   }
  43.   for (i=0; i<N; i++) 
  44.   { //sort input number array
  45.     k=i; l[i]=0;
  46.     for (j=2; j<=N; j=j*2) 
  47. {
  48.       l[i] += (N/j)*(k%2); k=k/2;
  49.     }
  50.   }
  51. }
  52. void imposition(double y[][2], long width)
  53. {
  54. long i,j,pos1,pos2;
  55. double temp[2];
  56. long height = width;
  57. for(j = 0; j < height; j ++)
  58. {
  59. for(i = 0; i < j; i ++)
  60. {
  61. pos1 = j*height + i;
  62. pos2 = i*width + j;
  63. temp[0] = y[pos1][0];
  64. temp[1] = y[pos1][1];
  65. y[pos1][0] = y[pos2][0];
  66. y[pos1][1] = y[pos2][1];
  67. y[pos2][0] = temp[0];
  68. y[pos2][1] = temp[1];
  69. }
  70. }
  71. return;
  72. }
  73. void imposition(double y[], long width)
  74. {
  75. long i,j,pos1,pos2;
  76. double temp;
  77. long height = width;
  78. for(j = 0; j < height; j ++)
  79. {
  80. for(i = 0; i < j; i ++)
  81. {
  82. pos1 = j*height + i;
  83. pos2 = i*width + j;
  84. temp = y[pos1];
  85. y[pos1] = y[pos2];
  86. y[pos2] = temp;
  87. }
  88. }
  89. return;
  90. }
  91. void dct(double x[], double * pCos, double * pSin, int * l, int N) //N is the power of 2 (as 8,64, 1024)
  92. {
  93. int i;
  94. double (* y)[2] = new double[N][2];
  95. double c, s, a;
  96. for(i = 0; i < N/2; i ++)
  97. {
  98. y[i][0] = x[2*i];
  99. y[i][1] = 0.0;
  100. y[N-1-i][0] = x[2*i+1];
  101. y[N-1-i][1] = 0.0;
  102. }
  103. fft(y, pCos, pSin, l, N);
  104. a = sqrt(2.0/(double)N);
  105. for(i = 0; i < N; i ++)
  106. {
  107. c = cos(i*PI/(double)(2*N));
  108. s = sin(i*PI/(double)(2*N));
  109. x[i] = (c*y[i][0] - s*y[i][1]) * a;
  110. }
  111. x[0] = x[0]/sqrt(2.0);
  112. if(y) delete[] y;
  113. }
  114. void fft(double pr[][2],int n,int k,
  115.         double f[][2],int l,int il)
  116. {
  117. int it,m,is,i,j,nv,l0;
  118.     double p,q,s,vr,vi,poddr,poddi;//
  119.     for (it=0; it<=n-1; it++)
  120.     {
  121. m=it; is=0;
  122.         for (i=0; i<=k-1; i++)
  123.         { 
  124. j=m/2; is=2*is+(m-2*j); m=j;
  125. }
  126.         f[it][0]=pr[is][0]; f[it][0]=pr[is][0];
  127.     }
  128.     pr[0][0]=1.0; pr[0][1]=0.0;
  129.     p=6.283185306/(1.0*n);
  130.     pr[1][0]=cos(p); pr[1][1]=-sin(p);
  131.     if (l!=0)
  132. {
  133. pr[1][0]=-pr[1][0];
  134. }
  135.     for (i=2; i<=n-1; i++)
  136.     { 
  137. p=pr[i-1][0]*pr[1][0]; q=pr[i-1][1]*pr[1][1];
  138.         s=(pr[i-1][0]+pr[i-1][1])*(pr[1][0]+pr[1][1]);
  139.         pr[i][0]=p-q; pr[i][1]=s-p-q;
  140.     }
  141.     for (it=0; it<=n-2; it=it+2)
  142.     { 
  143. vr=f[it][0]; vi=f[it][1];
  144.         f[it][0]=vr+f[it+1][0]; f[it][1]=vi+f[it+1][1];
  145.         f[it+1][0]=vr-f[it+1][0]; f[it+1][1]=vi-f[it+1][1];
  146.     }
  147.     m=n/2; nv=2;
  148.     for (l0=k-2; l0>=0; l0--)
  149.     { 
  150. m=m/2; nv=2*nv;
  151.         for (it=0; it<=(m-1)*nv; it=it+nv)
  152. {
  153. for (j=0; j<=(nv/2)-1; j++)
  154.             { p=pr[m*j][0]*f[it+j+nv/2][0];
  155.               q=pr[m*j][1]*f[it+j+nv/2][1];
  156.               s=pr[m*j][0]+pr[m*j][1];
  157.               s=s*(f[it+j+nv/2][0]+f[it+j+nv/2][1]);
  158.               poddr=p-q; poddi=s-p-q;
  159.               f[it+j+nv/2][0]=f[it+j][0]-poddr;
  160.               f[it+j+nv/2][1]=f[it+j][1]-poddi;
  161.               f[it+j][0]=f[it+j][0]+poddr;
  162.               f[it+j][1]=f[it+j][1]+poddi;
  163.             }
  164. }
  165.      }
  166.     if (l!=0)
  167.     {  for (i=0; i<=n-1; i++)
  168.         { f[i][0]=f[i][0]/(1.0*n);
  169.           f[i][1]=f[i][1]/(1.0*n);
  170.         }
  171. }
  172.     if (il!=0)
  173. {
  174. for (i=0; i<=n-1; i++)
  175.         { pr[i][0]=sqrt(f[i][0]*f[i][0]+f[i][1]*f[i][1]);
  176.           if (fabs(f[i][0])<0.000001*fabs(f[i][1]))
  177.           { 
  178.   if ((f[i][1]*f[i][0])>0) 
  179.   pr[i][1]=90.0;
  180.               else
  181.   pr[i][1]=-90.0;
  182.           }
  183.           else
  184.             pr[i][1]=atan(f[i][1]/f[i][0])*360.0/6.283185306;
  185.         }
  186. }
  187. }