[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