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}