The following commit has been merged in the master branch:
commit ec66e94c6904eb1736a4a81e9fe450802e233df1
Author: Andrei Zavada <[email protected]>
Date:   Sun Jan 20 03:11:18 2013 +0200

    fix sigproc::envelope

diff --git a/src/sigproc/patterns.hh b/src/sigproc/patterns.hh
index 659393e..726c098 100644
--- a/src/sigproc/patterns.hh
+++ b/src/sigproc/patterns.hh
@@ -48,7 +48,7 @@ class CMatch
 
 template <typename T>
 struct SPatternPPack {
-       int     env_tightness;
+       double  env_scope;
        double  bwf_ffrom,
                bwf_fupto;
        int     bwf_order;
@@ -57,7 +57,7 @@ struct SPatternPPack {
        int     dzcdf_smooth;
        bool operator==( const SPatternPPack<T>& rv) const // cannot be 
defaulted!
                {
-                       return  env_tightness == rv.env_tightness &&
+                       return  env_scope == rv.env_scope &&
                                bwf_ffrom == rv.bwf_ffrom &&
                                bwf_fupto == rv.bwf_fupto &&
                                bwf_order == rv.bwf_order &&
diff --git a/src/sigproc/patterns.ii b/src/sigproc/patterns.ii
index 0e02d45..fb3bb9b 100644
--- a/src/sigproc/patterns.ii
+++ b/src/sigproc/patterns.ii
@@ -47,8 +47,8 @@ do_search( const valarray<T>& fenv_u,
 
        size_t  essential_part = size_essential();
        for ( ssize_t i = 0; i+inc < fsize - essential_part; i += inc ) {
-               auto    p0 = penv.centre( SPatternPPack<T>::env_tightness),
-                       p1 = penv.breadth( SPatternPPack<T>::env_tightness),
+               auto    p0 = penv.centre( SPatternPPack<T>::env_scope),
+                       p1 = penv.breadth( SPatternPPack<T>::env_scope),
                        p2 = ptarget_freq( SPatternPPack<T>::bwf_ffrom,
                                           SPatternPPack<T>::bwf_fupto,
                                           SPatternPPack<T>::bwf_order),
@@ -104,7 +104,7 @@ do_search( const valarray<T>& signal,
 {
        valarray<T> fenv_u, fenv_l;
        sigproc::envelope(
-               {signal, samplerate}, SPatternPPack<T>::env_tightness,
+               {signal, samplerate}, SPatternPPack<T>::env_scope,
                1./samplerate, &fenv_u, &fenv_l);
 
        auto ftarget_freq =
diff --git a/src/sigproc/sigproc.cc b/src/sigproc/sigproc.cc
index 4266a3b..b665584 100644
--- a/src/sigproc/sigproc.cc
+++ b/src/sigproc/sigproc.cc
@@ -23,8 +23,8 @@ using namespace std;
 template void sigproc::smooth( valarray<TFloat>&, size_t);
 template void sigproc::normalize( valarray<TFloat>&);
 template valarray<TFloat> sigproc::derivative( const valarray<TFloat>&);
-template size_t sigproc::envelope( const SSignalRef<float>&, size_t, double, 
valarray<float>*, valarray<float>*, vector<size_t>*, vector<size_t>*);
-template size_t sigproc::envelope( const SSignalRef<double>&, size_t, double, 
valarray<double>*, valarray<double>*, vector<size_t>*, vector<size_t>*);
+template size_t sigproc::envelope( const SSignalRef<float>&, double, double, 
valarray<float>*, valarray<float>*, vector<size_t>*, vector<size_t>*);
+template size_t sigproc::envelope( const SSignalRef<double>&, double, double, 
valarray<double>*, valarray<double>*, vector<size_t>*, vector<size_t>*);
 template valarray<TFloat> sigproc::dzcdf( const SSignalRef<TFloat>&, double, 
double, size_t);
 template double sigproc::sig_diff( const valarray<TFloat>&, const 
valarray<TFloat>&, int);
 template double sigproc::phase_diff( const SSignalRef<TFloat>&, const 
SSignalRef<TFloat>&, size_t, size_t, double, double, unsigned, size_t);
diff --git a/src/sigproc/sigproc.hh b/src/sigproc/sigproc.hh
index e5e1162..59fc83d 100644
--- a/src/sigproc/sigproc.hh
+++ b/src/sigproc/sigproc.hh
@@ -104,7 +104,7 @@ struct SSignalRef {
 template <typename T>
 size_t
 envelope( const SSignalRef<T>& in,
-         size_t dh,  // tightness
+         double dh,  // tightness
          double dt,
          valarray<T>* env_lp = nullptr,  // return interpolated
          valarray<T>* env_up = nullptr,  // return vector of points
@@ -133,12 +133,12 @@ struct SCachedEnvelope
        SCachedEnvelope (const SCachedEnvelope&) = delete;
 
        const pair<valarray<T>&, valarray<T>&>
-       operator()( unsigned tightness_)
+       operator()( double scope_)
                {
                        if ( lower.size() == 0 ||
-                            tightness != tightness_ ) {
+                            scope != scope_ ) {
                                envelope( (SSignalRef<T>)*this,
-                                         tightness = tightness_,
+                                         scope = scope_,
                                          1./SSignalRef<T>::samplerate,
                                          &lower,
                                          &upper); // don't need anchor points, 
nor their count
@@ -153,31 +153,30 @@ struct SCachedEnvelope
                        lower.resize(0);
                }
 
-       T breadth( unsigned tightness_, size_t i)
+       T breadth( double scope_, size_t i)
                {
-                       (*this)( tightness_);
+                       (*this)( scope_);
                        return upper[i] - lower[i];
                }
-       valarray<T> breadth( unsigned tightness_)
+       valarray<T> breadth( double scope_)
                {
-                       (*this)( tightness_);
+                       (*this)( scope_);
                        return upper - lower;
                }
 
-       T centre( unsigned tightness_, size_t i)
+       T centre( double scope_, size_t i)
                {
-                       (*this)( tightness_);
+                       (*this)( scope_);
                        return mid[i];
                }
-       valarray<T> centre( unsigned tightness_)
+       valarray<T> centre( double scope_)
                {
-                       (*this)( tightness_);
+                       (*this)( scope_);
                        return mid;
                }
 
     private:
-       unsigned
-               tightness;
+       double  scope;
        valarray<T>
                upper,
                mid,
diff --git a/src/sigproc/sigproc.ii b/src/sigproc/sigproc.ii
index 845ddb9..22655bc 100644
--- a/src/sigproc/sigproc.ii
+++ b/src/sigproc/sigproc.ii
@@ -14,8 +14,8 @@ extern template void smooth( valarray<TFloat>&, size_t);
 extern template void normalize( valarray<TFloat>&);
 extern template valarray<TFloat> derivative( const valarray<TFloat>&);
 // this one is used for both T = float and double
-extern template size_t envelope( const SSignalRef<float>&, size_t, double, 
valarray<float>*, valarray<float>*, vector<size_t>*, vector<size_t>*);
-extern template size_t envelope( const SSignalRef<double>&, size_t, double, 
valarray<double>*, valarray<double>*, vector<size_t>*, vector<size_t>*);
+extern template size_t envelope( const SSignalRef<float>&, double, double, 
valarray<float>*, valarray<float>*, vector<size_t>*, vector<size_t>*);
+extern template size_t envelope( const SSignalRef<double>&, double, double, 
valarray<double>*, valarray<double>*, vector<size_t>*, vector<size_t>*);
 extern template valarray<TFloat> dzcdf( const SSignalRef<TFloat>&, double, 
double, size_t);
 extern template double sig_diff( const valarray<TFloat>&, const 
valarray<TFloat>&, int);
 extern template double phase_diff( const SSignalRef<TFloat>&, const 
SSignalRef<TFloat>&, size_t, size_t, double, double, unsigned, size_t);
@@ -72,15 +72,17 @@ derivative( const valarray<T>& a)
 template <typename T>
 size_t
 envelope( const SSignalRef<T>& in,
-         size_t dh,  // tightness
-         double dt,
+         double dh_,  // tightness, sec
+         double dt_,
          valarray<T>* env_lp = nullptr,    // return interpolated
          valarray<T>* env_up = nullptr,
          vector<size_t> *mini_p = nullptr, // return vector of extremum indices
          vector<size_t> *maxi_p = nullptr)
 {
-       size_t  i, j,
-               n_samples = in.signal.size();
+       auto&   S = in.signal;
+       size_t  i,
+               n_samples = S.size(),
+               dh2 = dh_ * in.samplerate / 2;
 
        vector<size_t>
                mini,
@@ -90,25 +92,21 @@ envelope( const SSignalRef<T>& in,
        mini.push_back( 0);
        maxi.push_back( 0);
 
-       for ( i = dh; i < n_samples-dh; ++i ) {
-               for ( j = 1; j <= dh; ++j )
-                       if ( in.signal[i-j] <= in.signal[i] )  // [i] is not a 
local min
-                               goto inner_continue;
-               for ( j = 1; j <= dh; ++j )
-                       if ( in.signal[i+j] <= in.signal[i] )  // [i] is not
-                               goto inner_continue;
-               mini.push_back( i);
-               continue;
-       inner_continue:
-               for ( j = 1; j <= dh; ++j )
-                       if ( in.signal[i-j] >= in.signal[i] )  // [i] is not a 
local max
-                               goto outer_continue;
-               for ( j = 1; j <= dh; ++j )
-                       if ( in.signal[i+j] >= in.signal[i] )  // [i] is not
-                               goto outer_continue;
-               maxi.push_back( i);
-       outer_continue:
-               ;
+       // auto dS = derivative(in.signal); // will skip over many extrema due 
to quantization
+       for ( i = dh2; i < n_samples-dh2; ++i ) {
+               auto lmax = S[ slice (i-dh2, dh2+dh2, 1) ].max();
+               if ( S[i] == lmax && i != i-dh2 && i+dh2 ) {
+                       maxi.push_back(i);
+                       i += dh2 - 1;
+                       continue;
+               }
+       }
+       for ( i = dh2; i < n_samples-dh2; ++i ) {
+               auto lmin = S[ slice (i-dh2, dh2+dh2, 1) ].min();
+               if ( S[i] == lmin && i != i-dh2 && i+dh2 ) {
+                       mini.push_back(i);
+                       i += dh2 - 1;
+               }
        }
 
        // put a point at end
@@ -117,9 +115,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( mini, in.samplerate, in.signal, 
dt_);
                if ( env_up )
-                       *env_up = interpolate( maxi, in.samplerate, in.signal, 
dt);
+                       *env_up = interpolate( maxi, in.samplerate, in.signal, 
dt_);
                if ( mini_p )
                        *mini_p = mini;
                if ( maxi_p )

-- 
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