mirror of
https://github.com/hubaldv/bioz-firmware-rs.git
synced 2025-12-06 05:01:18 +00:00
Added num_complex instead of custom complex struct.
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user