OpendTect  6.6
despiker.h
Go to the documentation of this file.
1 #pragma once
2 
3 /*+
4 ________________________________________________________________________
5 
6  (C) dGB Beheer B.V.; (LICENSE) http://opendtect.org/OpendTect_license.txt
7  Author: Bert
8  Date: March 2017
9 ________________________________________________________________________
10 
11 -*/
12 
13 #include "algomod.h"
14 #include "math2.h"
15 
16 
17 template<class VT,class IT>
19 {
20 public:
21 
22  DeSpiker( VT maxgrubbs=VT(5) )
23  : maxgrubbs_(maxgrubbs) {}
24 
25  inline bool hasSpike(const VT*,IT sz) const;
27  inline bool deSpike(VT*,IT sz) const;
29 
30 
31  inline IT getSpikeIdx(const VT*,IT sz,VT* newvalptr=0) const;
34 
35  const VT maxgrubbs_;
36 
37 };
38 
39 
40 template <class VT,class IT>
41 inline IT DeSpiker<VT,IT>::getSpikeIdx( const VT* vals, IT sz,
42  VT* newvalptr ) const
43 {
44  if ( sz < 5 )
45  return -1;
46 
47  VT maxval = vals[0]; VT minval = maxval, sum = maxval;
48  IT minidx = 0, maxidx = 0;
49  for ( IT isamp=1; isamp<sz; isamp++ )
50  {
51  const VT val = vals[isamp];
52  if ( maxval < val )
53  { maxidx = isamp; maxval = val; }
54  if ( minval > val )
55  { minidx = isamp; minval = val; }
56  sum += val;
57  }
58  if ( maxval == minval )
59  return -1;
60 
61  const VT avg = sum / sz;
62  sum = 0;
63  for ( IT isamp=0; isamp<sz; isamp++ )
64  {
65  const VT delta = avg - vals[isamp];
66  sum += delta * delta;
67  }
68  const VT stdev = Math::Sqrt( sum / sz );
69 
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_ )
76  return -1;
77 
78  const IT targetidx = testingmin ? minidx : maxidx;
79  if ( newvalptr )
80  {
81  IT previdx = targetidx - 1; IT nextidx = targetidx + 1;
82  if ( previdx < 0 )
83  previdx = 1;
84  if ( nextidx >= sz )
85  nextidx = sz-2;
86  *newvalptr = avg;
87  }
88 
89  return targetidx;
90 }
91 
92 
93 template <class VT,class IT>
94 inline bool DeSpiker<VT,IT>::hasSpike( const VT* vals, IT sz ) const
95 {
96  return getSpikeIdx( vals, sz ) >= 0;
97 }
98 
99 
100 template <class VT,class IT>
101 inline bool DeSpiker<VT,IT>::deSpike( VT* vals, IT sz ) const
102 {
103  float newval;
104  bool hadspikes = false;
105  for ( IT idx=0; idx<500 /* Max nr to ensure no infinite loops*/; idx++ )
106  {
107  const IT spikeidx = getSpikeIdx( vals, sz, &newval );
108  if ( spikeidx < 0 )
109  break;
110 
111  hadspikes = true;
112  vals[spikeidx] = newval;
113  }
114 
115  return hadspikes;
116 }
DeSpiker::DeSpiker
DeSpiker(VT maxgrubbs=VT(5))
Definition: despiker.h:22
DeSpiker::hasSpike
bool hasSpike(const VT *, IT sz) const
returns whether there is at least one spike
Definition: despiker.h:94
DeSpiker::deSpike
bool deSpike(VT *, IT sz) const
fixes all spikes. returns whether any change made
Definition: despiker.h:101
mClass
#define mClass(module)
Definition: commondefs.h:181
DeSpiker::maxgrubbs_
const VT maxgrubbs_
Definition: despiker.h:35
DeSpiker
Definition: despiker.h:19
DeSpiker::getSpikeIdx
IT getSpikeIdx(const VT *, IT sz, VT *newvalptr=0) const
Definition: despiker.h:41
Math::Sqrt
float Sqrt(float)
math2.h

Generated at for the OpendTect seismic interpretation project. Copyright (C): dGB Beheer B.V. 1995-2021