Skip to main content

rescale_core/
gain.rs

1//! Modul manipulasi gain dan konversi unit decibel.
2
3pub struct Gain;
4
5impl Gain {
6    /// Mengonversi nilai Decibel (dB) ke faktor amplitudo linier.
7    /// Rumus: G = 10^(dB / 20)
8    #[inline(always)]
9    pub fn db_to_linear(db: f32) -> f32 {
10        10.0_f32.powf(db / 20.0)
11    }
12
13    /// Mengonversi faktor amplitudo linier ke Decibel (dB).
14    /// Rumus: dB = 20 * log10(amplitude)
15    #[inline(always)]
16    pub fn linear_to_db(linear: f32) -> f32 {
17        if linear <= 1e-6 {
18            -120.0 // Threshold batas noise floor
19        } else {
20            20.0 * linear.log10()
21        }
22    }
23
24    /// Mengaplikasikan gain linier langsung ke buffer audio in-place.
25    #[inline]
26    pub fn apply_linear(buffer: &mut [f32], factor: f32) {
27        for sample in buffer.iter_mut() {
28            *sample *= factor;
29        }
30    }
31
32    /// Mengaplikasikan perubahan gain dalam dB ke buffer in-place.
33    #[inline]
34    pub fn apply_db(buffer: &mut [f32], db: f32) {
35        let factor = Self::db_to_linear(db);
36        Self::apply_linear(buffer, factor);
37    }
38}