diff options
Diffstat (limited to 'altoslib/AltosState.java')
-rw-r--r-- | altoslib/AltosState.java | 48 |
1 files changed, 31 insertions, 17 deletions
diff --git a/altoslib/AltosState.java b/altoslib/AltosState.java index 7817c76a..a920d425 100644 --- a/altoslib/AltosState.java +++ b/altoslib/AltosState.java @@ -30,7 +30,8 @@ public class AltosState implements Cloneable { public int set; - static final double filter_len = 0.5; + static final double ascent_filter_len = 0.1; + static final double descent_filter_len = 2.0; /* derived data */ @@ -102,29 +103,42 @@ public class AltosState implements Cloneable { } void set_derivative(AltosValue in) { - double new_value = in.rate(); + double n = in.rate(); - if (new_value == AltosRecord.MISSING) + if (n == AltosRecord.MISSING) return; + double p = prev_value; + double pt = prev_set_time; + + if (p == AltosRecord.MISSING) { + p = 0; + pt = in.time() - 0.01; + } + /* Clip changes to reduce noise */ - if (prev_value != AltosRecord.MISSING) { - double ddt = in.time() - prev_set_time; - double ddv = (new_value - prev_value) / ddt; + double ddt = in.time() - pt; + double ddv = (n - p) / ddt; - /* 100gs */ - if (Math.abs(ddv) > 1000) { - if (new_value > prev_value) - new_value = prev_value + ddt * 1000; - else - new_value = prev_value - ddt * 1000; - } - - double f = 1/Math.exp(ddt/ filter_len); - new_value = prev_value * f + new_value * (1-f); + /* 100gs */ + if (Math.abs(ddv) > 1000) { + if (n > p) + n = p + ddt * 1000; + else + n = p - ddt * 1000; } - set(new_value, in.time()); + double filter_len; + + if (ascent) + filter_len = ascent_filter_len; + else + filter_len = descent_filter_len; + + double f = 1/Math.exp(ddt/ filter_len); + n = p * f + n * (1-f); + + set(n, in.time()); } void set_integral(AltosValue in) { |