pub struct CsiFrame {Show 21 fields
pub frame_id: FrameId,
pub session_id: SessionId,
pub source_id: SourceId,
pub adapter_kind: AdapterKind,
pub timestamp_ns: u64,
pub channel: u16,
pub bandwidth_mhz: u16,
pub rssi_dbm: Option<i16>,
pub noise_floor_dbm: Option<i16>,
pub antenna_index: Option<u8>,
pub tx_chain: Option<u8>,
pub rx_chain: Option<u8>,
pub subcarrier_count: u16,
pub i_values: Vec<f32>,
pub q_values: Vec<f32>,
pub amplitude: Vec<f32>,
pub phase: Vec<f32>,
pub validation: ValidationStatus,
pub quality_score: f32,
pub quality_reasons: Vec<String>,
pub calibration_version: Option<String>,
}Expand description
One CSI observation at a timestamp, normalized across all sources.
Invariants enforced by crate::validate_frame:
i_values.len() == q_values.len() == amplitude.len() == phase.len() == subcarrier_count- all of
i_values/q_values/amplitude/phaseare finite subcarrier_countis within the source’scrate::AdapterProfilerssi_dbm, when present, is within plausible device bounds
Fields§
§frame_id: FrameIdMonotonic id within the session.
session_id: SessionIdOwning capture session.
source_id: SourceIdHuman-readable source id.
adapter_kind: AdapterKindWhich adapter produced this frame.
timestamp_ns: u64Source timestamp in nanoseconds.
channel: u16WiFi channel number.
bandwidth_mhz: u16Channel bandwidth in MHz (20, 40, 80, 160).
rssi_dbm: Option<i16>Received signal strength, dBm, if reported.
noise_floor_dbm: Option<i16>Noise floor, dBm, if reported.
antenna_index: Option<u8>Receive-antenna index, if reported.
tx_chain: Option<u8>Transmit chain index, if reported.
rx_chain: Option<u8>Receive chain index, if reported.
subcarrier_count: u16Number of subcarriers (== length of the four vectors below).
i_values: Vec<f32>In-phase components, one per subcarrier.
q_values: Vec<f32>Quadrature components, one per subcarrier.
amplitude: Vec<f32>Magnitude sqrt(i^2 + q^2), one per subcarrier.
phase: Vec<f32>Phase atan2(q, i) in radians, one per subcarrier (unwrapped by DSP later).
validation: ValidationStatusValidation outcome.
quality_score: f32Quality / usability confidence in [0.0, 1.0].
quality_reasons: Vec<String>Reasons a frame was degraded (empty when Accepted).
calibration_version: Option<String>Calibration version this frame was processed against, if any.
Implementations§
Source§impl CsiFrame
impl CsiFrame
Sourcepub fn from_iq(
frame_id: FrameId,
session_id: SessionId,
source_id: SourceId,
adapter_kind: AdapterKind,
timestamp_ns: u64,
channel: u16,
bandwidth_mhz: u16,
i_values: Vec<f32>,
q_values: Vec<f32>,
) -> Self
pub fn from_iq( frame_id: FrameId, session_id: SessionId, source_id: SourceId, adapter_kind: AdapterKind, timestamp_ns: u64, channel: u16, bandwidth_mhz: u16, i_values: Vec<f32>, q_values: Vec<f32>, ) -> Self
Build a raw (un-validated) frame from interleaved-free I/Q vectors.
amplitude and phase are derived from i_values/q_values. The
frame is returned with validation = Pending and quality_score = 0.0;
run crate::validate_frame before exposing it.
Sourcepub fn with_noise_floor(self, noise_floor_dbm: i16) -> Self
pub fn with_noise_floor(self, noise_floor_dbm: i16) -> Self
Builder-style setter for noise floor.
Sourcepub fn with_chains(
self,
antenna: Option<u8>,
tx: Option<u8>,
rx: Option<u8>,
) -> Self
pub fn with_chains( self, antenna: Option<u8>, tx: Option<u8>, rx: Option<u8>, ) -> Self
Builder-style setter for antenna / chain metadata.
Sourcepub fn mean_amplitude(&self) -> f32
pub fn mean_amplitude(&self) -> f32
Mean amplitude across subcarriers (0.0 for an empty frame).
Sourcepub fn is_exposable(&self) -> bool
pub fn is_exposable(&self) -> bool
Whether this frame may be exposed across a language boundary.