mirror of
https://github.com/librespot-org/librespot.git
synced 2025-10-03 17:59:24 +02:00
Quantum-realm level normalisation optimization (#965)
This saves up to 1-2% CPU useage on a PI 4 depending on how much normalisation is actually being done. * We don't need to test against EPSILON. The factor will never be over 1.0 in basic normalisation mode. * Don't check the normalisation mode EVERY sample. * Do as little math as possible by simplfiying all equations as much as possible (while still retaining the textbook equations in comments). * Misc cleanup
This commit is contained in:
parent
cb194cfd3b
commit
616809b64c
3 changed files with 96 additions and 97 deletions
|
@ -3,7 +3,7 @@ use rand::SeedableRng;
|
|||
use rand_distr::{Distribution, Normal, Triangular, Uniform};
|
||||
use std::fmt;
|
||||
|
||||
const NUM_CHANNELS: usize = 2;
|
||||
use crate::NUM_CHANNELS;
|
||||
|
||||
// Dithering lowers digital-to-analog conversion ("requantization") error,
|
||||
// linearizing output, lowering distortion and replacing it with a constant,
|
||||
|
@ -102,7 +102,7 @@ impl GaussianDitherer {
|
|||
|
||||
pub struct HighPassDitherer {
|
||||
active_channel: usize,
|
||||
previous_noises: [f64; NUM_CHANNELS],
|
||||
previous_noises: [f64; NUM_CHANNELS as usize],
|
||||
cached_rng: SmallRng,
|
||||
distribution: Uniform<f64>,
|
||||
}
|
||||
|
@ -111,7 +111,7 @@ impl Ditherer for HighPassDitherer {
|
|||
fn new() -> Self {
|
||||
Self {
|
||||
active_channel: 0,
|
||||
previous_noises: [0.0; NUM_CHANNELS],
|
||||
previous_noises: [0.0; NUM_CHANNELS as usize],
|
||||
cached_rng: create_rng(),
|
||||
distribution: Uniform::new_inclusive(-0.5, 0.5), // 1 LSB +/- 1 LSB (previous) = 2 LSB
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue