Skip to main content

use_acoustics/
frequency.rs

1use std::f64::consts::PI;
2
3/// A validated acoustic frequency in hertz.
4#[derive(Clone, Copy, Debug, PartialEq, PartialOrd)]
5pub struct FrequencyHz(f64);
6
7impl FrequencyHz {
8    /// Creates a validated frequency in hertz.
9    #[must_use]
10    pub fn new(value: f64) -> Option<Self> {
11        if is_valid_frequency(value) {
12            Some(Self(value))
13        } else {
14            None
15        }
16    }
17
18    /// Returns the stored frequency value.
19    #[must_use]
20    pub fn value(self) -> f64 {
21        self.0
22    }
23
24    /// Returns the period in seconds for this frequency.
25    #[must_use]
26    pub fn period_seconds(self) -> f64 {
27        1.0 / self.0
28    }
29
30    /// Returns the angular frequency in radians per second.
31    #[must_use]
32    pub fn angular_frequency_rad_per_s(self) -> f64 {
33        2.0 * PI * self.0
34    }
35}
36
37/// Returns the period in seconds for a validated frequency.
38#[must_use]
39pub fn period_seconds(frequency_hz: f64) -> Option<f64> {
40    FrequencyHz::new(frequency_hz).map(FrequencyHz::period_seconds)
41}
42
43/// Returns the angular frequency in radians per second for a validated frequency.
44#[must_use]
45pub fn angular_frequency_rad_per_s(frequency_hz: f64) -> Option<f64> {
46    FrequencyHz::new(frequency_hz).map(FrequencyHz::angular_frequency_rad_per_s)
47}
48
49fn is_valid_frequency(value: f64) -> bool {
50    value.is_finite() && value > 0.0
51}