41 #include "EST_error.h"
42 #include "EST_track_aux.h"
43 #include "EST_inline_utils.h"
44 #include "sigpr/EST_fft.h"
45 #include "sigpr/EST_sigpr_frame.h"
46 #include "sigpr/EST_sigpr_utt.h"
48 #include "EST_Features.h"
49 #include "EST_types.h"
50 #include "EST_string_aux.h"
60 static void parse_op_settings(
EST_Features &op, EST_WindowFunc *&wf,
float &f)
65 w_name = op.
S(
"window_type");
67 w_name = DEFAULT_WINDOW_NAME;
70 f = op.
present(
"frame_factor") ? op.
F(
"frame_factor")
71 : DEFAULT_FRAME_FACTOR;
82 else if (delta_order == 1)
84 else if (delta_order == 2)
87 EST_error(
"Requested delta order too high: %d\n", delta_order);
91 for (
EST_Litem *s = types.head(); s; s = s->next())
96 int actual_order = op.
I(t +
"_order");
99 cerr <<
"Invalid " << t <<
"_order" <<
" : ";
100 cerr << actual_order;
101 cerr <<
" (using 1 instead) " << endl;
105 int lowest_coef=0,highest_coef=actual_order-1;
111 highest_coef=actual_order;
119 highest_coef=actual_order;
126 if(actual_order == 1)
129 map.
append(
"$" + t + dos +
"-"+itoString(lowest_coef)+
"+"+itoString(highest_coef));
146 float liftering_parameter=0;
147 bool use_power_rather_than_energy=
false, take_logs=
true, include_c0=
false;
149 parse_op_settings(op, wf, frame_factor);
151 for (
EST_Litem *s = slist.head(); s; s = s->next())
156 if( (slist(s) ==
"melcep") && !op.
present(
"include_c0"))
162 fv.
sub_track(fill, 0, EST_ALL, k +
"_" + start_channel, k +
"_N");
165 cerr <<
"USING POWER" << endl;
167 if ((slist(s) ==
"lpc") || (slist(s) ==
"cep")
168 ||(slist(s) ==
"ref") || (slist(s) ==
"lsf"))
169 sig2coef(sig, fill, slist(s), frame_factor, wf);
170 else if (slist(s) ==
"power")
171 power(sig, fill, frame_factor);
172 else if (slist(s) ==
"energy")
173 energy(sig, fill, frame_factor);
174 else if (slist(s) ==
"f0")
176 op.
set(
"srpd_resize", 0);
177 op.
set(
"pda_frame_shift", op.
F(
"frame_shift"));
178 pda(sig, fill, op,
"srpd");
183 else if (slist(s) ==
"fbank")
185 use_power_rather_than_energy = op.
present(
"usepower");
186 fbank(sig, fill, frame_factor, wf, use_power_rather_than_energy,
190 else if (slist(s) ==
"melcep")
192 fbank_order=op.
I(
"fbank_order");
193 use_power_rather_than_energy = op.
present(
"usepower");
194 include_c0=op.
present(
"include_c0");
197 liftering_parameter=op.
F(
"lifter");
201 melcep(sig, fill, frame_factor, fbank_order,
202 liftering_parameter, wf, include_c0,
203 use_power_rather_than_energy);
206 EST_error(
"Error: Unnknown type of processing requested: %s\n",
207 ((
const char*) slist(s)));
220 if( (k ==
"melcep") && !op.
present(
"include_c0"))
226 fv.
sub_track(base, 0, EST_ALL, k +
"_" + start_channel, k +
"_N");
232 add_channels_to_map(tmp_map, tmp_base, op, 0);
237 base.set_equal_space(
false);
238 sigpr_base(sig, base, op, tmp_base);
244 fv.
sub_track(fill, 0, EST_ALL, k+
"_d", 1);
246 fv.
sub_track(fill, 0, EST_ALL, k+
"_d_" + start_channel, k+
"_d_N");
268 if( (k ==
"melcep") && !op.
present(
"include_c0"))
271 fv.
sub_track(base, 0, EST_ALL, k +
"_d", 1);
272 else if (fv.
has_channel(k +
"_d_" + start_channel))
273 fv.
sub_track(base, 0, EST_ALL, k +
"_d_" + start_channel, k +
"_d_N");
278 add_channels_to_map(tmp_map, tmp_base, op, 1);
283 base.set_equal_space(
false);
284 sigpr_delta(sig, base, op, tmp_base);
288 fv.
sub_track(fill, 0, EST_ALL, k+
"_a", 1);
290 fv.
sub_track(fill, 0, EST_ALL, k+
"_a_" + start_channel, k+
"_a_N");
303 for (
EST_Litem *s = slist.head(); s; s = s->next())
304 sigpr_acc(sig, fv, op, slist(s));
310 for (
EST_Litem *s = slist.head(); s; s = s->next())
311 sigpr_delta(sig, fv, op, slist(s));
316 int i,
int sample_rate,
int prefer_prev)
322 prev = irint((pms.
t(i) - pms.
t(i-1))*sample_rate);
324 next = irint((pms.
t(i+1) - pms.
t(i))*sample_rate);
327 return prev>=0?prev:(next>=0?next:0);
328 return next>=0?next:(prev>=0?prev:0);
331 float get_time_frame_size(
EST_Track &pms,
int i,
int prefer_prev)
337 prev = pms.
t(i) - pms.
t(i-1);
339 next = pms.
t(i+1) - pms.
t(i);
342 return prev>=0 ? prev: (next>=0 ? next : 0.0);
343 return next>=0 ? next: (prev>=0 ? prev : 0.0);
398 float factor, EST_WindowFunc *wf)
408 size = (int)(-1.0 * factor * (
float)sig.
sample_rate());
410 size = irint(get_frame_size(tr, k, sig.
sample_rate())* factor);
411 start = (irint(tr.
t(k) * sig.
sample_rate()) - (size/2));
416 frame_convert(frame,
"sig", coefs, type);
423 int window_start, window_size, pos, k;
431 window_size = (int)(-1.0 * factor * (
float)sig.
sample_rate());
433 window_size = irint(get_frame_size(pow, k, sig.
sample_rate())
435 window_start = pos - window_size/2;
438 sig2pow(frame, pow.
a(k));
445 int window_start, window_size, pos, k;
453 window_size = (int)(-1.0 * factor * (
float)sig.
sample_rate());
455 window_size = irint(get_frame_size(pow, k, sig.
sample_rate())
457 window_start = pos - window_size/2;
460 sig2rms(frame, pow.
a(k));
473 EST_error(
"In track has %d frames, out track has %d\n",
477 tmp = ((in_type ==
"") ? determine_type(in_track.channel_name(0)):in_type);
482 for (
int i = 0; i < in_track.
num_frames(); ++i)
484 in_track.
frame(in_frame, i);
485 out_track.
frame(out_frame, i);
486 frame_convert(in_frame, tmp, out_frame, out_type);
496 const bool use_power_rather_than_energy,
502 int window_start, window_size, pos, k;
511 EST_error(
"Filterbank order of %i makes no sense.\n",fbank_order);
515 for (k = 0; k < fbank_track.
num_frames(); ++k)
518 window_size = (int)(-1.0 * factor * (
float)sig.
sample_rate());
520 window_size = irint(get_frame_size(fbank_track, k, sig.
sample_rate())
523 window_start = pos - window_size/2;
526 fbank_track.
frame(fbank_frame,k);
528 use_power_rather_than_energy,take_log);
539 float liftering_parameter,
541 const bool include_c0,
542 const bool use_power_rather_than_energy)
556 fbank_track.set_equal_space(
false);
562 fbank(sig, fbank_track, factor, wf, use_power_rather_than_energy,
true);
573 mfcc_track.
frame(mfcc_frame,k);
574 fbank_track.
frame(fbank_frame,k);
576 fbank2melcep(fbank_frame, mfcc_frame,liftering_parameter,include_c0);