welch_sde/
builder.rs

1use crate::Signal;
2
3/// Generic builder
4#[derive(Debug, Clone)]
5pub struct Builder<'a, T: Signal> {
6    /// number of segments (`k`)
7    pub(crate) n_segment: usize,
8    /// size of each segment (`l`)
9    pub(crate) segment_size: usize,
10    /// segment overlapping fraction (`0<a<1`)
11    pub(crate) overlap: f64,
12    /// maximum size of the discrete Fourier transform (`p`)
13    pub(crate) dft_max_size: usize,
14    /// the signal to estimate the spectral density for
15    pub(crate) signal: &'a [T],
16    /// the signal sampling frequency `[Hz]`
17    pub(crate) fs: Option<T>,
18}
19impl<'a, T: Signal> Builder<'a, T> {
20    /// Creates a Welch [Builder] from a given signal with `k=4` and `a=0.5`
21    pub fn new(signal: &'a [T]) -> Self {
22        let k: usize = 4;
23        let a: f64 = 0.5;
24        let l = (signal.len() as f64 / (k as f64 * (1. - a) + a)).trunc() as usize;
25        Self {
26            n_segment: k,
27            segment_size: l,
28            overlap: a,
29            dft_max_size: 4096,
30            signal,
31            fs: None,
32        }
33    }
34    /// Sets the signal sampling frequency
35    pub fn sampling_frequency(self, fs: T) -> Self {
36        Self {
37            fs: Some(fs),
38            ..self
39        }
40    }
41    /// Sets the segment overlapping fraction (`0<a<1`)
42    pub fn overlap(self, overlap: f64) -> Self {
43        let k = self.n_segment;
44        let a = overlap;
45        let l = (self.signal.len() as f64 / (k as f64 * (1. - a) + a)).trunc() as usize;
46        Self {
47            segment_size: l,
48            overlap: a,
49            ..self
50        }
51    }
52    /// Sets the number of segments (`k`)
53    pub fn n_segment(self, n_segment: usize) -> Self {
54        let k = n_segment;
55        let a = self.overlap;
56        let l = (self.signal.len() as f64 / (k as f64 * (1. - a) + a)).trunc() as usize;
57        Self {
58            n_segment: k,
59            segment_size: l,
60            ..self
61        }
62    }
63    /// Sets the log2 of the maximum size of the discrete Fourier transform (`p`)
64    pub fn dft_log2_max_size(self, dft_log2_max_size: usize) -> Self {
65        Self {
66            dft_max_size: 2 << (dft_log2_max_size - 1),
67            ..self
68        }
69    }
70}