You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
use cmsis_dsp_sys::{arm_sin_f32};let sin = unsafe{arm_sin_f32(core::f32::consts::PI)};assert_eq!(sin,0f32);
the dirty details
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:
= note: rust-lld: error: undefined symbol: sqrtf
>>> referenced by arm_math.h:6841 (../../Include/arm_math.h:6841)
>>> arm_cmplx_mag_f32.o:(arm_cmplx_mag_f32) in archive /home/jacob/Downloads/dsp-discoveryf4-rust/lab4/libarm_cortexM4lf_math.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:
use cmsis_dsp_sys::{arm_cfft_sR_f32_len16, arm_cfft_f32, arm_cfft_instance_f32, arm_cmplx_mag_f32};use micromath::F32Ext;//C needs access to a sqrt fn, lets use micromath#[no_mangle]pubextern"C"fnsqrtf(x:f32) -> f32{
x.sqrt()}
...//your data as stored as real and imaginary pairs here
let mut dtfsecoef = [0f32;32];letmut mag = [0f32;16];//Coefficient calculation with CFFT functionunsafe{//CFFT calculationarm_cfft_f32(&arm_cfft_sR_f32_len16, dtfsecoef.as_mut_ptr(),0,1);// Magnitude calculationarm_cmplx_mag_f32(s.as_ptr(), mag.as_mut_ptr(),N::to_usize()asuint32_t);}
...