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).");
8 err = clfftInitSetupData(&fftSetup);
9 err = clfftSetup(&fftSetup);
18 void FFT<T>::Trigger() {
20 /* Execute the plan. */
21 err = clfftEnqueueTransform(planHandle, CLFFT_FORWARD, 1, &command_queue(), 0, NULL, NULL, &local_buff(), NULL, NULL);
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 );
36 void FFT<T>::SetSignal( cl::Buffer& signal_buff, uint sig_size ) {
38 signal_size = sig_size;
39 local_buff = signal_buff;
41 size_t clLengths[1] = { sig_size };
43 /* Create a default plan for a real FFT. */
44 err = clfftCreateDefaultPlan(&planHandle, context(), dim, clLengths);
47 /* Set plan parameters. */
48 if ( boost::is_same< typename T::value_type, float>::value ) {
49 err = clfftSetPlanPrecision(planHandle, CLFFT_SINGLE);
51 err = clfftSetPlanPrecision(planHandle, CLFFT_DOUBLE);
56 err = clfftSetLayout(planHandle, CLFFT_REAL, CLFFT_HERMITIAN_INTERLEAVED );
59 err = clfftSetResultLocation(planHandle, CLFFT_INPLACE);
63 err = clfftBakePlan(planHandle, 1, &command_queue(), NULL, NULL);
67 cl::Buffer& FFT<T>::ProcessedSignal() {
72 size_t FFT<T>::ProcessedSignalBytes() {
73 return signal_size*sizeof( typename T::value_type );
77 size_t FFT<T>::ProcessedSignalSize() {
82 bool FFT<T>::NeedsToReknew() {
87 void FFT<T>::TearDown() {
88 /* Release the plan. */
89 err = clfftDestroyPlan( &planHandle );
90 /* Release clFFT library. */