mod ema;
#[cfg(feature = "moving-average")]
mod moving_avg;
pub use ema::EmaFilter;
#[cfg(feature = "moving-average")]
pub use moving_avg::MovingAvgFilter;
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum NoiseFilter {
None,
ExponentialMovingAverage { alpha: f32 },
#[cfg(feature = "moving-average")]
MovingAverage { window_size: usize },
}
impl NoiseFilter {
pub const fn validate(&self) -> Result<(), &'static str> {
match self {
NoiseFilter::None => Ok(()),
NoiseFilter::ExponentialMovingAverage { alpha } => {
if *alpha <= 0.0 || *alpha > 1.0 {
return Err("EMA alpha must be in range (0.0, 1.0]");
}
Ok(())
}
#[cfg(feature = "moving-average")]
NoiseFilter::MovingAverage { window_size } => {
if *window_size == 0 {
return Err("MovingAverage window_size must be > 0");
}
if *window_size > 32 {
return Err("MovingAverage window_size must be <= 32");
}
Ok(())
}
}
}
}