CWO++library  0.32
 All Classes Functions Variables Groups
gwo.h
1 // Copyright (C) Tomoyoshi Shimobaba 2011-
2 
3 
4 #ifndef _GWO_H
5 #define _GWO_H
6 
7 #include "cwo.h"
8 #include "cwoCu.h"
9 #include "gwo_lib.h"
10 
11 #include <string>
12 #include <assert.h>
13 
14 //#ifndef _GWO_LIB_H
15 //#define _GWO_LIB_H
16 //#include "gwo_lib.h"
17 
18 class GWO : public CWO
19 {
20  int stream_mode;
21  float *p_rnd;
22 
23 public:
24  //cwoStream cstream;
25  gwoCtx gtx;
26 
27  GWO();
28  ~GWO();
29 
30  GWO(GWO &tmp);
31  GWO(int Nx, int Ny);
32 
33 #ifdef __NOW_DEBUGGIBNG_OPERATOR
34  template<class T> friend GWO operator+(GWO& const lhs, T& const rhs){ printf("ope1 + \n"); GWO nrv = lhs; nrv += rhs; return nrv; };
35  template<class T> friend GWO&& operator+(GWO&& lhs, T& const rhs){ printf("ope2 + \n"); lhs += rhs; return std::move(lhs); };
36  template<class T> friend GWO&& operator+(const GWO& lhs, T&& rhs){ printf("ope3 + \n"); rhs += lhs; return std::move(rhs); };
37  template<class T> friend GWO&& operator+(GWO&& lhs, T&& rhs){ printf("ope4 + \n"); lhs += std::move(rhs); return std::move(lhs); };
38 
39  template<class T> friend GWO operator-(GWO& const lhs, T& const rhs){ printf("ope1 - \n"); GWO nrv = lhs; nrv -= rhs; return nrv; };
40  template<class T> friend GWO&& operator-(GWO&& lhs, T& const rhs){ printf("ope2 - \n"); lhs -= rhs; return std::move(lhs); };
41  template<class T> friend GWO&& operator-(const T& lhs, GWO&& rhs){ printf("ope3 - \n"); rhs -= lhs; return std::move(rhs); };
42  template<class T> friend GWO&& operator-(GWO&& lhs, T&& rhs){ printf("ope4 - \n"); lhs -= std::move(rhs); return std::move(lhs); };
43 
44  template<class T> friend GWO operator*(GWO& const lhs, T& const rhs){ printf("ope1 * \n"); GWO nrv = lhs; nrv *= rhs; return nrv; };
45  template<class T> friend GWO&& operator*(GWO&& lhs, T& const rhs){ printf("ope2 * \n"); lhs *= rhs; return std::move(lhs); };
46  template<class T> friend GWO&& operator*(const T& lhs, GWO&& rhs){ printf("ope3 * \n"); rhs *= lhs; return std::move(rhs); };
47  template<class T> friend GWO&& operator*(GWO&& lhs, T&& rhs){ printf("ope4 * \n"); lhs *= std::move(rhs); return std::move(lhs); };
48 
49  template<class T> friend GWO operator/(GWO& const lhs, T& const rhs){ printf("ope1 / \n"); GWO nrv = lhs; nrv /= rhs; return nrv; };
50  template<class T> friend GWO&& operator/(GWO&& lhs, T& const rhs){ printf("ope2 / \n"); lhs /= rhs; return std::move(lhs); };
51  template<class T> friend GWO&& operator/(const T& lhs, GWO&& rhs){ printf("ope3 / \n"); rhs /= lhs; return std::move(rhs); };
52  template<class T> friend GWO&& operator/(GWO&& lhs, T&& rhs){ printf("ope4 / \n"); lhs /= std::move(rhs); return std::move(lhs); };
53 #endif
54 
55  GWO& operator=(GWO& tmp)
56  {
57  size_t size = tmp.GetMemSizeCplx();
58 
59  assert(tmp.GetBuffer() != nullptr);
60 
61  if (GetNx() != tmp.GetNx() || GetNy() != tmp.GetNy() || GetBuffer() == nullptr) {
62  SetSize(tmp.GetNx(), tmp.GetNy());
63  __Free((void**)&p_field);
64  p_field = __Malloc(size);
65  assert(p_field != nullptr);
66  }
67  else {
68  SetSize(tmp.GetNx(), tmp.GetNy());
69  }
70  __Memcpy(GetBuffer(), tmp.GetBuffer(), size);
71 
72  ctx = tmp.ctx; //copy context
73 
74  return *this;
75  }
76 
77  GWO& operator=(float a)
78  {
79  cwoComplex tmp;
80  CWO_RE(tmp) = a;
81  CWO_IM(tmp) = 0.0f;
82  Fill(tmp);
83  return *this;
84  }
85 
86  GWO& operator=(const cwoComplex &a)
87  {
88  Fill(a);
89  return *this;
90  }
91 
92  template<class T = GWO> T operator+(T &a) {
93  T tmp;
94  tmp.Create(GetNx(), GetNy());
95  assert(tmp.GetBuffer() != nullptr);
96  (tmp).ctx = ctx;
97  __Add(GetBuffer(), a.GetBuffer(), tmp.GetBuffer());
98  return tmp;
99  }
100  template<class T = GWO> T operator+(float a) {
101  T tmp;
102  tmp.Create(GetNx(), GetNy());
103  assert(tmp.GetBuffer() != nullptr);
104  (tmp).ctx = ctx;
105  cwoComplex cplx;
106  CWO_RE(cplx) = a; CWO_IM(cplx) = 0.0f;
107  __Add(GetBuffer(), cplx, tmp.GetBuffer());
108  return tmp;
109  }
110  template<class T = GWO> T operator+(const cwoComplex &a) {
111  T tmp;
112  tmp.Create(GetNx(), GetNy());
113  assert(tmp.GetBuffer() != nullptr);
114  (tmp).ctx = ctx;
115  __Add(GetBuffer(), a, tmp.GetBuffer());
116  return (tmp);
117  }
118  template<class T> friend GWO operator+(const T &a, GWO& c) { GWO tmp = c; tmp += a; return tmp; };
119 
120  template<class T = GWO> T operator-(T &a) {
121  T tmp;
122  tmp.Create(GetNx(), GetNy());
123  assert(tmp.GetBuffer() != nullptr);
124  (tmp).ctx = ctx;
125  __Sub(GetBuffer(), a.GetBuffer(), tmp.GetBuffer());
126  return tmp;
127  }
128  template<class T = GWO> T operator-(float a) {
129  T tmp;
130  tmp.Create(GetNx(), GetNy());
131  assert(tmp.GetBuffer() != nullptr);
132  (tmp).ctx = ctx;
133  cwoComplex cplx;
134  CWO_RE(cplx) = a; CWO_IM(cplx) = 0.0f;
135  __Sub(GetBuffer(), cplx, tmp.GetBuffer());
136  return tmp;
137  }
138  template<class T = GWO> T operator-(const cwoComplex &a) {
139  T tmp;
140  tmp.Create(GetNx(), GetNy());
141  assert(tmp.GetBuffer() != nullptr);
142  (tmp).ctx = ctx;
143  __Sub(GetBuffer(), a, tmp.GetBuffer());
144  return (tmp);
145  }
146  template<class T> friend GWO operator-(const T &a, GWO& c) { GWO tmp(c.GetNx(), c.GetNy()); tmp = a; tmp -= c; return tmp; };
147 
148  template<class T = GWO> T operator*(T &a) {
149  T tmp;
150  tmp.Create(GetNx(), GetNy());
151  assert(tmp.GetBuffer() != nullptr);
152  (tmp).ctx = ctx;
153  __Mul(GetBuffer(), a.GetBuffer(), tmp.GetBuffer());
154  return tmp;
155  }
156  template<class T = GWO> T operator*(float a) {
157  T tmp;
158  tmp.Create(GetNx(), GetNy());
159  assert(tmp.GetBuffer() != nullptr);
160  (tmp).ctx = ctx;
161  cwoComplex cplx;
162  CWO_RE(cplx) = a; CWO_IM(cplx) = 0.0f;
163  __Mul(GetBuffer(), cplx, tmp.GetBuffer());
164  return tmp;
165  }
166  template<class T = GWO> T operator*(const cwoComplex &a) {
167  T tmp;
168  tmp.Create(GetNx(), GetNy());
169  assert(tmp.GetBuffer() != nullptr);
170  (tmp).ctx = ctx;
171  __Mul(GetBuffer(), a, tmp.GetBuffer());
172  return (tmp);
173  }
174  template<class T> friend GWO operator*(const T &a, GWO& c) { GWO tmp = c; tmp *= a; return tmp; };
175 
176  template<class T = GWO> T operator/(T &a) {
177  T tmp;
178  tmp.Create(GetNx(), GetNy());
179  assert(tmp.GetBuffer() != nullptr);
180  (tmp).ctx = ctx;
181  __Div(GetBuffer(), a.GetBuffer(), tmp.GetBuffer());
182  return tmp;
183  }
184  template<class T = GWO> T operator/(float a) {
185  T tmp;
186  tmp.Create(GetNx(), GetNy());
187  assert(tmp.GetBuffer() != nullptr);
188  (tmp).ctx = ctx;
189  cwoComplex cplx;
190  CWO_RE(cplx) = a; CWO_IM(cplx) = 0.0f;
191  __Div(GetBuffer(), cplx, tmp.GetBuffer());
192  return tmp;
193  }
194  template<class T = GWO> T operator/(const cwoComplex &a) {
195  T tmp;
196  tmp.Create(GetNx(), GetNy());
197  assert(tmp.GetBuffer() != nullptr);
198  (tmp).ctx = ctx;
199  __Div(GetBuffer(), a, tmp.GetBuffer());
200  return (tmp);
201  }
202  template<class T> friend GWO operator/(const T &a, GWO& c) {
203  GWO tmp;
204  tmp.Create(c.GetNx(), c.GetNy());
205  assert(tmp.GetBuffer() != nullptr);
206  (tmp).ctx = c.ctx;
207  c.__Rep(c.GetBuffer(), a, tmp.GetBuffer());
208  return tmp;
209  };
210 
211  //CWO& operator=(float a) { return *this; }
212 
213  //GWO(GWO&& a) {//!< move constructor
214  // *this = std::move(a);
215  //}
216 
217  //GWO& operator=(GWO&& a) {//!< move constructor
218  // if (p_field) {
219  // delete p_field;
220  // }
221  // p_field = a.p_field;
222  // a.p_field = nullptr;
223  // return *this;
224  //}
225 
226 
227  /*friend GWO operator+(GWO& const lhs, GWO& const rhs)
228  {
229  printf("gpu ope 1\n");
230  GWO nrv;
231  nrv = lhs;
232  nrv += rhs;
233  return nrv;
234  }
235 
236  friend GWO&& operator+(GWO&& lhs, GWO& const rhs)
237  {
238  printf("gpu ope 2\n");
239  lhs += rhs;
240  return std::move(lhs);
241  }
242 
243  friend CWO&& operator+(GWO& const lhs, GWO&& rhs)
244  {
245  printf("gpu ope 3\n");
246  rhs += lhs;
247  return std::move(rhs);
248  }
249 
250  friend GWO&& operator+(GWO&& lhs, GWO&& rhs)
251  {
252  printf("gpu ope 4\n");
253  lhs += std::move(rhs);
254  return std::move(lhs);
255  }
256 
257 
258  friend GWO operator-(GWO& const lhs, GWO& const rhs)
259  {
260  printf("gpu ope 1\n");
261  GWO nrv;
262  nrv = lhs;
263  nrv -= rhs;
264  return nrv;
265  }
266 
267  friend GWO&& operator-(GWO&& lhs, GWO& const rhs)
268  {
269  printf("gpu ope 2\n");
270  lhs -= rhs;
271  return std::move(lhs);
272  }
273 
274  friend CWO&& operator-(GWO& const lhs, GWO&& rhs)
275  {
276  printf("gpu ope 3\n");
277  rhs -= lhs;
278  return std::move(rhs);
279  }
280 
281  friend GWO&& operator-(GWO&& lhs, GWO&& rhs)
282  {
283  printf("gpu ope 4\n");
284  lhs -= std::move(rhs);
285  return std::move(lhs);
286  }*/
287 
288  void SetDev(int dev);
289  void SetThreads(int Nx, int Ny);
290  int GetThreadsX();
291  int GetThreadsY();
292 
293  //void Create(int dev, int Nx, int Ny);
294  //int Create(int Nx, int Ny=1, int Nz=1);
295  void Delete();
296 
297  void Send(CWO &a);
298  void Recv(CWO &a);
299 
300  void CreateStream();
301  cwoStream GetStream();
302  void DestroyStream();
303  void SyncStream();
304 
305 /* void SetMemcpyFlag(int i=0);
306  int GetMemcpyFlag();
307  void SetPagelockFlag(int i=0);
308  int GetPagelockFlag();
309 */ void SetStreamMode(int mode);
310  int GetStreamMode();
311 
312  int Load(const std::string& fname, int c=CWO_GREY);
313  int Load(const std::string& fname_amp, const std::string& fname_pha, int c = CWO_GREY);
314  int Save(const std::string& fname, int bmp_8_24 = 24);
315  int Save(const std::string& fname, CWO *r, CWO *g = nullptr, CWO *b = nullptr);
316  //int SaveMonosToColor(char* fname, char *r_name, char *g_name, char *b_name);
317  int SaveAsImage(const std::string& fname, float i1, float i2, float o1, float o2, int flag = CWO_SAVE_AS_RE);
318  int SaveAsImage(const std::string& fname, int flag = CWO_SAVE_AS_RE, CWO *r = nullptr, CWO *g = nullptr, CWO *b = nullptr);
319  int SaveAsImage(cwoComplex *p, int Nx, int Ny, const std::string& fname, int flag = CWO_SAVE_AS_RE, int bmp_8_24 = 24);
320 
321 public:
322  void* __Malloc(size_t size);
323  void __Free(void **a);
324  void __Memcpy(void *dst, void *src, size_t size);
325  void __Memset(void *p, int c, size_t size);
326 
327  void Fill(cwoComplex pix);
328 
329  /*void __Expand(void *src, int srcNx, int srcNy,
330  void *dst, int dstNx, int dstNy, int type);*/
331  void __Expand(
332  void *src, int sx, int sy, int srcNx, int srcNy,
333  void *dst, int dx, int dy, int dstNx, int dstNy,
334  int type);
335 
336 
337  void __ShiftedFresnelAperture(cwoComplex *a);
338  void __ShiftedFresnelProp(cwoComplex *a);
339  void __ShiftedFresnelCoeff(cwoComplex *a);
340 
341  void __ARSSFresnelAperture(cwoComplex *a);
342  void __ARSSFresnelProp(cwoComplex *a);
343  void __ARSSFresnelCoeff(cwoComplex *a);
344 
345  void __FresnelConvProp(cwoComplex *a);
346  void __FresnelConvCoeff(cwoComplex *a, float const_val=1.0f);
347 
348  void __AngularProp(cwoComplex *a, int flag);
349  //void __ShiftedAngularProp(cwoComplex *a);
350 
351  void __HuygensProp(cwoComplex *a);
352 // void __HuygensCoeff(cwoComplex *a);
353 
354  void __FresnelFourierProp(cwoComplex *a);
355  void __FresnelFourierCoeff(cwoComplex *a);
356 
357  void __FresnelDblAperture(cwoComplex *a, float z1);
358  void __FresnelDblFourierDomain(cwoComplex *a, float z1, float z2, cwoInt4 *zp);
359  void __FresnelDblCoeff(cwoComplex *a, float z1, float z2);
360 
361  void __FFT(void *src, void *dst, int type);
362  void __IFFT(void *src, void *dst);
363  void __FFTShift(void *src);
364 
365  void __NUFFT_T1(cwoComplex *p_fld, cwoFloat2 *p_x, int R=2, int Msp=12);
366  void __NUFFT_T2(cwoComplex *p_fld, cwoFloat2 *p_x, int R=2, int Msp=12);
367 
368  void __Add(cwoComplex *a, const cwoComplex &b, cwoComplex *c);//c=a+b
369  void __Add(cwoComplex *a, cwoComplex *b, cwoComplex *c);//c=a+b
370  void __Sub(cwoComplex *a, const cwoComplex &b, cwoComplex *c);//c=a-b
371  void __Sub(cwoComplex *a, cwoComplex *b, cwoComplex *c);//c=a-b
372  void __Mul(cwoComplex *a, const cwoComplex &b, cwoComplex *c);//c=a*b
373  void __Mul(cwoComplex *a, cwoComplex *b, cwoComplex *c);//c=a*b
374  void __Div(cwoComplex *a, const cwoComplex &b, cwoComplex *c);//c=a/b
375  void __Div(cwoComplex *a, cwoComplex *b, cwoComplex *c);//c=a/b
376  void __Rep(cwoComplex *a, float b, cwoComplex *c);//Reciprocal number c=b/a
377  void __Rep(cwoComplex *a, const cwoComplex &b, cwoComplex *c);//Reciprocal number c=b/a
378  void __Rep(cwoComplex *a, cwoComplex *b, cwoComplex *c);//Reciprocal number c=b/a
379 
380  void __AddSphericalWave(cwoComplex *p, float x, float y, float z, float px, float py, float a);
381  void __MulSphericalWave(cwoComplex *p, float x, float y, float z, float px, float py, float a);
382  void __AddApproxSphWave(cwoComplex *p, float x, float y, float z, float zx, float zy, float px, float py, float a);
383  void __MulApproxSphWave(cwoComplex *p, float x, float y, float z, float zx, float zy, float px, float py, float a);
384 
385  void __Re(cwoComplex*a , cwoComplex *b);
386  void __Im(cwoComplex*a , cwoComplex *b);
387  void __Intensity(cwoComplex*a , cwoComplex *b);
388  void __Amp(cwoComplex*a , cwoComplex *b);
389  void __Phase(cwoComplex*a , cwoComplex *b, float offset);
390  void __Arg(cwoComplex *a , cwoComplex *b, float scale, float offset);
391  void __Real2Complex(float *src, cwoComplex *dst);
392  void __Phase2Complex(float *src, cwoComplex *dst);
393  void __Arg2Cplx(cwoComplex *src, cwoComplex *dst, float scale, float offset);
394  void __Polar(float *amp, float *ph, cwoComplex *c);
395  void __ReIm(cwoComplex *re, cwoComplex *im, cwoComplex *c);
396  // void __Gamma(float *src, float gamma);
397  void __RectFillInside(cwoComplex *p, int x, int y, int Sx, int Sy, cwoComplex a);
398  void __RectFillOutside(cwoComplex *p, int x, int y, int Sx, int Sy, cwoComplex a);
399 
400  void __CircFillInside(cwoComplex *p, int m, int n, int r, const cwoComplex a);
401  void __CircFillOutside(cwoComplex *p, int m, int n, int r, const cwoComplex a);
402 
403  void __FloatToChar(char *dst, float *src, int N);
404  void __CharToFloat(float *dst, char *src, int N);
405 
406  void __Copy(
407  cwoComplex *src, int x1, int y1, int sNx, int sNy,
408  cwoComplex *dst, int x2, int y2, int dNx, int dNy,
409  int Sx, int Sy);
410 
411  void FFTShift();
412 
413  void SqrtReal();
414  void SqrtCplx();
415 
416  void Log(float base = 10.0f, float eps = 1.0f);
417  void Gamma(float g);
418  void Threshold(float max, float min=0.0);
419  void __PickupFloat(float *src, float *pix_p, float pix);
420  void __PickupCplx(cwoComplex *src, cwoComplex *pix_p, float pix);
421  void Binary(float th = 0.0, float max = 1.0, float min = 0.0);
422 
423 
424  float Average();
425  float Variance();
426 
427 
428  void SetRandSeed(long long s);
429  void RandReal(float max = 1.0f, float min = 0.0f);
430  void __RandPhase(cwoComplex *a, float max, float min);
431  void __MulRandPhase(cwoComplex *a, float max, float min);
432 
433 
434  void __WindowFlatCos(cwoComplex *p, int L, int L0, float k);
435 
436 
437  void __MaxMin(cwoComplex *a, float *max, float *min, int *max_x = nullptr, int *max_y = nullptr, int *min_x = nullptr, int *min_y = nullptr);
438 
440 
441 
442 
443  int __ScaleReal(float i1, float i2, float o1, float o2);
444  int __ScaleCplx(float i1, float i2, float o1, float o2);
445 
446 
447  void __ResizeNearest(
448  cwoComplex *p_new, int dNx, int dNy, cwoComplex *p_old, int sNx, int sNy);
449  void __ResizeLinear(
450  cwoComplex *p_new, int dNx, int dNy, cwoComplex *p_old, int sNx, int sNy);
451  void __ResizeCubic(
452  cwoComplex *p_new, int dNx, int dNy, cwoComplex *p_old, int sNx, int sNy);
453  void __ResizeLanczos(
454  cwoComplex *p_new, int dNx, int dNy, cwoComplex *p_old, int sNx, int sNy);
455 
456 
457  void __ResizeNearestScale(cwoComplex *p_src, cwoComplex *p_dst, float scale_x, float scale_y);
458  void __ResizeLinearScale(cwoComplex *p_src, cwoComplex *p_dst, float scale_x, float scale_y);
459  void __ResizeCubicScale(cwoComplex *p_src, cwoComplex *p_dst, float scale_x, float scale_y);
460  void __ResizeLanczosScale(cwoComplex *p_src, cwoComplex *p_dst, float scale_x, float scale_y);
461 
462 
463  void AffineAngularSpectrum(float *mat_affine, float px, float py, int flag);
464 
465 
466 
467  void ErrorDiffusion(CWO *a = nullptr, int flag = CWO_ED_FS);
468  void ErrorDiffusionSegmented(CWO *a = nullptr, int flag = CWO_ED_FS);
469 
470  float MSE(CWO &ref);
471 
472 
474 //Test code
476 virtual void __ArbitFresnelDirect(
477  cwoComplex *p1, cwoComplex *p2,
478  cwoFloat2 *p_x1, cwoFloat2 *p_x2,
479  float *p_d1, float *p_d2);
480 
481 virtual void __ArbitFresnelCoeff(
482  cwoComplex *p, cwoFloat2 *p_x2, float *p_d2);
483 
484 
485 
486 };
487 
488 
489 #endif