use std::f64::consts::PI;
pub fn fourier_basis(t: &[f64], nbasis: usize) -> Vec<f64> {
let t_min = t.iter().copied().fold(f64::INFINITY, f64::min);
let t_max = t.iter().copied().fold(f64::NEG_INFINITY, f64::max);
let period = t_max - t_min;
fourier_basis_with_period(t, nbasis, period)
}
pub fn fourier_basis_with_period(t: &[f64], nbasis: usize, period: f64) -> Vec<f64> {
let n = t.len();
let t_min = t.iter().copied().fold(f64::INFINITY, f64::min);
let mut basis = vec![0.0; n * nbasis];
for (i, &ti) in t.iter().enumerate() {
let x = 2.0 * PI * (ti - t_min) / period;
basis[i] = 1.0;
let mut k = 1;
let mut freq = 1;
while k < nbasis {
if k < nbasis {
basis[i + k * n] = (f64::from(freq) * x).sin();
k += 1;
}
if k < nbasis {
basis[i + k * n] = (f64::from(freq) * x).cos();
k += 1;
}
freq += 1;
}
}
basis
}