use_acoustics/
pressure.rs1use crate::decibel::REFERENCE_SOUND_PRESSURE_AIR_PA;
2
3#[derive(Clone, Copy, Debug, PartialEq, PartialOrd)]
5pub struct SoundPressurePa(f64);
6
7impl SoundPressurePa {
8 #[must_use]
10 pub fn new(value: f64) -> Option<Self> {
11 if is_valid_positive_scalar(value) {
12 Some(Self(value))
13 } else {
14 None
15 }
16 }
17
18 #[must_use]
20 pub fn value(self) -> f64 {
21 self.0
22 }
23
24 #[must_use]
26 pub fn level_db_spl(self) -> f64 {
27 20.0 * (self.0.log10() - REFERENCE_SOUND_PRESSURE_AIR_PA.log10())
28 }
29}
30
31#[must_use]
33pub fn pressure_from_spl_db(db_spl: f64) -> Option<f64> {
34 if !db_spl.is_finite() {
35 return None;
36 }
37
38 let pressure = REFERENCE_SOUND_PRESSURE_AIR_PA * 10.0_f64.powf(db_spl / 20.0);
39
40 if pressure.is_finite() && pressure > 0.0 {
41 Some(pressure)
42 } else {
43 None
44 }
45}
46
47fn is_valid_positive_scalar(value: f64) -> bool {
48 value.is_finite() && value > 0.0
49}