The following commit has been merged in the master branch:
commit 2e5485095074b8da7d9d2449a92f4da4f82d7c2c
Author: Andrei Zavada <[email protected]>
Date:   Mon Jul 22 01:54:11 2013 +0300

    simplify, template sigproc::interpolate() on 3rd arg

diff --git a/src/aghermann/ui/sf/channel.cc b/src/aghermann/ui/sf/channel.cc
index e7bfb35..bb2506a 100644
--- a/src/aghermann/ui/sf/channel.cc
+++ b/src/aghermann/ui/sf/channel.cc
@@ -216,7 +216,7 @@ get_psd_course()
                auto xi = vector<size_t> (tmp.size());
                for ( size_t i = 0; i < tmp.size(); ++i )
                        xi[i] = i;
-               psd.course = sigproc::interpolate( xi, 3600/_p.pagesize(), tmp, 
3./3600);
+               psd.course = sigproc::interpolate<TFloat>( xi, 
3600/_p.pagesize(), tmp, 3./3600);
        } else
                psd.course = tmp;
 }
@@ -235,9 +235,10 @@ get_psd_in_bands()
                                _upto = _p._p.ED->freq_bands[b][1];
                        auto tmp = crecording.psd_profile.course( _from, _upto);
                        psd.course_in_bands[b] =
-                               sigproc::interpolate( xi, 3600/_p.pagesize(),
-                                                     tmp,
-                                                     3./3600);
+                               sigproc::interpolate<TFloat>(
+                                       xi, 3600/_p.pagesize(),
+                                       tmp,
+                                       3./3600);
                }
        } else
                for ( size_t b = 0; b <= psd.uppermost_band; ++b ) {
@@ -260,7 +261,7 @@ get_swu_course()
                auto xi = vector<size_t> (tmp.size());
                for ( size_t i = 0; i < tmp.size(); ++i )
                        xi[i] = i;
-               swu.course = sigproc::interpolate( xi, 3600/_p.pagesize(), tmp, 
3./3600);
+               swu.course = sigproc::interpolate<TFloat>( xi, 
3600/_p.pagesize(), tmp, 3./3600);
        } else
                swu.course = tmp;
 }
@@ -277,7 +278,8 @@ get_mc_course()
                auto xi = vector<size_t> (tmp.size());
                for ( size_t i = 0; i < tmp.size(); ++i )
                        xi[i] = i;
-               mc.course = sigproc::interpolate( xi, 3600/_p.pagesize(), tmp, 
3./3600);
+               mc.course = sigproc::interpolate<TFloat>(
+                       xi, 3600/_p.pagesize(), tmp, 3./3600);
        } else
                mc.course = tmp;
 }
diff --git a/src/libsigproc/sigproc.cc b/src/libsigproc/sigproc.cc
index d78804a..730dd20 100644
--- a/src/libsigproc/sigproc.cc
+++ b/src/libsigproc/sigproc.cc
@@ -11,8 +11,6 @@
 
 #include <vector>
 #include <valarray>
-#include <gsl/gsl_interp.h>
-#include <gsl/gsl_spline.h>
 
 #include "sigproc.hh"
 
