47 ClassImp(TFFTComplex);
52 TFFTComplex::TFFTComplex()
67 TFFTComplex::TFFTComplex(Int_t n, Bool_t inPlace)
69 fIn = fftw_malloc(
sizeof(fftw_complex) *n);
71 fOut = fftw_malloc(
sizeof(fftw_complex) * n);
86 TFFTComplex::TFFTComplex(Int_t ndim, Int_t *n, Bool_t inPlace)
90 fN =
new Int_t[fNdim];
91 for (Int_t i=0; i<fNdim; i++){
95 fIn = fftw_malloc(
sizeof(fftw_complex)*fTotalSize);
97 fOut = fftw_malloc(
sizeof(fftw_complex) * fTotalSize);
109 TFFTComplex::~TFFTComplex()
111 fftw_destroy_plan((fftw_plan)fPlan);
113 fftw_free((fftw_complex*)fIn);
115 fftw_free((fftw_complex*)fOut);
140 void TFFTComplex::Init( Option_t *flags, Int_t sign,
const Int_t* )
146 fftw_destroy_plan((fftw_plan)fPlan);
150 fPlan = (
void*)fftw_plan_dft(fNdim, fN, (fftw_complex*)fIn, (fftw_complex*)fOut, sign,MapFlag(flags));
152 fPlan = (
void*)fftw_plan_dft(fNdim, fN, (fftw_complex*)fIn, (fftw_complex*)fIn, sign, MapFlag(flags));
158 void TFFTComplex::Transform()
161 fftw_execute((fftw_plan)fPlan);
163 Error(
"Transform",
"transform not initialised");
171 void TFFTComplex::GetPoints(Double_t *data, Bool_t fromInput)
const
174 for (Int_t i=0; i<2*fTotalSize; i+=2){
175 data[i] = ((fftw_complex*)fOut)[i/2][0];
176 data[i+1] = ((fftw_complex*)fOut)[i/2][1];
179 for (Int_t i=0; i<2*fTotalSize; i+=2){
180 data[i] = ((fftw_complex*)fIn)[i/2][0];
181 data[i+1] = ((fftw_complex*)fIn)[i/2][1];
189 void TFFTComplex::GetPointComplex(Int_t ipoint, Double_t &re, Double_t &im, Bool_t fromInput)
const
191 if (fOut && !fromInput){
192 re = ((fftw_complex*)fOut)[ipoint][0];
193 im = ((fftw_complex*)fOut)[ipoint][1];
195 re = ((fftw_complex*)fIn)[ipoint][0];
196 im = ((fftw_complex*)fIn)[ipoint][1];
203 void TFFTComplex::GetPointComplex(
const Int_t *ipoint, Double_t &re, Double_t &im, Bool_t fromInput)
const
205 Int_t ireal = ipoint[0];
206 for (Int_t i=0; i<fNdim-1; i++)
207 ireal=fN[i+1]*ireal + ipoint[i+1];
209 if (fOut && !fromInput){
210 re = ((fftw_complex*)fOut)[ireal][0];
211 im = ((fftw_complex*)fOut)[ireal][1];
213 re = ((fftw_complex*)fIn)[ireal][0];
214 im = ((fftw_complex*)fIn)[ireal][1];
221 void TFFTComplex::GetPointsComplex(Double_t *re, Double_t *im, Bool_t fromInput)
const
223 if (fOut && !fromInput){
224 for (Int_t i=0; i<fTotalSize; i++){
225 re[i] = ((fftw_complex*)fOut)[i][0];
226 im[i] = ((fftw_complex*)fOut)[i][1];
229 for (Int_t i=0; i<fTotalSize; i++){
230 re[i] = ((fftw_complex*)fIn)[i][0];
231 im[i] = ((fftw_complex*)fIn)[i][1];
239 void TFFTComplex::GetPointsComplex(Double_t *data, Bool_t fromInput)
const
241 if (fOut && !fromInput){
242 for (Int_t i=0; i<fTotalSize; i+=2){
243 data[i] = ((fftw_complex*)fOut)[i/2][0];
244 data[i+1] = ((fftw_complex*)fOut)[i/2][1];
247 for (Int_t i=0; i<fTotalSize; i+=2){
248 data[i] = ((fftw_complex*)fIn)[i/2][0];
249 data[i+1] = ((fftw_complex*)fIn)[i/2][1];
257 void TFFTComplex::SetPoint(Int_t ipoint, Double_t re, Double_t im)
259 ((fftw_complex*)fIn)[ipoint][0]=re;
260 ((fftw_complex*)fIn)[ipoint][1]=im;
266 void TFFTComplex::SetPoint(
const Int_t *ipoint, Double_t re, Double_t im)
268 Int_t ireal = ipoint[0];
269 for (Int_t i=0; i<fNdim-1; i++)
270 ireal=fN[i+1]*ireal + ipoint[i+1];
272 ((fftw_complex*)fIn)[ireal][0]=re;
273 ((fftw_complex*)fIn)[ireal][1]=im;
278 void TFFTComplex::SetPointComplex(Int_t ipoint, TComplex &c)
280 ((fftw_complex*)fIn)[ipoint][0] = c.Re();
281 ((fftw_complex*)fIn)[ipoint][1] = c.Im();
288 void TFFTComplex::SetPoints(
const Double_t *data)
290 for (Int_t i=0; i<2*fTotalSize-1; i+=2){
291 ((fftw_complex*)fIn)[i/2][0]=data[i];
292 ((fftw_complex*)fIn)[i/2][1]=data[i+1];
299 void TFFTComplex::SetPointsComplex(
const Double_t *re_data,
const Double_t *im_data)
302 Error(
"SetPointsComplex",
"Size is not set yet");
305 for (Int_t i=0; i<fTotalSize; i++){
306 ((fftw_complex*)fIn)[i][0]=re_data[i];
307 ((fftw_complex*)fIn)[i][1]=im_data[i];
318 UInt_t TFFTComplex::MapFlag(Option_t *flag)
322 if (opt.Contains(
"ES"))
323 return FFTW_ESTIMATE;
324 if (opt.Contains(
"M"))
326 if (opt.Contains(
"P"))
328 if (opt.Contains(
"EX"))
329 return FFTW_EXHAUSTIVE;
330 return FFTW_ESTIMATE;