C++ main module for emicrom Package  1.0
FFTW_Complex.h
Go to the documentation of this file.
1 #ifndef FFTW_Complex_H
2 #define FFTW_Complex_H
3 
4 
5 
6 #include "FFTW_Object.h"
7 
8 #include "OMP_Thread.h"
9 
10 
18 class FFTW_Complex : public virtual FFTW_Object {
20  // ATTRIBUTES
21 
22 
23 private:
24  //complex value
26 
27  //real value
28  mutable tFFTWReal mWork;
29  // ASSOCIATIONS
30 
31 
32 public:
33  // METHODS
34 
35  // CONSTRUCTORS
36 
38  FFTW_Complex(void) {
39  mValue[0]=0;
40  mValue[0]=0;
41  }
46  FFTW_Complex(const tFFTWReal& a,const tFFTWReal& b) {
47  mValue[0]=a;
48  mValue[1]=b;
49  }
54  mValue[0]=f[0];
55  mValue[1]=f[1];
56  }
61  mValue[0]=f[0];
62  mValue[1]=f[1];
63  }
64 
65  // DESTRUCTORS
68  virtual ~FFTW_Complex(void) {
69  }
70 
71  // -----------------------
72  // shared pointer operator
73  // ------------------------
74 public:
75 
76  // ----------------
77  // New constructors
78  // ----------------
79 public:
83  static inline SP::FFTW_Complex New() {
84  SP::FFTW_Complex p(new FFTW_Complex(),
86  p->setThis(p);
87  return p;
88  };
89 
90 public:
91  // operators
92  // =========
97  inline tFFTWReal& operator[](const tUSInt& i) {
98  return mValue[i];
99  };
104  inline const tFFTWReal& operator[](const tUSInt& i) const {
105  return mValue[i];
106  };
107 
112  inline FFTW_Complex & operator=(const FFTW_Complex& s) {
113  mValue[0]=s[0];
114  mValue[1]=s[1];
115  return (*this);
116  };
121  inline FFTW_Complex& operator=(const tFFTWComplex& s) {
122  mValue[0]=s[0];
123  mValue[1]=s[1];
124  return (*this);
125  };
126 
131  inline FFTW_Complex& operator=(const tFFTWReal& s) {
132  mValue[0]=s;
133  mValue[1]=0;
134  return (*this);
135  };
136 
141  inline FFTW_Complex& operator*=(const tFFTWReal& s) {
142  mValue[0]*=s;
143  mValue[1]*=s;
144  return (*this);
145  };
151  mWork=mValue[0]*s[0]-mValue[1]*s[1];
152  mValue[1]=mValue[0]*s[1]+mValue[1]*s[0];
153  mValue[0]=mWork;
154  return (*this);
155  };
156 
162  mWork=mValue[0]*s[0]-mValue[1]*s[1];
163  mValue[1]=mValue[0]*s[1]+mValue[1]*s[0];
164  mValue[0]=mWork;
165  return (*this);
166  };
167 
172  inline FFTW_Complex& operator/=(const tFFTWReal& s) {
173  if (s==0) throw CORE_Exception("math/signam","FFTW_Complex/=","division by 0");
174  mValue[0]/=s;
175  mValue[1]/=s;
176  return (*this);
177  };
183  mWork=mValue[0]*s[0]+mValue[1]*s[1];
184  mValue[1]=(-mValue[0]*s[1]+mValue[1]*s[0]);
185  mValue[0]=mWork;
186  mWork=s.module2();
187  if (mWork==0) throw CORE_Exception("math/signam","FFTW_Complex/=","division by 0");
188  mValue[0]/=mWork;
189  mValue[1]/=mWork;
190  return (*this);
191  };
197  mValue[0]+=s[0];
198  mValue[1]+=s[1];
199  return (*this);
200  };
206  mValue[0]+=s[0];
207  mValue[1]+=s[1];
208  return (*this);
209  };
215  mValue[0]-=s[0];
216  mValue[1]-=s[1];
217  return (*this);
218  };
224  mValue[0]-=s[0];
225  mValue[1]-=s[1];
226  return (*this);
227  };
228  // SET methods
229 
234  inline void setValue(const tFFTWReal& x,const tFFTWReal& y) {
235  mValue[0]=x;
236  mValue[1]=y;
237  }
238 
239  // GET methods
240 
244  inline const tFFTWComplex& getValue() const {
245  return mValue;
246  }
250  inline tFFTWComplex& getValue() {
251  return mValue;
252  }
253 
256  inline void conjugate() {
257  mValue[1]*=-1;
258  }
262  inline tFFTWReal module2() const {
263  return module2(mValue);
264  }
268  inline tFFTWReal module() const {
269  return module(mValue);
270  }
275  inline static tFFTWReal module2(const tFFTWComplex& f) {
276  return f[0]*f[0]+f[1]*f[1];
277  }
282  inline static tFFTWReal module(const tFFTWComplex& f) {
283  return sqrt(module2(f));
284  }
285 
286  /* \brief complex product a*=b;
287  * @param a: the a value
288  * @param b: the b value
289  */
290  inline static void product(tFFTWComplex& a,const tFFTWComplex& b) {
291  tFFTWReal temp;
292  product(a,b,temp);
293  }
294  /* \brief complex product a*=b;
295  * @param a: the a value
296  * @param b: the b value
297  */
298  inline static void product(tFFTWComplex& a,const tFFTWComplex& b,tFFTWReal& wrk) {
299  product(a,b,a,wrk);
300  }
301 
302  /* \brief complex product r=a*b;
303  * @param a: the a value
304  * @param b: the b value
305  * @param r: the result value
306  * @param temp: work value
307  */
308  inline static void product(const tFFTWComplex& a,const tFFTWComplex& b,tFFTWComplex& r,tFFTWReal& wrk) {
309  wrk=a[0]*b[0]-a[1]*b[1];
310  r[1]=a[0]*b[1]+a[1]*b[0];
311  r[0]=wrk;
312  }
313  /* \brief complex product r=a*b
314  * @param a: the a value
315  * @param b: the b value
316  * @param r: the result value
317  */
318  inline static void product(const tFFTWComplex& a,const tFFTWComplex& b,tFFTWComplex& r) {
319  ASSERT_IN(&b!=&r);
320  ASSERT_IN(&a!=&r);
321  r[0]=a[0]*b[0]-a[1]*b[1];
322  r[1]=a[0]*b[1]+a[1]*b[0];
323  }
324  /* \brief complex product r=a*b;
325  * @param a: the a value
326  * @param b: the b value
327  * @param r: the result value
328  */
329  inline static void product(const FFTW_Complex& a,const FFTW_Complex& b,FFTW_Complex& r) {
330  product(a.getValue(),b.getValue(),r.getValue());
331  }
332  /* \brief complex product r=(a+ib)*(x+i*y)
333  * @param a: real part
334  * @param b: imaginary part
335  * @param x: real part
336  * @param y: imaginary part
337  * @param r: result
338  */
339  inline static void product(const tFFTWReal& a,const tFFTWReal& b,const tFFTWReal& x,const tFFTWReal& y,tFFTWComplex& r) {
340  r[0]=a*x-b*y;
341  r[1]=a*y+b*x;
342  }
343  /* \brief complex add a+=b
344  * @param a: the a value
345  * @param b: the b value
346  */
347  inline static void add(tFFTWComplex& a,const tFFTWComplex& b) {
348  a[0]+=b[0];
349  a[1]+=b[1];
350  }
351  /* \brief complex add r=a+b;
352  * @param a: the a value
353  * @param b: the b value
354  * @param r: the result value
355  */
356  inline static void add(const tFFTWComplex& a,const tFFTWComplex& b,tFFTWComplex& r) {
357  r[0]=a[0]+b[0];
358  r[1]=a[0]+b[1];
359  }
360  /* \brief complex sub a-=b;
361  * @param a: the a value
362  * @param b: the b value
363  */
364  inline static void sub(tFFTWComplex& a,const tFFTWComplex& b) {
365  a[0]-=b[0];
366  a[1]-=b[1];
367  }
368  /* \brief complex sub : r=a-b;
369  * @param a: the a value
370  * @param b : the b value
371  * @param r: the result value
372  */
373  inline static void sub(const tFFTWComplex& a,const tFFTWComplex& b,tFFTWComplex& r) {
374  r[0]=a[0]-b[0];
375  r[1]=a[1]-b[1];
376  }
377  /* \brief swap a & b
378  * @param a: the value to swap
379  * @param b: the value to swap
380  */
381  inline static void swap(tFFTWComplex& a,tFFTWComplex& b) {
382  std::swap(a[0],b[0]);
383  std::swap(a[1],b[1]);
384  }
385 
391  inline static tFFTWReal norm2(const tFFTWComplex& a,const tFFTWComplex& b) {
392 
393  return (a[0]-b[0])*(a[0]-b[0])+(a[1]-b[1])*(a[1]-b[1]);
394  }
400  inline static tFFTWReal norm(const tFFTWComplex& a,const tFFTWComplex& b) {
401 
402  return sqrt(norm2(a,b));
403  }
404 
405 
406 
410  virtual tString toString() const {
411  return toString(mValue);
412  }
417  inline static tString toString(const tFFTWComplex& f) {
418  tString ret="";
419  ret+=CORE_Real::toString(f[0]);
420  if (f[1]>0) {
421  ret+="+"+CORE_Real::toString(f[1])+"i";
422  } else if (f[1]<0) {
423  ret+=CORE_Real::toString(f[1])+"i";
424  }
425  return ret;
426  }
432  inline static tString toString(const fftw_complex& f,const tUSInt& nDigits) {
433  tString ret="";
434  ret+=CORE_Real::toString(f[0],nDigits);
435  if (f[1]>0) {
436  ret+="+"+CORE_Real::toString(f[1],nDigits)+"i";
437  } else if (f[1]<0) {
438  ret+=CORE_Real::toString(f[1],nDigits)+"i";
439  }
440  return ret;
441  }
442 
443 
444 
445 
446 
447 };
448 
449 
450 #endif
static void sub(tFFTWComplex &a, const tFFTWComplex &b)
Definition: FFTW_Complex.h:364
static void product(const tFFTWReal &a, const tFFTWReal &b, const tFFTWReal &x, const tFFTWReal &y, tFFTWComplex &r)
Definition: FFTW_Complex.h:339
static tFFTWReal norm(const tFFTWComplex &a, const tFFTWComplex &b)
return the norm of the difference
Definition: FFTW_Complex.h:400
tFFTWReal module() const
compute the module of this
Definition: FFTW_Complex.h:268
static void sub(const tFFTWComplex &a, const tFFTWComplex &b, tFFTWComplex &r)
Definition: FFTW_Complex.h:373
FFTW_Complex & operator+=(const FFTW_Complex &s)
add operator
Definition: FFTW_Complex.h:196
static void add(const tFFTWComplex &a, const tFFTWComplex &b, tFFTWComplex &r)
Definition: FFTW_Complex.h:356
FFTW_Complex & operator*=(const tFFTWComplex &s)
multiply operator
Definition: FFTW_Complex.h:161
FFTW_Complex & operator-=(const tFFTWComplex &s)
sub operator
Definition: FFTW_Complex.h:223
static void swap(tFFTWComplex &a, tFFTWComplex &b)
Definition: FFTW_Complex.h:381
virtual ~FFTW_Complex(void)
destroy an FFT complex array
Definition: FFTW_Complex.h:68
This class describes complex based on fftw_complex structure.
Definition: FFTW_Complex.h:18
static tFFTWReal module2(const tFFTWComplex &f)
compute the square of module of f
Definition: FFTW_Complex.h:275
static tString toString(const fftw_complex &f, const tUSInt &nDigits)
return the string representation of the complex f
Definition: FFTW_Complex.h:432
static void product(const FFTW_Complex &a, const FFTW_Complex &b, FFTW_Complex &r)
Definition: FFTW_Complex.h:329
#define tUSInt
Definition: types.h:28
FFTW_Complex & operator=(const tFFTWReal &s)
copy the real
Definition: FFTW_Complex.h:131
#define tFFTWComplex
Definition: fftw_types.h:65
tFFTWComplex mValue
Definition: FFTW_Complex.h:25
void setValue(const tFFTWReal &x, const tFFTWReal &y)
set the value at index
Definition: FFTW_Complex.h:234
FFTW_Complex & operator/=(const FFTW_Complex &s)
divide operator
Definition: FFTW_Complex.h:182
FFTW_Complex & operator*=(const tFFTWReal &s)
multiply operator
Definition: FFTW_Complex.h:141
DEFINE_SPTR(FFTW_Complex)
static SP::FFTW_Complex New()
return a FFTW_Complex shared pointer
Definition: FFTW_Complex.h:83
FFTW_Complex & operator*=(const FFTW_Complex &s)
multiply operator
Definition: FFTW_Complex.h:150
static void product(tFFTWComplex &a, const tFFTWComplex &b)
Definition: FFTW_Complex.h:290
tFFTWReal mWork
Definition: FFTW_Complex.h:28
FFTW_Complex(void)
create a FFT complex
Definition: FFTW_Complex.h:38
static tString toString(const tFFTWComplex &f)
return the string representation of the complex f
Definition: FFTW_Complex.h:417
this class describes the exceptions raised for CORE package
Definition: CORE_Exception.h:15
FFTW_Complex & operator=(const tFFTWComplex &s)
copy the complex
Definition: FFTW_Complex.h:121
This class is the base class of FFTW objects.
Definition: FFTW_Object.h:19
static tFFTWReal module(const tFFTWComplex &f)
compute the module of f
Definition: FFTW_Complex.h:282
tFFTWReal module2() const
compute the square of module of this
Definition: FFTW_Complex.h:262
static void product(const tFFTWComplex &a, const tFFTWComplex &b, tFFTWComplex &r)
Definition: FFTW_Complex.h:318
void conjugate()
conjugate the complex
Definition: FFTW_Complex.h:256
#define tString
Definition: types.h:135
FFTW_Complex & operator+=(const tFFTWComplex &s)
add operator
Definition: FFTW_Complex.h:205
FFTW_Complex(const tFFTWComplex &f)
create a FFT complex
Definition: FFTW_Complex.h:53
const tFFTWReal & operator[](const tUSInt &i) const
get the value for reading only
Definition: FFTW_Complex.h:104
static void add(tFFTWComplex &a, const tFFTWComplex &b)
Definition: FFTW_Complex.h:347
tString toString() const
return the string associated to the real
Definition: CORE_Real.h:97
SP_OBJECT(FFTW_Complex)
FFTW_Complex & operator/=(const tFFTWReal &s)
divide operator
Definition: FFTW_Complex.h:172
FFTW_Complex & operator-=(const FFTW_Complex &s)
sub operator
Definition: FFTW_Complex.h:214
FFTW_Complex(const FFTW_Complex &f)
create a copy FFT complex
Definition: FFTW_Complex.h:60
#define tFFTWReal
Definition: fftw_types.h:66
tFFTWReal & operator[](const tUSInt &i)
get the value for reading & writing
Definition: FFTW_Complex.h:97
static void product(const tFFTWComplex &a, const tFFTWComplex &b, tFFTWComplex &r, tFFTWReal &wrk)
Definition: FFTW_Complex.h:308
static tFFTWReal norm2(const tFFTWComplex &a, const tFFTWComplex &b)
return the norm of the difference
Definition: FFTW_Complex.h:391
FFTW_Complex(const tFFTWReal &a, const tFFTWReal &b)
create a FFT complex
Definition: FFTW_Complex.h:46
#define ASSERT_IN(a)
Definition: types.h:196
FFTW_Complex & operator=(const FFTW_Complex &s)
copy the complex
Definition: FFTW_Complex.h:112
const tFFTWComplex & getValue() const
get values for reading only
Definition: FFTW_Complex.h:244
virtual tString toString() const
return the string repesentation of this
Definition: FFTW_Complex.h:410
static void product(tFFTWComplex &a, const tFFTWComplex &b, tFFTWReal &wrk)
Definition: FFTW_Complex.h:298
tFFTWComplex & getValue()
get values for reading or writing
Definition: FFTW_Complex.h:250
class Free introduced for deleting a smart pointer
Definition: CORE_Object.h:141