summaryrefslogtreecommitdiff
path: root/common/gyro_still_det.c
diff options
context:
space:
mode:
Diffstat (limited to 'common/gyro_still_det.c')
-rw-r--r--common/gyro_still_det.c242
1 files changed, 0 insertions, 242 deletions
diff --git a/common/gyro_still_det.c b/common/gyro_still_det.c
deleted file mode 100644
index 4574e22e5f..0000000000
--- a/common/gyro_still_det.c
+++ /dev/null
@@ -1,242 +0,0 @@
-/* Copyright 2020 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include "gyro_still_det.h"
-#include "vec3.h"
-
-/* Enforces the limits of an input value [0,1]. */
-static fp_t gyro_still_det_limit(fp_t value);
-
-void gyro_still_det_update(struct gyro_still_det *gyro_still_det,
- uint32_t stillness_win_endtime, uint32_t sample_time,
- fp_t x, fp_t y, fp_t z)
-{
- fp_t delta = INT_TO_FP(0);
-
- /*
- * Using the method of the assumed mean to preserve some numerical
- * stability while avoiding per-sample divisions that the more
- * numerically stable Welford method would afford.
- *
- * Reference for the numerical method used below to compute the
- * online mean and variance statistics:
- * 1). en.wikipedia.org/wiki/assumed_mean
- */
-
- /* Increment the number of samples. */
- gyro_still_det->num_acc_samples++;
-
- /* Online computation of mean for the running stillness period. */
- gyro_still_det->mean[X] += x;
- gyro_still_det->mean[Y] += y;
- gyro_still_det->mean[Z] += z;
-
- /* Is this the first sample of a new window? */
- if (gyro_still_det->start_new_window) {
- /* Record the window start time. */
- gyro_still_det->window_start_time = sample_time;
- gyro_still_det->start_new_window = false;
-
- /* Update assumed mean values. */
- gyro_still_det->assumed_mean[X] = x;
- gyro_still_det->assumed_mean[Y] = y;
- gyro_still_det->assumed_mean[Z] = z;
-
- /* Reset current window mean and variance. */
- gyro_still_det->num_acc_win_samples = 0;
- gyro_still_det->win_mean[X] = INT_TO_FP(0);
- gyro_still_det->win_mean[Y] = INT_TO_FP(0);
- gyro_still_det->win_mean[Z] = INT_TO_FP(0);
- gyro_still_det->acc_var[X] = INT_TO_FP(0);
- gyro_still_det->acc_var[Y] = INT_TO_FP(0);
- gyro_still_det->acc_var[Z] = INT_TO_FP(0);
- } else {
- /*
- * Check to see if we have enough samples to compute a stillness
- * confidence score.
- */
- gyro_still_det->stillness_window_ready =
- (sample_time >= stillness_win_endtime) &&
- (gyro_still_det->num_acc_samples > 1);
- }
-
- /* Record the most recent sample time stamp. */
- gyro_still_det->last_sample_time = sample_time;
-
- /* Online window mean and variance ("one-pass" accumulation). */
- gyro_still_det->num_acc_win_samples++;
-
- delta = (x - gyro_still_det->assumed_mean[X]);
- gyro_still_det->win_mean[X] += delta;
- gyro_still_det->acc_var[X] += fp_sq(delta);
-
- delta = (y - gyro_still_det->assumed_mean[Y]);
- gyro_still_det->win_mean[Y] += delta;
- gyro_still_det->acc_var[Y] += fp_sq(delta);
-
- delta = (z - gyro_still_det->assumed_mean[Z]);
- gyro_still_det->win_mean[Z] += delta;
- gyro_still_det->acc_var[Z] += fp_sq(delta);
-}
-
-fp_t gyro_still_det_compute(struct gyro_still_det *gyro_still_det)
-{
- fp_t tmp_denom = INT_TO_FP(1);
- fp_t tmp_denom_mean = INT_TO_FP(1);
- fp_t tmp;
- fp_t upper_var_thresh, lower_var_thresh;
-
- /* Don't divide by zero (not likely, but a precaution). */
- if (gyro_still_det->num_acc_win_samples > 1) {
- tmp_denom = fp_div(
- tmp_denom,
- INT_TO_FP(gyro_still_det->num_acc_win_samples - 1));
- tmp_denom_mean =
- fp_div(tmp_denom_mean,
- INT_TO_FP(gyro_still_det->num_acc_win_samples));
- } else {
- /* Return zero stillness confidence. */
- gyro_still_det->stillness_confidence = 0;
- return gyro_still_det->stillness_confidence;
- }
-
- /* Update the final calculation of window mean and variance. */
- tmp = gyro_still_det->win_mean[X];
- gyro_still_det->win_mean[X] =
- fp_mul(gyro_still_det->win_mean[X], tmp_denom_mean);
- gyro_still_det->win_var[X] =
- fp_mul((gyro_still_det->acc_var[X] -
- fp_mul(gyro_still_det->win_mean[X], tmp)),
- tmp_denom);
-
- tmp = gyro_still_det->win_mean[Y];
- gyro_still_det->win_mean[Y] =
- fp_mul(gyro_still_det->win_mean[Y], tmp_denom_mean);
- gyro_still_det->win_var[Y] =
- fp_mul((gyro_still_det->acc_var[Y] -
- fp_mul(gyro_still_det->win_mean[Y], tmp)),
- tmp_denom);
-
- tmp = gyro_still_det->win_mean[Z];
- gyro_still_det->win_mean[Z] =
- fp_mul(gyro_still_det->win_mean[Z], tmp_denom_mean);
- gyro_still_det->win_var[Z] =
- fp_mul((gyro_still_det->acc_var[Z] -
- fp_mul(gyro_still_det->win_mean[Z], tmp)),
- tmp_denom);
-
- /* Adds the assumed mean value back to the total mean calculation. */
- gyro_still_det->win_mean[X] += gyro_still_det->assumed_mean[X];
- gyro_still_det->win_mean[Y] += gyro_still_det->assumed_mean[Y];
- gyro_still_det->win_mean[Z] += gyro_still_det->assumed_mean[Z];
-
- /* Define the variance thresholds. */
- upper_var_thresh = gyro_still_det->var_threshold +
- gyro_still_det->confidence_delta;
-
- lower_var_thresh = gyro_still_det->var_threshold -
- gyro_still_det->confidence_delta;
-
- /* Compute the stillness confidence score. */
- if ((gyro_still_det->win_var[X] > upper_var_thresh) ||
- (gyro_still_det->win_var[Y] > upper_var_thresh) ||
- (gyro_still_det->win_var[Z] > upper_var_thresh)) {
- /*
- * Sensor variance exceeds the upper threshold (i.e., motion
- * detected). Set stillness confidence equal to 0.
- */
- gyro_still_det->stillness_confidence = 0;
- } else if ((gyro_still_det->win_var[X] <= lower_var_thresh) &&
- (gyro_still_det->win_var[Y] <= lower_var_thresh) &&
- (gyro_still_det->win_var[Z] <= lower_var_thresh)) {
- /*
- * Sensor variance is below the lower threshold (i.e.
- * stillness detected).
- * Set stillness confidence equal to 1.
- */
- gyro_still_det->stillness_confidence = INT_TO_FP(1);
- } else {
- /*
- * Motion detection thresholds not exceeded. Compute the
- * stillness confidence score.
- */
- fp_t var_thresh = gyro_still_det->var_threshold;
- fpv3_t limit;
-
- /*
- * Compute the stillness confidence score.
- * Each axis score is limited [0,1].
- */
- tmp_denom = fp_div(INT_TO_FP(1),
- (upper_var_thresh - lower_var_thresh));
- limit[X] = gyro_still_det_limit(
- FLOAT_TO_FP(0.5f) -
- fp_mul(gyro_still_det->win_var[X] - var_thresh,
- tmp_denom));
- limit[Y] = gyro_still_det_limit(
- FLOAT_TO_FP(0.5f) -
- fp_mul(gyro_still_det->win_var[Y] - var_thresh,
- tmp_denom));
- limit[Z] = gyro_still_det_limit(
- FLOAT_TO_FP(0.5f) -
- fp_mul(gyro_still_det->win_var[Z] - var_thresh,
- tmp_denom));
-
- gyro_still_det->stillness_confidence =
- fp_mul(limit[X], fp_mul(limit[Y], limit[Z]));
- }
-
- /* Return the stillness confidence. */
- return gyro_still_det->stillness_confidence;
-}
-
-void gyro_still_det_reset(struct gyro_still_det *gyro_still_det,
- bool reset_stats)
-{
- fp_t tmp_denom = INT_TO_FP(1);
-
- /* Reset the stillness data ready flag. */
- gyro_still_det->stillness_window_ready = false;
-
- /* Signal to start capture of next stillness data window. */
- gyro_still_det->start_new_window = true;
-
- /* Track the stillness confidence (current->previous). */
- gyro_still_det->prev_stillness_confidence =
- gyro_still_det->stillness_confidence;
-
- /* Track changes in the mean estimate. */
- if (gyro_still_det->num_acc_samples > INT_TO_FP(1))
- tmp_denom =
- fp_div(INT_TO_FP(1), gyro_still_det->num_acc_samples);
-
- gyro_still_det->prev_mean[X] =
- fp_mul(gyro_still_det->mean[X], tmp_denom);
- gyro_still_det->prev_mean[Y] =
- fp_mul(gyro_still_det->mean[Y], tmp_denom);
- gyro_still_det->prev_mean[Z] =
- fp_mul(gyro_still_det->mean[Z], tmp_denom);
-
- /* Reset the current statistics to zero. */
- if (reset_stats) {
- gyro_still_det->num_acc_samples = 0;
- gyro_still_det->mean[X] = INT_TO_FP(0);
- gyro_still_det->mean[Y] = INT_TO_FP(0);
- gyro_still_det->mean[Z] = INT_TO_FP(0);
- gyro_still_det->acc_var[X] = INT_TO_FP(0);
- gyro_still_det->acc_var[Y] = INT_TO_FP(0);
- gyro_still_det->acc_var[Z] = INT_TO_FP(0);
- }
-}
-
-fp_t gyro_still_det_limit(fp_t value)
-{
- if (value < INT_TO_FP(0))
- value = INT_TO_FP(0);
- else if (value > INT_TO_FP(1))
- value = INT_TO_FP(1);
-
- return value;
-}