int RealTier_interpolateQuadratically (I, long numberOfPointsPerParabola, int logarithmically) { iam (RealTier); RealTier thee = (structRealTier *)Data_copy (me); cherror for (long ipoint = 1; ipoint < my points -> size; ipoint ++) { RealPoint point1 = (structRealPoint *)my points -> item [ipoint], point2 = (structRealPoint *)my points -> item [ipoint + 1]; double time1 = point1 -> time, time2 = point2 -> time, tmid = 0.5 * (time1 + time2); double value1 = point1 -> value, value2 = point2 -> value, valuemid; double timeStep = (tmid - time1) / (numberOfPointsPerParabola + 1); if (logarithmically) value1 = log (value1), value2 = log (value2); valuemid = 0.5 * (value1 + value2); /* * Left from the midpoint. */ for (long inewpoint = 1; inewpoint <= numberOfPointsPerParabola; inewpoint ++) { double newTime = time1 + inewpoint * timeStep; double phase = (newTime - time1) / (tmid - time1); double newValue = value1 + (valuemid - value1) * phase * phase; if (logarithmically) newValue = exp (newValue); RealTier_addPoint (thee, newTime, newValue); cherror } /* * The midpoint. */ RealTier_addPoint (thee, tmid, logarithmically ? exp (valuemid) : valuemid); cherror /* * Right from the midpoint. */ for (long inewpoint = 1; inewpoint <= numberOfPointsPerParabola; inewpoint ++) { double newTime = tmid + inewpoint * timeStep; double phase = (time2 - newTime) / (time2 - tmid); double newValue = value2 + (valuemid - value2) * phase * phase; if (logarithmically) newValue = exp (newValue); RealTier_addPoint (thee, newTime, newValue); cherror } } end: iferror { forget (thee); return 0; } Thing_swap (me, thee); forget (thee); return 1; }
void RealTier_interpolateQuadratically (RealTier me, long numberOfPointsPerParabola, int logarithmically) { try { autoRealTier thee = Data_copy (me); for (long ipoint = 1; ipoint < my points.size; ipoint ++) { RealPoint point1 = my points.at [ipoint], point2 = my points.at [ipoint + 1]; double time1 = point1 -> number, time2 = point2 -> number, tmid = 0.5 * (time1 + time2); double value1 = point1 -> value, value2 = point2 -> value, valuemid; double timeStep = (tmid - time1) / (numberOfPointsPerParabola + 1); if (logarithmically) value1 = log (value1), value2 = log (value2); valuemid = 0.5 * (value1 + value2); /* * Left from the midpoint. */ for (long inewpoint = 1; inewpoint <= numberOfPointsPerParabola; inewpoint ++) { double newTime = time1 + inewpoint * timeStep; double phase = (newTime - time1) / (tmid - time1); double newValue = value1 + (valuemid - value1) * phase * phase; if (logarithmically) newValue = exp (newValue); RealTier_addPoint (thee.get(), newTime, newValue); } /* * The midpoint. */ RealTier_addPoint (thee.get(), tmid, logarithmically ? exp (valuemid) : valuemid); /* * Right from the midpoint. */ for (long inewpoint = 1; inewpoint <= numberOfPointsPerParabola; inewpoint ++) { double newTime = tmid + inewpoint * timeStep; double phase = (time2 - newTime) / (time2 - tmid); double newValue = value2 + (valuemid - value2) * phase * phase; if (logarithmically) newValue = exp (newValue); RealTier_addPoint (thee.get(), newTime, newValue); } } Thing_swap (me, thee.get()); } catch (MelderError) { Melder_throw (me, U": not interpolated quadratically."); } }