use scirs2_core::numeric::Complex64;
#[non_exhaustive]
#[derive(Debug, Clone)]
pub struct CyclostationaryConfig {
pub cyclic_freqs: Option<Vec<f64>>,
pub alpha_resolution: f64,
pub n_fft: usize,
pub overlap: f64,
pub fs: f64,
pub detection_threshold: f64,
}
impl Default for CyclostationaryConfig {
fn default() -> Self {
Self {
cyclic_freqs: None,
alpha_resolution: 0.01,
n_fft: 512,
overlap: 0.5,
fs: 1.0,
detection_threshold: 0.1,
}
}
}
#[derive(Debug, Clone)]
pub struct SpectralCorrelationResult {
pub scd: Vec<Vec<Complex64>>,
pub cyclic_frequencies: Vec<f64>,
pub spectral_frequencies: Vec<f64>,
}
impl SpectralCorrelationResult {
pub fn n_alphas(&self) -> usize {
self.scd.len()
}
pub fn n_freqs(&self) -> usize {
self.scd.first().map(|v| v.len()).unwrap_or(0)
}
pub fn cyclic_power_spectrum(&self) -> Vec<f64> {
self.scd
.iter()
.map(|row| {
let sum_sq: f64 = row.iter().map(|c| c.re * c.re + c.im * c.im).sum();
(sum_sq / row.len().max(1) as f64).sqrt()
})
.collect()
}
}