Advertisement
Soverein

Untitled

Nov 11th, 2021
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.92 KB | None | 0 0
  1. #include <complex>
  2. #include <iostream>
  3. #include <valarray>
  4.  
  5. const double PI = 3.141592653589793238460;
  6.  
  7. typedef std::complex<double> Complex;
  8. typedef std::valarray<Complex> CArray;
  9.  
  10.  
  11. void fft(CArray& x)
  12. {
  13.     const size_t N = x.size();
  14.     if (N <= 1) return;
  15.  
  16.     // divide
  17.     CArray even = x[std::slice(0, N / 2, 2)];
  18.     CArray  odd = x[std::slice(1, N / 2, 2)];
  19.  
  20.     // conquer
  21.     fft(even);
  22.     fft(odd);
  23.  
  24.     // combine
  25.     for (size_t k = 0; k < N / 2; ++k)
  26.     {
  27.         Complex t = std::polar(1.0, -2 * PI * k / N) * odd[k];
  28.         x[k] = even[k] + t;
  29.         x[k + N / 2] = even[k] - t;
  30.     }
  31. }
  32. int main()
  33. {
  34.     const Complex test[] = { 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0 };
  35.     CArray data(test, 8);
  36.  
  37.     // forward fft
  38.     fft(data);
  39.  
  40.     std::cout << "fft" << std::endl;
  41.     for (int i = 0; i < 8; ++i)
  42.     {
  43.         std::cout << data[i] << std::endl;
  44.     }
  45.  
  46.     return 0;
  47. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement