/** * @file welford_mean.h * @author liuyang (liuyangzys@outlook.com) * @brief Welford's online algorithm for computing mean and variance * @version 0.1 * @date 2023-07-20 * * @copyright Copyright (c) 2023 * */ #pragma once #include #include #include typedef struct { float _mean; float _M2; float _mean_accum; float _M2_accum; uint16_t _count; } WelfordMean_t; bool welford_mean_valid(WelfordMean_t *wm); void welford_mean_reset(WelfordMean_t *wm); bool welford_mean_updata(WelfordMean_t *wm, float new_val); int welford_mean_get_count(WelfordMean_t *wm); float welford_mean_get_mean(WelfordMean_t *wm); float welford_mean_get_variance(WelfordMean_t *wm); float welford_mean_get_stddev(WelfordMean_t *wm); typedef struct { float _mean[3]; float _mean_accum[3]; float _M2[3][3]; float _M2_accum[3][3]; uint16_t _count; } WelfordMeanVector3f_t; bool welford_mean_vector3f_valid(WelfordMeanVector3f_t *wm); void welford_mean_vector3f_reset(WelfordMeanVector3f_t *wm); bool welford_mean_vector3f_updata(WelfordMeanVector3f_t *wm, float new_val[3]); int welford_mean_vector3f_get_count(WelfordMeanVector3f_t *wm); bool welford_mean_vector3f_get_mean(WelfordMeanVector3f_t *wm, float mean[3]); bool welford_mean_vector3f_get_variance(WelfordMeanVector3f_t *wm, float variance[3]); float welford_mean_vector3f_get_covariance(WelfordMeanVector3f_t *wm, int x, int y);