[med-svn] [SCM] aghermann branch, master, updated. 06bda7dfaa687aaf0708a024d192024e2cd58421
andrei zavada
jh at johnhommer.com
Thu Jan 24 00:43:40 UTC 2013
The following commit has been merged in the master branch:
commit a770c7a63bc9ef03293b82c65089ce94ac8e912b
Author: andrei zavada <jh at johnhommer.com>
Date: Fri Jan 11 22:59:26 2013 +0000
patterns WIP
on Kiev-Kharkov train
diff --git a/src/sigproc/patterns.hh b/src/sigproc/patterns.hh
index 0dc56f8..103f2f7 100644
--- a/src/sigproc/patterns.hh
+++ b/src/sigproc/patterns.hh
@@ -66,8 +66,6 @@ struct SPatternPPack {
dzcdf_smooth == rv.dzcdf_smooth &&
criteria == rv.criteria;
}
- CMatch<T>
- criteria;
}; // keep fields in order, or edit ctor by initializer_list
@@ -75,7 +73,7 @@ struct SPatternPPack {
template <typename T>
class CPattern
: public SPatternPPack<T> {
- CPattern () = delete;
+ DELETE_DEFAULT_METHODS (CPattern);
public:
// the complete pattern signature is made of:
@@ -98,21 +96,16 @@ class CPattern
throw invalid_argument ("pattern size too small");
}
- size_t find( const sigproc::SSignalRef<T>& field,
- ssize_t start,
- int inc);
- size_t find( const valarray<T>& field,
- ssize_t start,
- int inc);
- size_t find( const valarray<T>& env_u, // broken-down field
- const valarray<T>& env_l,
- const valarray<T>& target_freq,
- const valarray<T>& dzcdf,
- ssize_t start,
- int inc);
-
- vector<size_t>
- match_indices;
+ int do_search( const sigproc::SSignalRef<T>& field,
+ int inc);
+ int do_search( const valarray<T>& field,
+ int inc);
+ int do_search( const valarray<T>& env_u, // broken-down field
+ const valarray<T>& env_l,
+ const valarray<T>& target_freq,
+ const valarray<T>& dzcdf,
+ int inc);
+
vector<CMatch<T>>
diff;
diff --git a/src/sigproc/patterns.ii b/src/sigproc/patterns.ii
index 58e7bb3..26d1961 100644
--- a/src/sigproc/patterns.ii
+++ b/src/sigproc/patterns.ii
@@ -24,18 +24,18 @@ extern template size_t CPattern<TFloat>::find( const valarray<TFloat>&,
template <typename T>
-size_t
+int
CPattern<T>::
-find( const valarray<T>& fenv_u,
- const valarray<T>& fenv_l,
- const valarray<T>& ftarget_freq,
- const valarray<T>& fdzcdf,
- ssize_t start,
- int inc)
+do_search( const valarray<T>& fenv_u,
+ const valarray<T>& fenv_l,
+ const valarray<T>& ftarget_freq,
+ const valarray<T>& fdzcdf,
+ size_t inc)
{
- if ( inc == 0 || inc > (ssize_t)ftarget_freq.size() ) {
- fprintf( stderr, "CPattern::find(): bad search increment: %d\n", inc);
- return (size_t)-1;
+ size_t fsize = ftarget_freq.size();
+ if ( inc == 0 || inc > (ssize_t)fsize ) {
+ fprintf( stderr, __FUNCTION__": bad search increment: %d\n", inc);
+ return -1;
}
// make it (each time) field-specific
@@ -45,19 +45,15 @@ find( const valarray<T>& fenv_u,
crit_dzcdf_unity =
fdzcdf.sum() / fdzcdf.size();
- 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.get<0>(), SPatternPPack<T>::criteria[1], SPatternPPack<T>::criteria[2], SPatternPPack<T>::criteria[3]);
+ printf( "field = %zu, thing = %zu(%zu), size_essential = %zu\n",
+ fsize, ptarget_freq.signal.size(),
+ penv.centre(SPatternPPack<T>::env_tightness).size(), size_essential());
// here be all diffs
- diff.resize( ftarget_freq.size());
- match_indices.resize(0);
+ diff.resize( fsize);
- 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 ) {
+ 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),
p2 = ptarget_freq( SPatternPPack<T>::bwf_ffrom,
@@ -84,36 +80,34 @@ find( const valarray<T>& fenv_u,
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[i].good_enough(SPatternPPack<T>::criteria) )
- match_indices.push_back(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]);
}
- return match_indices.size();
+ return 0;
}
template <typename T>
-size_t
+int
CPattern<T>::
-find( const sigproc::SSignalRef<T>& signal,
- ssize_t start,
- int inc)
+do_search( const sigproc::SSignalRef<T>& signal,
+ int inc)
{
if ( signal.samplerate != samplerate )
throw invalid_argument( "CPattern::find( SSignalRef&): not same samplerate");
return find( signal.signal,
- start, inc);
+ inc);
}
template <typename T>
-size_t
+int
CPattern<T>::
-find( const valarray<T>& signal,
- ssize_t start,
- int inc)
+do_search( const valarray<T>& signal,
+ int inc)
{
valarray<T> fenv_u, fenv_l;
sigproc::envelope(
@@ -134,7 +128,7 @@ find( const valarray<T>& signal,
SPatternPPack<T>::dzcdf_smooth);
return find( fenv_u, fenv_l, ftarget_freq, fdzcdf,
- start, inc);
+ inc);
}
diff --git a/src/ui/sf/sf-patterns.cc b/src/ui/sf/sf-patterns.cc
index 8e47de6..e221157 100644
--- a/src/ui/sf/sf-patterns.cc
+++ b/src/ui/sf/sf-patterns.cc
@@ -21,12 +21,11 @@ using namespace std;
aghui::SScoringFacility::SFindDialog::
SFindDialog (SScoringFacility& parent)
- : Pp {2, 0., 1.5, 1, .1, .5, 3},
+ : Pp {2, 0., 1.5, 1, .1, .5, 3,
+ {.2, .2, .2, .2}},
Pp2 (Pp),
- tolerance (.2, .4, .2, .2),
cpattern (nullptr),
- last_find ((size_t)-1),
- increment (3),
+ increment (.05),
draw_details (true),
_p (parent)
{
@@ -37,15 +36,17 @@ SFindDialog (SScoringFacility& parent)
W_V.reg( _p.ePatternDZCDFStep, &Pp.dzcdf_step);
W_V.reg( _p.ePatternDZCDFSigma, &Pp.dzcdf_sigma);
W_V.reg( _p.ePatternDZCDFSmooth, &Pp.dzcdf_smooth);
- W_V.reg( _p.ePatternParameterA, &tolerance[0]);
- W_V.reg( _p.ePatternParameterB, &tolerance[1]);
- W_V.reg( _p.ePatternParameterC, &tolerance[2]);
- W_V.reg( _p.ePatternParameterD, &tolerance[3]);
+ W_V.reg( _p.ePatternParameterA, &get<0>(Pp.criteria);
+ W_V.reg( _p.ePatternParameterB, &get<1>(Pp.criteria);
+ W_V.reg( _p.ePatternParameterC, &get<2>(Pp.criteria);
+ W_V.reg( _p.ePatternParameterD, &get<3>(Pp.criteria);
}
aghui::SScoringFacility::SFindDialog::
~SFindDialog ()
{
+ if ( cpattern )
+ delete cpattern;
// g_object_unref( mPatterns);
gtk_widget_destroy( (GtkWidget*)_p.wPattern);
}
@@ -283,30 +284,30 @@ load_pattern( const char *label, bool do_globally)
&Pp.env_tightness,
&Pp.bwf_order, &Pp.bwf_ffrom, &Pp.bwf_fupto,
&Pp.dzcdf_step, &Pp.dzcdf_sigma, &Pp.dzcdf_smooth,
- &tolerance[0], &tolerance[1], &tolerance[2], &tolerance[3],
+ &get<0>(Pp.criteria), &get<1>(Pp.criteria), &get<2>(Pp.criteria), &get<3>(Pp.criteria),
&samplerate, &full_sample, &context_before, &context_after) == 14 ) {
- pattern.resize( full_sample);
+ thing.resize( full_sample);
for ( size_t i = 0; i < full_sample; ++i ) {
- double tmp;
- if ( fscanf( fd, "%la", &tmp) != 1 ) {
+ double d;
+ if ( fscanf( fd, "%la", &d) != 1 ) {
fprintf( stderr, "load_pattern(): short read at sample %zu from %s; "
"Removing file\n", i, __buf__);
- pattern.resize( 0);
+ thing.resize( 0);
fclose( fd);
unlink( __buf__);
enumerate_patterns_to_combo();
return;
} else
- pattern[i] = tmp;
+ thing[i] = d;
}
if ( samplerate != field_channel->samplerate() ) {
printf( "Loaded pattern has samplerate different from the current samplerate (%zu vs %zu); it will be resampled now.",
samplerate, field_channel->samplerate());
double fac = (double)field_channel->samplerate() / samplerate;
- pattern =
- sigproc::resample( pattern, 0, full_sample,
+ thing =
+ sigproc::resample( thing, 0, full_sample,
fac * full_sample);
context_before *= fac;
context_after *= fac;
@@ -318,10 +319,10 @@ load_pattern( const char *label, bool do_globally)
set_pattern_da_width( full_sample / field_channel->spp());
} else {
- pattern.resize( 0);
+ thing.resize( 0);
fprintf( stderr, "load_pattern(): corrupted %s; "
"Removing file\n", __buf__);
- pattern.resize( 0);
+ thing.resize( 0);
unlink( __buf__);
enumerate_patterns_to_combo();
}
@@ -364,8 +365,8 @@ save_pattern( const char *label, bool do_globally)
Pp.dzcdf_step, Pp.dzcdf_sigma, Pp.dzcdf_smooth,
tolerance[0], tolerance[1], tolerance[2], tolerance[3],
samplerate, pattern.size(), context_before, context_after);
- for ( size_t i = 0; i < pattern.size(); ++i )
- fprintf( fd, "%a\n", (double)pattern[i]);
+ for ( size_t i = 0; i < thing.size(); ++i )
+ fprintf( fd, "%a\n", (double)thing[i]);
fclose( fd);
}
}
@@ -390,7 +391,7 @@ discard_pattern( const char *label, bool do_globally)
bool
aghui::SScoringFacility::SFindDialog::
-search( ssize_t from)
+search()
{
if ( field_channel && pattern.size() > 0 ) {
if ( !(Pp == Pp2) || field_channel != field_channel_saved) {
@@ -398,19 +399,23 @@ search( ssize_t from)
field_channel_saved = field_channel;
}
cpattern = new sigproc::CPattern<TFloat>
- ({pattern, field_channel->samplerate()},
+ ({thing, field_channel->samplerate()},
context_before, context_after,
Pp);
- last_find = cpattern->find(
+ auto found =
+ (cpattern->find(
field_channel->signal_envelope( Pp.env_tightness).first,
field_channel->signal_envelope( Pp.env_tightness).second,
field_channel->signal_bandpass( Pp.bwf_ffrom, Pp.bwf_fupto, Pp.bwf_order),
field_channel->signal_dzcdf( Pp.dzcdf_step, Pp.dzcdf_sigma, Pp.dzcdf_smooth),
- from, increment);
- match = cpattern->match;
+ increment * samplerate),
+ cpattern->diff);
delete cpattern;
cpattern = nullptr;
+
+ for ( size_t i = 0; i < found.size(); ++i )
+ if
return last_find != (size_t)-1;
} else
return false;
@@ -440,10 +445,10 @@ scandir_filter( const struct dirent *e)
{
return strcmp( e->d_name, ".") && strcmp( e->d_name, "..");
}
+const char
+ *globally_marker = "[global] ";
}
-const char
- *aghui::SScoringFacility::SFindDialog::globally_marker = "[global] ";
void
aghui::SScoringFacility::SFindDialog::
diff --git a/src/ui/sf/sf.hh b/src/ui/sf/sf.hh
index 0cb184f..55e9b4e 100644
--- a/src/ui/sf/sf.hh
+++ b/src/ui/sf/sf.hh
@@ -501,18 +501,13 @@ class SScoringFacility
struct SFindDialog {
DELETE_DEFAULT_METHODS (SFindDialog);
- // own copies of parent's same
- pattern::SPatternPPack<TFloat>
- Pp,
- Pp2;
-
- sigproc::TMatch<TFloat>
- tolerance,
- match;
+ // ctor, dtor
+ SFindDialog (SScoringFacility& parent);
+ ~SFindDialog ();
// loadable
valarray<TFloat>
- pattern;
+ thing;
size_t samplerate;
size_t context_before,
context_after;
@@ -522,48 +517,45 @@ class SScoringFacility
double pattern_length() const; // in seconds
double pattern_length_essential() const;
+ void load_pattern( SScoringFacility::SChannel&); // load selection on this channel
+ void load_pattern( const char* name, bool globally); // load named
+ void save_pattern( const char* name, bool globally);
+ void discard_pattern( const char *label, bool globally);
+
// finding tool
- sigproc::CPattern<TFloat>
+ pattern::SPatternPPack<TFloat>
+ Pp,
+ Pp2;
+ pattern::CPattern<TFloat>
*cpattern;
- size_t last_find;
- int increment;
+ double increment; // in seconds
SScoringFacility::SChannel
*field_channel,
*field_channel_saved;
+ size_t search();
- bool search( ssize_t from);
-
- // ctor, dtor
- SFindDialog (SScoringFacility& parent);
- ~SFindDialog ();
-
+ // draw
bool draw_details:1;
void draw( cairo_t*);
+ float display_scale;
+
+ // widgets
+ SUIVarCollection
+ W_V;
void enumerate_patterns_to_combo();
void preselect_entry( const char*, bool globally);
void preselect_channel( const char*);
void enable_controls( bool);
- SUIVarCollection
- W_V;
-
- float display_scale;
- static const char
- *globally_marker;
- void load_pattern( SScoringFacility::SChannel&); // load selection on this channel
- void load_pattern( const char* name, bool globally); // load named
- void save_pattern( const char* name, bool globally);
- void discard_pattern( const char *label, bool globally);
-
- SScoringFacility&
- _p;
- // widgets
static const int
da_ht = 280;
int da_wd;
void set_pattern_da_width( int);
+
+ SScoringFacility&
+ _p;
};
SFindDialog
find_dialog;
--
Sleep experiment manager
More information about the debian-med-commit
mailing list