use ndarray::Array1;
use rustfft::FftPlanner;
use super::spectra::SpectrumResult;
use super::window_and_fft;
use crate::compute::error::ComputeError;
use crate::compute::traits::Fit;
#[derive(Debug, Clone, Copy, Default)]
pub struct VcdSpectrum;
impl Fit for VcdSpectrum {
type Input<'a> = (&'a Array1<f64>, f64);
type Output = SpectrumResult;
fn fit<'a>(&self, input: Self::Input<'a>) -> Result<Self::Output, ComputeError> {
let (acf, dt_fs) = input;
let n = acf.len();
if n == 0 {
return Err(ComputeError::EmptyInput);
}
if dt_fs <= 0.0 {
return Err(ComputeError::OutOfRange {
field: "dt_fs",
value: dt_fs.to_string(),
});
}
let mut planner = FftPlanner::new();
let (frequencies_cm1, intensities) = window_and_fft(&mut planner, acf, dt_fs)?;
Ok(SpectrumResult {
frequencies_cm1,
intensities,
resolution: n - 1,
n_frames: n,
})
}
}