double PointProcess_getStdevPeriod (PointProcess me, double tmin, double tmax, double minimumPeriod, double maximumPeriod, double maximumPeriodFactor) { if (tmax <= tmin) tmin = my xmin, tmax = my xmax; // autowindowing long imin, imax; long numberOfPeriods = PointProcess_getWindowPoints (me, tmin, tmax, & imin, & imax) - 1; if (numberOfPeriods < 2) return NUMundefined; /* * Compute mean. */ double sum = 0.0; for (long i = imin; i < imax; i ++) { if (PointProcess_isPeriod (me, i, minimumPeriod, maximumPeriod, maximumPeriodFactor)) { sum += my t [i + 1] - my t [i]; // this interval counts as a period } else { numberOfPeriods --; // this interval does not count as a period } } if (numberOfPeriods < 2) return NUMundefined; double mean = sum / numberOfPeriods; /* * Compute variance. */ double sum2 = 0.0; for (long i = imin; i < imax; i ++) { if (PointProcess_isPeriod (me, i, minimumPeriod, maximumPeriod, maximumPeriodFactor)) { double dperiod = my t [i + 1] - my t [i] - mean; sum2 += dperiod * dperiod; } } /* * Compute standard deviation. */ return sqrt (sum2 / (numberOfPeriods - 1)); }
autoAmplitudeTier PointProcess_Sound_to_AmplitudeTier_point (PointProcess me, Sound thee) { try { long imin, imax, numberOfPeaks = PointProcess_getWindowPoints (me, my xmin, my xmax, & imin, & imax); if (numberOfPeaks < 3) return nullptr; autoAmplitudeTier him = AmplitudeTier_create (my xmin, my xmax); for (long i = imin; i <= imax; i ++) { double value = Vector_getValueAtX (thee, my t [i], Vector_CHANNEL_AVERAGE, Vector_VALUE_INTERPOLATION_SINC700); if (NUMdefined (value)) RealTier_addPoint (him.peek(), my t [i], value); } return him; } catch (MelderError) { Melder_throw (me, U" & ", thee, U": not converted to AmplitudeTier."); } }
long PointProcess_getNumberOfPeriods (PointProcess me, double tmin, double tmax, double minimumPeriod, double maximumPeriod, double maximumPeriodFactor) { if (tmax <= tmin) tmin = my xmin, tmax = my xmax; // autowindowing long imin, imax; long numberOfPeriods = PointProcess_getWindowPoints (me, tmin, tmax, & imin, & imax) - 1; if (numberOfPeriods < 1) return 0; for (long i = imin; i < imax; i ++) { if (PointProcess_isPeriod (me, i, minimumPeriod, maximumPeriod, maximumPeriodFactor)) { (void) 0; // this interval counts as a period } else { numberOfPeriods --; // this interval does not count as a period } } return numberOfPeriods; }
double PointProcess_getMeanPeriod (PointProcess me, double tmin, double tmax, double minimumPeriod, double maximumPeriod, double maximumPeriodFactor) { if (tmax <= tmin) tmin = my xmin, tmax = my xmax; // autowindowing long imin, imax; long numberOfPeriods = PointProcess_getWindowPoints (me, tmin, tmax, & imin, & imax) - 1; if (numberOfPeriods < 1) return NUMundefined; double sum = 0.0; for (long i = imin; i < imax; i ++) { if (PointProcess_isPeriod (me, i, minimumPeriod, maximumPeriod, maximumPeriodFactor)) { sum += my t [i + 1] - my t [i]; // this interval counts as a period } else { numberOfPeriods --; // this interval does not count as a period } } return numberOfPeriods > 0 ? sum / numberOfPeriods : NUMundefined; }
autoAmplitudeTier PointProcess_Sound_to_AmplitudeTier_period (PointProcess me, Sound thee, double tmin, double tmax, double pmin, double pmax, double maximumPeriodFactor) { try { if (tmax <= tmin) tmin = my xmin, tmax = my xmax; long imin, imax; long numberOfPeaks = PointProcess_getWindowPoints (me, tmin, tmax, & imin, & imax); if (numberOfPeaks < 3) Melder_throw (U"Too few pulses between ", tmin, U" and ", tmax, U" seconds."); autoAmplitudeTier him = AmplitudeTier_create (tmin, tmax); for (long i = imin + 1; i < imax; i ++) { double p1 = my t [i] - my t [i - 1], p2 = my t [i + 1] - my t [i]; double intervalFactor = p1 > p2 ? p1 / p2 : p2 / p1; if (pmin == pmax || (p1 >= pmin && p1 <= pmax && p2 >= pmin && p2 <= pmax && intervalFactor <= maximumPeriodFactor)) { double peak = Sound_getHannWindowedRms (thee, my t [i], 0.2 * p1, 0.2 * p2); if (NUMdefined (peak) && peak > 0.0) RealTier_addPoint (him.peek(), my t [i], peak); } } return him; } catch (MelderError) { Melder_throw (me, U" & ", thee, U": not converted to AmplitudeTier."); } }