pub struct Kalman1D {
x_n1: f32,
p_n_n1: f32,
}
impl Kalman1D {
pub const fn new(state_est: f32, est_uncertainty: f32) -> Self {
Self {
x_n1: state_est,
p_n_n1: est_uncertainty,
}
}
pub fn filter<Sf: Fn(f32) -> f32, Pf: Fn(f32) -> f32>(&mut self, z: f32, r: f32, state_est_fn: Sf, var_est_fn: Pf) -> f32 {
let pred_x = (state_est_fn)(self.x_n1);
let pred_p = (var_est_fn)(self.p_n_n1);
let gain = pred_p / (pred_p + r);
self.x_n1 = pred_x + gain * (z - pred_x);
self.p_n_n1 = (1.0 - gain) * pred_p;
self.x_n1
}
}
#[cfg(test)]
mod test {
extern crate std;
use std::prelude::rust_2021::*;
use std::io::Read;
use crate::kalman::Kalman1D;
#[test]
fn test() {
let mut filter = Kalman1D::new(2000.0, 67.4f32.powi(2));
let mut f = std::fs::File::open("test_assets/cap_full_throttle.txt").unwrap();
let mut str = String::new();
f.read_to_string(&mut str).unwrap();
for val in str.lines().flat_map(|s| s.parse::<u16>()) {
let est = filter.filter(val as f32, 191.93f32.powi(2), |x| x, |v| v + 0.001);
std::println!("{:.0}", est);
std::println!("filter uncertainty: {}", filter.p_n_n1)
}
}
}