1extern crate num_complex;
2
3#[allow(non_camel_case_types)]
7pub type cf32 = num_complex::Complex32;
8
9#[macro_export]
16macro_rules! assert_evm {
17
18 ($actual:expr, $ref:expr) => {
19 assert_evm!($actual,$ref,-80.0)
20 };
21
22 ($actual:expr, $ref:expr, $evm_limit_db:expr) => {
23 assert_eq!($actual.len(),$ref.len(), "Input slices/vectors must be same length");
24 for (idx, (act, re)) in $actual.iter().zip($ref).enumerate() {
25 let evm = (act - re).norm();
26 let limit = re.norm() * ($evm_limit_db / 10f32).powi(10);
27
28 if evm > limit {
29 let evm_db = evm.log10()*10f32;
30 panic!(
31 "EVM limit exceeded: Got {}({}dB) > limit {}({}dB) for element {}. Actual {}, Expected {}",
32 evm,evm_db,limit, $evm_limit_db, idx, act, re
33 );
34 }
35 }
36 };
37}
38
39#[macro_export]
40macro_rules! vec_align {
41 [$init:expr; $len:expr] => {
42 unimplemented!()
43 }
44}
45
46pub mod vecops;
48
49pub mod fft;
51
52pub mod sampling;
54
55pub mod sequence;
57
58#[cfg(test)]
59mod test {
60 use super::cf32;
61
62 #[test]
63 fn evm_correct() {
64 let refr = vec![
65 cf32::new(1f32, 0f32),
66 cf32::new(1f32, 0f32),
67 cf32::new(1f32, 0f32),
68 cf32::new(1f32, 0f32),
69 ];
70 let act = vec![
71 cf32::new(1f32, 0f32),
72 cf32::new(1f32, 0f32),
73 cf32::new(1f32, 0f32),
74 cf32::new(0.9f32, 0f32),
75 ];
76 assert_evm!(act, refr, (-10.0));
78 }
79
80 #[test]
81 #[should_panic]
82 fn evm_fail() {
83 let refr = vec![
84 cf32::new(1f32, 0f32),
85 cf32::new(1f32, 0f32),
86 cf32::new(1f32, 0f32),
87 cf32::new(1f32, 0f32),
88 ];
89 let act = vec![
90 cf32::new(1f32, 0f32),
91 cf32::new(1f32, 0f32),
92 cf32::new(1f32, 0f32),
93 cf32::new(0.9f32, 0f32),
94 ];
95 assert_evm!(act, refr, (0.0));
97 }
98
99 #[test]
100 fn vec_align() {
101 let _v = vec_align![cf32::default(); 2048];
102 }
103
104}