JASPL  0.2
Just Another Signal Processing Library
fft.tpp
1 template<typename T>
2 FFT<T>::FFT() {
3 
4  static_assert( is_stdlib_container< T >::value, "FFT object must be built with container-like class." );
5  static_assert( std::is_floating_point< typename T::value_type >::value, "FFT object must be built with floating-point template parameter (e.g. double, float).");
6 
7  /* Setup clFFT. */
8  err = clfftInitSetupData(&fftSetup);
9  err = clfftSetup(&fftSetup);
10 }
11 
12 template<typename T>
13 FFT<T>::~FFT() {
14  TearDown();
15 }
16 
17 template<typename T>
18 void FFT<T>::Trigger() {
19 
20  /* Execute the plan. */
21  err = clfftEnqueueTransform(planHandle, CLFFT_FORWARD, 1, &command_queue(), 0, NULL, NULL, &local_buff(), NULL, NULL);
22  if ( err == 4097 ) {
23  //Signal size must be divisible by 2, 3, 5 or 7
24  // and total size must be less than 2^24 for
25  // single-precision real 1D transforms
26  std::string err_str = "clFFT cannot support signal of size ";
27  err_str += boost::lexical_cast<std::string>( signal_size );
28  throw std::runtime_error( err_str );
29  }
30 
31  OCL_DEBUG( err );
32 
33 }
34 
35 template <typename T>
36 void FFT<T>::SetSignal( cl::Buffer& signal_buff, uint sig_size ) {
37 
38  signal_size = sig_size;
39  local_buff = signal_buff;
40 
41  size_t clLengths[1] = { sig_size };
42 
43  /* Create a default plan for a real FFT. */
44  err = clfftCreateDefaultPlan(&planHandle, context(), dim, clLengths);
45  OCL_DEBUG( err );
46 
47  /* Set plan parameters. */
48  if ( boost::is_same< typename T::value_type, float>::value ) {
49  err = clfftSetPlanPrecision(planHandle, CLFFT_SINGLE);
50  } else {
51  err = clfftSetPlanPrecision(planHandle, CLFFT_DOUBLE);
52  }
53 
54  OCL_DEBUG( err );
55 
56  err = clfftSetLayout(planHandle, CLFFT_REAL, CLFFT_HERMITIAN_INTERLEAVED );
57  OCL_DEBUG( err );
58 
59  err = clfftSetResultLocation(planHandle, CLFFT_INPLACE);
60  OCL_DEBUG( err );
61 
62  /* Bake the plan. */
63  err = clfftBakePlan(planHandle, 1, &command_queue(), NULL, NULL);
64 }
65 
66 template <typename T>
67 cl::Buffer& FFT<T>::ProcessedSignal() {
68  return local_buff;
69 }
70 
71 template <typename T>
72 size_t FFT<T>::ProcessedSignalBytes() {
73  return signal_size*sizeof( typename T::value_type );
74 }
75 
76 template <typename T>
77 size_t FFT<T>::ProcessedSignalSize() {
78  return signal_size;
79 }
80 
81 template <typename T>
82 bool FFT<T>::NeedsToReknew() {
83  return true;
84 }
85 
86 template <typename T>
87 void FFT<T>::TearDown() {
88  /* Release the plan. */
89  err = clfftDestroyPlan( &planHandle );
90  /* Release clFFT library. */
91  clfftTeardown();
92 }