前言
科研自用,有误请留言
一、bdf格式文件
bdf格式是脑电数据存储的常用文件格式,由于此格式文件无法在原有的基础上进行数据追加,因此只能将所有脑电数据拼接之后再添加到bdf文件中。
二、步骤
1.引入库
代码如下(示例):
import numpy as np
import pyedflib
import random
import time
2.保存数据方法
代码如下(示例):
def create_bdf(file, channel):
"""
:param file: 需要创建的文件名
:param channel: 通道数 + 1(刺激通道)
:return:
"""
# 创建单次传输数据时长(单次运动想象时长)
file_duration = 4
# 读取bdf文件,若不存在则创建
f = pyedflib.EdfWriter(file, channel, file_type=pyedflib.FILETYPE_BDFPLUS)
# 创建通道文件头信息列表
channel_info = []
# 创建通道列表(最后一个为刺激通道)
channel_list = ['C3', 'C4', 'Cz', 'FC3', 'FC4', 'CP3', 'CP4', 'CPz', 'Status']
# 设计通道头文件
for index, ch in enumerate(channel_list):
ch_dict = {
'label': ch,
'dimension': 'uV',
'sample_rate': 256,
'physical_max': 100,
'physical_min': -100,
'digital_max': 8388607,
'digital_min': -8388607,
'transducer': '',
'prefilter': ''
}
# 修改刺激通道的数字最大值和最小值
if ch == 'Status':
ch_dict['digital_max'] = ch_dict['physical_max']
ch_dict['digital_min'] = ch_dict['physical_min']
# 将每个通道的文件头信息添加到文件头信息列表
channel_info.append(ch_dict)
else:
channel_info.append(ch_dict)
# 将通道文件头信息列表添加到bdf文件中
f.setSignalHeaders(channel_info)
# 创建一个变量用于控制循环
num = 0
# 模拟四次数据的存储
while num < 4:
# 随机生成模拟脑电数据
data_arr = np.random.random((len(channel_list) - 1, file_duration * ch_dict['sample_rate']))
# 随机生成标签
random_number = random.randint(1, 4)
# 生成一个刺激通道大小的全0一维数组
pulse_data = np.zeros((1, file_duration * ch_dict['sample_rate']))
# 给刺激通道添加事件(在第0s添加标签会出现异常,可在第0.001s处添加消除该异常)
pulse_data[0][1] = pulse_data[0][1].item() + random_number
# 将刺激通道的数据添加到脑电数据数组中
data_arr = np.insert(data_arr, 8, pulse_data, axis=0)
# 将脑电数据和标签添加到bdf文件中(为什么不能使用物理测量值??????)
f.writeSamples(data_arr)
# 每添加一次数据就将num + 1
num = num + 1
# 每次添加数据之间的间隔为2秒
time.sleep(2)
# 关闭文件
f.close()
3. 方法调用
代码如下(示例):
if __name__ == "__main__":
demoFilePath = 'demoTest.bdf'
create_bdf(demoFilePath, 9)
总结
还有部分内容未了解清楚,后续补充