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.");
	}
}
Beispiel #2
0
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, ".");
	}
}