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

图片显示

开发平台:

Visual C++

  1. // FFT.cpp: implementation of the CFFT class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "Dsp.h"
  6. #include "FFT.h"
  7. #include <math.h>
  8. #include "FFTINPUTDLG.h"
  9. #include "FFTINPUTDLG2.h"
  10. #ifdef _DEBUG
  11. #undef THIS_FILE
  12. static char THIS_FILE[]=__FILE__;
  13. #define new DEBUG_NEW
  14. #endif
  15. //////////////////////////////////////////////////////////////////////
  16. // Construction/Destruction
  17. //////////////////////////////////////////////////////////////////////
  18. CFFT::CFFT()
  19. {
  20. //m=(int)(log10(lengthoftrans)/log10(2.0));
  21. }
  22. CFFT::CFFT(int len)
  23. {
  24. m=(int)(log10(len)/log10(2.0));
  25.     length = len;
  26. wI = new double[len];
  27. wR = new double[len];
  28. xI = new double[len];
  29. xR = new double[len];
  30. transofx = new double[len];
  31. bridge = new double[len];
  32.     L = new int[len];
  33. }
  34. CFFT::~CFFT()
  35. {
  36. delete wI;
  37. delete wR;
  38. delete xI;
  39. delete xR;
  40. delete L;
  41. delete bridge;
  42. delete transofx;
  43. }
  44. void CFFT::FftTrans(int M)
  45. {
  46. int ip,k,kk,l,incr,iter,j,i;
  47. double Tr,Ti;
  48. ip=1;
  49. kk= (M>>1);
  50. incr= 2;
  51. AdjustSignalOrder(M);// adjust the order of the signal  
  52. for (iter=0;iter<m;iter++)
  53. {
  54. for (j=0;j<M;j+=incr)
  55. {
  56. i= j+ip;
  57. Tr= xR[i];
  58. Ti= xI[i];
  59. xR[i]= xR[j]-Tr;
  60. xI[i]= xI[j]-Ti;
  61. xR[j]= xR[j]+Tr;
  62. xI[j]= xI[j]+Ti;
  63. }
  64. if (iter!=0)
  65. {
  66. for (k=1;k<ip;k++)
  67. {
  68. l= k*kk-1;
  69. for (j=k;j<M;j+=incr)
  70. {
  71. i= j+ip;
  72. Tr= xR[i]*wR[l]-xI[i]*wI[l];
  73. Ti= xR[i]*wI[l]+xI[i]*wR[l];
  74. xR[i]= xR[j]-Tr;
  75.                     xI[i]= xI[j]-Ti;
  76. xR[j]= xR[j]+Tr;
  77. xI[j]= xI[j]+Ti;
  78. }
  79. }
  80. }
  81. kk>>=1;
  82. ip<<=1;
  83. incr<<=1;
  84. }
  85. }
  86. void CFFT::IFftTrans(int M)
  87. {
  88. }
  89. void CFFT::BitReversal(int M)
  90. {
  91. unsigned int MASK,C,A,j,k,i;
  92. for (k=0;k<M;k++)
  93. {
  94. MASK =1;
  95. C=0;
  96. for (i=0,j=m-1;i<m;i++,j--)
  97. { A= (k&MASK)>>i;
  98.             A<<=j;
  99. C|=A;
  100. MASK= MASK<<1;
  101. }
  102. L[k]=C;
  103. }
  104. }
  105. void CFFT::IniWvalue(int M,int flag)//flag=1 for fft ,flag=0 for ifft
  106. {
  107. int n2;
  108. double theta;
  109. n2=(M>>1)-1;
  110. theta= 2.0*3.1415926/M;
  111. for (int i=0;i<=n2;i++)
  112. {
  113. wR[i]= cos((i+1)*theta);
  114. wI[i]= sin((i+1)*theta);
  115. if (flag==1)
  116. wI[i]= -wI[i];
  117. }
  118. }
  119. void CFFT::IniSignals(int type, int M)
  120. {
  121. ///////////////////////////////////////////////////////
  122. IniWvalue(M,1);/////////// ini the value of w[i]
  123. BitReversal(M);
  124. ///////////////////////////////////////////////
  125. if (type==1)
  126. {
  127. double p,q;
  128. CFFTINPUTDLG dlg;
  129. dlg.DoModal();
  130. p= dlg.m_p;
  131. q= dlg.m_q;
  132. for (int n=0;n<M;n++)
  133. {
  134. xI[n]= 0.0;
  135. xR[n]= exp(-(n-p)*(n-p)/q);
  136. }
  137. }
  138. else if (type==2)
  139. {
  140. double a,f;
  141. CFFTINPUTDLG2 dlg;
  142. dlg.DoModal();
  143. a= dlg.m_a;
  144. f= dlg.m_f;
  145. for (int n=0;n<M;n++)
  146. {
  147. xI[n]= 0.0;
  148. xR[n]= exp(-a*n)*sin(2*3.1415926*f*n);
  149. }
  150. }
  151. else if (type==3)
  152. {
  153. for (int n=0;n<M;n++)
  154. {
  155. xI[n]=0.0;
  156. xR[n]=0.0;
  157. if (n>=0 && n<=3)
  158. xR[n]= n+1;
  159. if (n<=7 && n>=4)
  160. xR[n]= 8-n;
  161. }
  162. /* double a=0.02;A=1.0;W=0.3;f=1;
  163. for (int n=0;n<lengthoftrans;n++)
  164. {
  165. xI[n]=0.0;
  166. xR[n]= A*exp(-a*n/f)*sin(W*n/f); 
  167. }*/
  168. }
  169. else if (type==4)
  170. {
  171. for (int n=0;n<M;n++)
  172. {
  173. xI[n]=0.0;
  174. xR[n]=0.0;
  175. if (n>=0 && n<=3)
  176. xR[n]= 4-n;
  177. if (n<=7 && n>=4)
  178. xR[n]= n-3;
  179. }
  180. }
  181. }
  182. void CFFT::AdjustSignalOrder(int M)
  183. {
  184. for (int n=0;n<M;n++)
  185. {
  186. bridge[n] = xR[n];
  187. }
  188. for (int i=0;i<M;i++)
  189. {
  190. xR[i]= bridge[L[i]];
  191. }
  192. }
  193. /*void CFFT::DrawSignal(CClientDC *mDC,int startx, int starty, int len,double signal)
  194. {
  195. double max= GetMax(signal,lengthoftrans);
  196. for (int n=0;n<len;n++)
  197. {
  198. mDC->MoveTo(n*5+startx,y);
  199. mDC->LineTo(n*5+startx,int(starty-90/max*signals[n]));
  200. }
  201. }
  202. */
  203. void CFFT::GetAmp(int M)
  204. {
  205. for (int k=0;k<M;k++)
  206. {
  207. transofx[k]= sqrt(xR[k]*xR[k]+xI[k]*xI[k]);
  208. }
  209. }