[med-svn] [SCM] aghermann branch, master, updated. 06bda7dfaa687aaf0708a024d192024e2cd58421

Andrei Zavada johnhommer at gmail.com
Thu Jan 24 00:43:48 UTC 2013


The following commit has been merged in the master branch:
commit ec66e94c6904eb1736a4a81e9fe450802e233df1
Author: Andrei Zavada <johnhommer at gmail.com>
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



More information about the debian-med-commit mailing list