public void ShouldExtrapolateTwoPeriodsBackwardAndTwoPeriodsForward() { int period = 24; double[] data = new double[2 * period]; double dx = 2 * Math.PI / period; for (int i = 0; i < data.Length; ++i) { int amplitude = 10 - i / period; data[i] = amplitude * Math.Sin(i * dx); } double[] extendedData = new double[6 * period]; var sssmoother = new CyclicSubSeriesSmoother(7, 1, 1, data.Length, period, 2, 2); sssmoother.Smooth(data, extendedData, null); for (int i = 0; i < extendedData.Length; ++i) { int amplitude = 12 - i / period; // Two extra for the extrapolation before. double value = amplitude * Math.Sin(i * dx); Assert.AreEqual(extendedData[i], value, 1.0e-11, $"Test point {i}"); } }
public void TrendingSinusoidExtrapolationTest() { int period = 24; double[] data = new double[2 * period]; double dx = 2 * Math.PI / period; for (int i = 0; i < data.Length; ++i) { int amplitude = 10 - i / period; data[i] = amplitude * Math.Sin(i * dx); } double[] extendedData = new double[4 * period]; var sssmoother = new CyclicSubSeriesSmoother(7, 1, 1, data.Length, period, 1, 1); sssmoother.Smooth(data, extendedData, null); for (int i = 0; i < extendedData.Length; ++i) { int amplitude = 11 - i / period; // An extra for the extrapolation before. double value = amplitude * Math.Sin(i * dx); Assert.AreEqual(extendedData[i], value, 1.0e-11, $"Test point {i}"); } }