#include "TFFTComplex.h"
#include "fftw3.h"
#include "TComplex.h"
ClassImp(TFFTComplex)
TFFTComplex::TFFTComplex()
{
fIn = 0;
fOut = 0;
fPlan = 0;
fN = 0;
}
TFFTComplex::TFFTComplex(Int_t n, Bool_t inPlace)
{
fIn = fftw_malloc(sizeof(fftw_complex) *n);
if (!inPlace)
fOut = fftw_malloc(sizeof(fftw_complex) * n);
else
fOut = 0;
fN = new Int_t[1];
fN[0] = n;
fTotalSize = n;
fNdim = 1;
fPlan = 0;
}
TFFTComplex::TFFTComplex(Int_t ndim, Int_t *n, Bool_t inPlace)
{
fNdim = ndim;
fTotalSize = 1;
fN = new Int_t[fNdim];
for (Int_t i=0; i<fNdim; i++){
fN[i] = n[i];
fTotalSize*=n[i];
}
fIn = fftw_malloc(sizeof(fftw_complex)*fTotalSize);
if (!inPlace)
fOut = fftw_malloc(sizeof(fftw_complex) * fTotalSize);
else
fOut = 0;
fPlan = 0;
}
TFFTComplex::~TFFTComplex()
{
fftw_destroy_plan((fftw_plan)fPlan);
fPlan = 0;
fftw_free((fftw_complex*)fIn);
if (fOut)
fftw_free((fftw_complex*)fOut);
if (fN)
delete [] fN;
}
void TFFTComplex::Init( Option_t *flags, Int_t sign,const Int_t* )
{
fSign = sign;
fFlags = flags;
if (fOut)
fPlan = (void*)fftw_plan_dft(fNdim, fN, (fftw_complex*)fIn, (fftw_complex*)fOut, sign,MapFlag(flags));
else
fPlan = (void*)fftw_plan_dft(fNdim, fN, (fftw_complex*)fIn, (fftw_complex*)fIn, sign, MapFlag(flags));
}
void TFFTComplex::Transform()
{
if (fPlan)
fftw_execute((fftw_plan)fPlan);
else {
Error("Transform", "transform not initialised");
return;
}
}
void TFFTComplex::GetPoints(Double_t *data, Bool_t fromInput) const
{
if (!fromInput){
for (Int_t i=0; i<2*fTotalSize; i+=2){
data[i] = ((fftw_complex*)fOut)[i/2][0];
data[i+1] = ((fftw_complex*)fOut)[i/2][1];
}
} else {
for (Int_t i=0; i<2*fTotalSize; i+=2){
data[i] = ((fftw_complex*)fIn)[i/2][0];
data[i+1] = ((fftw_complex*)fIn)[i/2][1];
}
}
}
void TFFTComplex::GetPointComplex(Int_t ipoint, Double_t &re, Double_t &im, Bool_t fromInput) const
{
if (fOut && !fromInput){
re = ((fftw_complex*)fOut)[ipoint][0];
im = ((fftw_complex*)fOut)[ipoint][1];
} else {
re = ((fftw_complex*)fIn)[ipoint][0];
im = ((fftw_complex*)fIn)[ipoint][1];
}
}
void TFFTComplex::GetPointComplex(const Int_t *ipoint, Double_t &re, Double_t &im, Bool_t fromInput) const
{
Int_t ireal = ipoint[0];
for (Int_t i=0; i<fNdim-1; i++)
ireal=fN[i+1]*ireal + ipoint[i+1];
if (fOut && !fromInput){
re = ((fftw_complex*)fOut)[ireal][0];
im = ((fftw_complex*)fOut)[ireal][1];
} else {
re = ((fftw_complex*)fIn)[ireal][0];
im = ((fftw_complex*)fIn)[ireal][1];
}
}
void TFFTComplex::GetPointsComplex(Double_t *re, Double_t *im, Bool_t fromInput) const
{
if (fOut && !fromInput){
for (Int_t i=0; i<fTotalSize; i++){
re[i] = ((fftw_complex*)fOut)[i][0];
im[i] = ((fftw_complex*)fOut)[i][1];
}
} else {
for (Int_t i=0; i<fTotalSize; i++){
re[i] = ((fftw_complex*)fIn)[i][0];
im[i] = ((fftw_complex*)fIn)[i][1];
}
}
}
void TFFTComplex::GetPointsComplex(Double_t *data, Bool_t fromInput) const
{
if (fOut && !fromInput){
for (Int_t i=0; i<fTotalSize; i+=2){
data[i] = ((fftw_complex*)fOut)[i/2][0];
data[i+1] = ((fftw_complex*)fOut)[i/2][1];
}
} else {
for (Int_t i=0; i<fTotalSize; i+=2){
data[i] = ((fftw_complex*)fIn)[i/2][0];
data[i+1] = ((fftw_complex*)fIn)[i/2][1];
}
}
}
void TFFTComplex::SetPoint(Int_t ipoint, Double_t re, Double_t im)
{
((fftw_complex*)fIn)[ipoint][0]=re;
((fftw_complex*)fIn)[ipoint][1]=im;
}
void TFFTComplex::SetPoint(const Int_t *ipoint, Double_t re, Double_t im)
{
Int_t ireal = ipoint[0];
for (Int_t i=0; i<fNdim-1; i++)
ireal=fN[i+1]*ireal + ipoint[i+1];
((fftw_complex*)fIn)[ireal][0]=re;
((fftw_complex*)fIn)[ireal][1]=im;
}
void TFFTComplex::SetPointComplex(Int_t ipoint, TComplex &c)
{
((fftw_complex*)fIn)[ipoint][0] = c.Re();
((fftw_complex*)fIn)[ipoint][1] = c.Im();
}
void TFFTComplex::SetPoints(const Double_t *data)
{
for (Int_t i=0; i<2*fTotalSize-1; i+=2){
((fftw_complex*)fIn)[i/2][0]=data[i];
((fftw_complex*)fIn)[i/2][1]=data[i+1];
}
}
void TFFTComplex::SetPointsComplex(const Double_t *re_data, const Double_t *im_data)
{
if (!fIn){
Error("SetPointsComplex", "Size is not set yet");
return;
}
for (Int_t i=0; i<fTotalSize; i++){
((fftw_complex*)fIn)[i][0]=re_data[i];
((fftw_complex*)fIn)[i][1]=im_data[i];
}
}
UInt_t TFFTComplex::MapFlag(Option_t *flag)
{
TString opt = flag;
opt.ToUpper();
if (opt.Contains("ES"))
return FFTW_ESTIMATE;
if (opt.Contains("M"))
return FFTW_MEASURE;
if (opt.Contains("P"))
return FFTW_PATIENT;
if (opt.Contains("EX"))
return FFTW_EXHAUSTIVE;
return FFTW_ESTIMATE;
}
ROOT page - Class index - Class Hierarchy - Top of the page
This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.