Try to optimize

This commit is contained in:
2026-01-29 11:53:47 +01:00
parent 4d0d837e14
commit 845c1134fe
14 changed files with 764 additions and 214 deletions

View File

@@ -85,6 +85,7 @@ struct SpectrumAnalyzer {
fft: Arc<dyn rustfft::Fft<f32>>,
window: [f32; FFT_SIZE],
scratch: Vec<Complex<f32>>,
fft_buf: Vec<Complex<f32>>,
band_edges: [usize; NUM_BANDS + 1],
}
@@ -114,6 +115,7 @@ impl SpectrumAnalyzer {
fft,
window,
scratch: vec![Complex::default(); scratch_len],
fft_buf: vec![Complex::default(); FFT_SIZE],
band_edges,
}
}
@@ -130,20 +132,19 @@ impl SpectrumAnalyzer {
}
fn run_fft(&mut self, output: &SpectrumBuffer) {
let mut buf: Vec<Complex<f32>> = (0..FFT_SIZE)
.map(|i| {
let idx = (self.pos + i) % FFT_SIZE;
Complex::new(self.ring[idx] * self.window[i], 0.0)
})
.collect();
for i in 0..FFT_SIZE {
let idx = (self.pos + i) % FFT_SIZE;
self.fft_buf[i] = Complex::new(self.ring[idx] * self.window[i], 0.0);
}
self.fft.process_with_scratch(&mut buf, &mut self.scratch);
self.fft
.process_with_scratch(&mut self.fft_buf, &mut self.scratch);
let mut bands = [0.0f32; NUM_BANDS];
for (band, mag) in bands.iter_mut().enumerate() {
let lo = self.band_edges[band];
let hi = self.band_edges[band + 1].max(lo + 1);
let sum: f32 = buf[lo..hi].iter().map(|c| c.norm()).sum();
let sum: f32 = self.fft_buf[lo..hi].iter().map(|c| c.norm()).sum();
let avg = sum / (hi - lo) as f32;
let amplitude = avg / (FFT_SIZE as f32 / 2.0);
let db = 20.0 * amplitude.max(1e-10).log10();