[med-svn] [SCM] aghermann branch, master, updated. 06bda7dfaa687aaf0708a024d192024e2cd58421
Andrei Zavada
johnhommer at gmail.com
Thu Jan 24 00:43:39 UTC 2013
The following commit has been merged in the master branch:
commit f1b040bce5bb746a021759f0ba4d593998cde68d
Author: Andrei Zavada <johnhommer at gmail.com>
Date: Fri Jan 11 20:31:43 2013 +0200
patterns overhaul WIP
diff --git a/src/sigproc/patterns.cc b/src/sigproc/patterns.cc
index 9e7f989..f4d3b62 100644
--- a/src/sigproc/patterns.cc
+++ b/src/sigproc/patterns.cc
@@ -14,16 +14,16 @@
using namespace std;
-template sigproc::CPattern<TFloat>::CPattern( const SSignalRef<TFloat>&, size_t, size_t,
+template pattern::CPattern<TFloat>::CPattern( const sigproc::SSignalRef<TFloat>&, size_t, size_t,
const SPatternPPack<TFloat>&);
-template size_t sigproc::CPattern<TFloat>::find( const valarray<TFloat>&,
+template size_t pattern::CPattern<TFloat>::find( const valarray<TFloat>&,
const valarray<TFloat>&,
const valarray<TFloat>&,
const valarray<TFloat>&,
ssize_t, int);
-template size_t sigproc::CPattern<TFloat>::find( const SSignalRef<TFloat>&,
+template size_t pattern::CPattern<TFloat>::find( const sigproc::SSignalRef<TFloat>&,
ssize_t, int);
-template size_t sigproc::CPattern<TFloat>::find( const valarray<TFloat>&,
+template size_t pattern::CPattern<TFloat>::find( const valarray<TFloat>&,
ssize_t, int);
diff --git a/src/sigproc/patterns.hh b/src/sigproc/patterns.hh
index 875d216..0dc56f8 100644
--- a/src/sigproc/patterns.hh
+++ b/src/sigproc/patterns.hh
@@ -13,6 +13,9 @@
#ifndef _SIGPROC_PATTERNS_H
#define _SIGPROC_PATTERNS_H
+#include <tuple>
+#include <vector>
+
#include <gsl/gsl_math.h>
#include "sigproc.hh"
@@ -23,31 +26,24 @@
using namespace std;
-namespace sigproc {
+namespace pattern {
template <typename T>
-struct TMatch : public valarray<T> {
- TMatch (T _1, T _2, T _3, T _4)
- : valarray<T> ({_1, _2, _3, _4})
- {}
- TMatch<T> ()
- : valarray<T> (4)
+class CMatch
+ : public tuple<T, T, T, T> {
+ public:
+ CMatch ()
+ : tuple<T, T, T, T> (NAN, NAN, NAN, NAN)
{}
- bool operator==( const TMatch<T>& rv) const
- {
- for ( size_t i = 0; i < 4; ++i )
- if ( (*this)[i] != rv[i] )
- return false;
- return true;
- }
- bool good_enough( const TMatch<T>& rv) const
+ bool good_enough( const CMatch<T>& rv) const
{
- for ( size_t i = 0; i < 4; ++i )
- if ( (*this)[i] > rv[i] )
- return false;
- return true;
+ return get<0>(*this) < get<0>(rv) &&
+ get<1>(*this) < get<1>(rv) &&
+ get<2>(*this) < get<2>(rv) &&
+ get<3>(*this) < get<3>(rv);
}
+
};
template <typename T>
@@ -70,7 +66,7 @@ struct SPatternPPack {
dzcdf_smooth == rv.dzcdf_smooth &&
criteria == rv.criteria;
}
- TMatch<T>
+ CMatch<T>
criteria;
}; // keep fields in order, or edit ctor by initializer_list
@@ -88,14 +84,10 @@ class CPattern
// (c) target frequency (band-passed);
// (d) instantaneous frequency at fine intervals;
- TMatch<T>
- match; // resulting
-
- CPattern (const SSignalRef<T>& thing,
+ CPattern (const sigproc::SSignalRef<T>& thing,
size_t ctx_before_, size_t ctx_after_,
const SPatternPPack<T>& Pp_)
: SPatternPPack<T> (Pp_),
- match (NAN, NAN, NAN, NAN),
penv (thing),
ptarget_freq (thing),
pdzcdf (thing),
@@ -103,10 +95,10 @@ class CPattern
ctx_before (ctx_before_), ctx_after (ctx_after_)
{
if ( ctx_before + ctx_after >= thing.signal.size() )
- throw invalid_argument ("pattern.size too small");
+ throw invalid_argument ("pattern size too small");
}
- size_t find( const SSignalRef<T>& field,
+ size_t find( const sigproc::SSignalRef<T>& field,
ssize_t start,
int inc);
size_t find( const valarray<T>& field,
@@ -119,6 +111,11 @@ class CPattern
ssize_t start,
int inc);
+ vector<size_t>
+ match_indices;
+ vector<CMatch<T>>
+ diff;
+
size_t size_with_context() const
{
return ptarget_freq.signal.size();
@@ -130,11 +127,11 @@ class CPattern
}
private:
- SCachedEnvelope<T>
+ sigproc::SCachedEnvelope<T>
penv;
- SCachedBandPassCourse<T>
+ sigproc::SCachedBandPassCourse<T>
ptarget_freq;
- SCachedDzcdf<T>
+ sigproc::SCachedDzcdf<T>
pdzcdf;
size_t samplerate;
diff --git a/src/sigproc/patterns.ii b/src/sigproc/patterns.ii
index 0bc05ac..58e7bb3 100644
--- a/src/sigproc/patterns.ii
+++ b/src/sigproc/patterns.ii
@@ -10,14 +10,14 @@
* License: GPL
*/
-extern template CPattern<TFloat>::CPattern( const SSignalRef<TFloat>&, size_t, size_t,
+extern template CPattern<TFloat>::CPattern( const sigproc::SSignalRef<TFloat>&, size_t, size_t,
const SPatternPPack&);
extern template size_t CPattern<TFloat>::find( const valarray<TFloat>&,
const valarray<TFloat>&,
const valarray<TFloat>&,
const valarray<TFloat>&,
ssize_t, int);
-extern template size_t CPattern<TFloat>::find( const SSignalRef<TFloat>&,
+extern template size_t CPattern<TFloat>::find( const sigproc::SSignalRef<TFloat>&,
ssize_t, int);
extern template size_t CPattern<TFloat>::find( const valarray<TFloat>&,
ssize_t, int);
@@ -48,59 +48,56 @@ find( const valarray<T>& fenv_u,
printf( "field = %zu, thing = %zu(%zu), start = %zu, size_essential = %zu\n",
ftarget_freq.size(), ptarget_freq.signal.size(),
penv.centre(SPatternPPack<T>::env_tightness).size(), start, size_essential());
- printf( " %4g %4g %4g %4g\n",
- SPatternPPack<T>::criteria[0], SPatternPPack<T>::criteria[1], SPatternPPack<T>::criteria[2], SPatternPPack<T>::criteria[3]);
+ // printf( " %4g %4g %4g %4g\n",
+ // SPatternPPack<T>::criteria.get<0>(), SPatternPPack<T>::criteria[1], SPatternPPack<T>::criteria[2], SPatternPPack<T>::criteria[3]);
+
+ // here be all diffs
+ diff.resize( ftarget_freq.size());
+ match_indices.resize(0);
+
ssize_t iz = (inc > 0) ? ftarget_freq.size() - size_with_context() : 0;
size_t essential_part = size_essential();
for ( ssize_t i = start; (inc > 0) ? i+inc < iz : i+inc > iz; i += inc ) {
- TMatch<T>
- diff;
- auto
- p0 = penv.centre( SPatternPPack<T>::env_tightness),
- p1 = penv.breadth( SPatternPPack<T>::env_tightness),
- p2 = ptarget_freq( SPatternPPack<T>::bwf_ffrom,
- SPatternPPack<T>::bwf_fupto,
- SPatternPPack<T>::bwf_order),
- p3 = pdzcdf( SPatternPPack<T>::dzcdf_step,
- SPatternPPack<T>::dzcdf_sigma,
- SPatternPPack<T>::dzcdf_smooth);
+ auto p0 = penv.centre( SPatternPPack<T>::env_tightness),
+ p1 = penv.breadth( SPatternPPack<T>::env_tightness),
+ p2 = ptarget_freq( SPatternPPack<T>::bwf_ffrom,
+ SPatternPPack<T>::bwf_fupto,
+ SPatternPPack<T>::bwf_order),
+ p3 = pdzcdf( SPatternPPack<T>::dzcdf_step,
+ SPatternPPack<T>::dzcdf_sigma,
+ SPatternPPack<T>::dzcdf_smooth);
for ( size_t j = 0; j < essential_part; ++j ) {
- diff[0] += gsl_pow_2( p0[ctx_before + j]
+ get<0>(diff[i]) += gsl_pow_2( p0[ctx_before + j]
- (fenv_u[i+j] + fenv_l[i+j])/2);
- diff[1] += gsl_pow_2( p1[ctx_before + j]
+ get<1>(diff[i]) += gsl_pow_2( p1[ctx_before + j]
- (fenv_u[i+j] - fenv_l[i+j]));
- diff[2] += gsl_pow_2( p2[ctx_before + j]
+ get<2>(diff[i]) += gsl_pow_2( p2[ctx_before + j]
- ftarget_freq[i+j]);
- diff[3] += gsl_pow_2( p3[ctx_before + j]
+ get<3>(diff[i]) += gsl_pow_2( p3[ctx_before + j]
- fdzcdf[i+j]);
}
- diff[0] = sqrt(diff[0] / essential_part) / crit_linear_unity; // normalise
- diff[1] = sqrt(diff[1] / essential_part) / crit_linear_unity;
- diff[2] = sqrt(diff[2] / essential_part) / crit_linear_unity;
- diff[3] = sqrt(diff[3] / essential_part) / crit_dzcdf_unity;
+ get<0>(diff[i]) = sqrt(get<0>(diff[i]) / essential_part) / crit_linear_unity; // normalise
+ get<1>(diff[i]) = sqrt(get<1>(diff[i]) / essential_part) / crit_linear_unity;
+ get<2>(diff[i]) = sqrt(get<2>(diff[i]) / essential_part) / crit_linear_unity;
+ get<3>(diff[i]) = sqrt(get<3>(diff[i]) / essential_part) / crit_dzcdf_unity;
// if ( i % 250 == 0 ) printf( "at %zu diff_course = %g,\tdiff_breadth = %g\t diff_dzcdf = %g\n", i, diff_course, diff_breadth, diff_dzcd);
- if ( diff.good_enough(SPatternPPack<T>::criteria) ) {
- // if ( !looking_further ) {
- // looking_further = true;
- match = diff;
- return i;
- }
+ if ( diff[i].good_enough(SPatternPPack<T>::criteria) )
+ match_indices.push_back(i);
// printf( " %17zu : %4g %4g %4g %4g\n",
// i, diff[0], diff[1], diff[2], diff[3]);
}
- match = {1., 1., 1., 1.};
- return (size_t)-1;
+ return match_indices.size();
}
template <typename T>
size_t
CPattern<T>::
-find( const SSignalRef<T>& signal,
+find( const sigproc::SSignalRef<T>& signal,
ssize_t start,
int inc)
{
@@ -119,19 +116,22 @@ find( const valarray<T>& signal,
int inc)
{
valarray<T> fenv_u, fenv_l;
- envelope( {signal, samplerate}, SPatternPPack<T>::env_tightness,
- 1./samplerate, &fenv_u, &fenv_l);
+ sigproc::envelope(
+ {signal, samplerate}, SPatternPPack<T>::env_tightness,
+ 1./samplerate, &fenv_u, &fenv_l);
auto ftarget_freq =
- exstrom::band_pass( signal, samplerate,
- SPatternPPack<T>::bwf_ffrom,
- SPatternPPack<T>::bwf_fupto,
- SPatternPPack<T>::bwf_order, true);
+ exstrom::band_pass(
+ signal, samplerate,
+ SPatternPPack<T>::bwf_ffrom,
+ SPatternPPack<T>::bwf_fupto,
+ SPatternPPack<T>::bwf_order, true);
auto fdzcdf =
- dzcdf( SSignalRef<T> {signal, samplerate},
- SPatternPPack<T>::dzcdf_step,
- SPatternPPack<T>::dzcdf_sigma,
- SPatternPPack<T>::dzcdf_smooth);
+ sigproc::dzcdf(
+ sigproc::SSignalRef<T> {signal, samplerate},
+ SPatternPPack<T>::dzcdf_step,
+ SPatternPPack<T>::dzcdf_sigma,
+ SPatternPPack<T>::dzcdf_smooth);
return find( fenv_u, fenv_l, ftarget_freq, fdzcdf,
start, inc);
diff --git a/src/ui/sf/sf.hh b/src/ui/sf/sf.hh
index b1a8685..0cb184f 100644
--- a/src/ui/sf/sf.hh
+++ b/src/ui/sf/sf.hh
@@ -502,7 +502,7 @@ class SScoringFacility
DELETE_DEFAULT_METHODS (SFindDialog);
// own copies of parent's same
- sigproc::SPatternPPack<TFloat>
+ pattern::SPatternPPack<TFloat>
Pp,
Pp2;
--
Sleep experiment manager
More information about the debian-med-commit
mailing list