QMind 商城
登录 注册
菜单
返回商城
æ

波形识别

v1.0.2 作者:Qmind 更新于 2026-10-12
EEG标注波形识别

波形识别分析插件接口

wave_recognition 与 analyzer_epoch、analyzer_erp 一样,是由分析页动态发现的 AnalyzerViewPlugin。生产入口为:

from plugins.wave_recognition import AnalyzerViewPlugin

# AnalyzerViewPlugin is AnalyzerWaveRecognitionWidget

插件包通过 info.json 中的 {"analyzer_view": {"enabled": true}} 参与发现, 宿主不应直接导入具体插件类。

1. 组件边界

AnalyzerWaveRecognitionWidget 是唯一总装和状态协调层,内部包含:

  • WaveRecognitionTopBar:背景活动、导航、设置和 panel 显隐;
  • WaveformAreaWidget:当前窗口 EEG、Trigger、Mark 和 Segment;
  • WaveRecognitionProgressBar:整段记录缩略时间轴和当前窗口;
  • AnnotationOverviewPanel:背景、Segment 和 Mark 列表。

波形、时间轴和 panel 不直接修改宿主数据。它们发出用户意图,由总装层更新权威状态, 再向所有子组件回填完整快照。

2. AnalyzerViewPlugin 宿主钩子

set_data_provider(provider)

宿主注入整段预处理 EEG:

provider() -> (
    eeg,          # np.ndarray, shape=(channels, samples)
    fs,           # float, Hz
    ch_names,     # list[str]
    trigger_mat,  # np.ndarray, shape=(N, 2), [sample_index, code]
    scale_unit,   # float, 转换到 µV 的倍率
)

set_event_provider(provider)

宿主注入统一 Auto、Manual、behavioral 事件流。事件至少包含 source、label, 并通过 sample_index 或 display_timestamp / timestamp 定位。

bind_eeg_preprocessing(host)

绑定宿主预处理变更和现有 EEG 波形显示配置。插件通过鸭子类型消费宿主能力,不导入 app.view 中的具体视图类。

recompute() / activate_analysis_view()

  • 首次激活或预处理变化后,重新读取整段 EEG;
  • 普通再次激活只同步事件和显示配置,不重复执行整段预处理;
  • 隐藏时延迟计算,重新显示后再刷新。

refresh_events()

Manual 事件新增或删除后由宿主调用。只刷新 Trigger 层,不重新计算 EEG。

3. 唯一时间契约

边界 起点 时长
波形 draw_wave() Unix 时间戳秒 float 毫秒 int
波形导航信号 — 移动毫秒 int
时间轴 相对记录起点毫秒 int 毫秒 int
右侧 panel 已格式化显示字符串 已格式化显示字符串

秒与毫秒、绝对时间与相对时间只允许在 AnalyzerWaveRecognitionWidget 中转换。

4. 标注数据

波形帧的字典键携带标注类型:

marks = {
    "Mark": [(label, channel, unix_start_sec, duration_ms, highlighted)],
    "Segment": [(label, "", unix_start_sec, duration_ms, highlighted)],
    "background": [],
}

时间轴统一使用记录内相对毫秒:

marks = {
    "Mark": [(label, channel, relative_start_ms, duration_ms)],
    "Segment": [(label, "", relative_start_ms, duration_ms)],
}

波形通过 marks_change 发出变更命令:

{
    "action": "add" | "del" | "change",
    "before": (mark_type, label, channel, unix_start_sec, duration_ms) | None,
    "after": (mark_type, label, channel, unix_start_sec, duration_ms) | None,
}

总装层处理命令后重新向波形、时间轴和右侧 panel 回填状态。

Segment 使用相邻边界形成:第一个边界提供标签和起点,后一个边界提供结束点;相邻同标签 Segment 自动合并。

5. 标签定义

设置弹窗使用:

LabelDefinition(label, color, description, shortcut)

波形的统一标签表为:

wave_key_map = {
    label: (shortcut, color, "mark" | "segment" | "background")
}

时间轴读取同一映射的前两个字段。标签或快捷键冲突时,总装层保留第一项;重复快捷键的 后续项按空快捷键处理,避免交互崩溃。

6. 状态所有权

  • EEG、预处理配置和 Auto/Manual 事件属于宿主;
  • 当前观察窗口、波形 Mark、Segment 边界、背景活动和标签配置属于插件实例;
  • annotation_state() 返回插件标注状态副本,供后续持久化或导出适配器使用;
  • 所有子组件只持有渲染快照,不作为权威数据源。