autoIntensityTier IntensityTier_PointProcess_to_IntensityTier (IntensityTier me, PointProcess pp) { try { if (my points -> size == 0) Melder_throw (U"No intensity points."); autoIntensityTier thee = IntensityTier_create (pp -> xmin, pp -> xmax); for (long i = 1; i <= pp -> nt; i ++) { double time = pp -> t [i]; double value = RealTier_getValueAtTime (me, time); RealTier_addPoint (thee.peek(), time, value); } return thee; } catch (MelderError) { Melder_throw (me, U" & ", pp, U": not converted to IntensityTier."); } }
IntensityTier Formant_and_Spectrogram_to_IntensityTier (Formant me, Spectrogram thee, long iformant) { try { if (my xmin != thy xmin || my xmax != thy xmax) { Melder_throw ("The start and end times of the Formant and the Spectrogram must be equal."); } if (iformant < 1 || iformant > my maxnFormants) { Melder_throw ("Formant number not in range [1, ", my maxnFormants, "]."); } autoIntensityTier him = IntensityTier_create (my xmin, my xmax); double previousValue = -80000; // can never occur double previousTime = my xmin; for (long iframe = 1; iframe <= my nx; iframe++) { Formant_Frame frame = & my d_frames [iframe]; long numberOfFormants = frame -> nFormants; double time = Sampled_indexToX (me, iframe); double value = 0; if (iformant <= numberOfFormants) { double f = frame -> formant[iformant].frequency; value = Matrix_getValueAtXY (thee, time, f); value = value == NUMundefined ? 0.0 : value; } value = 10.0 * log10 ((value + 1e-30) / 4.0e-10); /* dB / Hz */ if (value != previousValue) { if (iframe > 1 && previousTime < time - 1.5 * my dx) { // mark the end of the same interval RealTier_addPoint (him.peek(), time - my dx, previousValue); } RealTier_addPoint (him.peek(), time, value); previousTime = time; } previousValue = value; } return him.transfer(); } catch (MelderError) { Melder_throw ("IntensityTier not created from ", me, " and ", thee, "."); } }