---
title: data pipeline
type: method
last_updated: 2026-04-25
status: settled
---

# 传感器数据管道设计说明

> 本文档用于向导师/合作方/评审人汇报传感器数据从采集到Agent智能评估的完整技术方案。

---

## 一、设计目标

我们需要解决一个核心问题：**如何将手套上四种传感器（EDA、PPG、IMU、麦克风）的原始信号，经过预处理转化为AI Agent可理解的标准化特征数据，并建立Agent自动调用数据的接口？**

这个问题可以拆解为三个子问题：
1. 原始传感器信号怎么预处理？用什么算法提取什么特征？
2. 提取出来的特征怎么存储？用什么格式？
3. Agent怎么自动获取这些数据？以什么接口形式？

---

## 二、整体架构设计

我们设计了一个四层数据管道，每一层的设计都遵循**"够用就行，不过度设计"**的原则：

```
┌─────────────────────────────────────────────────────────┐
│ Layer 1: 硬件采集层                                       │
│ 手套MCU → BLE →                                   │
│ IMU@50Hz / PPG@64Hz / EDA@4Hz / Mic@16kHz                │
└──────────────────────┬──────────────────────────────────┘
                       │
┌──────────────────────▼──────────────────────────────────┐
│ Layer 2: 边缘预处理层 (preprocessing.py)                  │
│ 每5分钟聚合一次原始信号 → 提取标准化特征                    │
│ 15000个IMU采样点 → 1行 (步速/步频/变异性/震颤/活动量)      │
│ 19200个PPG采样点 → 1行 (HR/SDNN/RMSSD/LF_HF/SpO2)       │
│ 1200个EDA采样点  → 1行 (SCL/SCR次数/SCR幅度)              │
│ 语音段 → 1行 (F0/Jitter/MFCC/停顿率/TTR/语义连贯性)      │
└──────────────────────┬──────────────────────────────────┘
                       │ HTTP POST (JSON, 每5分钟)
┌──────────────────────▼──────────────────────────────────┐
│ Layer 3: 数据存储层 (data_pipeline.py → CSVWriter)        │
│ CSV文件存储 (研究阶段足够, pandas可直接读取)               │
│ data/raw/{patient_id}/{sensor}_{date}.csv  (分传感器)     │
│ data/features/{patient_id}/multimodal_{date}.csv (融合)   │
│ 每天每患者约180行 (5分钟窗口 × 15小时)                    │
└──────────────────────┬──────────────────────────────────┘
                       │
┌──────────────────────▼──────────────────────────────────┐
│ Layer 4: Agent消费层 (data_pipeline.py → AgentDataLoader) │
│ format_for_agent() → 一键输出Agent所需全部上下文           │
│ 包含: 最新12条特征 + 患者档案 + 个人基线 + 近期评估       │
│ MCP Tool接口: read_sensor_features / read_baseline 等     │
└─────────────────────────────────────────────────────────┘
```

---

## 三、各传感器预处理方法及依据

### 3.1 EDA（皮肤电活动）

**临床意义：** EDA反映交感神经系统兴奋程度，是检测AD患者BPSD激越事件的核心生理指标（Iaboni 2022，个性化模型AUC 0.80-0.95）。

**预处理流程：**
- 低通滤波（Butterworth 4阶，截止频率1Hz）去除高频噪声
- cvxEDA凸优化分解（Benedek & Kaernbach 2010）将信号分离为：
  - Tonic成分（SCL，皮肤电导水平）→ 反映长期自主神经基调
  - Phasic成分（SCR，皮肤电导反应）→ 反映即时情绪/刺激反应
- SCR峰值检测（amplitude > 0.01μS）→ 计算SCR次数、幅度、非特异性SCR频率

**工具选择：** NeuroKit2（Python，集成cvxEDA算法，一站式`eda_process()`调用）

**为什么选cvxEDA而不是其他方法：** cvxEDA是当前EDA分解的gold standard（被引用2000+次），对可穿戴场景的运动伪迹有较好的鲁棒性。

### 3.2 PPG/HRV（光电容积描记/心率变异性）

**临床意义：** HRV是评估自主神经功能的核心指标。Collins 2012发现HRV降低与AD风险独立相关；SDNN下降>20%提示自主神经退化。

**预处理流程：**
- 带通滤波（0.5-8Hz，Butterworth 3阶）保留心跳成分
- PPG系统收缩波峰值检测 → IBI（心跳间期）计算
- IBI去伪迹（Malik法：相邻IBI差>20%则插值替换）
- HRV时域分析：SDNN（总体变异性）、RMSSD（副交感指标）、pNN50
- HRV频域分析：Welch功率谱估计 → LF(0.04-0.15Hz)/HF(0.15-0.4Hz)功率 → LF/HF比值

**标准遵循：** Task Force of ESC/NASPE 1996国际HRV分析标准。5分钟窗口满足短期HRV的最低要求。

### 3.3 IMU（惯性测量单元）

