18 #include <gsl/gsl_fft_halfcomplex.h>
28 fWaveTable = gsl_fft_real_wavetable_alloc(size);
29 fWork = gsl_fft_real_workspace_alloc(size);
30 fHCWaveTable = gsl_fft_halfcomplex_wavetable_alloc(size);
55 gsl_fft_real_workspace_free(
fWork);
71 QVector res(2*origData.Size());
75 for(
size_t i=0;i<=
fSize/2;i++){
77 FT[i].SetIm(res[i+
fSize]);
82 for(
size_t i=0;i<
fSize;i++){
84 FT[i].SetIm(res[i+
fSize]);
93 Resize(2*(origFT.Size()-1));
98 QVectorC fullFT(
fSize);
101 for(
size_t i=0;i<
fSize/2;i++){
105 ret =
Transform(fullFT.SingleVector(),data);
108 ret =
Transform(origFT.SingleVector(),data);
115 result.Resize(
fSize*2);
117 result.Resize(
fSize);
123 for(
size_t i = 0; i <
fSize; i++){
128 for(
size_t i = 0; i <
fSize; i++){
129 fData[i] = origData[i];
136 rval = gsl_fft_real_radix2_transform(
fData,1,
fSize);
137 if(rval == GSL_SUCCESS){
139 for (
size_t i = 0; i <=
fSize/2; i++){
140 result[i] =
fData[i];
146 size_t s32=size_t(1.5*
fSize);
147 result[
fSize] = 0;result[s32]=0;
148 for (
size_t i =
fSize + 1; i < s32; i++){
151 for (
size_t i = s32+1; i < 2*
fSize; i++){
157 else if(rval != GSL_EDOM)
162 if(rval == GSL_SUCCESS){
164 printf(
"QRealComplexFFTGSL::Transform(forward): odd lenght data size"
165 " (%zd) not implemented yet\n",
fSize);
168 size_t imOff =
fSize;
169 result[0] =
fData[0];
171 for(
size_t i = 1; i <
fSize/2; i++) {
175 result[imOff+
fSize-i] = -(result[imOff+i] =
fData[i*2]);
178 result[imOff +
fSize/2] = 0.;
183 else if(rval != GSL_EDOM)
191 fData[0]=origData[0];
193 for (
size_t i=1;i<
fSize/2;i++){
194 fData[i]=origData[i];
198 gsl_fft_halfcomplex_radix2_inverse(
fData,1,
fSize) :
199 gsl_fft_halfcomplex_radix2_backward(
fData,1,
fSize);
200 if(rval == GSL_SUCCESS)result.SetArray(
fData,
fSize);
205 printf(
"QRealComplexFFTGSL::Transform(backward): odd lenght data size"
206 " (%zd) not implemented yet\n",
fSize);
210 fData[0] = origData[0];
212 for(
size_t i = 1; i <
fSize/2; i++) {
214 fData[i*2-1] = origData[i];
221 if(rval == GSL_SUCCESS)result.SetArray(
fData,
fSize);
236 gsl_fft_real_workspace_free(
fWork);
240 fData =
new double[n];
242 fWork = gsl_fft_real_workspace_alloc(n);
256 size_t wsize = tmp.Size();
#define Q_BEGIN_NAMESPACE
ClassImp(Diana::QRealComplexFFTGSL)
Interface for ffts in Diana analysis.
void SetNormalized(bool isNormalized)
virtual method. Must be implemented by daughter classes set the normalization of the transform.
void SetForward(bool isForward)
virtual method. Must be implemented by daughter classes set the direction of the transform.
static QVector GetWindow(WindowType wt, size_t size, size_t zeros=0, int coherent=0, int param=0)
create window and add zeros/2 to the left and zeros/2 to the right
QRealComplexFFTGSL()
empty constructor
virtual int TransformFromFreq(const QVectorC &FT, QVector &spectrum, bool compress=false)
transform from the frequencies to the times
gsl_fft_halfcomplex_wavetable * fHCWaveTable
virtual int TransformToFreq(const QVector &data, QVectorC &FFT, bool compress=false)
transform from the times to the frequencies
virtual int Transform(const QVector &data, QVector &result)
virtual method. Must be implemented by daughter classes.
virtual ~QRealComplexFFTGSL()
destructor
virtual void SetWindowType(WindowType wt, int coherent=0)
resize working table and space
virtual bool Resize(size_t s)
virtual method. Must be implemented by daughter classes
gsl_fft_real_workspace * fWork
gsl_fft_real_wavetable * fWaveTable
set the window type.