diff --git a/Cargo.lock b/Cargo.lock index cccde7e..bb1b67c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -75,7 +75,7 @@ dependencies = [ "embassy-usb", "embedded-hal 1.0.0", "heapless 0.9.1", - "libm", + "num", "panic-probe", "postcard-rpc", "static_cell", @@ -776,6 +776,58 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d5439c4ad607c3c23abf66de8c8bf57ba8adcd1f129e699851a6e43935d339d" +[[package]] +name = "num" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" +dependencies = [ + "num-complex", + "num-integer", + "num-iter", + "num-rational", + "num-traits", +] + +[[package]] +name = "num-complex" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +dependencies = [ + "num-integer", + "num-traits", +] + [[package]] name = "num-traits" version = "0.2.19" @@ -783,6 +835,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", + "libm", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index a40927a..aa1d418 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -22,7 +22,9 @@ bitflags = "2.9.4" postcard-rpc = {version = "0.11.15", features = ["embassy-usb-0_4-server", "defmt"]} bioz-icd-rs = {path = "../bioz-icd-rs"} -libm = { version = "0.2.15" } +# libm = { version = "0.2.15" } + +num = {version = "0.4.3", default-features = false, features = ["libm"]} heapless = { version = "0.9.1" } diff --git a/src/impedance.rs b/src/impedance.rs index a5b9834..8e2c51d 100644 --- a/src/impedance.rs +++ b/src/impedance.rs @@ -10,6 +10,8 @@ use static_cell::StaticCell; use heapless::Vec; +use num::complex::Complex; + use crate::ad5940::*; use crate::ad5940_registers::*; @@ -386,14 +388,6 @@ pub async fn impedance_setup_readout_task(mut pin: ExtiInput<'static>, impedance } } -extern crate libm; - -#[derive(Debug, Clone, Copy)] -pub struct Complex { - real: i32, - imag: i32, -} - #[derive(Debug)] pub struct ImpedanceResult { pub magnitude: f32, @@ -410,29 +404,20 @@ fn sign_extend_18bit(val: u32) -> i32 { /// Calculate magnitude and phase of Rz using Rcal reference pub fn calculate_impedance(data: [u32; 4]) -> ImpedanceResult { - let mut signed_data = [0i32; 4]; - for (i, &val) in data.iter().enumerate() { - signed_data[i] = sign_extend_18bit(val); - } + let dft_rcal = Complex::new( + sign_extend_18bit(data[0]) as f32, + sign_extend_18bit(data[1]) as f32 + ); + let dft_rz = Complex::new( + sign_extend_18bit(data[2]) as f32, + sign_extend_18bit(data[3]) as f32 + ); - let dft_rcal = Complex { - real: signed_data[0], - imag: signed_data[1], - }; + let rcal_mag = dft_rcal.norm(); + let rz_mag = dft_rz.norm(); - let dft_rz = Complex { - real: signed_data[2], - imag: signed_data[3], - }; - - let rcal_mag = libm::sqrtf((dft_rcal.real as f32) * (dft_rcal.real as f32) - + (dft_rcal.imag as f32) * (dft_rcal.imag as f32)); - - let rz_mag = libm::sqrtf((dft_rz.real as f32) * (dft_rz.real as f32) - + (dft_rz.imag as f32) * (dft_rz.imag as f32)); - - let rcal_phase = libm::atan2f(-(dft_rcal.imag as f32), dft_rcal.real as f32); - let rz_phase = libm::atan2f(-(dft_rz.imag as f32), dft_rz.real as f32); + let rcal_phase = dft_rcal.arg(); + let rz_phase = dft_rz.arg(); let magnitude = (rcal_mag / rz_mag) * RCAL_VAL; let phase = rcal_phase - rz_phase;