Diana Software
QFFTWPlan.cc
Go to the documentation of this file.
1 #include "QFFTWPlan.hh"
2 
3 
4 Diana::QFFTWRealComplexPlan::QFFTWRealComplexPlan(Diana::QVector &realData,Diana::QVectorC &complexData,QFFT::FFTDirection direction)
5  : fSize(realData.Size()),
6  fRealData(realData.fData,realData.fSize,realData.fStride),
7  fComplexData((gsl_complex *)complexData.fData,complexData.fSize,complexData.fStride)
8 {
9  Build(direction);
10 }
11 
12 // Diana::QFFTWRealComplexPlan::QFFTWRealComplexPlan(size_t size,Diana::QVector &realData,Diana::QVectorC &complexData,QFFT::FFTDirection direction)
13 // : fSize(size),
14 // fRealData(realData.fData,realData.fSize,realData.fStride),
15 // fComplexData((gsl_complex *)complexData.fData,complexData.fSize,complexData.fStride)
16 // {
17 // fRealData.Resize(size);
18 // fComplexData.Resize(size/2+1);
19 // Build(direction);
20 // }
21 
22 Diana::QFFTWRealComplexPlan::QFFTWRealComplexPlan(Diana::QVector &realComplexData,QFFT::FFTDirection direction)
23  : fSize(realComplexData.Size()),
24  fRealData(realComplexData.fData,realComplexData.fSize,realComplexData.fStride),
25  fComplexData((gsl_complex *)realComplexData.fData,realComplexData.fSize,realComplexData.fStride)
26 {
27  Build(direction);
28 }
29 
30 // Diana::QFFTWRealComplexPlan::QFFTWRealComplexPlan(size_t size,Diana::QVector &realComplexData,QFFT::FFTDirection direction)
31 // : fSize(size),
32 // fRealData(realComplexData.fData,realComplexData.fSize,realComplexData.fStride),
33 // fComplexData((gsl_complex *)realComplexData.fData,realComplexData.fSize,realComplexData.fStride)
34 // {
35 // fRealData.Resize(size);
36 // fComplexData.Resize(size/2+1);
37 // Build(direction);
38 // }
39 
40 Diana::QFFTWRealComplexPlan::~QFFTWRealComplexPlan() {
41 #ifdef _HAVE_FFTW3_
42  fftw_destroy_plan(fFFTPlan);
43 #endif
44 }
45 
46 void Diana::QFFTWRealComplexPlan::Execute() {
47 #ifdef _HAVE_FFTW3_
48  fftw_execute(fFFTPlan);
49 #endif
50 }
51 
52 Diana::QFFTWRealComplexPlan Diana::QFFTWRealComplexPlan::CreateForwardPlan(Diana::QVector &realData,Diana::QVectorC &complexData) {
53  return QFFTWRealComplexPlan(realData,complexData,QFFT::kForward);
54 }
55 
56 Diana::QFFTWRealComplexPlan Diana::QFFTWRealComplexPlan::CreateBackwardPlan(Diana::QVectorC &complexData,Diana::QVector &realData) {
57  return QFFTWRealComplexPlan(realData,complexData,QFFT::kBackward);
58 }
59 
60 // Diana::QFFTWRealComplexPlan Diana::QFFTWRealComplexPlan::CreateForwardPlan(size_t size,Diana::QVector &realData,Diana::QVectorC &complexData) {
61 // return QFFTWRealComplexPlan(size,realData,complexData,QFFT::kForward);
62 // }
63 
64 // Diana::QFFTWRealComplexPlan Diana::QFFTWRealComplexPlan::CreateBackwardPlan(size_t size,Diana::QVectorC &complexData,Diana::QVector &realData) {
65 // return QFFTWRealComplexPlan(size,realData,complexData,QFFT::kBackward);
66 // }
67 
68 void Diana::QFFTWRealComplexPlan::Build(QFFT::FFTDirection direction) {
69  if(fComplexData.Size() < fRealData.Size()/2+1)
70  throw QError(QERR_SIZE_NOT_MATCH,__FILE__,__LINE__,"Complex data vector is too small for the ");
71 #ifdef _HAVE_FFTW3_
72  if(direction == QFFT::kForward)
73  fFFTPlan = fftw_plan_many_dft_r2c(1,&fSize,1,fRealData.fData,NULL,fRealData.fStride,0,
74  (fftw_complex *)fComplexData.fData,NULL,fComplexData.fStride,0,
75  FFTW_MEASURE);
76  if(direction == QFFT::kBackward)
77  fFFTPlan = fftw_plan_many_dft_c2r(1,&fSize,1,(fftw_complex *)fComplexData.fData,NULL,fComplexData.fStride,0,
78  fRealData.fData,NULL,fRealData.fStride,0,
79  FFTW_MEASURE);
80 #else
81  throw QError(QERR_UNKNOWN_ERR,__FILE__,__LINE__,
82  "Package mathtools not compiled with FFTW3 support!");
83 #endif
84 }
@ QERR_UNKNOWN_ERR
Definition: QError.hh:108
@ QERR_SIZE_NOT_MATCH
Definition: QError.hh:31
error class with error type and description
Definition: QError.hh:115
Interface to FFTW's FFT plans.
Definition: QFFTWPlan.hh:33
FFTDirection
Definition: QFFT.hh:46
@ kBackward
Definition: QFFT.hh:48
@ kForward
Definition: QFFT.hh:47