Advertisement
dragonslayer0531

FFT

Nov 15th, 2017
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.46 KB | None | 0 0
  1.     void FFTHelper(std::valarray<std::complex<float>>& Data)
  2.     {
  3.         const size_t N = Data.size();
  4.         if (N <= 1) return;
  5.  
  6.         std::valarray<std::complex<float>> even = Data[std::slice(0, N / 2, 2)];
  7.         std::valarray<std::complex<float>> odd = Data[std::slice(1, N / 2, 2)];
  8.  
  9.         FFTHelper(even);
  10.         FFTHelper(odd);
  11.  
  12.         for (size_t k = 0; k < N / 2; ++k)
  13.         {
  14.             std::complex<float> t = std::polar(1.0f, (float)(-2 * LUMINOS_PI * k / N)) * odd[k];
  15.             Data[k] = even[k] + t;
  16.             Data[k + N / 2] = even[k] - t;
  17.         }
  18.     }
  19.  
  20.     luminos_vector<std::complex<float>> FFT(luminos_vector<std::complex<float>> InputData, uint32_t Width, uint32_t Height)
  21.     {
  22.         luminos_vector<std::complex<float>> res;
  23.  
  24.         for (int i = 0; i < Height; i++)
  25.         {
  26.             std::valarray<std::complex<float>> Data(InputData.data() + i * Width, InputData.size() / Height);
  27.             FFTHelper(Data);
  28.             for (auto i : Data)
  29.             {
  30.                 res.push_back(i);
  31.             }
  32.         }
  33.  
  34.         luminos_vector<std::complex<float>> tmp(Width * Height);
  35.         for (int i = 0; i < Width * Height; i++)
  36.         {
  37.             tmp[i] = res[Width * Height - 1 - i];
  38.         }
  39.         res.clear();
  40.         for (int i = 0; i < Height; i++)
  41.         {
  42.             std::valarray<std::complex<float>> Data(tmp.data() + i * Width, tmp.size() / Height);
  43.             FFTHelper(Data);
  44.             for (auto i : Data)
  45.             {
  46.                 res.push_back(i);
  47.             }
  48.         }
  49.         for (int i = 0; i < Width * Height; i++)
  50.         {
  51.             res.push_back(tmp[Width * Height - 1 - i]);
  52.         }
  53.         return res;
  54.     }
  55.  
  56.     void IFFTHelper(std::valarray<std::complex<float>>& Data)
  57.     {
  58.         Data = Data.apply(std::conj);
  59.         FFTHelper(Data);
  60.         Data = Data.apply(std::conj);
  61.         Data /= Data.size();
  62.     }
  63.  
  64.     luminos_vector<std::complex<float>> IFFT(luminos_vector<std::complex<float>> InputData, uint32_t Width, uint32_t Height)
  65.     {
  66.         luminos_vector<std::complex<float>> res;
  67.         luminos_vector<std::complex<float>> tmp;
  68.  
  69.         for (auto i = 0; i < Width * Height; i++)
  70.         {
  71.             res.push_back(InputData[Width * Height - 1 - i]);
  72.         }
  73.  
  74.         for (auto i = 0; i < Height; i++)
  75.         {
  76.             std::valarray<std::complex<float>> Data(res.data() + (i * Width), res.size() / Height);
  77.             IFFTHelper(Data);
  78.             for (auto i : Data)
  79.             {
  80.                 tmp.push_back(i);
  81.             }
  82.         }
  83.         res.clear();
  84.  
  85.         for (auto i = 0; i < Width * Height; i++)
  86.         {
  87.             res.push_back(tmp[Width * Height - 1 - i]);
  88.         }
  89.         for (auto i = 0; i < Height; i++)
  90.         {
  91.             std::valarray<std::complex<float>> Data(res.data() + (i * Width), res.size() / Height);
  92.             IFFTHelper(Data);
  93.             for (auto i : Data)
  94.             {
  95.                 tmp.push_back(i);
  96.             }
  97.         }
  98.  
  99.         return tmp;
  100.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement