X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=blobdiff_plain;f=altoslib%2FAltosTimeSeries.java;h=75225e1558d236ae45bdd34e72509fcce48905ab;hp=b5d831be0b6fff843684ff7949fcfa109f3e0d7c;hb=e38e1a2f735a1bb4aebf0817cdd99a05567c6340;hpb=a61217f0a6d0ef48b6471f632c4600255867e831 diff --git a/altoslib/AltosTimeSeries.java b/altoslib/AltosTimeSeries.java index b5d831be..75225e15 100644 --- a/altoslib/AltosTimeSeries.java +++ b/altoslib/AltosTimeSeries.java @@ -12,7 +12,7 @@ * General Public License for more details. */ -package org.altusmetrum.altoslib_12; +package org.altusmetrum.altoslib_13; import java.util.*; @@ -20,15 +20,30 @@ public class AltosTimeSeries implements Iterable, Comparable values; + boolean data_changed; public int compareTo(AltosTimeSeries other) { return label.compareTo(other.label); } public void add(AltosTimeValue tv) { + data_changed = true; values.add(tv); } + public void erase_values() { + data_changed = true; + this.values = new ArrayList(); + } + + public void clear_changed() { + data_changed = false; + } + +// public boolean changed() { +// return data_changed; +// } + public void add(double time, double value) { add(new AltosTimeValue(time, value)); } @@ -150,30 +165,51 @@ public class AltosTimeSeries implements Iterable, Comparable 0) + return values.get(0); + return null; + } + + public AltosTimeValue last() { + if (values.size() > 0) + return values.get(values.size() - 1); + return null; + } + public double average() { - double total = 0; - int count = 0; + double total_value = 0; + double total_time = 0; + AltosTimeValue prev = null; for (AltosTimeValue tv : values) { - total += tv.value; - count++; + if (prev != null) { + total_value += (tv.value + prev.value) / 2 * (tv.time - prev.time); + total_time += (tv.time - prev.time); + } + prev = tv; } - if (count == 0) + if (total_time == 0) return AltosLib.MISSING; - return total / count; + return total_value / total_time; } public double average(double start_time, double end_time) { - double total = 0; - int count = 0; + double total_value = 0; + double total_time = 0; + AltosTimeValue prev = null; for (AltosTimeValue tv : values) { if (start_time <= tv.time && tv.time <= end_time) { - total += tv.value; - count++; + if (prev != null) { + total_value += (tv.value + prev.value) / 2 * (tv.time - start_time); + total_time += (tv.time - start_time); + } + start_time = tv.time; } + prev = tv; } - if (count == 0) + if (total_time == 0) return AltosLib.MISSING; - return total / count; + return total_value / total_time; } public AltosTimeSeries integrate(AltosTimeSeries integral) { @@ -243,14 +279,35 @@ public class AltosTimeSeries implements Iterable, Comparable 0); + return s; + } - return Math.cos(ratio * Math.PI / 2); + private static double kaiser(double n, double m, double beta) { + double alpha = m / 2; + double t = (n - alpha) / alpha; + + if (t > 1 || t < -1) + t = 1; + double k = i0 (beta * Math.sqrt (1 - t*t)) / i0(beta); + return k; + } + + private double filter_coeff(double dist, double width) { + return kaiser(dist + width/2.0, width, 2 * Math.PI); } public AltosTimeSeries filter(AltosTimeSeries f, double width) { + double half_width = width/2; + int half_point = values.size() / 2; for (int i = 0; i < values.size(); i++) { double center_time = values.get(i).time; double left_time = center_time - half_width;