rust bindings for the prebuilt cmsis-dsp math
Note downloads ~100mb CMSIS_5 during build phase in order select and link the correct math.lib
Rust 1.51.0 for resolver 2
```rust use cmsisdspsys::{armsinf32};
let sin = unsafe { armsinf32(core::f32::consts::PI) }; assert_eq!(sin, 0f32); ```
Its complicated. Im currently not building any c files that accompany the arm dsp libraries. Bringing the necessary libc, libm and abstracting against every possible architecture and build flag seems hopeless atm. As a result you're going to have to do some work on your end.
When you start to do anything complicated you're probably going to see something like:
```bash = note: rust-lld: error: undefined symbol: sqrtf
referenced by armmath.h:6841 (../../Include/armmath.h:6841) armcmplxmagf32.o:(armcmplxmagf32) in archive /home/jacob/Downloads/dsp-discoveryf4-rust/lab4/libarmcortexM4lfmath.a ```
Which means you need to bring some libm type function with you. Possibilitie pure rust options I've seen include libm or micromath with differing tradeoffs. Stub one in with:
```rust use cmsisdspsys::{armcfftsRf32len16, armcfftf32, armcfftinstancef32, armcmplxmagf32}; use micromath::F32Ext;
//C needs access to a sqrt fn, lets use micromath
pub extern "C" fn sqrtf(x: f32) -> f32 { x.sqrt() } ... //your data as stored as real and imaginary pairs here let mut dtfsecoef = [0f32; 32];
let mut mag = [0f32; 16];
//Coefficient calculation with CFFT function
unsafe {
//CFFT calculation
arm_cfft_f32(&arm_cfft_sR_f32_len16, dtfsecoef.as_mut_ptr(), 0, 1);
// Magnitude calculation
arm_cmplx_mag_f32(s.as_ptr(), mag.as_mut_ptr(), N::to_usize() as uint32_t);
}
... ```