返回项目
已完成·

EEG Convert - 脑电数据格式转换工具

支持 EDF/BDF/CDT 等多种脑电数据格式互转,集成 Butterworth 滤波和陷波滤波,提供命令行和 Python API 两种使用方式。

EEG Convert - 脑电数据格式转换工具
PythonMNE-PythonpyEDFlibNumPySciPy

简介

在脑电(EEG)研究和临床应用中,不同厂商的采集设备输出的数据格式各不相同。常见的格式包括:

  • EDF(European Data Format)— 欧洲数据格式,最通用的标准
  • BDF(BioSemi Data Format)— BioSemi 设备专用格式,24位精度
  • CDT(Curry Data Format)— Neuroscan Curry 系统格式
  • SET(EEGLAB Dataset)— MATLAB 环境下的 EEGLAB 格式

EEG Convert 是一个轻量级的 Python 工具库,用于在这些格式之间进行无损转换,同时支持在转换过程中应用数字滤波(高通、低通、陷波)。

核心功能

格式互转

支持以下格式之间的双向转换:

输入格式输出格式说明
EDFBDF / SET / MAT标准欧洲数据格式
BDFEDF / SET / MATBioSemi 24位高精度
CDTEDF / BDF / SETNeuroscan Curry 格式
SETEDF / BDF / MATEEGLAB 数据集

信号滤波

转换过程中可同步应用数字滤波器:

  • 高通滤波 — 去除基线漂移(默认 0.5 Hz)
  • 低通滤波 — 去除高频噪声(默认 50 Hz)
  • 陷波滤波 — 去除工频干扰(50/60 Hz)

滤波器采用 Butterworth IIR 设计,通过 scipy.signal 实现,支持零相位滤波(forward-backward)避免相位失真。

使用方式

命令行

# 基础转换
python -m eeg_convert -i input.edf -o output.bdf
 
# 带滤波转换
python -m eeg_convert -i input.cdt -o output.edf \
  --low_pass 50 --high_pass 0.5 --notch 50

Python API

import eeg_convert
 
# 读取源文件
reader = eeg_convert.EEGReader("input.edf")
print(f"通道数: {len(reader.signals)}")
print(f"采样率: {reader.signals['Fp1']} Hz")
print(f"时长: {reader.duration} 秒")
 
# 按时间读取数据(避免内存溢出)
data = reader.read_by_time(start_time_second=0, duration_second=300)
 
# 创建写入器
writer = eeg_convert.EEGWriter("output.bdf", reader.signals)
 
# 分块转换(每块 5 分钟)
for i in range(0, int(reader.duration), 300):
    batch = reader.read_by_time(i, 300)
    filtered = [reader.filter2(ch, reader.signals[ch], 
                                low=0.5, high=50, notch=50) 
                for ch in reader.signals]
    writer.write_samples(filtered)
 
writer.closed()

技术实现

读取器架构

EEGReader 类封装了不同格式的读取逻辑:

  • EDF/BDF — 基于 pyEDFlib 直接读取二进制数据
  • CDT — 通过 MNE-Pythonread_raw_curry() 接口
  • SET — 借助 MNE-Python 读取 EEGLAB 数据集

分块处理

针对长时间记录的大文件(数小时甚至数十小时),采用分块读取策略:

  1. 每次读取固定时长(默认 300 秒)
  2. 逐通道应用滤波器
  3. 写入目标文件后释放内存
  4. 避免一次性加载整个文件导致内存溢出

滤波器设计

# Butterworth 带通滤波示例
from scipy.signal import butter, filtfilt
 
def butter_bandpass(lowcut, highcut, fs, order=4):
    nyq = 0.5 * fs
    low = lowcut / nyq
    high = highcut / nyq
    b, a = butter(order, [low, high], btype='band')
    return b, a
 
# 零相位滤波(消除相位延迟)
y = filtfilt(b, a, data)

应用场景

多中心数据整合

不同实验室使用不同品牌的脑电设备(Neuroscan、BioSemi、Brain Products),数据格式各异。通过 EEG Convert 统一转换为 EDF 标准格式,便于后续联合分析。

数据预处理流水线

在机器学习模型训练前,通常需要:

  1. 格式标准化 → 2. 滤波去噪 → 3. 重参考 → 4. 分段

EEG Convert 可嵌入这一流水线的前两步。

临床数据归档

医院长期积累的脑电数据可能包含多种格式,统一转换为 EDF(医疗行业标准)便于归档和后续调阅。

项目地址