use std::error::Error;
use adaptif::Algorithm;
use adaptif::filters::FilterBase;
use adaptif::types::buffers::NoiseWindowView;
use adaptif::types::signals::{InputSignal, NoiseReference};
use adaptif::types::{BlockSize, WindowSize};
pub struct MyAlgorithm {
pub alpha: f64,
pub window_size: WindowSize,
}
impl Algorithm<f64> for MyAlgorithm {
fn update_step(&mut self, weights: &mut [f64], error: f64, noise_window: NoiseWindowView<f64>) {
for (w, x) in weights.iter_mut().zip(noise_window.iter()) {
*w += self.alpha * error * x;
}
}
fn window_size(&self) -> WindowSize {
self.window_size
}
}
fn main() -> Result<(), Box<dyn Error>> {
let input_signal = InputSignal::new(vec![1.0, -2.5, 3.0])?;
let noise_ref = NoiseReference::new(vec![2.0, -1.2, -3.8])?;
let algorithm_cfg = MyAlgorithm {
alpha: 1.0,
window_size: WindowSize::new(16)?,
};
let block_size = BlockSize::new(1)?;
let mut filter = FilterBase::new(algorithm_cfg, block_size);
let _output = filter.adapt(&input_signal, &noise_ref)?;
Ok(())
}