pub struct Interpolator {
y: [f64; 4],
coefficients: [f64; 3]
}
impl Interpolator {
pub fn new() -> Self {
Self {
y: [0.0; 4],
coefficients: [0.0; 3],
}
}
pub fn feed(&mut self, input: f64) {
self.y[0] = self.y[1];
self.y[1] = self.y[2];
self.y[2] = self.y[3];
self.y[3] = input;
let y1 = self.y[2] - self.y[0];
self.coefficients[0] = 0.5 * self.y[1] + 0.25 * (self.y[0] + self.y[2]);
self.coefficients[1] = 0.5 * y1;
self.coefficients[2] = 0.25 * (self.y[3] - self.y[1] - y1);
}
pub fn interpolate(&self, x: f64) -> f64 {
(self.coefficients[2] * x + self.coefficients[1]) * x + self.coefficients[0]
}
}