17 template<
class VT,
class IT>
23 : maxgrubbs_(maxgrubbs) {}
25 inline bool hasSpike(
const VT*,IT sz)
const;
27 inline bool deSpike(VT*,IT sz)
const;
31 inline IT getSpikeIdx(
const VT*,IT sz,VT* newvalptr=0)
const;
40 template <
class VT,
class IT>
47 VT maxval = vals[0]; VT minval = maxval, sum = maxval;
48 IT minidx = 0, maxidx = 0;
49 for ( IT isamp=1; isamp<sz; isamp++ )
51 const VT val = vals[isamp];
53 { maxidx = isamp; maxval = val; }
55 { minidx = isamp; minval = val; }
58 if ( maxval == minval )
61 const VT avg = sum / sz;
63 for ( IT isamp=0; isamp<sz; isamp++ )
65 const VT delta = avg - vals[isamp];
70 const VT diffmin = avg - minval;
71 const VT diffmax = maxval - avg;
72 const bool testingmin = diffmin > diffmax;
73 const VT maxdiff = testingmin ? diffmin : diffmax;
74 const VT grubbsval = maxdiff / stdev;
75 if ( grubbsval < maxgrubbs_ )
78 const IT targetidx = testingmin ? minidx : maxidx;
81 IT previdx = targetidx - 1; IT nextidx = targetidx + 1;
93 template <
class VT,
class IT>
96 return getSpikeIdx( vals, sz ) >= 0;
100 template <
class VT,
class IT>
104 bool hadspikes =
false;
105 for ( IT idx=0; idx<500 ; idx++ )
107 const IT spikeidx = getSpikeIdx( vals, sz, &newval );
112 vals[spikeidx] = newval;