**临床意义：** 步态参数是AD最有价值的早期标志之一。Buracchio 2010发现步速下降拐点出现在MCI临床诊断**前12.1年**——远早于任何量表能检出。

**预处理流程：**
- 计算加速度向量幅值SVM = √(ax²+ay²+az²)
- 步态频段带通滤波（0.5-3Hz）→ 峰值检测 → 步数、步频
- 步态变异性 = 步间距的变异系数CV（Hausdorff 2005：CV>5%提示神经退行风险）
- 步速估算采用Weinberg模型：step_length = K × (a_max - a_min)^0.25
- 手部震颤分析：带通3-12Hz → 功率谱密度（区分AD不规则震颤 vs PD规律4-6Hz震颤）

### 3.4 语音

**临床意义：** 语言变化可出现在AD临床诊断前10年。ADReSS Challenge (Luz 2020) 证明声学+语言学组合特征AUC>0.85。

**预处理流程分为两部分：**

**声学特征（不需要转录）：**
- 基频F0：pYIN算法（librosa实现，比传统自相关法更鲁棒）
- Jitter（频率微扰）、Shimmer（幅度微扰）→ 声带控制能力下降的标志
- HNR（谐噪比）→ 发声质量
- MFCC 13维 → 语音整体声学表示

**语言学特征（需要ASR转录）：**
- Whisper large-v3做中文语音识别（WER<10%）
- jieba分词 → 计算TTR（词汇多样性）、MLU（平均句长）
- 停顿率 = 静默时长/总时长（König 2015: 最敏感的单一AD语音特征，AUC 0.78）

---

## 四、数据存储方案

**为什么选CSV而不是数据库？**

| 考量 | 说明 |
|------|------|
| 数据频率 | 5分钟一条特征行，不是50Hz原始流 → 每天仅180行/患者 |
| 可读性 | Excel/Numbers直接打开，方便论文作图和手动检查 |
| 兼容性 | pandas、R、MATLAB、任何工具都能读 |
| 开发效率 | 无需配置数据库，零运维成本 |

**升级信号：** 当患者数>50或需要复杂SQL查询时，再考虑升级到SQLite/PostgreSQL。

---

## 五、Agent数据接口设计

核心设计理念：**Agent不需要知道数据从哪来，只需要调用标准接口获取标准格式的数据。**

我们设计了`AgentDataLoader`类，提供以下接口：

```python
loader = AgentDataLoader(data_root="data")

# 接口1: 获取最新传感器特征（Agent最频繁调用）
df = loader.load_latest_features("patient_003", n_rows=12)
# 返回: 最近1小时的12条5分钟窗口特征

# 接口2: 获取患者档案
profile = loader.load_patient_profile("patient_003")
# 返回: 年龄、性别、诊断、用药、偏好等

# 接口3: 获取个体化基线
baseline = loader.load_baseline("patient_003")
# 返回: 28天均值/标准差，用于判断当前数据是否偏离基线

# 接口4: 获取历史趋势
history = loader.load_history("patient_003", days=7)
# 返回: 过去7天的全部特征，用于趋势检测

# 接口5: 一键打包（Agent评估时调用这一个就够了）
context = loader.format_for_agent("patient_003")
# 返回: 拼接好的文本 = 档案 + 最新数据 + 基线 + 近期评估
# 直接作为Agent的user_prompt输入
```

在MCP Tool模式（Claude Agent SDK）中，这些接口被注册为Agent可调用的工具。Agent在每次评估时，会自动调用`read_sensor_features`获取数据，无需人工干预。

---

## 六、合成测试数据

由于目前没有真实患者数据，我们开发了基于文献的合成数据生成器（`synthetic.py`），用于系统测试：

- **6个AD阶段**的传感器参数分布（均值和标准差来自文献）
- **6种BPSD事件**注入模板（激越、日落综合征、焦虑、淡漠、游荡、睡眠障碍）
- **昼夜节律调制**（模拟真实的日间活动模式变化）
- 已生成**6个合成患者 × 3天 = 3240行**测试数据

合成数据与真实数据共享完全相同的CSV格式和Agent接口，保证系统在真实数据到来时可以无缝切换。

---

## 七、关键设计决策总结

| 决策点 | 选择 | 理由 |
|--------|------|------|
| 特征窗口 | 5分钟 | 满足HRV最低要求（Task Force 1996），兼顾EDA和步态 |
| EDA分解 | cvxEDA | Gold standard，运动伪迹鲁棒（Benedek 2010） |
| HRV计算 | NeuroKit2 | 一站式PPG→HRV，遵循国际标准 |
| 步速估算 | Weinberg模型 | 经典IMU步长模型，精度±10% |
| 语音ASR | Whisper | 中文WER<10%，TAUKADIAL 2024验证 |
| 存储格式 | CSV | 研究阶段够用，零运维 |
| Agent接口 | Python类 + MCP Tool | 兼容直接调用和Agent SDK |
| 评估频率 | 每小时 | 平衡API成本（~$2.40/天/患者）和监测灵敏度 |
