Try to optimize
This commit is contained in:
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user