01_vdsp_fft/
01_vdsp_fft.rs1use apple_accelerate::{
2 add_f32, add_f64, blackman_window, blackman_window_f64, dot_f32, dot_f64, fft_direction,
3 fft_radix, hamming_window, hamming_window_f64, FftSetup,
4};
5
6fn main() {
7 let added = add_f32(&[1.0, 2.0, 3.0], &[4.0, 5.0, 6.0]).expect("vector add failed");
8 assert!(added
9 .iter()
10 .zip([5.0_f32, 7.0, 9.0])
11 .all(|(actual, expected)| (*actual - expected).abs() < 1.0e-6));
12
13 let added64 = add_f64(&[1.0, 2.0, 3.0], &[4.0, 5.0, 6.0]).expect("vector add f64 failed");
14 assert!(added64
15 .iter()
16 .zip([5.0_f64, 7.0, 9.0])
17 .all(|(actual, expected)| (*actual - expected).abs() < 1.0e-12));
18
19 let dot = dot_f32(&[1.0, 2.0, 3.0], &[4.0, 5.0, 6.0]).expect("dot product failed");
20 assert!((dot - 32.0).abs() < 1.0e-6);
21
22 let dot64 = dot_f64(&[1.0, 2.0, 3.0], &[4.0, 5.0, 6.0]).expect("dot product f64 failed");
23 assert!((dot64 - 32.0).abs() < 1.0e-12);
24
25 let hamm = hamming_window(8, 0);
26 let hamm64 = hamming_window_f64(8, 0);
27 let blk = blackman_window(8, 0);
28 let blk64 = blackman_window_f64(8, 0);
29 assert_eq!(hamm.len(), 8);
30 assert_eq!(hamm64.len(), 8);
31 assert_eq!(blk.len(), 8);
32 assert_eq!(blk64.len(), 8);
33
34 let setup = FftSetup::new(2, fft_radix::RADIX2).expect("failed to create FFT setup");
35 let mut real = vec![1.0_f32, 0.0, 0.0, 0.0];
36 let mut imag = vec![0.0_f32; 4];
37 setup
38 .fft_zip(&mut real, &mut imag, 2, fft_direction::FORWARD)
39 .expect("fft failed");
40
41 for value in &real {
42 assert!(
43 (*value - 1.0).abs() < 1.0e-5,
44 "unexpected FFT real output: {real:?}"
45 );
46 }
47 for value in &imag {
48 assert!(value.abs() < 1.0e-5, "unexpected FFT imag output: {imag:?}");
49 }
50
51 println!(
52 "vdsp smoke passed: added={added:?} added64={added64:?} dot={dot} dot64={dot64} fft_real={real:?}"
53 );
54}