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}