• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 
2 #include "pffft.hpp"
3 
4 #include <complex>
5 #include <iostream>
6 
7 
cxx98_forward_complex_float(const int transformLen)8 void cxx98_forward_complex_float(const int transformLen)
9 {
10   std::cout << "running " << __FUNCTION__ << "()" << std::endl;
11 
12   // first check - might be skipped
13   typedef pffft::Fft< std::complex<float> > FFT_T;
14   if (transformLen < FFT_T::minFFtsize())
15   {
16     std::cerr << "Error: minimum FFT transformation length is " << FFT_T::minFFtsize() << std::endl;
17     return;
18   }
19 
20   // instantiate FFT and prepare transformation for length N
21   pffft::Fft< std::complex<float> > fft(transformLen);
22 
23   // one more check
24   if (!fft.isValid())
25   {
26     std::cerr << "Error: transformation length " << transformLen << " is not decomposable into small prime factors. "
27               << "Next valid transform size is: " << FFT_T::nearestTransformSize(transformLen)
28               << "; next power of 2 is: " << FFT_T::nextPowerOfTwo(transformLen) << std::endl;
29     return;
30   }
31 
32   // allocate aligned vectors for input X and output Y
33   pffft::AlignedVector< std::complex<float> > X = fft.valueVector();
34   pffft::AlignedVector< std::complex<float> > Y = fft.spectrumVector();
35 
36   // alternative access: get raw pointers to aligned vectors
37   std::complex<float> *Xs = X.data();
38   std::complex<float> *Ys = Y.data();
39 
40   // prepare some input data
41   for (int k = 0; k < transformLen; k += 2)
42   {
43     X[k] = std::complex<float>(k, k&1);        // access through AlignedVector<float>
44     Xs[k+1] = std::complex<float>(-1-k, k&1);  // access through raw pointer
45   }
46 
47   // do the forward transform; write complex spectrum result into Y
48   fft.forward(X, Y);
49 
50   // print spectral output
51   std::cout << "output should be complex spectrum with " << fft.getSpectrumSize() << " bins" << std::endl;
52   std::cout << "output vector has size " << Y.size() << " (complex bins):" << std::endl;
53   for (unsigned k = 0; k < Y.size(); k += 2)
54   {
55     std::cout << "Y[" << k << "] = " << Y[k] << std::endl;
56     std::cout << "Y[" << k+1 << "] = " << Ys[k+1] << std::endl;
57   }
58 }
59 
60 
main(int argc,char * argv[])61 int main(int argc, char *argv[])
62 {
63   int N = (1 < argc) ? atoi(argv[1]) : 16;
64   cxx98_forward_complex_float(N);
65   return 0;
66 }
67