The VisAO Camera
rmsAccumulator.h
1 
2 
3 #ifndef __rmsAccumulator_h__
4 #define __rmsAccumulator_h__
5 
6 #include <iostream>
7 #include <vector>
8 #include <cmath>
9 
10 template<class floatT>
12 {
13 public:
14  std::vector<std::vector<floatT> > values;
15  std::vector<floatT> means;
16  std::vector<floatT> rmss;
17 
18  int length;
19  int nStreams;
20 
21  void resize(int nstr, int len);
22 
23  int currVal;
24 
25  floatT minLim;
26  floatT maxLim;
27 
28  void addValues(std::vector<floatT> newVals);
29 
30 
31  void addValues(floatT * newVals);
32 
33  void calcMeans();
34 
35  void calcRmss();
36 
37 };
38 
39 template<typename floatT>
40 void rmsAccumulator<floatT>::resize(int nstr, int len)
41 {
42  nStreams = nstr;
43  length=len;
44 
45  values.resize(length);
46 
47  for(int i=0;i<length; ++i)
48  {
49  values[i].resize(nStreams, 0);
50  }
51 
52  means.resize(nStreams,0);
53  rmss.resize(nStreams,0);
54 
55 
56  currVal = 0;
57 }
58 
59 template<typename floatT>
60 void rmsAccumulator<floatT>::addValues(std::vector<floatT> newVals)
61 {
62  if(newVals.size() != values[0].size())
63  {
64  std::cerr << "wrong size\n";
65  return;
66  }
67 
68  values[currVal] = newVals;
69 
70  ++currVal;
71 
72  if(currVal >= values.size()) currVal = 0;
73 
74 }
75 
76 template<typename floatT>
77 void rmsAccumulator<floatT>::addValues(floatT * newVals)
78 {
79  for(int i=0;i<nStreams;++i)
80  values[currVal][i] = newVals[i];
81 
82  ++currVal;
83 
84  if(currVal >= values.size()) currVal = 0;
85 
86 }
87 
88 template<typename floatT>
90 {
91  for(int i=0;i<nStreams;++i)
92  {
93  means[i] = values[currVal][i]/length;
94  }
95 
96  int j = currVal + 1;
97  if(j >= length) j = 0;
98  while(j != currVal)
99  {
100  for(int i=0;i<nStreams;++i)
101  {
102  means[i] += values[j][i]/length;
103  }
104  ++j;
105  if(j >= length) j = 0;
106  }
107 }
108 
109 template<typename floatT>
111 {
112  floatT d;
113  for(int i=0;i<nStreams;++i)
114  {
115  d = values[currVal][i];
116  if(fabs(d) < 1e3)
117  rmss[i] = (d*d)/length;
118  else
119  rmss[i] = 0;
120  }
121 
122  int j = currVal + 1;
123  if(j >= length) j = 0;
124  while(j != currVal)
125  {
126 
127  for(int i=0;i<nStreams;++i)
128  {
129  d = values[j][i];
130  if(fabs(d)<1e3)
131  rmss[i] += (d*d)/length;
132  }
133  ++j;
134  if(j >= length) j = 0;
135  }
136 }
137 
138 #endif //__rmsAccumulator_h__