1 /***************************************************************************
2                           smooth1d.hpp -- accelerated smooth 1d
3                              -------------------
4     begin                : May 30 2017
5     copyright            : (C) 2017 by G. Duvert
6     email                : m_schellens@users.sourceforge.net
7  ***************************************************************************/
8 
9 /***************************************************************************
10  *                                                                         *
11  *   This program is free software; you can redistribute it and/or modify  *
12  *   it under the terms of the GNU General Public License as published by  *
13  *   the Free Software Foundation; either version 2 of the License, or     *
14  *   (at your option) any later version.                                   *
15  *                                                                         *
16  ***************************************************************************/
17 
18 // to be included from datatypes.cpp
19 #ifdef INCLUDE_SMOOTH_1D
20 //initiate mean of Width first values:
21 DDouble mean = 0;
22 DDouble z;
23 DDouble n = 0;
24 //initial mean. may be Nan
25 for (SizeT i = 0; i < (2 * w + 1); ++i) {
26  DDouble v = data[i];
27  n += 1.0;
28  z = 1. / n;
29  mean = (1. - z) * mean + z * v;
30 }
31 #if defined(USE_EDGE)
32 //start: use mean1
33 DDouble mean1 = mean;
34 for (SizeT i = 0; i < w; ++i) {
35  res[w - i] = mean1;
36  DDouble v = data[2 * w - i];
37  mean1 -= z*v;
38 
39 #if defined (EDGE_WRAP)
40  v = data[dimx - i - 1];
41 #elif defined (EDGE_TRUNCATE)
42  v = data[0];
43 #elif defined (EDGE_MIRROR)
44  v = data[i];
45 #elif defined (EDGE_ZERO)
46  v = 0;
47 #endif
48  mean1 += z*v;
49 }
50 res[0] = mean1;
51 
52 #endif
53 
54 //middle: use mean & n
55 for (SizeT i = w, ivm = 0, ivp = 2 * w + 1; i < dimx - w - 1; ++i, ++ivm, ++ivp) {
56  res[i] = mean;
57  DDouble v = data[ivm];
58  mean -= z*v;
59  v = data[ivp];
60  mean += z*v;
61 }
62 res[dimx - 1 - w] = mean;
63 
64 #ifdef USE_EDGE
65 //end: use mean
66 for (SizeT i = dimx - 1 - w; i < dimx - 1; ++i) {
67  res[i] = mean;
68  DDouble v = data[i - w];
69  mean -= z*v;
70 #if defined (EDGE_WRAP)
71  v = data[i - dimx + w + 1];
72 #elif defined (EDGE_TRUNCATE)
73  v = data[dimx - 1];
74 #elif defined (EDGE_MIRROR)
75  v = data[2 * dimx - i - w - 2];
76 #elif defined (EDGE_ZERO)
77  v = 0;
78 #endif
79  mean += z*v;
80 }
81 res[dimx - 1] = mean;
82 #endif
83 
84 #endif
85