lc3_codec/common/
config.rs

1#[derive(Clone, Copy)]
2pub enum SamplingFrequency {
3    Hz8000,
4    Hz16000,
5    Hz24000,
6    Hz32000,
7    Hz44100,
8    Hz48000,
9}
10
11#[derive(Debug, Clone, Copy, PartialEq, Eq)]
12pub enum FrameDuration {
13    SevenPointFiveMs,
14    TenMs,
15}
16
17#[derive(Clone, Copy)]
18pub struct Lc3Config {
19    /// Sampling frequency index (e.g. 4)
20    pub fs_ind: usize,
21
22    /// Sampling frequency in hz (e.g. 48000)
23    pub fs: usize,
24
25    /// Number of encoded spectral lines (per frame and channel) (e.g. 400)
26    pub ne: usize,
27
28    /// Frame duration in milliseconds (e.g. TenMs)
29    pub n_ms: FrameDuration,
30
31    /// Number of bands (e.g. 64)
32    pub nb: usize,
33
34    /// Number of samples processed in one frame of one channel (also known as frame size) (e.g. 480)
35    pub nf: usize,
36
37    /// Number of leading zeros in MDCT window (e.g. 180)
38    pub z: usize,
39}
40
41impl Lc3Config {
42    pub const fn new(sampling_frequency: SamplingFrequency, frame_duration: FrameDuration) -> Self {
43        let (fs_ind, fs) = match sampling_frequency {
44            SamplingFrequency::Hz8000 => (0, 8000),
45            SamplingFrequency::Hz16000 => (1, 16000),
46            SamplingFrequency::Hz24000 => (2, 24000),
47            SamplingFrequency::Hz32000 => (3, 32000),
48            SamplingFrequency::Hz44100 => (4, 44100),
49            SamplingFrequency::Hz48000 => (4, 48000),
50        };
51
52        let nf;
53        let ne;
54        let nb;
55        let z;
56
57        match frame_duration {
58            FrameDuration::SevenPointFiveMs => {
59                nf = match sampling_frequency {
60                    SamplingFrequency::Hz8000 => 60,
61                    SamplingFrequency::Hz16000 => 120,
62                    SamplingFrequency::Hz24000 => 180,
63                    SamplingFrequency::Hz32000 => 240,
64                    SamplingFrequency::Hz44100 => 360,
65                    SamplingFrequency::Hz48000 => 360,
66                };
67
68                ne = if nf == 360 { 300 } else { nf };
69                nb = match sampling_frequency {
70                    SamplingFrequency::Hz8000 => 60,
71                    _ => 64,
72                };
73                z = 7 * nf / 30;
74            }
75            FrameDuration::TenMs => {
76                nf = match sampling_frequency {
77                    SamplingFrequency::Hz8000 => 80,
78                    SamplingFrequency::Hz16000 => 160,
79                    SamplingFrequency::Hz24000 => 240,
80                    SamplingFrequency::Hz32000 => 320,
81                    SamplingFrequency::Hz44100 => 480,
82                    SamplingFrequency::Hz48000 => 480,
83                };
84
85                ne = if nf == 480 { 400 } else { nf };
86                nb = 64;
87                z = 3 * nf / 8;
88            }
89        }
90
91        Self {
92            fs_ind,
93            fs,
94            n_ms: frame_duration,
95            nb,
96            ne,
97            nf,
98            z,
99        }
100    }
101}
102
103#[cfg(test)]
104mod tests {
105    extern crate std;
106    use super::*;
107
108    #[test]
109    fn simple_config() {
110        let config = Lc3Config::new(SamplingFrequency::Hz48000, FrameDuration::TenMs);
111
112        assert_eq!(config.fs, 48000);
113        assert_eq!(config.fs_ind, 4);
114        assert_eq!(config.n_ms, FrameDuration::TenMs);
115        assert_eq!(config.z, 180);
116        assert_eq!(config.nf, 480);
117        assert_eq!(config.nb, 64);
118        assert_eq!(config.ne, 400);
119    }
120}