use crate::tensor::Tensor;
#[derive(Debug, Clone)]
pub struct TemporalSmoothing {
pub kernel: Tensor,
}
impl TemporalSmoothing {
pub fn new_gaussian(dim: usize, kernel_size: usize, sigma: f64) -> Self {
let mut kernel_1d = vec![0.0f32; kernel_size];
let _half = kernel_size as f64 / 2.0;
let mut sum = 0.0f64;
for i in 0..kernel_size {
let x = i as f64 - (kernel_size / 2) as f64;
let v = (-0.5 * (x / sigma) * (x / sigma)).exp();
kernel_1d[i] = v as f32;
sum += v;
}
for v in kernel_1d.iter_mut() {
*v /= sum as f32;
}
let mut data = Vec::with_capacity(dim * kernel_size);
for _ in 0..dim {
data.extend_from_slice(&kernel_1d);
}
Self {
kernel: Tensor::from_vec(data, vec![dim, 1, kernel_size]),
}
}
pub fn new_learnable(dim: usize, kernel_size: usize) -> Self {
Self {
kernel: Tensor::zeros(&[dim, 1, kernel_size]),
}
}
pub fn forward(&self, x: &Tensor) -> Tensor {
x.depthwise_conv1d(&self.kernel)
}
}