1use std::sync::OnceLock;
6
7pub const SR: u32 = 48_000;
10pub const SR_F: f64 = 48_000.0;
12pub const N_FFT: usize = 1 << 17;
14pub const BINS: usize = N_FFT / 2 + 1;
16
17pub fn design_freqs() -> &'static [f64] {
19 static F: OnceLock<Vec<f64>> = OnceLock::new();
20 F.get_or_init(|| {
21 let step = 1.0 / (N_FFT as f64 * (1.0 / SR_F));
22 (0..BINS).map(|k| k as f64 * step).collect()
23 })
24}
25
26#[cfg(test)]
27mod tests {
28 use super::*;
29
30 #[test]
31 fn design_grid_matches_the_dsp_primitive() {
32 let expected = secs_dsp::grid::freqs(N_FFT, SR_F).unwrap();
33 assert_eq!(design_freqs().len(), BINS);
34 assert!(
35 design_freqs()
36 .iter()
37 .zip(&expected)
38 .all(|(a, b)| a.to_bits() == b.to_bits())
39 );
40 }
41}