Skip to main content

audio_lab/dsp/
pad.rs

1use ndarray::s;
2
3use crate::signal::{SignalError, TimeSignal};
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq)]
6pub enum PadMode {
7    After,
8    Before,
9}
10
11pub fn pad_zeros(
12    signal: &TimeSignal,
13    pad_width: usize,
14    mode: PadMode,
15) -> Result<TimeSignal, SignalError> {
16    let mut padded = TimeSignal::zeros(
17        signal.num_channels(),
18        signal.num_time_steps() + pad_width,
19        signal.sample_rate(),
20    )?;
21
22    for (mut padded_channel, channel) in padded.channel_iter_mut().zip(signal.channel_iter()) {
23        match mode {
24            PadMode::After => {
25                padded_channel
26                    .slice_mut(s![..signal.num_time_steps()])
27                    .assign(&channel);
28            }
29            PadMode::Before => {
30                padded_channel.slice_mut(s![pad_width..]).assign(&channel);
31            }
32        }
33    }
34
35    Ok(padded)
36}
37
38#[cfg(test)]
39mod tests {
40    use ndarray::{arr1, arr2};
41
42    use super::*;
43
44    #[test]
45    fn pad_zeros_before_and_after() {
46        let signal = TimeSignal::new(arr2(&[[0.0, 1.0], [2.0, 3.0]]), 8.0).unwrap();
47
48        let after = pad_zeros(&signal, 2, PadMode::After).unwrap();
49        assert_eq!(after.channel(0), arr1(&[0.0, 1.0, 0.0, 0.0]));
50        assert_eq!(after.channel(1), arr1(&[2.0, 3.0, 0.0, 0.0]));
51
52        let before = pad_zeros(&signal, 2, PadMode::Before).unwrap();
53        assert_eq!(before.channel(0), arr1(&[0.0, 0.0, 0.0, 1.0]));
54        assert_eq!(before.channel(1), arr1(&[0.0, 0.0, 2.0, 3.0]));
55    }
56}