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