Advertisement
qhuy4119

Untitled

Dec 13th, 2019
597
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.59 KB | None | 0 0
  1. void FourierTransform::FFT(Mat data, Direction direction)
  2. {
  3. if (direction == Forward)
  4. {
  5. int N = data.total();
  6. int K = N/2;
  7. if (N <= 1)
  8. {
  9. return;
  10. }
  11. Mat even = Mat(1, N / 2, data.type(), Scalar(0,0));
  12. Mat odd = Mat(1, N / 2, data.type(), Scalar(0,0));
  13. separate(data, even, odd);
  14.  
  15. FFT(even, Forward);
  16. FFT(odd, Forward);
  17.  
  18. for (unsigned long u = 0; u < K; ++u) {
  19. vector<complex<double>> F_u_and_uK = F_u_and_F_uK_FFT(even, odd, u, K);
  20. data.at<Vec2d>(u)[0] = F_u_and_FuK[0].real();
  21. data.at<Vec2d>(u)[1] = F_u_and_F_uK[0].imag();
  22.  
  23. data.at<Vec2d>(u+K)[0] = F_u_and_F_uK[1].real();
  24. data.at<Vec2d>(u+K)[1] = F_u_and_F_uK[1].imag();
  25. }
  26.  
  27. }
  28. else if (direction == Backward)
  29. {
  30. multiply(data, Scalar(1, -1), data);
  31. FFT(data, Forward);
  32. multiply(data, Scalar(data.total(), data.total()), data);
  33. }
  34. }
  35.  
  36. vector<complex<double>> FourierTransform::calculate_F_u_and_F_uK_FFT(Mat even, Mat odd, int u, int K)
  37. {
  38. vector<complex<double>> result;
  39. complex<double> F_even(even.at<Vec2d>(u)[0], even.at<Vec2d>(u)[1]);
  40. complex<double> F_odd(odd.at<Vec2d>(u)[0], odd.at<Vec2d>(u)[1]);
  41. complex<double> W(cos( double(( -2 * M_PI * u)) / (2*K)), sin( double(( -2 * M_PI * u)) / (2*K)));
  42. complex<double> F_u(0, 0);
  43. complex<double> F_uK(0, 0);
  44. F_u = F_even + F_odd*W;
  45. F_uK = F_even - F_odd*W;
  46. result.push_back(F_u);
  47. result.push_back(F_uK);
  48. return result;
  49. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement