Guest User

Untitled

a guest
Dec 15th, 2018
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.71 KB | None | 0 0
  1. #include <iostream>
  2. #include<string.h>
  3. #include<math.h>
  4. #include <iomanip>
  5.  
  6. using namespace std;
  7.  
  8. const double pi = 3.14159265;
  9.  
  10. struct imaginary
  11. {
  12. float real;
  13. float img;
  14. } ;
  15.  
  16.  
  17. void get_magnitude(imaginary arr[],int N,double mag[])
  18. {
  19. for(int i=0;i<N;i++)
  20. {
  21. mag[i]=pow(arr[i].real,2);
  22. mag[i]+=pow(arr[i].img,2);
  23. mag[i]=sqrt(mag[i]);
  24. }
  25.  
  26. }
  27.  
  28.  
  29. void get_phase(imaginary arr[],int N,double phs[])
  30. {
  31. for(int i=0;i<N;i++)
  32. {
  33. if (arr[i].real==0)
  34. {
  35. phs[i]=90;
  36. }
  37. else
  38. {
  39. phs[i]= (((atan((arr[i].img)/(arr[i].real)))*180)/pi);
  40. }
  41. }
  42.  
  43. }
  44.  
  45.  
  46.  
  47. imaginary* fft(imaginary arr[],int n)
  48. {
  49.  
  50. imaginary F1[n/2];
  51. imaginary F2[n/2];
  52. imaginary Wn[n/2];
  53. imaginary *p1;
  54. imaginary *p2;
  55. if(n==1)
  56. {
  57. return arr;
  58. }
  59. if(n>1)
  60. {
  61. for(int i=0;i<n/2;i++)
  62. {
  63. F1[i]=arr[2*i];
  64. F2[i]=arr[2*i+1];
  65. }
  66.  
  67. n=n/2;
  68. p1=fft(F1,n);
  69. p2=fft(F2,n);
  70. for(int i=0;i<n;i++)
  71. {
  72. F1[i]=p1[i];
  73. F2[i]=p2[i];
  74. }
  75. for(int i=0;i<n;i++)
  76. {
  77.  
  78. Wn[i].real=cos(((2*pi)*i)/(n*2));
  79. Wn[i].img=-1*(sin(((2*pi)*i)/(n*2)));
  80. arr[i].real=F1[i].real+((Wn[i].real)*(F2[i].real)-(Wn[i].img)*(F2[i].img));
  81. arr[i].img=F1[i].img+((Wn[i].real)*(F2[i].img)+(Wn[i].img)*(F2[i].real));
  82.  
  83. arr[i+n].real=F1[i].real-((Wn[i].real)*(F2[i].real)-(Wn[i].img)*(F2[i].img));
  84. arr[i+n].img=F1[i].img-((Wn[i].real)*(F2[i].img)+(Wn[i].img)*(F2[i].real));
  85.  
  86. }
  87. return arr;
  88. }
  89. }
  90.  
  91.  
  92.  
  93. int main()
  94. {
  95.  
  96.  
  97. int N = 0 ;
  98.  
  99. cout<<endl;
  100. cout << "Enter the number of points 'N' : ";
  101. cin >> N ;
  102. int T=N;
  103. imaginary X[N];
  104. imaginary out[N]={0};
  105. imaginary *o;
  106. cout<<endl;
  107. cout << "Enter the size of X(N) = ";
  108.  
  109.  
  110. int s;
  111. cin >> s;
  112. cout<<endl;
  113. cout << "Enter the discrete signal ( separated by spaces ) X(N) = ";
  114. if (s < N && s > 0 && N > 0)
  115. {
  116. for ( int i = s; i < N; i++ )
  117. {
  118. X[i].real = 0;
  119. X[i].img = 0;
  120. }
  121. for (int i = 0; i < s; i ++)
  122. {
  123. cin >> X[i].real;
  124. X[i].img = 0;
  125. }
  126. }
  127. if ( s == N && s > 0 && N > 0 )
  128. {
  129. for (int i = 0; i < N; i ++)
  130. {
  131. cin >> X[i].real;
  132. X[i].img = 0;
  133. }
  134. }
  135.  
  136.  
  137. cout<<endl;
  138.  
  139. for(int i=0 ; i< N; i++)
  140. {
  141. cout << fixed << setprecision(2) <<X[i].real<<" + J ";
  142. if(i+1!=N)
  143. {
  144. cout << fixed << setprecision(2) <<X[i].img<<" , ";
  145. }
  146. else
  147. {
  148. cout << fixed << setprecision(2) <<X[i].img;
  149. }
  150. }
  151. cout<<" } \n";
  152.  
  153.  
  154. cout << endl << " ******** SOLUTION ******** " << endl;
  155.  
  156.  
  157. o=fft(X,N);
  158.  
  159. for(int i=0;i<N;i++)
  160. {
  161. out[i].real=o[i].real;
  162. out[i].img=o[i].img;
  163. }
  164. cout<<" X[K] = { ";
  165. for(int i=0 ; i< N; i++)
  166. {
  167. cout << fixed << setprecision(2) <<out[i].real<<" + J ";
  168. if(i+1!=N)
  169. {
  170. cout << fixed << setprecision(2) <<out[i].img<<" , ";
  171. }
  172. else
  173. {
  174. cout << fixed << setprecision(2) <<out[i].img;
  175. }
  176. }
  177. cout<<" } \n";
  178.  
  179. double mag[N];
  180. get_magnitude(out,N,mag);
  181. cout<<endl;
  182. cout<<" magnitude = { ";
  183.  
  184. for(int i=0 ; i< N; i++)
  185. {
  186. if(i+1!=N)
  187. {
  188. cout <<mag[i]<<" , ";
  189. }
  190. else
  191. {
  192. cout <<mag[i] ;
  193. }
  194. }
  195. cout<<" } \n";
  196.  
  197. cout<<endl;
  198. cout<<" phase = {";
  199. double phs[N];
  200. get_phase(out,N,phs);
  201. for(int i=0 ; i< N; i++)
  202. {
  203. if(i+1!=N)
  204. {
  205. cout <<phs[i]<<" , ";
  206. }
  207. else
  208. {
  209. cout <<phs[i] ;
  210. }
  211. }
  212. cout<<" } \n";
  213.  
  214. }
Add Comment
Please, Sign In to add comment