UNIVERS  15.3
UNIVERS base processing software API
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
s2_corr_inline.hpp
1 /* s2_corr_inline.hpp */
2 /* $Id: s2_corr_inline.hpp 22125 2013-05-08 16:35:52Z urij $ */
3 #ifndef __s2_corr_inline_hpp
4 #define __s2_corr_inline_hpp
5 
6 #ifdef GE_BUILD
7 #include <s2_corr.hpp>
8 #else
9 #include <s2proc/s2_corr.hpp>
10 #endif
11 
12 #include <math.h>
13 
16 template <template <class> class Functor>
17 bool S2Corr::traceBaseOp(Trace &tr, const DVector &bases)
18 {
19  Functor<Trace::AmplT> functor;
20 
21  // number of bases should be > 0 and < than trace lenght
22  if (bases.size() < 1 || tr.size() < 1 || bases.size() > tr.size())
23  {
24  printf ("S2Corr->traceBaseOp: error: %zu bases provided for %zu samplse in trace.\n",
25  bases.size(), tr.size());
26  return false;
27  }
28 
29  AvgBaseSep<Trace::AmplT> sep(&tr[0], tr.size(), bases.size());
30  size_t bn = 0;
31  Trace::AmplT res = 0.;
32 
33  // apply weights for trace
34  for (size_t i=0; i<bases.size(); i++)
35  {
36  Trace::AmplT *trb = sep.get(i, bn);
37  for (size_t j=0; j<bn; j++)
38  {
39  res = functor(trb[j], bases[i]);
40 #if 0
41  printf ("S2Corr->traceBaseOp: base %d, sample %d : %g op %g = %g\n",
42  i, j, trb[j], bases[i], res);
43 #endif
44  trb[j] = res;
45  }
46  }
47 
48  return true;
49 }
50 
51 class CDFT2D;
52 
54 template <typename FFT_T>
55 bool S2Corr::tracesCCF(FFT_T &fft,
56  const Trace &tr1,
57  const Trace &tr2,
58  Trace &ccf,
59  bool norma)
60 {
61  if(tr1.size() != tr2.size() || tr1.size() == 0 || tr2.size() == 0)
62  {
63  printf("S2Corr::tracesCCF: error: incorrect size of traces tr1.size() = %zu tr2.size = %zu\n",
64  tr1.size(), tr2.size());
65  return false;
66  }
67 
68  double En1 = 0.;
69  double En2 = 0.;
70  for(size_t n=0; n<tr1.size(); ++n)
71  {
72  En1 += tr1[n]*tr1[n];
73  En2 += tr2[n]*tr2[n];
74  }
75 
76  float E = 1e-7;
77  double norm_coef = 0;
78 
79  if(En1 > E && En2 > E)
80  norm_coef = 1/sqrt(En1*En2);
81 
82  fft.setRotateFlag(false);
83  fft.setDirection(1);
84 
85  Trace sp1_re(tr1.header(), tr1.begin(), tr1.end());
86  Trace sp1_im(tr1.header(), tr1.size(), 0.);
87  fft.calc(sp1_re, sp1_im);
88 
89  Trace sp2_re(tr2.header(), tr2.begin(), tr2.end());
90  Trace sp2_im(tr2.header(), tr2.size(), 0.);
91  fft.calc(sp2_re, sp2_im);
92 
93  // get spectr of CCF
94  Trace resultRe(sp1_re.header(), sp1_re.size(), 0.);
95  Trace resultIm(sp1_im.header(), sp1_im.size(), 0.);
96 
97  for(unsigned int i=0; i<sp1_re.size(); ++i)
98  {
99  //multiplying (a + ib) * (c - id) = (a*c + d*b) + i(b*c - a*d)
100  // a = sp1_re[i]
101  // b = sp1_im[i]
102  // c = sp2_re[i]
103  // d = sp2_im[i]
104 
105  resultRe[i] = sp1_re[i]*sp2_re[i] + sp1_im[i]*sp2_im[i];
106  resultIm[i] = sp1_im[i]*sp2_re[i] - sp1_re[i]*sp2_im[i];
107  }
108 
109  fft.setDirection(-1); // invers fft
110 
111  if(!fft.calc(resultRe, resultIm))
112  return false;
113 
114  size_t half = resultRe.size()/2;
115  size_t add = resultRe.size()%2;
116 
117  //printf("tracesCCF::INFO: result t0 = %g dt = %g \n", resultRe.header().t0, resultRe.header().timestep);
118  ccf = Trace(tr1.header(), resultRe.begin(), resultRe.end());
119 
120  for (size_t i=half+add; i<ccf.size(); i++)
121  ccf[i-half-add] = resultRe[i];
122 
123  for (size_t i=0; i<half+add; i++)
124  ccf[i+half] = resultRe[i];
125 
126  if(norma)
127  for (size_t i=0; i<ccf.size(); i++)
128  ccf[i]*=norm_coef;
129 
130  // set proper zero time
131  ccf.header().t0 = (-ccf.header().timestep)*(half + add);
132 
133  return true;
134 }
135 
137 template <typename FFT_T>
138 bool S2Corr::traceACF(FFT_T &fft,
139  const Trace &tr,
140  Trace &acf,
141  bool norma)
142 {
143 
144  if(0 == tr.size())
145  {printf("traceACF::ERROR: Empty traces tr.size() = %zu\n", tr.size()); return false;}
146 
147  fft.setRotateFlag(false);
148  fft.setDirection(1);
149 
150  Trace sp_re = tr;
151  Trace sp_im = tr;
152  std::fill (sp_im.begin(), sp_im.end(), 0);
153  fft.calc(sp_re, sp_im);
154 
155  // get spectr of ACF
156  Trace resultRe = sp_re, resultIm = sp_im;
157 
158  std::fill (resultRe.begin(), resultRe.end(), 0);
159  std::fill (resultIm.begin(), resultIm.end(), 0);
160 
161  for(unsigned int i=0; i<sp_re.size(); ++i)
162  {
163  //multiplying (a + ib) * (a - ib) = (a*a + b*b) + i(b*a - a*b)
164  // a = sp_re[i]
165  // b = sp_im[i]
166 
167  resultRe[i] = sp_re[i]*sp_re[i] + sp_im[i]*sp_im[i];
168  resultIm[i] = sp_im[i]*sp_re[i] - sp_re[i]*sp_im[i];
169  }
170 
171  fft.setDirection(-1); // invers fft
172 
173  if(!fft.calc(resultRe, resultIm))
174  {
175  return false;
176  }
177 
178  size_t half = resultRe.size()/2;
179  size_t add = resultRe.size()%2;
180 
181  //for (size_t i=0; i<half; i++)
182  //std::swap<Trace::AmplT>(resultRe[i], resultRe[half + i]);
183 
184  //Trace::AmplT first_sample = resultRe[0];
185 
186  acf = resultRe;
187 
188  for (size_t i=half+add; i<acf.size(); i++)
189  acf[i-half-add] = resultRe[i];
190 
191  for (size_t i=0; i<half+add; i++)
192  acf[i+half] = resultRe[i];
193 
194  if(norma)
195  {
196  float norm_coef;
197  if(acf[half+add] > 1e-7)
198  norm_coef = 1./acf[half+add];
199  else
200  norm_coef = 0.;
201  for (size_t i=0; i<acf.size(); i++)
202  acf[i]*=norm_coef;
203  }
204 
205  // set proper zero time
206  acf.header().t0 = (-acf.header().timestep)*(half + add);
207 
208  return true;
209 }
210 
211 
213 template <typename FFT_T>
214 bool S2Corr::SpectrWidth(FFT_T &fft,
215  const Trace &tr,
216  float &sw_val)
217 {
218  if(0 == tr.size())
219  {printf("SpectrWidth::ERROR: Empty traces tr.size() = %zu\n", tr.size()); return false;}
220 
221  float dt = tr.header().timestep;
222 
223  fft.setRotateFlag(false);
224  fft.setDirection(1);
225 
226  Trace sp_re = tr;
227  Trace sp_im = tr;
228  std::fill (sp_im.begin(), sp_im.end(), 0);
229  fft.calc(sp_re, sp_im);
230 
231  // get spectr of trace
232  Trace resultRe = sp_re, resultIm = sp_im; // for correct .header() values
233 
234  float width_val = 0;
235  float norm_val = 0;
236 
237  std::fill (resultRe.begin(), resultRe.end(), 0);
238  std::fill (resultIm.begin(), resultIm.end(), 0);
239 
240  for(unsigned int i=0; i<sp_re.size(); ++i)
241  {
242  //multiplying (a + ib) * (a - ib) = (a*a + b*b) + i(b*a - a*b) = a*a + b*b
243  // a = sp_re[i]
244  // b = sp_im[i]
245  resultRe[i] = sp_re[i]*sp_re[i] + sp_im[i]*sp_im[i];
246 
247  width_val += (i+1)*(i+1)*resultRe[i];
248  norm_val += resultRe[i];
249  }
250  if(0. == norm_val)
251  {
252  sw_val = 0.;
253  return true;
254  }
255 
256  sw_val = width_val/norm_val;
257  sw_val /= 4.*dt*dt;
258 
259  return true;
260 }
261 
262 #endif /* s2_corr_inline.hpp */
float AmplT
Definition: trace.hpp:21
bool traceACF(FFT_T &fft, const Trace &tr, Trace &acf, bool norma)
Definition: s2_corr_inline.hpp:138
Definition: base_separator.hpp:10
size_t size() const
const Header & header() const
Definition: trace.hpp:196
bool tracesCCF(FFT_T &fft, const Trace &tr1, const Trace &tr2, Trace &ccf, bool norma)
Definition: s2_corr_inline.hpp:55
TimeT timestep
Definition: trace.hpp:122
TimeT t0
Definition: trace.hpp:119
std::vector< Trace::AmplT > DVector
Definition: s2_corr.hpp:20
Definition: trace.hpp:14
bool traceBaseOp(Trace &tr, const DVector &bases)
Definition: s2_corr_inline.hpp:17
const_iterator begin() const
Definition: cdft2d.hpp:15