@@ -75,68 +73,6 @@ resample( const valarray<double>& signal,
 
 
 
-
-
-
-
-valarray<double>
-sigproc::
-interpolate_d( const vector<size_t>& xi,
-              unsigned samplerate,
-              const valarray<double>& y,
-              float dt)
-{
-//     if ( 1. / samplerate > dt )
-//             return y;
-
-       size_t i;
-       valarray<double>
-               x_known (xi.size()),
-               y_known (xi.size());
-       for ( i = 0; i < xi.size(); ++i ) {
-               x_known[i] = (double)xi[i] / samplerate;
-               y_known[i] = y[ xi[i] ];
-       }
-
-       gsl_spline *spline = gsl_spline_alloc( gsl_interp_akima, xi.size());
-       gsl_interp_accel *acc = gsl_interp_accel_alloc();
-
-       gsl_spline_init( spline, &x_known[0], &y_known[0], xi.size());
-
-       double  t;
-       size_t  pad = (1./samplerate / dt) // this I understand
-                       / 2;                // this, I don't
-       valarray<double>
-               out (ceilf((x_known[x_known.size()-1] - x_known[0] + 
1./samplerate) / dt) + 1);
-       for ( i = pad, t = x_known[0]; t < x_known[x_known.size()-1]; ++i, t += 
dt )
-               out[i] = gsl_spline_eval( spline, t, acc);
-
-       gsl_interp_accel_free( acc);
-       gsl_spline_free( spline);
-
-       return out;
-}
-
-
-valarray<float>
-sigproc::
-interpolate( const vector<size_t>& xi,
-            unsigned samplerate,
-            const valarray<float>& y,
-            float dx)
-{
-       valarray<double> in (y.size());
-       for ( size_t i = 0; i < y.size(); ++i )
-               in[i] = y[i];
-
-       valarray<double> tmp = sigproc::interpolate_d( xi, samplerate, in, dx);
-
-       valarray<float> out (tmp.size());
-       for ( size_t i = 0; i < tmp.size(); ++i )
-               out[i] = tmp[i];
-       return out;
-}
-
 // Local Variables:
 // Mode: c++
 // indent-tabs-mode: 8
diff --git a/src/libsigproc/sigproc.hh b/src/libsigproc/sigproc.hh
index 6277687..5cce45b 100644
--- a/src/libsigproc/sigproc.hh
+++ b/src/libsigproc/sigproc.hh
@@ -18,6 +18,8 @@
 #include <stdexcept>
 
 #include <gsl/gsl_math.h>
+#include <gsl/gsl_interp.h>
+#include <gsl/gsl_spline.h>
 #include <samplerate.h>
 
 #include "common/lang.hh"
@@ -67,24 +69,14 @@ resample( const valarray<double>& signal,
          int alg);
 
 
-valarray<double>
-interpolate_d( const vector<size_t>&,
-              unsigned, const valarray<double>&, float);
 
-valarray<float>
-interpolate( const vector<size_t>& xi,
-            unsigned samplerate,
-            const valarray<float>& y,
-            float dx);
-
-inline valarray<double>
-interpolate( const vector<size_t>& xi,
-            size_t samplerate,
-            const valarray<double>& y,
-            float dx)
-{
-       return interpolate_d( xi, samplerate, y, dx);
-}
+
+
+
+template <typename T, class Container>
+valarray<T>
+interpolate( const vector<unsigned long>& xi,
+            unsigned samplerate, const Container& y, double dt);
 
 
 
diff --git a/src/libsigproc/sigproc.ii b/src/libsigproc/sigproc.ii
index 335b3ba..99a7b86 100644
--- a/src/libsigproc/sigproc.ii
+++ b/src/libsigproc/sigproc.ii
@@ -59,7 +59,7 @@ derivative( const valarray<T>& a)
        valarray<T> out (a.size());
        for ( size_t i = 1; i < a.size(); ++i )
                out[i-1] = a[i] - a[i-1];
-       return out;
+       return move( out);
 }
 
 
@@ -67,6 +67,43 @@ derivative( const valarray<T>& a)
 
 
 
+template <typename T, class Container>
+valarray<T>
+interpolate( const vector<unsigned long>& xi,
+            unsigned samplerate, const Container& y, double dt)
+{
+       size_t i;
+       valarray<double>
+               x_known (xi.size()),
+               y_known (xi.size());
+       for ( i = 0; i < xi.size(); ++i ) {
+               x_known[i] = (double)xi[i] / samplerate;
+               y_known[i] = y[ xi[i] ];
+       }
+
+       gsl_spline *spline = gsl_spline_alloc( gsl_interp_akima, xi.size());
+       gsl_interp_accel *acc = gsl_interp_accel_alloc();
+
+       gsl_spline_init( spline, &x_known[0], &y_known[0], xi.size());
+
+       double  t;
+       size_t  pad = (1./samplerate / dt) // this I understand
+                       / 2;                // this, I don't
+       valarray<T>
+               out (ceilf((x_known[x_known.size()-1] - x_known[0] + 
1./samplerate) / dt) + 1);
+       for ( i = pad, t = x_known[0]; t < x_known[x_known.size()-1]; ++i, t += 
dt )
+               out[i] = gsl_spline_eval( spline, t, acc);
+
+       gsl_interp_accel_free( acc);
+       gsl_spline_free( spline);
+
+       return move( out);
+}
+
+
+
+
+
 
 template <typename T>
 size_t
@@ -114,9 +151,9 @@ envelope( const SSignalRef<T>& in,
 
        if ( mini.size() > 5 && maxi.size() > 5 ) {
                if ( env_lp )
-                       *env_lp = interpolate( mini, in.samplerate, in.signal, 
dt_);
+                       *env_lp = interpolate<T>( mini, in.samplerate, 
in.signal, dt_);
                if ( env_up )
-                       *env_up = interpolate( maxi, in.samplerate, in.signal, 
dt_);
+                       *env_up = interpolate<T>( maxi, in.samplerate, 
in.signal, dt_);
                if ( mini_p )
                        *mini_p = mini;
                if ( maxi_p )
@@ -191,7 +228,7 @@ dzcdf( const SSignalRef<T>& in,
                }
                I = J;
        }
-       return interpolate( xi, in.samplerate, y, 1./in.samplerate);
+       return move( interpolate<T>( xi, in.samplerate, y, 1./in.samplerate));
 }
 
 

-- 
Sleep experiment manager

_______________________________________________
debian-med-commit mailing list
[email protected]
http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/debian-med-commit

Reply via email to