
RuView v2 中 Signal 与 MAT Crate 的 ruvector 集成实战ADR-017 七个集成点的源码级拆解【免费下载链接】RuViewπ RuView turns commodity WiFi signals into real-time spatial intelligence, vital sign monitoring, and presence detection — all without a single pixel of video.项目地址: https://gitcode.com/GitHub_Trending/wi/RuView导读本文以 RuView 仓库内 ADR-017-ruvector-signal-mat-integration.md 为绝对主线深入解析 WiFi-DensePose 信号处理与灾难检测两套生产级 Rust crate 与 ruvector v2.0.4 系列算法的融合方案。ADR-017 共设计七个集成点横跨wifi-densepose-signalSOTA 信号处理子载波选择、频谱图、身体速度轮廓 BVP、菲涅尔区几何求解与wifi-densepose-matMass Casualty Assessment Tool多 AP 三角定位、呼吸/心跳波形检测并同时修正了 ADR-002 中指向不存在的虚构 crate 的依赖错误。读完本文你将掌握五个 ruvector 发布 crate 各自的核心 API 与算法优势、七个集成点的动机/替代实现/ruvector 方案/复杂度对比、MAT 内存压缩的量化收益以及在当前仓库 v2/Cargo.toml 工作区中真实落地的依赖配置与 feature 门控方式。1. 背景为何需要第二轮 ruvector 集成ADR-016 已将五个 ruvector v2.0.4 crate 接入训练管线 cratewifi-densepose-trainmodel.rs、dataset.rs、subcarrier.rs、metrics.rs。但两个更早诞生的生产 crate 仍处于未接入状态尽管它们存在明确的高价值接入点wifi-densepose-signal承载 ADR-014 定义的 SOTA 信号处理算法——共轭相乘、Hampel 滤波、菲涅尔区呼吸模型、CSI 频谱图、子载波灵敏度选择、身体速度轮廓BVP。其共性瓶颈是大量逐元素独立运算或暴力穷举搜索缺乏亚多项式级优化空间。wifi-densepose-mat承载 ADR-001 的灾难检测能力——多 AP 三角定位、呼吸/心跳波形检测、分诊分类。其共性瓶颈是时间序列数据无压缩、定位采用闭式几何而非迭代求解。与此同时ADR-002 的依赖策略小节引用了四个并不存在的 crate 名ruvector-core、ruvector-data-framework、ruvector-consensus、ruvector-wasm版本号0.1在 crates.io 上无法解析。ADR-016 已确认 v2.0.4 实际发布的 crate 名单ADR-017 决定以真实 crate 替换虚构依赖。1.1 五个已核实发布的 cratev2.0.4ADR 依据对 ruvnet/ruvector 源码及 crates.io 的核查列出五个可用 crateCrate关键 API算法优势ruvector-mincutDynamicMinCut、MinCutBuilderO(n^1.5 log n) 动态图划分ruvector-attn-mincutattn_mincut(q,k,v,d,seq,λ,τ,ε)注意力 mincut 门控单遍完成ruvector-temporal-tensorTemporalTensorCompressor、segment::decode分层量化内存降低 50–75%ruvector-solverNeumannSolver::new(tol,max_iter).solve(CsrMatrix,[f32])O(√n) Neumann 级数收敛ruvector-attentionScaledDotProductAttention::new(d).compute(q,ks,vs)小 d 场景的次线性注意力需要特别说明的是ADR-002 中描述的 RVF 认知容器ADR-003、HNSW 搜索ADR-004、SONA 自学习ADR-005、GNN 模式ADR-006、后量子密码ADR-007、Raft 共识ADR-008、WASM 边缘运行时ADR-009等能力在 v2.0.4 中属于 ruvector内部架构能力而非独立发布 crate。这些 ADR 保留为前瞻性架构指引其实现路径在适用处以五个发布 crate 为构建块。1.2 集成全景图ADR-017 给出了逐文件映射原文中的目录结构可直接在仓库中对应wifi-densepose-signal/ ├── subcarrier_selection.rs ← ruvector-mincut (DynamicMinCut partitions) ├── spectrogram.rs ← ruvector-attn-mincut (attention-gated STFT tokens) ├── bvp.rs ← ruvector-attention (cross-subcarrier BVP attention) └── fresnel.rs ← ruvector-solver (Fresnel geometry system) wifi-densepose-mat/ ├── localization/ │ └── triangulation.rs ← ruvector-solver (multi-AP TDoA equations) └── detection/ ├── breathing.rs ← ruvector-temporal-tensor (tiered waveform compression) └── heartbeat.rs ← ruvector-temporal-tensor (tiered micro-Doppler compression)2. 集成点一DynamicMinCut 驱动的子载波灵敏度选择目标文件wifi-densepose-signal/src/subcarrier_selection.rs引入 crateruvector-mincut2.1 现状与问题传统方案对所有子载波按variance_motion / variance_static比值排序后取 top-K复杂度为 O(n log n) 的静态排序。该逻辑在当前源码中依然保留为基线实现 subcarrier_selection.rsselect_sensitive_subcarriers计算每个子载波的灵敏度得分sensitivity var(motion[k]) / (var(static[k]) 1e-12)随后降序排序并受SubcarrierSelectionConfig默认top_k: 20、min_sensitivity: 1.5约束。静态排序的问题在于环境一旦变化家具移动、新住户出现就必须全量重新计算排序。2.2 ruvector 集成方案将子载波建模为相似图顶点边权重编码方差比相似度|sensitivity_i − sensitivity_j|^−1。DynamicMinCut求最小二分把高灵敏度运动响应型与低灵敏度噪声主导型子载波切到两侧。新静态/运动测量到达时通过insert_edge/delete_edge增量更新划分摊还复杂度 O(n^1.5 log n)无需全量重排。ADR 中给出的核心函数原型如下在当前仓库的 subcarrier_selection.rs 中已有落地实现mincut_subcarrier_partitionuse ruvector_mincut::{DynamicMinCut, MinCutBuilder}; /// Partition subcarriers into sensitive/insensitive groups via min-cut. /// Returns (sensitive_indices, insensitive_indices). pub fn mincut_subcarrier_partition( sensitivity: [f32], ) - (Vecusize, Vecusize) { let n sensitivity.len(); // Build fully-connected similarity graph (prune edges threshold) let threshold 0.1_f64; let mut edges Vec::new(); for i in 0..n { for j in (i 1)..n { let diff (sensitivity[i] - sensitivity[j]).abs() as f64; let weight if diff 1e-9 { 1.0 / diff } else { 1e6 }; if weight threshold { edges.push((i as u64, j as u64, weight)); } } } let mc MinCutBuilder::new().exact().with_edges(edges).build(); let (side_a, side_b) mc.partition(); // side with higher mean sensitivity sensitive let mean_a: f32 side_a.iter().map(|i| sensitivity[i as usize]).sum::f32() / side_a.len() as f32; let mean_b: f32 side_b.iter().map(|i| sensitivity[i as usize]).sum::f32() / side_b.len() as f32; if mean_a mean_b { (side_a.into_iter().map(|x| x as usize).collect(), side_b.into_iter().map(|x| x as usize).collect()) } else { (side_b.into_iter().map(|x| x as usize).collect(), side_a.into_iter().map(|x| x as usize).collect()) } }2.3 仓库源码印证从源码看该集成点已经真实落地且实现较 ADR 草案做了一些工程化细节补充实际代码使用MinCutBuilderuse ruvector_mincut::MinCutBuilder;边权重剪枝阈值取0.5_f64并包含小输入兜底n 4时视为全部敏感与全等边兜底edges.is_empty()时按中位数切分这些健壮性分支正是生产代码与设计草案的典型差异。配套测试 subcarrier_selection.rs 中的mincut_partition_separates_high_low构造[0.9, 0.85, 0.92, 0.1, 0.12, 0.08]两组灵敏度假数据断言切出的两组sens_mean insens_meanmincut_partition_small_input则验证小输入下不 panic、元素总数守恒。该文件完整提供了三种可切换的选择策略经典方差比 top-K 排序、纯方差在线选择select_by_variance、以及 mincut 划分mincut_subcarrier_partition方便调用方按场景权衡。源码头注还引用了 WiDanceMobiCom 2017与 WiGestSenSys 2015作为算法谱系来源。2.4 优势动态划分能跟踪灵敏度变化O(n^1.5 log n) vs O(n^2) 重扫设备搬动或新人员入场后无需人工重调参数即可自动重划敏感子载波集合。3. 集成点二Attention-Gated CSI 频谱图目标文件wifi-densepose-signal/src/spectrogram.rs引入 crateruvector-attn-mincut3.1 现状与问题原实现逐子载波独立计算 STFT再堆叠为[freq_bins × time_frames]二维矩阵送入下游 CNN 时所有时频 bin等权。这导致噪声帧与多径伪影被同等放大抑制了真实体动段的信噪贡献。3.2 ruvector 集成方案STFT 之后把每个时间帧视作一个序列 tokend n_freq_binsseq_len n_time_frames调用attn_mincut对谱图输出做门控抑制噪声帧与多径伪影、放大体动时段的贡献。use ruvector_attn_mincut::attn_mincut; /// Apply attention gating to a computed spectrogram. /// spectrogram: [n_freq_bins × n_time_frames] row-major f32 pub fn gate_spectrogram( spectrogram: [f32], n_freq: usize, n_time: usize, lambda: f32, // 0.1 mild gating, 0.5 aggressive ) - Vecf32 { // Q K V spectrogram (self-attention over time frames) let out attn_mincut( spectrogram, spectrogram, spectrogram, n_freq, // d feature dimension (freq bins) n_time, // seq_len number of time frames lambda, /*tau*/ 2, /*eps*/ 1e-7, ); out.output }3.3 关键参数lambda门控强度。ADR 注释给出经验区间——0.1对应轻度门控0.5对应激进门控。lambda 只调这一个标量即可连续调节去噪力度无需单独维护去噪或时序平滑管线。taumincut 门控中的温度/阈值类超参数示例取2。eps数值稳定项示例取1e-7。3.4 优势自注意力 mincut 可以识别出相干的时序段体动区间并门控掉不相关帧环境噪声、瞬时干扰。该方案无需为频谱图额外串接去噪模块。工程提示ADR-017 将本集成点定为 P3——因为它改动频谱图输出分布后下游 CNN 需要重新训练因此优先级低于不改变模型输入的方案。4. 集成点三跨子载波 BVP 注意力加权目标文件wifi-densepose-signal/src/bvp.rs引入 crateruvector-attention4.1 现状与问题身体速度轮廓Body Velocity ProfileBVP原实现为对全部子载波 STFT 幅值做均匀累加BVP[v,t] Σ_k |STFT_k[v,t]|等权求和意味着不敏感子载波会稀释速度估计——处于多径零点或噪声主导频段的子载波其贡献本应被压低。4.2 ruvector 集成方案改用ScaledDotProductAttention完成跨子载波的加权聚合每个子载波贡献一个 key其灵敏度分布与一个 value其 STFT 行query 为当前速度 bin。注意力权重会自动放大对查询速度区间响应强的子载波无需手工挑选或单独维护灵敏度步骤。use ruvector_attention::ScaledDotProductAttention; /// Compute attention-weighted BVP aggregation across subcarriers. /// stft_rows: Vec of n_subcarriers rows, each [n_velocity_bins] f32 /// sensitivity: sensitivity score per subcarrier [n_subcarriers] f32 pub fn attention_weighted_bvp( stft_rows: [Vecf32], sensitivity: [f32], n_velocity_bins: usize, ) - Vecf32 { let d n_velocity_bins; let attn ScaledDotProductAttention::new(d); // Mean sensitivity row as query (overall body motion profile) let query: Vecf32 (0..d).map(|v| { stft_rows.iter().zip(sensitivity.iter()) .map(|(row, s)| row[v] * s) .sum::f32() / sensitivity.iter().sum::f32() }).collect(); // Keys STFT rows (each subcarriers velocity profile) // Values STFT rows (same, weighted by attention) let keys: Vec[f32] stft_rows.iter().map(|r| r.as_slice()).collect(); let values: Vec[f32] stft_rows.iter().map(|r| r.as_slice()).collect(); attn.compute(query, keys, values) .unwrap_or_else(|_| vec![0.0; d]) }4.3 仓库源码印证该集成点已实际落地于 bvp.rs文件顶部use ruvector_attention::ScaledDotProductAttention;其中注释明确写着 Uses ScaledDotProductAttention to weight each subcarriers velocity profile并以ScaledDotProductAttention::new(n_velocity_bins)构造注意力实例。实现还包含unwrap_or_else(|_| vec![0.0; d])错误兜底说明compute返回Result生产代码对失败路径做了显式处理。4.4 优势用灵敏度感知的加权替代均匀求和多径零点处或噪声频段的子载波被自动分配低注意力权重。ADR-017 将其列为 P2理由是直接提升活动分类的准确率且不涉及模型重训。5. 集成点四菲涅尔区几何系统的 NeumannSolver 求解目标文件wifi-densepose-signal/src/fresnel.rs引入 crateruvector-solver5.1 现状与问题原实现依赖已知 TX-RX-人体几何的闭式菲涅尔区半径公式。实际部署中 d1TX→body与 d2body→RX通常未知——只有 AP 布放决定的直线距离 D 已知。5.2 ruvector 集成方案当多个子载波在同一胸腔位移处观察到不同的菲涅尔区穿越事件时可以把未知几何 (d1, d2, Δd) 组织成超定线性系统求解。矩阵稀疏用CsrMatrixCOO 组装NeumannSolver高效处理正则化法方程(AᵀA λI) x Aᵀb。use ruvector_solver::neumann::NeumannSolver; use ruvector_solver::types::CsrMatrix; /// Estimate TX-body and body-RX distances from multi-subcarrier Fresnel observations. /// observations: Vec of (wavelength_m, observed_amplitude_variation) /// Returns (d1_estimate_m, d2_estimate_m) pub fn solve_fresnel_geometry( observations: [(f32, f32)], d_total: f32, // Known TX-RX straight-line distance in metres ) - Option(f32, f32) { let n observations.len(); if n 3 { return None; } // System: A·[d1, d2]^T b // From Fresnel: A_k |sin(2π·2·Δd / λ_k)|, observed ~ A_k // Linearize: use log-magnitude ratios as rows // Normal equations: (A^T A λI) x A^T b let lambda_reg 0.05_f32; let mut coo Vec::new(); let mut rhs vec![0.0_f32; 2]; for (k, (wavelength, amplitude)) in observations.iter().enumerate() { // Row k: [1/wavelength, -1/wavelength] · [d1; d2] ≈ log(amplitude 1) let coeff 1.0 / wavelength; coo.push((k, 0, coeff)); coo.push((k, 1, -coeff)); let _ amplitude; // used implicitly via b vector } // Build normal equations let ata_csr CsrMatrix::f32::from_coo(2, 2, vec![ (0, 0, lambda_reg observations.iter().map(|(w, _)| 1.0 / (w * w)).sum::f32()), (1, 1, lambda_reg observations.iter().map(|(w, _)| 1.0 / (w * w)).sum::f32()), ]); let atb: Vecf32 vec![ observations.iter().map(|(w, a)| a / w).sum::f32(), -observations.iter().map(|(w, a)| a / w).sum::f32(), ]; let solver NeumannSolver::new(1e-5, 300); match solver.solve(ata_csr, atb) { Ok(result) { let d1 result.solution[0].abs().clamp(0.1, d_total - 0.1); let d2 (d_total - d1).clamp(0.1, d_total - 0.1); Some((d1, d2)) } Err(_) None, } }5.3 仓库源码印证从源码看该集成点已落地 fresnel.rs 顶部use ruvector_solver::neumann::NeumannSolver;并在求解器构造处使用NeumannSolver::new(1e-5, 300)——与 ADR 示例中的容差1e-5、最大迭代300完全一致。值得注意的扩展应用同目录下的 CIR 稀疏恢复模块 cir.rs 也复用了NeumannSolver作为 ISTA 迭代的warm-start——先对对角占优 CSR 近似(ΦᴴΦ εI)做一次 Neumann 求解得到初始解再进入稀疏恢复主循环对应 ADR-134 对 CIR 模块的收敛性要求。这证明ruvector-solver在 signal crate 内部被多个算法路径复用。5.4 优势把菲涅尔模型从「单次固定几何公式」升级为「数据驱动的几何估计器」只要 3 个子载波不同频率提供观测NeumannSolver 即可在 O(√n) 次迭代内收敛——这对 100 Hz 实时呼吸检测至关重要。本集成点被列为 P3用于未知几何场景下改善呼吸检测。6. 集成点五NeumannSolver 求解多 AP 三角定位目标文件wifi-densepose-mat/src/localization/triangulation.rs引入 crateruvector-solver6.1 现状与问题多 AP 定位采用成对 TDoA到达时间差转换为双曲方程组。解 N-AP 系统需要线性化 最小二乘原实现通过高斯消元做暴力法方程求解O(n³)。ADR-001 场景下 AP 数量多、测量对数量大直接消元开销可观。6.2 ruvector 集成方案线性化后的 TDoA 系统是稀疏的——每条测量只涉及 2 个 AP 而非全部 N 个。CsrMatrix::from_cooNeumannSolver求解稀疏法方程复杂度为 O(√nnz)其中 nnz 为非零元数远小于 N²。use ruvector_solver::neumann::NeumannSolver; use ruvector_solver::types::CsrMatrix; /// Solve multi-AP TDoA survivor localization. /// tdoa_measurements: Vec of (ap_i_idx, ap_j_idx, tdoa_seconds) /// ap_positions: Vec of (x, y) metre positions /// Returns estimated (x, y) survivor position. pub fn solve_triangulation( tdoa_measurements: [(usize, usize, f32)], ap_positions: [(f32, f32)], ) - Option(f32, f32) { let n_meas tdoa_measurements.len(); if n_meas 3 { return None; } const C: f32 3e8_f32; // speed of light let mut coo Vec::new(); let mut b vec![0.0_f32; n_meas]; // Linearize: subtract reference AP from each TDoA equation let (x_ref, y_ref) ap_positions[0]; for (row, (i, j, tdoa)) in tdoa_measurements.iter().enumerate() { let (xi, yi) ap_positions[i]; let (xj, yj) ap_positions[j]; // (xi - xj)·x (yi - yj)·y ≈ (d_ref_i - d_ref_j C·tdoa) / 2 coo.push((row, 0, xi - xj)); coo.push((row, 1, yi - yj)); b[row] C * tdoa / 2.0 ((xi * xi - xj * xj) (yi * yi - yj * yj)) / 2.0 - x_ref * (xi - xj) - y_ref * (yi - yj); } // Normal equations: (A^T A λI) x A^T b let lambda 0.01_f32; let ata CsrMatrix::f32::from_coo(2, 2, vec![ (0, 0, lambda coo.iter().filter(|e| e.1 0).map(|e| e.2 * e.2).sum::f32()), (0, 1, coo.iter().filter(|e| e.1 0).zip(coo.iter().filter(|e| e.1 1)).map(|(a, b2)| a.2 * b2.2).sum::f32()), (1, 0, coo.iter().filter(|e| e.1 1).zip(coo.iter().filter(|e| e.1 0)).map(|(a, b2)| a.2 * b2.2).sum::f32()), (1, 1, lambda coo.iter().filter(|e| e.1 1).map(|e| e.2 * e.2).sum::f32()), ]); let atb vec![ coo.iter().filter(|e| e.1 0).zip(b.iter()).map(|(e, bi)| e.2 * bi).sum::f32(), coo.iter().filter(|e| e.1 1).zip(b.iter()).map(|(e, bi)| e.2 * bi).sum::f32(), ]; NeumannSolver::new(1e-5, 500) .solve(ata, atb) .ok() .map(|r| (r.solution[0], r.solution[1])) }6.3 复杂度量化灾难现场通常部署 5–20 个 AP。此时 TDoA 测量对数量为 N×(N-1)/2 10–190 条但未知量只有 2 个x, y。注意法方程无论 N 多大都恒为 2×2 矩阵——规模与 N 无关。对于良态的 2×2 系统NeumannSolver 只需 O(1) 次迭代即收敛完全消除高斯消元的开销。6.4 优先级与工程状态ADR 将多 AP 三角定位列为P1理由为「安全关键精度改进」。从 wifi-densepose-mat/Cargo.toml 可以看到ruvectorfeature 的定义为ruvector [dep:ruvector-solver, dep:ruvector-temporal-tensor]即ruvector-solver是 MAT crate 的可选依赖随ruvectorfeature 一起启用这与 ADR-017「triangulation ← ruvector-solver」的映射一致。实际消费端可依部署形态选择编译开关。7. 集成点六呼吸波形分层压缩内存大头目标文件wifi-densepose-mat/src/detection/breathing.rs引入 crateruvector-temporal-tensor7.1 现状与问题内存的算术题呼吸检测器需在内存中维护各子载波 × 时间维的 CSI 幅度环形缓冲。按 60 秒窗口、100 Hz 采样率、56 个子载波估算60 s × 100 Hz × 56 子载波 × 4 bytes ≈ 13.4 MB / 区域(zone)ADR-001 的多区域扫描模型下16 个并发区域 约 214 MB 仅用于呼吸缓冲。灾难救援典型硬件如 Raspberry Pi 44–8 GB 内存难以支撑高并发区域扫描。7.2 ruvector 集成方案分层量化TemporalTensorCompressor以分层量化策略压缩呼吸波形缓冲热层 8-bit近期/ 温层 5–7-bit / 冷层 3-bit整体降低内存 50–75%。use ruvector_temporal_tensor::{TemporalTensorCompressor, TierPolicy}; use ruvector_temporal_tensor::segment; pub struct CompressedBreathingBuffer { compressor: TemporalTensorCompressor, encoded: Vecu8, n_subcarriers: usize, frame_count: u64, } impl CompressedBreathingBuffer { pub fn new(n_subcarriers: usize, zone_id: u64) - Self { Self { compressor: TemporalTensorCompressor::new( TierPolicy::default(), n_subcarriers, zone_id, ), encoded: Vec::new(), n_subcarriers, frame_count: 0, } } pub fn push_frame(mut self, amplitudes: [f32]) { self.compressor.push_frame(amplitudes, self.frame_count, mut self.encoded); self.frame_count 1; } pub fn flush(mut self) { self.compressor.flush(mut self.encoded); } /// Decode all frames for frequency analysis. pub fn to_vec(self) - Vecf32 { let mut out Vec::new(); segment::decode(self.encoded, mut out); out } /// Get single frame for real-time display. pub fn get_frame(self, idx: usize) - OptionVecf32 { segment::decode_single_frame(self.encoded, idx) } }7.3 仓库源码印证该集成点已真实落地于 breathing.rs文件头部注释明确标注 Integration 6: CompressedBreathingBuffer (ADR-017, ruvector feature)所有 ruvector 引用TemporalTensorCompressor、TierPolicy、segment均以#[cfg(feature ruvector)]门控测试用例#[cfg(all(test, feature ruvector))]同样按 feature 条件编译。这意味着不带ruvectorfeature 构建 MAT 时压缩逻辑完全不进入二进制保持最小依赖面。7.4 内存收益指标压缩前压缩后单区域呼吸缓冲13.4 MB3.4–6.7 MB50–75% 下降16 区域合计≈ 214 MB≈ 54–107 MB结论同一台救援设备可支持2–4 倍并发扫描区域或者为更多区域内联告警/分诊逻辑腾出内存。8. 集成点七心跳微多普勒频谱分层压缩目标文件wifi-densepose-mat/src/detection/heartbeat.rs引入 crateruvector-temporal-tensor8.1 现状与问题心跳检测使用微多普勒频谱图对 CSI 幅度时间序列做滑动 STFT。每区域频谱图形状为[n_freq_bins128, n_time600]60 秒、10 Hz 输出率128 × 600 × 4 bytes ≈ 307 KB / 区域16 个区域合计 4.9 MB绝对内存尚可接受但心跳频谱图是全系统访问最密集的数据——每次分诊更新都会查询因此压缩收益主要体现为降低随机访问成本与缓存压力。8.2 ruvector 集成方案把频谱图行视作时间演化帧每个频率 bin 维护一个独立的TemporalTensorCompressor热层最近 10 秒8-bit 高保真、温层10–30 秒5-bit、冷层30 秒以上3-bit。近期心跳周期保持高保真历史数据压缩约 5 倍。pub struct CompressedHeartbeatSpectrogram { /// One compressor per frequency bin bin_buffers: VecTemporalTensorCompressor, encoded: VecVecu8, n_freq_bins: usize, frame_count: u64, } impl CompressedHeartbeatSpectrogram { pub fn new(n_freq_bins: usize) - Self { let bin_buffers: Vec_ (0..n_freq_bins) .map(|i| TemporalTensorCompressor::new(TierPolicy::default(), 1, i as u64)) .collect(); let encoded vec![Vec::new(); n_freq_bins]; Self { bin_buffers, encoded, n_freq_bins, frame_count: 0 } } /// Push one column of the spectrogram (one time step, all frequency bins). pub fn push_column(mut self, column: [f32]) { for (i, (val, buf)) in column.iter().zip(self.bin_buffers.iter_mut()).enumerate() { buf.push_frame([val], self.frame_count, mut self.encoded[i]); } self.frame_count 1; } /// Extract heartbeat frequency band power (0.8–1.5 Hz) from recent frames. pub fn heartbeat_band_power(self, low_bin: usize, high_bin: usize) - f32 { (low_bin..high_bin.min(self.n_freq_bins - 1)) .map(|b| { let mut out Vec::new(); segment::decode(self.encoded[b], mut out); out.iter().rev().take(100).map(|x| x * x).sum::f32() }) .sum::f32() / (high_bin - low_bin 1) as f32 } }8.3 仓库源码印证与使用细节落地代码位于 heartbeat.rs同样以#[cfg(feature ruvector)]门控。需要注意一处实现差异仓库中实际构造调用为TemporalTensorCompressor::new(TierPolicy::default(), 1, i as u32)zone_id 参数为u32强转与 ADR 草案示例的u64略有出入属于编码期对 API 签名的对齐修正——这说明参考示例与最终库 API 之间需以实际编译为准。heartbeat_band_power的用法值得单独解释心跳频带功率提取针对0.8–1.5 Hz对应 48–90 次/分钟的成人心率区间调用方需传入该频带对应的low_bin/high_bin它只从每 bin 解码后取最近 100 个样本做平方和out.iter().rev().take(100)正好落在热层/温层的最近区间——这正是「近期高保真」设计意图的直接体现功率统计只需近期高保真数据无需解码全部历史。9. 依赖声明与 ADR-002 更正9.1 工作区依赖v2/Cargo.tomlADR-017 写明的依赖变更分两层。第一层是工作区级 v2/Cargo.toml五个 crate 已在 ADR-016 时加入 workspaceruvector-mincut 2.0.4 # already present ruvector-attn-mincut 2.0.4 # already present ruvector-temporal-tensor 2.0.4 # already present ruvector-solver 2.0.4 # already present ruvector-attention 2.0.4 # already present第二层是消费侧 Cargo.toml。结合当前仓库源码实际落地配置为# wifi-densepose-signal/Cargo.toml [dependencies] ruvector-mincut { workspace true } ruvector-attn-mincut { workspace true } ruvector-attention { workspace true } ruvector-solver { workspace true }# wifi-densepose-mat/Cargo.toml默认 features 含 ruvector [features] default [std, api, ruvector, ml] ruvector [dep:ruvector-solver, dep:ruvector-temporal-tensor]9.2 版本演进提示当前工作区 v2/Cargo.toml 中的 ruvector 版本已随后续同步迭代推进注释标明「Vendored at origin/main… Bumps per ADR-152 §2.6 (2026-06-10 vendor sync survey)」实际钉版本为ruvector-mincut 2.0.6、ruvector-attn-mincut 2.0.4、ruvector-temporal-tensor 2.0.6、ruvector-solver 2.0.6、ruvector-attention 2.1.0并额外引入了ruvector-core 2.3.0、ruvector-gnn、ruvector-crv等。因此ADR-0172026-02-28 记录所述的2.0.4是决策时点的已验证版本若你基于当前仓库构建请以 v2/Cargo.toml 中 workspace 实际钉住的版本为准cargo build前可执行cargo tree -i ruvector-solver核对解析结果。9.3 ADR-002 依赖策略勘误ADR-002 原依赖策略引用了 crates.io 上不存在的虚构 crate 与版本# WRONG (ADR-002 original — these crates do not exist at crates.io) ruvector-core { version 0.1, features [hnsw, sona, gnn] } ruvector-data-framework { version 0.1, features [rvf, witness, crypto] } ruvector-consensus { version 0.1, features [raft] } ruvector-wasm { version 0.1, features [edge-runtime] }ADR-017 给出经 crates.io 核实的正确依赖# CORRECT (as of 2026-02-28, all at v2.0.4) ruvector-mincut 2.0.4 # Dynamic min-cut, O(n^1.5 log n) updates ruvector-attn-mincut 2.0.4 # Attention mincut gating ruvector-temporal-tensor 2.0.4 # Tiered temporal compression ruvector-solver 2.0.4 # NeumannSolver, sublinear convergence ruvector-attention 2.0.4 # ScaledDotProductAttentionRVF 认知容器ADR-003、HNSWADR-004、SONAADR-005、GNNADR-006、后量子密码ADR-007、RaftADR-008、WASM 边缘运行时ADR-009等被证实在 v2.0.4 不对外发布为独立 crate因此作为前瞻性架构指引保留其实现以五个发布 crate 为构建块。10. 集成点总览表与实施优先级ADR-017 给出了七处集成的统一对照表集成点文件crate改造前改造后子载波选择subcarrier_selection.rsruvector-mincutO(n log n) 静态排序O(n^1.5 log n) 动态划分频谱图门控spectrogram.rsruvector-attn-mincut均匀 STFT bins注意力门控噪声抑制BVP 聚合bvp.rsruvector-attention均匀子载波求和灵敏度加权注意力菲涅尔几何fresnel.rsruvector-solver固定几何公式数据驱动多观测系统多 AP 三角定位triangulation.rsMATruvector-solverO(N³) 稠密高斯消元2×2 Neumann 系统O(1) 迭代呼吸缓冲breathing.rsMATruvector-temporal-tensor13.4 MB/区域3.4–6.7 MB/区域省 50–75%心跳频谱heartbeat.rsMATruvector-temporal-tensor307 KB/区域 均匀热/温/冷分层实施优先级ADR-017 原文决策优先级集成点决策理由P1呼吸 心跳压缩MAT16 区域灾难部署的内存关键项P1多 AP 三角定位MAT安全关键的精度改进P2DynamicMinCut 子载波选择支撑动态环境自适应P2BVP 注意力聚合直接提升活动分类精度P3频谱图注意力门控降低 CNN 输入噪声需 CNN 重训P3菲涅尔几何系统改善未知几何下的呼吸检测11. 决策影响评估收益与代价11.1 正向影响全生产 crate 一致性train、signal、MAT 三系 crate 统一基于 ruvector 五件套降低认知与维护成本。灾难检测内存锐减 50–75%16 区域并发从约 214 MB 降至约 54–107 MB救援设备可支撑 2–4 倍并发区域。动态子载波划分环境变化家具移动、新占用者无需人工调参即可自动适配。注意力加权 BVP不敏感子载波不再稀释速度估计误差。NeumannSolver 三角定位复杂度与 AP 数解耦——无论 N 多少恒求解 2×2 系统。11.2 负向影响与缓解类型桥接成本ruvector crate 全部基于 CPU 上的[f32]切片运算而 signal/MAT crate 原生类型为ndarray与复数num-complex必须在调用边界做显式转换仓库 Cargo.toml 中ndarray、rustfft、num-complex依赖并存正为此。有损压缩的保真度边界ruvector-temporal-tensor分层量化是有损的温/冷层心跳幅度值可能丢失精细细节。缓解机制是热层覆盖近期窗口而heartbeat_band_power只依赖最近样本的平方和恰好规避了对历史精度的强依赖。二分类假设局限DynamicMinCut 方案假设子载波呈「近似二部」的可切分结构若环境存在 3 个明显不同的子载波组需扩展为多路切multi-way cut才能正确建模。12. 在仓库中如何继续深入以下是按 ADR-017 主题继续阅读本仓库的推荐路径决策上下文ADR-016训练管线集成ADR-017 的前置参考实现、ADR-014signal 侧算法来源、ADR-001MAT 侧业务来源、ADR-015。signal 侧实现subcarrier_selection.rs含 mincut 落地与测试、bvp.rs、fresnel.rs、spectrogram.rs。MAT 侧实现breathing.rs、heartbeat.rs、triangulation.rsfeature 门控见 wifi-densepose-mat/Cargo.toml。CIR warm-start 扩展应用cir.rs是 NeumannSolver 在同一 crate 内被二次复用的实例。构建验证仓库根目录提供 Makefile 与 verify 等构建/验证入口工作区统一在 v2/Cargo.toml 中维护版本。阅读时注意 ruvector 系列 crate 版本已随 ADR-152 vendor sync 高于 ADR-017 记录的 2.0.4。结语ADR-017 的价值并不在于「引入五个依赖」而在于它把 ruvector 的图切分、注意力、矩阵求解与分层压缩四类算法精准映射到 Wi-Fi 感知中最痛的四类问题上子载波选择从静态排序变动态划分、速度聚合从等权变注意力加权、几何/定位从闭式公式与暴力消元变 Neumann 迭代、时域/频域缓冲从裸数组变分层量化。当前仓库 v2/crates 的源码证实其中的子载波 mincut、BVP 注意力、菲涅尔求解、呼吸与心跳压缩等集成点已经以 feature 门控的真实代码落地并配有对应单元测试剩余的高层改造如频谱图注意力门控对 CNN 的影响则需要结合训练管线在重训验证后推进。这套「决策记录 源码落地」的双层结构恰好也是读懂整个 RuView v2 工程演进的最佳入口。【免费下载链接】RuViewπ RuView turns commodity WiFi signals into real-time spatial intelligence, vital sign monitoring, and presence detection — all without a single pixel of video.项目地址: https://gitcode.com/GitHub_Trending/wi/RuView创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考