D12R2.CPP
上传用户:wangw4
上传日期:2007-06-10
资源大小:7k
文件大小:4k
源码类别:

数学计算

开发平台:

Visual C++

  1. #include <iostream.h>
  2. #include <math.h>
  3. #include <iomanip.h>
  4. #include <stdlib.h>
  5. #include <fstream.h>
  6. #include <string>
  7. #include <process.h>
  8. #include<stdio.h>
  9. int cint(double x)
  10. {
  11. int temp;
  12. double iprt;
  13. if (x>0)
  14. {
  15. x=modf(x,&iprt);
  16. if(fabs(x)<0.5)
  17. temp=int(iprt);
  18. else
  19. temp=int(iprt+1);
  20. }
  21. else if(x==0)
  22. temp=0;
  23. else
  24. {
  25. x=modf(x,&iprt);
  26. if(fabs(x)<0.5)
  27. temp=int(iprt);
  28. else
  29. temp=int(iprt)-1;
  30. }
  31. return temp;
  32. }
  33. void four1(double data[65], int nn, int isign)
  34. {
  35. int n,j,i,m,mmax,istep;
  36. double tempr,tempi,theta,wpr,wpi,wr,wi,wtemp;
  37.     n = 2 * nn;
  38.     j = 1;
  39.     for (i = 1;i<=n ;i=i+2)
  40. {
  41.         if( j > i)
  42. {
  43.             tempr = data[j];
  44.             tempi = data[j + 1];
  45.             data[j] = data[i];
  46.             data[j + 1] = data[i + 1];
  47.             data[i] = tempr;
  48.             data[i + 1] = tempi;
  49.         }
  50.         m = n / 2;
  51.         while (m >= 2 && j > m)
  52. {
  53.             j = j - m;
  54.             m = m / 2;
  55.         }
  56.         j = j + m;
  57.     }
  58.     mmax = 2;
  59.     while( n > mmax )
  60. {
  61.         istep = 2 * mmax;
  62.         theta = 6.28318530717959 / (isign * mmax);
  63.         wpr = -2.0 * sin(0.5 * theta)*sin(0.5 * theta);
  64.         wpi = sin(theta);
  65.         wr = 1.0;
  66.         wi = 0.0;
  67.         for( m = 1;m<=mmax;m=m+2)
  68. {
  69.             for (i = m ;i<=n;i=i+istep)
  70. {
  71.                 j = i + mmax;
  72.                 tempr = double(wr) * data[j] - double(wi) * data[j + 1];
  73.                 tempi = double(wr) * data[j + 1] + double(wi) * data[j];
  74.                 data[j] = data[i] - tempr;
  75.                 data[j + 1] = data[i + 1] - tempi;
  76.                 data[i] = data[i] + tempr;
  77.                 data[i + 1] = data[i + 1] + tempi;
  78.             }
  79.             wtemp = wr;
  80.             wr = wr * wpr - wi * wpi + wr;
  81.             wi = wi * wpr + wtemp * wpi + wi;
  82.         }
  83.         mmax = istep;
  84.     }
  85. }
  86. void twofft(double data1[], double data2[], double fft1[], double fft2[], int& n)
  87. {
  88. int j,n2,j2;
  89. double c1r,c1i,c2r,c2i,conjr,conji,h1r,h1i,h2r,h2i;
  90.     c1r = 0.5;
  91.     c1i = 0.0;
  92.     c2r = 0.0;
  93.     c2i = -0.5;
  94.     for (j = 1; j<=n; j++)
  95. {
  96.         fft1[2 * j - 1] = data1[j];
  97.         fft1[2 * j] = data2[j];
  98.     }
  99.     four1(fft1, n, 1);
  100.     fft2[1] = fft1[2];
  101.     fft2[2] = 0.0;
  102.     fft1[2] = 0.0;
  103.     n2 = 2 * (n + 2);
  104.     for (j = 2; j<=n / 2 + 1; j++)
  105. {
  106.         j2 = 2 * j;
  107.         conjr = fft1[n2 - j2 - 1];
  108.         conji = -fft1[n2 - j2];
  109.         h1r = c1r * (fft1[j2 - 1] + conjr) - c1i * (fft1[j2] + conji);
  110.         h1i = c1i * (fft1[j2 - 1] + conjr) + c1r * (fft1[j2] + conji);
  111.         h2r = c2r * (fft1[j2 - 1] - conjr) - c2i * (fft1[j2] - conji);
  112.         h2i = c2i * (fft1[j2 - 1] - conjr) + c2r * (fft1[j2] - conji);
  113.         fft1[j2 - 1] = h1r;
  114.         fft1[j2] = h1i;
  115.         fft1[n2 - j2 - 1] = h1r;
  116.         fft1[n2 - j2] = -h1i;
  117.         fft2[j2 - 1] = h2r;
  118.         fft2[j2] = h2i;
  119.         fft2[n2 - j2 - 1] = h2r;
  120.         fft2[n2 - j2] = -h2i;
  121.     }
  122. }
  123. void prntft(double data[], double nn2)
  124. {
  125. int n,m,mm;
  126.     cout<<"n       real(n)       imag.(n)     real(N-n)     imag.(N-n)"<<endl;
  127.     cout<<setw(1)<<"0";
  128. cout<<setw(14)<<data[1];
  129. cout<<setw(14)<<data[2];
  130. cout<<setw(14)<<data[1];
  131. cout<<setw(14)<<data[2]<<endl;
  132.     for (n = 3; n<=(nn2 / 2) + 1; n=n+2)
  133. {
  134.         m = (n - 1) / 2;
  135.         mm = nn2 + 2 - n;
  136. cout<<setiosflags(ios::fixed);
  137. cout<<setprecision(0)<<setw(1)<<m;
  138. cout<<setprecision(6)<<setw(14)<<data[n];
  139. cout<<setprecision(6)<<setw(14)<<data[n+1];
  140. cout<<setprecision(6)<<setw(14)<<data[mm];
  141. cout<<setprecision(6)<<setw(14)<<data[mm+1]<<endl;
  142.     }
  143. }
  144. void main()
  145. {
  146.     //program d12r2
  147.     //driver for routine twofft
  148. int n,i,n2,isign;
  149.     double data1[33], data2[33], fft1[65], fft2[65],per,x;
  150.     n = 32;
  151.     n2 = 2 * n;
  152.     per = 8.0;
  153.     const double pi = 3.1415926;    
  154.     for( i = 1; i<=n; i++)
  155. {
  156.         x = 2.0 * pi * i / per;
  157.         data1[i] = cint(cos(x));
  158.         data2[i] = cint(sin(x));
  159.     }
  160.     twofft(data1, data2, fft1, fft2, n);
  161.     cout<<setw(1)<< "Fourier transform of first function:"<<endl;
  162.     prntft(fft1, n2);
  163.     cout<<setw(1)<<"Fourier transform of second function:"<<endl;
  164.     prntft(fft2, n2);
  165.     //invert transform
  166.     isign = -1;
  167.     four1(fft1, n, isign);
  168.     cout<<setw(1)<<"Inverted transform = first function:"<<endl;
  169.     prntft(fft1, n2);
  170.     four1(fft2, n, isign);
  171.     cout<<setw(1)<<"Inverted transform = second function:"<<endl;
  172.     prntft(fft2, n2);
  173. }