Fourier library: Operations in the Fourier domain
fftwaffar.cc
Go to the documentation of this file.
1 
37 #define TF_FFTWAFFAR_CC_VERSION \
38  "TF_FFTWAFFAR_CC V1.1"
39 
40 #include <iostream>
41 #include <fourier/fftwaffar.h>
42 #include <fourier/error.h>
43 #include <aff/Carray.h>
44 #include <aff/slice.h>
45 #include <aff/shaper.h>
46 
47 namespace fourier {
48 
49  namespace fft {
50 
52  const int& nsamp)
53  : Mseriesarray(TAseries(aff::Shaper(0,nsamp-1)(0,nseis-1))),
54  Mspectrumarray(TAspectrum(aff::Shaper(0,DRFFTWAFFArrayEngine::ncoeff(nsamp)-1)(0,nseis-1))),
55  Mplanr2c(0), Mplanc2r(0)
56  {
57  this->checkconsistency();
58  }
59 
60  /*----------------------------------------------------------------------*/
61 
63  const TAspectrum& spec)
64  : Mseriesarray(series), Mspectrumarray(spec),
65  Mplanr2c(0), Mplanc2r(0)
66  { this->checkconsistency(); }
67 
68  /*----------------------------------------------------------------------*/
69 
71  : Mseriesarray(e.Mseriesarray), Mspectrumarray(e.Mspectrumarray),
72  Mplanr2c(0), Mplanc2r(0)
73  { }
74 
75  /*----------------------------------------------------------------------*/
76 
78  : Mseriesarray(TAseries(aff::Shaper(0,4-1)(0,0))),
79  Mspectrumarray(TAspectrum(aff::Shaper(0,DRFFTWAFFArrayEngine::ncoeff(4)-1)(0,0))),
80  Mplanr2c(0), Mplanc2r(0)
81  { }
82 
83  /*----------------------------------------------------------------------*/
84 
86  {
87  this->delete_plans();
90  return (*this);
91  } // DRFFTWAFFArrayEngine& DRFFTWAFFArrayEngine::operator=(const DRFFTWAFFArrayEngine& e)
92 
93  /*----------------------------------------------------------------------*/
94 
97  {
98  this->delete_plans();
99  } // DRFFTWAFFArrayEngine::~DRFFTWAFFArrayEngine()
100 
101  /*----------------------------------------------------------------------*/
102 
105  {
106  if (Mplanr2c != 0) { fftw_destroy_plan(Mplanr2c); }
107  if (Mplanc2r != 0) { fftw_destroy_plan(Mplanc2r); }
108  Mplanr2c=0;
109  Mplanc2r=0;
110  } // DRFFTWAFFArrayEngine::delete_plans()
111 
112  /*----------------------------------------------------------------------*/
113 
116  {
117  if (Mplanc2r == 0)
118  {
119  this->createplanc2r();
120  }
121  fftw_execute(Mplanc2r);
122  } // DRFFTWAFFArrayEngine::c2r()
123 
124  /*----------------------------------------------------------------------*/
125 
128  {
129  if (Mplanr2c == 0)
130  {
131  this->createplanr2c();
132  }
133  fftw_execute(Mplanr2c);
134  } // DRFFTWAFFArrayEngine::r2c()
135 
136  /*----------------------------------------------------------------------*/
137 
139  {
142  "ERROR: sample size inconsistent");
143  FOURIER_assert(Mseriesarray.size(1)==Mspectrumarray.size(1),
144  "ERROR: inconsistent number of signals");
145  FOURIER_assert(((Mseriesarray.size(2)==1) && (Mspectrumarray.size(2)==1)),
146  "ERROR: two-dimensional arrays only");
147  FOURIER_assert(((Mseriesarray.size(3)==1) && (Mspectrumarray.size(3)==1)),
148  "ERROR: two-dimensional arrays only");
149  } // void DRFFTWAFFArrayEngine::checkconsistency()
150 
151  /*----------------------------------------------------------------------*/
152 
154  {
155  if (Mplanr2c==0)
156  {
157  // overall parameters
158  // ------------------
159  // tranformation only along one dimension
160  const int rank=1;
161  // size of each series
162  int n=Mseriesarray.size(0);
163  // number of signals to be transformed
164  const int howmany=Mseriesarray.size(1);
165  // quick design
166  const unsigned flags=FFTW_ESTIMATE;
167 
168  // input array
169  // -----------
170  aff::CArray<TAseries::Tvalue> Cseriesarray(Mseriesarray);
171  // one-dimensional transform: use default
172  int* inembed=0;
173  // distance to next sample
174  const int istride=Cseriesarray.stride(0);
175  // distance to next signal
176  const int idist=Cseriesarray.stride(1);
177  // casted pointer
178  double* in=Cseriesarray.castedpointer<double>();
179 
180  // output array
181  // ------------
182  aff::CArray<TAspectrum::Tvalue> Cspectrumarray(Mspectrumarray);
183  // one-dimensional transform: use default
184  int* onembed=0;
185  // distance to next sample
186  const int ostride=Cspectrumarray.stride(0);
187  // distance to next signal
188  const int odist=Cspectrumarray.stride(1);
189  // casted pointer
190  fftw_complex* out=Cspectrumarray.castedpointer<fftw_complex>();
191 
192  // create plan
193  Mplanr2c=fftw_plan_many_dft_r2c(rank, &n, howmany,
194  in, inembed, istride, idist,
195  out, onembed, ostride, odist,
196  flags);
197  FOURIER_assert(Mplanr2c!=0, "ERROR: creating r2c plan");
198  }
199  } // void DRFFTWAFFArrayEngine::createplanr2c()
200 
201  /*----------------------------------------------------------------------*/
202 
204  {
205  if (Mplanc2r==0)
206  {
207  // overall parameters
208  // ------------------
209  // tranformation only along one dimension
210  const int rank=1;
211  // size of each series
212  int n=Mseriesarray.size(0);
213  // number of signals to be transformed
214  const int howmany=Mseriesarray.size(1);
215  // quick design
216  const unsigned flags=FFTW_ESTIMATE;
217 
218  // input array
219  // -----------
220  aff::CArray<TAspectrum::Tvalue> Cspectrumarray(Mspectrumarray);
221  // one-dimensional transform: use default
222  int* inembed=0;
223  // distance to next sample
224  const int istride=Cspectrumarray.stride(0);
225  // distance to next signal
226  const int idist=Cspectrumarray.stride(1);
227  // casted pointer
228  fftw_complex* in=Cspectrumarray.castedpointer<fftw_complex>();
229 
230  // output array
231  // ------------
232  aff::CArray<TAseries::Tvalue> Cseriesarray(Mseriesarray);
233  // one-dimensional transform: use default
234  int* onembed=0;
235  // distance to next sample
236  const int ostride=Cseriesarray.stride(0);
237  // distance to next signal
238  const int odist=Cseriesarray.stride(1);
239  // casted pointer
240  double* out=Cseriesarray.castedpointer<double>();
241 
242  // create plan
243  Mplanc2r=fftw_plan_many_dft_c2r(rank, &n, howmany,
244  in, inembed, istride, idist,
245  out, onembed, ostride, odist,
246  flags);
247  FOURIER_assert(Mplanc2r!=0, "ERROR: creating c2r plan");
248  }
249  } // void DRFFTWAFFArrayEngine::createplanc2r()
250 
251  /*----------------------------------------------------------------------*/
252 
264  {
265  return(1./(Mseriesarray.size(0)*dt));
266  } // Tsample DRFFTWAFFArrayEngine::scale_series(const Tsample& dt) const
267 
268  /*----------------------------------------------------------------------*/
269 
281  {
282  return(dt);
283  } // Tsample DRFFTWAFFArrayEngine::scale_spectrum(const Tsample& dt) const
284 
285  /*----------------------------------------------------------------------*/
286 
287  unsigned int DRFFTWAFFArrayEngine::nsamples() const
288  {
289  return Mseriesarray.size(0);
290  } // unsigned int DRFFTWAFFArrayEngine::nsamples() const
291 
292  /*----------------------------------------------------------------------*/
293 
295  {
296  return Mspectrumarray.size(0);
297  } // unsigned int DRFFTWAFFArrayEngine::nfrequencies() const
298 
299  /*----------------------------------------------------------------------*/
300 
301  unsigned int DRFFTWAFFArrayEngine::nseries() const
302  {
303  return Mseriesarray.size(1);
304  } // unsigned int DRFFTWAFFArrayEngine::nseries() const
305 
306  /*----------------------------------------------------------------------*/
307 
310  DRFFTWAFFArrayEngine::series(const unsigned int& i) const
311  {
312  FOURIER_assert(((i>=0) && (i<this->nseries())),
313  "ERROR: signal index is out of range");
314  return(aff::slice(Mseriesarray)()(i));
315  } // DRFFTWAFFArrayEngine::TAseries DRFFTWAFFArrayEngine::series(i) const
316 
317  /*----------------------------------------------------------------------*/
318 
321  DRFFTWAFFArrayEngine::spectrum(const unsigned int& i) const
322  {
323  FOURIER_assert(((i>=0) && (i<this->nseries())),
324  "ERROR: signal index is out of range");
325  return(aff::slice(Mspectrumarray)()(i));
326  } // DRFFTWAFFArrayEngine::TAspectrum DRFFTWAFFArrayEngine::spectrum(i) const
327 
328  } // namespace fft
329 
330 } // namespace fourier
331 
332 /* ----- END OF fftwaffar.cc ----- */
#define FOURIER_assert(C, M)
Check an assertion and report by throwing an exception.
Definition: error.h:141
unsigned int nsamples() const
return the number of samples in time series
Definition: fftwaffar.cc:287
Tsample scale_spectrum(const Tsample &dt) const
Return appropriate scaling factor for sampling interval dt.
Definition: fftwaffar.cc:280
aff::Array< Tsample > TAseries
Definition: fftwaffar.h:91
engine to transfrom several signals at once (prototypes)
aff::Array< Tcoeff > TAspectrum
Definition: fftwaffar.h:92
error handling for libfourier (prototypes)
~DRFFTWAFFArrayEngine()
delete plan.
Definition: fftwaffar.cc:96
TAseries series() const
return a reference to the time series arrays
Definition: fftwaffar.h:106
void r2c()
execute r2c plan
Definition: fftwaffar.cc:127
unsigned int nfrequencies() const
return the number of positive frequencies used
Definition: fftwaffar.cc:294
Tsample scale_series(const Tsample &dt) const
Return appropriate scaling factor for sampling interval dt.
Definition: fftwaffar.cc:263
Definition: error.cc:44
DRFFTWAFFArrayEngine & operator=(const DRFFTWAFFArrayEngine &e)
Definition: fftwaffar.cc:85
unsigned int nseries() const
return the number of series in the arrays
Definition: fftwaffar.cc:301
TAspectrum spectrum() const
return a reference to the Fourier coefficient arrays
Definition: fftwaffar.h:108
static unsigned int ncoeff(const unsigned int &nsamples)
return number of coefficients for given number of samples
Definition: fftwaffar.h:122
Engine to transform several signals at once. References to workspace are passed to the contstructor...
Definition: fftwaffar.h:87
void c2r()
execute c2r plan
Definition: fftwaffar.cc:115
void delete_plans()
delete plans.
Definition: fftwaffar.cc:104