45#include "EST_track_aux.h"
46#include "EST_Features.h"
106 op.
set(
"start_limit", 0.1);
107 op.
set(
"stop_limit", 0.1);
108 op.
set(
"range", 0.3);
109 op.
set(
"min_event_duration", 0.03);
122 cout <<
"rfc_recognise\n";
126 int_segment_to_unit(
ev,
eva);
130 cout <<
"rfc_recognise\n";
135 for (
e =
ev.head();
e != 0;
e = n)
146 cout <<
"start = " <<
e->F(
"start") <<
" End "
147 <<
e->F(
"end")<<
endl;
154 op.
F(
"min_event_duration")))
155 rf_match(
part, *
e, op.
F(
"range"));
164 make_int_item(*
tmp,
"sil",
fz.t(0),
fz.t(
fz.num_frames() - 1),
172 convert_to_local(
ev);
177 ev.f.set(
"intonation_style",
"rfc");
181 cout <<
"After RFC analysis\n";
196 if (
e->S(
"rfc.type",
"0") ==
"RISEFALL")
198 e->set(
"rfc.rise_amp", (
e->F(
"rfc.peak_f0") -
e->F(
"ev.start_f0")));
199 e->set(
"rfc.rise_dur", (
e->F(
"rfc.peak_pos") -
e->F(
"start")));
200 e->set(
"rfc.fall_amp", (
e->F(
"rfc.end_f0") -
e->F(
"rfc.peak_f0")));
201 e->set(
"rfc.fall_dur", (
e->F(
"end") -
e->F(
"rfc.peak_pos")));
202 e->set(
"ev.f0",
e->F(
"rfc.peak_f0"));
205 e->A(
"rfc").remove(
"peak_f0");
206 e->A(
"rfc").remove(
"peak_pos");
207 e->A(
"rfc").remove(
"end_f0");
208 e->A(
"rfc").remove(
"type");
209 e->A(
"ev").remove(
"start_f0");
211 else if (
e->S(
"rfc.type",
"0") ==
"RISE")
213 e->set(
"rfc.rise_amp", (
e->F(
"rfc.end_f0") -
e->F(
"ev.start_f0")));
214 e->set(
"rfc.rise_dur", (
e->F(
"end") -
e->F(
"start")));
215 e->set(
"rfc.fall_amp", 0.0);
216 e->set(
"rfc.fall_dur", 0.0);
217 e->set(
"ev.f0",
e->F(
"rfc.end_f0"));
220 e->A(
"rfc").remove(
"peak_f0");
221 e->A(
"rfc").remove(
"peak_pos");
222 e->A(
"rfc").remove(
"end_f0");
223 e->A(
"rfc").remove(
"type");
224 e->A(
"ev").remove(
"start_f0");
226 else if (
e->S(
"rfc.type",
"0") ==
"FALL")
228 e->set(
"rfc.rise_amp", 0.0);
229 e->set(
"rfc.rise_dur", 0.0);
230 e->set(
"rfc.fall_amp", (
e->F(
"rfc.end_f0") -
e->F(
"ev.start_f0")));
231 e->set(
"rfc.fall_dur", (
e->F(
"end") -
e->F(
"start")));
232 e->set(
"ev.f0",
e->F(
"ev.start_f0"));
234 e->A(
"rfc").remove(
"peak_f0");
235 e->A(
"rfc").remove(
"peak_pos");
236 e->A(
"rfc").remove(
"end_f0");
237 e->A(
"rfc").remove(
"type");
238 e->A(
"ev").remove(
"start_f0");
240 if (!
e->f_present(
"time"))
241 e->set(
"time", (
e->F(
"end") -
e->F(
"rfc.fall_dur")));
248 for (
e =
ev.head();
e;
e = inext(
e))
255 ev.remove_item_feature(
"ev.start_f0");
256 ev.remove_item_feature(
"start");
258 ev.remove_item_feature(
"end");
261 ev.f.set(
"timing_style",
"event");
275 EST_error(
"Illegal start and end times: %f %f\n", start, end);
288 tr_tmp.rm_trailing_breaks();
302 cout <<
"Contour too small for analysis\n";
306 for (i = 0; i <
tr_tmp.num_frames(); ++i)
307 if (
tr_tmp.track_break(i))
325 for (i = 0; i <
tr_tmp.num_frames(); ++i)
326 if (
tr_tmp.track_break(i))
334 for (;(i <
tr_tmp.num_frames()) && (
tr_tmp.track_break(i)); ++i)
349 part.rm_trailing_breaks();
359 for (
int i = 0; i <
fz.num_frames() - 1; ++i)
360 if ((
fz.a(i) >= 0.0) && (
fz.a(i + 1) < 0.0))
379 if (
fz.num_frames() <= 0)
381 ev.set(
"start", 0.0);
383 ev.set(
"rfc", empty);
384 ev.set(
"ev.start_f0", 0.0);
385 ev.set(
"rfc.peak_f0", 0.0);
386 ev.set(
"rfc.peak_pos", 0.0);
394 n = zero_cross(
diff);
417 ev.set(
"ev.start_f0",
fz.a(start));
418 ev.set(
"start",
fz.t(start));
439 ev.set(
"rfc.peak_f0",
fz.a(start));
440 ev.set(
"rfc.peak_pos",
fz.t(start));
444 ev.set(
"rfc.type",
"RISEFALL");
475 ev.set(
"start",
fz.t(start));
476 ev.set(
"ev.start_f0",
fz.a(start));
477 ev.set(
"rfc.peak_f0", 0.0);
478 ev.set(
"rfc.peak_pos", 0.0);
485 if (
fz.a(
fz.index(
fz.start())) <
fz.a(
fz.index(
fz.end())))
486 ev.set(
"rfc.type",
"RISE");
488 ev.set(
"rfc.type",
"FALL");
500 for (
e =
ev.head();
e;
e = inext(
e))
503 i =
fz.prev_non_break(
fz.index(
e->F(
"start")));
505 e->set(
"ev.start_f0",
fz.a(i));
506 i =
fz.next_non_break(
fz.index(
e->F(
"end")));
507 e->set(
"ev.end_f0",
fz.a(i));
518 for (
e =
ev.head();
e;
e = n)
525 s =
e->insert_before();
526 s->
set(
"name",
"phrase_end");
527 s->
set(
"ev.f0",
e->F(
"ev.start_f0"));
528 s->
set(
"time",
e->F(
"start"));
532 s =
e->insert_after();
533 s->
set(
"name",
"phrase_start");
534 s->
set(
"ev.f0",
e->F(
"ev.end_f0"));
535 s->
set(
"time",
e->F(
"end"));
540 for (
e =
ev.head();
e;
e = n)
607 const EST_String name,
float end,
float start,
608 float start_f0,
float peak_pos,
615 tmp.set(
"start", start);
618 tmp.set(
"ev.start_f0", start_f0);
620 if ((name !=
"sil") && (name !=
"c"))
623 tmp.set(
"rfc.peak_pos", peak_pos);
624 tmp.set(
"rfc.peak_f0", peak_f0);
625 tmp.set(
"rfc.pos", 1);
633 float distance = 0.0;
646static float weight(
float duration)
672 cerr <<
"Illegal beginning search region in match_rf_point:" <<
678 cerr <<
"Illegal ending search region in match_rf_point:" <<
695 duration = e_pos - s_pos;
699 for (k = 0; k < length + 1; ++k)
702 new_fz.a(k) = (amp * fncurve(duration, t, 2.0))
708 ndist *= weight(duration);
void set(const EST_String &name, int ival)
const float F(const EST_String &path) const
int present(const EST_String &name) const
void set(const EST_String &name, int ival)