bug fix
This commit is contained in:
@@ -1,32 +1,6 @@
|
||||
# XYParser 数据流与接口时序说明
|
||||
|
||||
## 1. 参与角色
|
||||
|
||||
- **64导EEG采集设备**
|
||||
- 持续输出原始 EEG 字节流。
|
||||
- **上位机**
|
||||
- 负责接收设备数据、调用 XYParser 库、对接算法模块。
|
||||
- **XYParser 库**
|
||||
- 负责帧解析、阻抗计算、算法数据回灌后的 Welch/PSD 计算。
|
||||
- **算法**
|
||||
- 接收上位机送入的算法数据,并输出用于 PSD/Welch 计算的数据。
|
||||
|
||||
## 2. 总体链路
|
||||
|
||||
当前流程可以分为两个阶段:
|
||||
|
||||
- **阶段一:阻抗检测阶段**
|
||||
- 设备连接后,首先下发采样率和增益配置命令。
|
||||
- 然后下发阻抗开启命令。
|
||||
- 在该阶段持续接收设备数据,并通过 `XYParser_ReadImpedance` 读取阻抗结果。
|
||||
- 阻抗检测结束后,下发阻抗关闭命令。
|
||||
|
||||
- **阶段二:常规采集与算法阶段**
|
||||
- 基于 `XYParser_Feed` 解析得到的帧数据继续做常规采集。
|
||||
- 帧数据先转换为算法数据,再送入算法模块。
|
||||
- Welch/PSD 不再直接基于帧解析结果计算,而是基于算法数据,通过 `XYParser_FeedAlgorithmData` 输入后计算。
|
||||
|
||||
## 3. 接口时序图
|
||||
## 接口时序图
|
||||
|
||||
### 3.1 64导初始化连接阶段
|
||||
|
||||
@@ -41,7 +15,7 @@ sequenceDiagram
|
||||
Host->>Lib: parser64 = XYParser_CreateParser(64)
|
||||
Host->>Lib: XYParser_SetAdcParams(parser64, 4.5, 6.0)
|
||||
Host->>Lib: XYParser_SetSampleRate(parser64, 250)
|
||||
Host->>Lib: XYParser_SetBypassChecksum(parser64, 0)
|
||||
Host->>Lib: XYParser_SetBypassChecksum(parser64, 1)
|
||||
Host->>Lib: gain_cmd_size = XYParser_Get64GainSampleRateCommandSize()
|
||||
Lib-->>Host: gain_cmd_size
|
||||
Host->>Lib: gain_cmd_bytes = XYParser_Serialize64GainSampleRateCommand(6, 250, gain_cmd_buf, gain_cmd_size)
|
||||
@@ -162,7 +136,7 @@ sequenceDiagram
|
||||
Host->>Lib: parser8 = XYParser_CreateParser(8)
|
||||
Host->>Lib: XYParser_SetAdcParams(parser8, vref, gain)
|
||||
Host->>Lib: XYParser_SetSampleRate(parser8, sample_rate)
|
||||
Host->>Lib: XYParser_SetBypassChecksum(parser8, 0)
|
||||
Host->>Lib: XYParser_SetBypassChecksum(parser8, 1)
|
||||
```
|
||||
|
||||
### 3.6 8导阻抗阶段
|
||||
@@ -235,204 +209,54 @@ sequenceDiagram
|
||||
Host->>Lib: XYParser_DestroyParser(parser8)
|
||||
```
|
||||
|
||||
## 4. 关键接口职责
|
||||
### 3.8 8导转64导导联映射关系
|
||||
|
||||
### 4.1 设备参数配置
|
||||
8导 workflow 在送入算法前,会先调用 `XYParser_Convert8ChFramesTo64Ch` 将 8 导帧扩展为 64 导帧。
|
||||
|
||||
- `XYParser_SetAdcParams`
|
||||
- 设置库内使用的 ADC 参考电压和增益参数。
|
||||
- 该参数影响原始采样值到微伏值的换算。
|
||||
- 8 个输入通道按固定导联位置写入 64 导 summary
|
||||
- 未覆盖到的其余 56 个 64 导导联全部补 `0`
|
||||
- `trigger type` 和 `trigger index` 原样透传
|
||||
|
||||
- `XYParser_SetSampleRate`
|
||||
- 设置库内处理逻辑使用的采样率。
|
||||
- 该参数影响阻抗、Welch/PSD 等后续处理。
|
||||
映射图如下:
|
||||
|
||||
- `XYParser_Get64GainSampleRateCommandSize`
|
||||
- 获取 64 导设备增益和采样率配置命令所需的缓冲区大小。
|
||||
```text
|
||||
8ch[0] -> PO5
|
||||
8ch[1] -> POZ
|
||||
8ch[2] -> PO6
|
||||
8ch[3] -> PO7
|
||||
8ch[4] -> O1
|
||||
8ch[5] -> OZ
|
||||
8ch[6] -> O2
|
||||
8ch[7] -> PO8
|
||||
others -> 0
|
||||
```
|
||||
|
||||
- `XYParser_Serialize64GainSampleRateCommand`
|
||||
- 根据目标增益和采样率生成下发给 64 导设备的命令字节流。
|
||||
- 上位机拿到该命令后发送给 EEG 设备,使设备端采样参数与库内配置保持一致。
|
||||
- 当前推荐流程中:
|
||||
- `vref` 固定为 `4.5`。
|
||||
- 设备连接成功后,先下发 `250Hz + 增益6`。
|
||||
- 开启阻抗前,下发 `250Hz + 增益24`,同时调用 `XYParser_SetImpedanceDetection(handle, 1)`,使库内 gain 自动切到 `24`。
|
||||
- 关闭阻抗后,再下发 `250Hz + 增益6`,同时调用 `XYParser_SetImpedanceDetection(handle, 0)`,使库内 gain 自动恢复到 `6`。
|
||||
也可以理解为下面这张对应表:
|
||||
|
||||
- `XYParser_Get64ImpedanceCommandSize`
|
||||
- 获取 64 导阻抗开关命令所需的缓冲区大小。
|
||||
| 8导索引 | 8导写入到的64导导联 |
|
||||
| --- | --- |
|
||||
| 0 | PO5 |
|
||||
| 1 | POZ |
|
||||
| 2 | PO6 |
|
||||
| 3 | PO7 |
|
||||
| 4 | O1 |
|
||||
| 5 | OZ |
|
||||
| 6 | O2 |
|
||||
| 7 | PO8 |
|
||||
|
||||
- `XYParser_Serialize64ImpedanceCommand`
|
||||
- 生成下发给 64 导设备的阻抗开关命令字节流。
|
||||
- `open = 1` 表示开启阻抗检测,`open = 0` 表示关闭阻抗检测。
|
||||
转换过程示意:
|
||||
|
||||
- `XYParser_Get8ChImpedanceCommandSize`
|
||||
- 获取 8 导阻抗开关命令所需的缓冲区大小。
|
||||
```text
|
||||
XYParser_Feed(8导原始数据)
|
||||
-> frame8_summary
|
||||
-> XYParser_Convert8ChFramesTo64Ch
|
||||
-> frame64_summary
|
||||
-> XYParser_ConvertSampleFramesToAlgorithmData
|
||||
-> algorithm_input_data
|
||||
```
|
||||
|
||||
- `XYParser_Serialize8ChImpedanceCommand`
|
||||
- 生成下发给 8 导设备的阻抗开关命令字节流。
|
||||
- `open = 1` 表示开启阻抗检测,`open = 0` 表示关闭阻抗检测。
|
||||
- 8 导流程中,设备连接后**不需要**额外下发增益和采样率命令。
|
||||
|
||||
### 4.2 原始数据解析
|
||||
|
||||
- `XYParser_Feed`
|
||||
- 输入设备原始字节流。
|
||||
- 输出解析后的 `XYParserFrameSummary` 数组。
|
||||
- 该接口当前仍负责驱动阻抗相关计算。
|
||||
- 该接口当前**不再驱动 Welch/PSD 计算**。
|
||||
|
||||
### 4.3 阻抗读取
|
||||
|
||||
- `XYParser_SetImpedanceDetection`
|
||||
- 控制是否启用阻抗检测。
|
||||
- 启用时,库内 ADC 增益自动切换到 `24`。
|
||||
- 关闭时,库内 ADC 增益自动恢复到 `6`。
|
||||
- 该接口只修改库内解析参数,不会自动给设备发送控制命令。
|
||||
|
||||
- `XYParser_ReadImpedance`
|
||||
- 读取当前已经累计完成的阻抗结果。
|
||||
- 阻抗结果来源于阻抗检测阶段的帧解析链路。
|
||||
|
||||
### 4.4 帧转算法数据
|
||||
|
||||
- `XYParser_ConvertSampleFramesToAlgorithmData`
|
||||
- 将单帧 `XYParserFrameSummary` 转为算法需要的连续数组。
|
||||
- 上位机通常在拿到帧数据后调用此接口,再把结果送入算法模块。
|
||||
代码依据:
|
||||
|
||||
- `XYParser_Convert8ChFramesTo64Ch`
|
||||
- 将 8 导帧转换为 64 导帧,未映射导联补 0。
|
||||
- 8 导流程中,在送算法数据前,需要先把 8 导帧转换为 64 导帧,再调用 `XYParser_ConvertSampleFramesToAlgorithmData`。
|
||||
|
||||
### 4.5 算法数据回灌
|
||||
|
||||
- `XYParser_FeedAlgorithmData`
|
||||
- 输入算法数据字节流。
|
||||
- 内部先按采样缓存,再按每 5 个采样组装为一帧。
|
||||
- 同时驱动 Welch/PSD 计算。
|
||||
- 可选输出重新组装后的 `XYParserFrameSummary`。
|
||||
|
||||
- `XYParser_ResetAlgorithmDataCache`
|
||||
- 清空算法数据缓存。
|
||||
- 适合在切换任务、重置状态时调用。
|
||||
|
||||
- `XYParser_FlushAlgorithmData`
|
||||
- 将缓存中不足 5 个采样的尾数据补齐为 1 帧输出。
|
||||
- 用于结束阶段处理残留数据。
|
||||
|
||||
### 4.6 Welch/PSD 读取
|
||||
|
||||
- `XYParser_SetWelchDetection`
|
||||
- 控制是否启用基于算法数据的 Welch 检测。
|
||||
|
||||
- `XYParser_ReadWelch`
|
||||
- 读取当前已累计完成的 Welch/PSD 结果。
|
||||
- Welch 结果当前仅来源于 `XYParser_FeedAlgorithmData`。
|
||||
|
||||
## 5. 当前设计结论
|
||||
|
||||
### 5.1 阻抗数据来源
|
||||
|
||||
- 阻抗在独立的阻抗检测阶段获取。
|
||||
- 即:
|
||||
- 设备连接成功
|
||||
- 下发采样率250和增益6命令
|
||||
- `XYParser_SetImpedanceDetection(handle, 1)`
|
||||
- 下发采样率250和增益24命令
|
||||
- 下发阻抗开启命令
|
||||
- 设备原始字节流
|
||||
- `XYParser_Feed`
|
||||
- `XYParser_ReadImpedance`
|
||||
- `XYParser_SetImpedanceDetection(handle, 0)`
|
||||
- 下发阻抗关闭命令
|
||||
- 下发采样率250和增益6命令
|
||||
|
||||
### 5.2 PSD 数据来源
|
||||
|
||||
- PSD/Welch 不再直接使用 `XYParser_Feed` 解析出来的帧数据。
|
||||
- 当前流程为:
|
||||
- 设备原始字节流
|
||||
- `XYParser_Feed`
|
||||
- `XYParser_ConvertSampleFramesToAlgorithmData`
|
||||
- 算法处理
|
||||
- `XYParser_FeedAlgorithmData`
|
||||
- `XYParser_ReadWelch`
|
||||
|
||||
### 5.3 8导算法数据来源
|
||||
|
||||
- 8 导流程中,算法输入和 Welch/PSD 仍然按 64 导数据格式处理。
|
||||
- 当前流程为:
|
||||
- 8 导设备原始字节流
|
||||
- `XYParser_Feed`
|
||||
- `XYParser_Convert8ChFramesTo64Ch`
|
||||
- `XYParser_ConvertSampleFramesToAlgorithmData`
|
||||
- 算法处理
|
||||
- `XYParser_FeedAlgorithmData`
|
||||
- `XYParser_ReadWelch`
|
||||
|
||||
## 6. 推荐调用顺序
|
||||
|
||||
### 6.1 64导推荐调用顺序
|
||||
|
||||
```text
|
||||
1. EEG 设备连接成功
|
||||
2. CreateParser
|
||||
3. SetAdcParams(4.5, 6) / SetSampleRate(250) / SetBypassChecksum
|
||||
4. Get64GainSampleRateCommandSize / Serialize64GainSampleRateCommand(6, 250)
|
||||
5. 上位机向设备下发采样率250、增益6命令
|
||||
6. SetImpedanceDetection(1)
|
||||
7. Get64GainSampleRateCommandSize / Serialize64GainSampleRateCommand(24, 250)
|
||||
8. 上位机向设备下发采样率250、增益24命令
|
||||
9. Get64ImpedanceCommandSize / Serialize64ImpedanceCommand(1)
|
||||
10. 上位机向设备下发阻抗开启命令
|
||||
11. 阻抗检测阶段循环:
|
||||
11.1 Feed 原始字节流,拿到帧
|
||||
11.2 ReadImpedance 读取阻抗
|
||||
12. Serialize64ImpedanceCommand(0)
|
||||
13. 上位机向设备下发阻抗关闭命令
|
||||
14. SetImpedanceDetection(0)
|
||||
15. Get64GainSampleRateCommandSize / Serialize64GainSampleRateCommand(6, 250)
|
||||
16. 上位机向设备下发采样率250、增益6命令
|
||||
17. SetWelchDetection
|
||||
18. 常规采集阶段循环:
|
||||
18.1 Feed 原始字节流,拿到帧
|
||||
18.2 将帧转换为算法数据
|
||||
18.3 将算法数据送入算法模块
|
||||
18.4 将算法输出数据通过 FeedAlgorithmData 回灌
|
||||
18.5 ReadWelch 读取 PSD/Welch 结果
|
||||
19. 必要时 FlushAlgorithmData
|
||||
20. DestroyParser
|
||||
```
|
||||
|
||||
### 6.2 8导推荐调用顺序
|
||||
|
||||
```text
|
||||
1. EEG 设备连接成功
|
||||
2. CreateParser
|
||||
3. SetAdcParams(vref, gain) / SetSampleRate(sample_rate) / SetBypassChecksum
|
||||
4. SetImpedanceDetection(1)
|
||||
5. Get8ChImpedanceCommandSize / Serialize8ChImpedanceCommand(1)
|
||||
6. 上位机向设备下发阻抗开启命令
|
||||
7. 阻抗检测阶段循环:
|
||||
7.1 Feed 原始字节流,拿到8导帧
|
||||
7.2 ReadImpedance 读取阻抗
|
||||
8. Serialize8ChImpedanceCommand(0)
|
||||
9. 上位机向设备下发阻抗关闭命令
|
||||
10. SetImpedanceDetection(0)
|
||||
11. SetWelchDetection
|
||||
12. 常规采集阶段循环:
|
||||
12.1 Feed 原始字节流,拿到8导帧
|
||||
12.2 将8导帧转换为64导帧
|
||||
12.3 将64导帧转换为算法数据
|
||||
12.4 将算法数据送入算法模块
|
||||
12.5 将算法输出数据通过 FeedAlgorithmData 回灌
|
||||
12.6 ReadWelch 读取 PSD/Welch 结果
|
||||
13. 必要时 FlushAlgorithmData
|
||||
14. DestroyParser
|
||||
```
|
||||
|
||||
## 7. 一句话总结
|
||||
|
||||
- **阻抗是独立阶段,先开阻抗、持续读取、再关阻抗。**
|
||||
- **Welch/PSD 走算法数据链路。**
|
||||
- **8导送算法前,先转成64导数据。**
|
||||
- `Convert8ChSummaryTo64ChSummary`
|
||||
- 8导映射表 `k8ChLeadMap`
|
||||
|
||||
Reference in New Issue
Block a user