WPOCT Software Developer's Kit (SDK)
SDK For using Wasatch Photonics OCT Spectrometers
Statistics.h
Go to the documentation of this file.
1 
10 #ifndef Statistics_HPP
11 #define Statistics_HPP
12 
13 // common header
14 #include <vector>
15 #include <stdio.h>
16 
17 #include "Helper.h"
18 
19 #ifdef ARRAYFIRE
20 
29 #define NOMINMAX
30 #include <arrayfire.h>
31 #include <af/util.h>
32 
33 #endif
34 
35 // what about Boost.compute? in Boost 1.61 not yet using newest version of boost...
36 
41 {
42 public:
43  template <typename T>
44  static float variance(int start, int offset, const T *in, int len)
45  {
46  double n = len;
47  double xbar = 0;
48  double _var = 0;
49 
50 #ifdef ARRAYFIRE
51  if (true)
52  {
53  doInitArrayFire();
54  af::array a_in = af::array(len, (in + start + offset));
55 
56  _var = af::var<double>(a_in, false);
57  return (float)_var;
58  }
59 #endif
60 
61  for (int i4 = start + offset; i4 < len + start; i4++)
62  {
63  xbar += *(in + i4) / n;
64  }
65 
66  for (int i4 = start + offset; i4 < len + start; i4++)
67  {
68  _var += (*(in + i4) - xbar) *(*(in + i4) - xbar);
69  }
70 
71  _var = _var / (n - 1.0);
72 
73  return (float)_var;
74  }
75 
76  // not used?
77  template <typename T>
78  static void histogramIt(const T *data_in, int len, int num_bins, T _min, T *&data_out)
79  {
80 #ifdef ARRAYFIRE
81  if (true)
82  {
83  doInitArrayFire();
84  af::array hist_in = af::array(len, data_in);
85  af::array hist_out = histogram(hist_in, num_bins, _min, 65530);
86  hist_out.host(data_out);
87  }
88 #endif
89  }
90 
91  template<typename T>
92  static void saveHistogramToFile(const T *out_data, int len) {}
93 
94  template<typename T>
95  static void cdfIt(const T *in_data, int len, int num_bins, float _min, T *&cdf_out) {}
96 
101  template< typename T, typename F>
102  static void minMaxData(const T *data_out, int width, int height, F &minVal, F &maxVal, int trim = 0)
103  {
104  int image_size = width * height;
105  maxVal = 0;
106  minVal = 65530;
107  T myMax, myMin;
108  myMax = 0;
109  myMin = 65535;
110 
111 #ifdef ARRAYFIRE
112  af::array a_in = af::array(image_size, data_out);
113  unsigned uIdx;
114 
115  af::min(&myMin, &uIdx, a_in);
116 
117  // want to use mask to eliminate all of the values before trim, i.e. first 10 rows
118  if (trim > 0)
119  {
120  doSetTrimMaskArray(trim, width, height);
121  af::max(&myMax, &uIdx, a_in*trimMaskArray);
122  }
123  else
124  {
125  af::max(&myMax, &uIdx, a_in);
126  }
127 #else
128 
129  // find range of values in out_data
130  T val;
131  for (int row = 0; row < height; row++)
132  {
133  for (int col = 0; col < width; col++)
134  {
135  // ignore first few lines
136  //if(!isZeroPad)
137  if (col >= trim)
138  {
139  val = *(data_out + row * width + col);
140  if (val > myMax)
141  {
142  myMax = val;
143  }
144  else if (val < myMin)
145  {
146  myMin = val;
147  }
148  }
149  }
150  }
151 #endif
152  minVal = static_cast<F>(myMin);
153  maxVal = static_cast<F>(myMax);
154  }
155 
159  template< typename T, typename F>
160  static void minMaxData(std::vector<T> *data_out, int w, int h, F &minVal, F &maxVal, int trim = 0)
161  {
162  return minMaxData(data_out->data(), w, h, minVal, maxVal, trim);
163  }
164 
168  template< typename T>
169  static void minMaxData(const T *data_in, int len, T &maxVal, T &minVal)
170  {
171  maxVal = 0;
172  minVal = 65535;
173 #ifdef ARRAYFIRE
174  doInitArrayFire();
175  af::array a_in = af::array(len, data_in);
176  unsigned uIdx;
177  T myMax, myMin;
178  af::min(&myMin, &uIdx, a_in);
179  af::max(&myMax, &uIdx, a_in);
180  minVal = myMin;
181  maxVal = myMax;
182 #else
183  // find range of values in out_data
184  for (int i = 0; i < len; i++)
185  {
186  T val = *(data_in + i);
187  if (val > maxVal)
188  {
189  maxVal = val;
190  }
191  else if (val < minVal)
192  {
193  minVal = val;
194  }
195  }
196 #endif
197  }
198 
199  static void minMaxDataTrim(const unsigned short *data_out, int w, int h, int trim, double &minVal, double &maxVal);
200  static void minMaxDataAvg(const unsigned short *data_out, int w, int h, int trim, double &minVal, double &maxVal);
201 
202  template< typename T, typename F>
203  static void avgMatrixToLine(const T* in, int startRow, int stopRow, int w, F *&out)
204  {
205  double n = (double)(stopRow - startRow);
206  for (int row = startRow; row < stopRow; row++)
207  {
208  for (int col = 0; col < w; col++)
209  {
210  if (row == startRow)
211  {
212  *(out + col) = 0;
213  }
214  *(out + col) += static_cast<F>(*(in + row * w + col) / n);
215  }
216  }
217  }
218 
219  static void movingFilterLine(float *&in, int len, int filter);
220  static void movingFilterLine(const float *in, int len, int filter, float *&out);
221  static void gradientLine(float *&in, int len);
222  static void gradientLine(const float *in, int len, float *&out);
223  static void filterVector(std::vector<float> *sumOfVar);
224 
225  template< typename T>
226  static T localMaxVal(std::vector<T> *in, int &myMaxIndex)
227  {
228  T myMax = 0;
229  int len = (int)in->size();
230  myMaxIndex = len / 2;
231  return localMaxVal(in->data(), len, myMaxIndex);
232  }
233 
238  template<typename T>
239  static T localMaxVal(const T* in, int len, int &myMaxIndex)
240  {
241  T myMax = 0;
242  myMaxIndex = len / 2;
243 
244 #ifdef ARRAYFIRE
245  if (false)
246  {
247  doInitArrayFire();
248  af::array a_in = af::array(len, in);
249 
250  unsigned uIdx;
251  af::max(&myMax, &uIdx, a_in);
252  myMaxIndex = uIdx;
253  }
254 #endif
255  for (int i = 1; i < len - 1; i++)
256  {
257  T val = *(in + i);
258  T diff1 = val - *(in + i - 1);
259  T diff2 = *(in + i + 1) - val;
260 
261  // look for sign change
262  bool a = diff1 / std::abs(diff1) != diff2 / std::abs(diff2);
263  if ((val > myMax) && a)
264  {
265  myMax = val;
266  myMaxIndex = i;
267  }
268  //if(a && t) smessage(" candidate "+i2S(myMax)+" at "+i2S(myMaxIndex) );
269  }
270  //smessage(" myMax= "+i2S(myMax)+" at "+i2S(myMaxIndex) );
271 
272  return myMax;
273  }
274 
275  template<typename T>
276  static T maxVal(std::vector<T> *in, int &myMaxIndex)
277  {
278  T myMax = 0;
279  int len = (int)in->size();
280 
281  float myMax = 0;
282  myMaxIndex = len / 2;
283 
284 #ifdef ARRAYFIRE
285  doInitArrayFire();
286  array a_in = array(len, in);
287  unsigned uIdx;
288  max<T>(&myMax, &uIdx, a_in);
289  myMaxIndex = uIdx;
290  return myMax;
291 #endif
292 
293  for (int i4 = 0; i4 < len; i4++)
294  {
295  if ((*in)[i4] > myMax)
296  {
297  myMax = (*in)[i4];
298  myMaxIndex = i4;
299  }
300  }
301 
302  return myMax;
303  }
304 
305  static bool isOscilating(float *&in, int len, int posGradLimit);
306 
307 protected:
308 
309  static bool isVerbose;
310  static bool initArrayFire;
311  static void doInitArrayFire();
312  static void doSetTrimMaskArray(int trimVal, int w, int h);
313 
314 #ifdef ARRAYFIRE
315 
316  static af::array trimMaskArray;
317  static int trim_val;
318  static int mask_width;
319  static int mask_height;
320 
321 #endif
322 };
323 #endif
Utility template functions.
Helper class to perform basic statistics.
Definition: Statistics.h:41
static void minMaxData(const T *data_in, int len, T &maxVal, T &minVal)
this is just a standard max-min.
Definition: Statistics.h:169
static T localMaxVal(const T *in, int len, int &myMaxIndex)
This is looking for a local max.
Definition: Statistics.h:239
static void minMaxData(const T *data_out, int width, int height, F &minVal, F &maxVal, int trim=0)
Determine the max and min values for a matrix (image) and trim the top - this is needed to ignore the...
Definition: Statistics.h:102
static void minMaxData(std::vector< T > *data_out, int w, int h, F &minVal, F &maxVal, int trim=0)
Same as above but with data in an array.
Definition: Statistics.h:160