二、EEG信号介绍

EEGLAB处理BP数据类型 最近在处理BP数据类型,面对数据,不知道如何使用eeglab来导入数据和处理,以下是我的处理方案: 1. BP数据类型 参考链接:http://www.360doc.com/content/17/0510/21/31769764_652801993.shtml (1)EEG数据  用BP收集数据可能给我留下最大的一个形象就是数据好多,收集一个数据会出来至少三个文件。EEG文件是最大的一个文... 阅读详情

1_EEG信号介绍

选择数据路径
在这里插入图片描述以上三个文件为原始数据(Brain Products数据):

  • .eeg:存储数据
  • .vhdr:头文件信息 通道配置信息
  • .vmrk:marker信息

EEG脑电预处理的原理解释:http://t.csdnimg.cn/BI0Sx

1.1 导入一例原始数据

import os
os.chdir("F:/data_Project/ml_part2/1_preprocessing/1_single_preprocessing/")
import mne
import numpy as np

#导入一例原始数据
#读取原始数据 mne区分是否是原始数据的方式是看数据的纬度 
#二维的数据(连续数据)都是raw 分段过的数据都用epoch的形式读
#不知道用什么函数 可以打mne.io.read之后tab一下
raw =  mne.io.read_raw_brainvision('1.vhdr',preload=True)
#eeg1 = mne.io.read_epochs_eeglab('1_LH.set')

#查看raw的基本信息
raw.info

#<RawBrainVision | 1.eeg, 64 x 439880 (439.9 s), ~214.9 MB, data loaded>
#当前raw:64*439880,64个通道,439880个数据
print(raw)

#查看raw的函数、方法、属性
dir(raw)

#查看采样率信息
sampling_rate = raw.info['sfreq']‘、

#查看采样点信息(采样点个数)
n_time_samps = raw.n_times

#每个采样点对应的时间信息 单位是s
time_secs = raw.times

#查看通道信息(通道名/数量)
ch_names = raw.ch_names
n_ch = len(ch_names)

raw.plot()
#定义一次显示多少个通道 多长时间的数据 以及绘图的尺寸
#一般建议:60导左右的数据 用30e-6
raw.plot(n_channels= 64, duration=5, scalings = 30e-6)

在这里插入图片描述基本信息

  • bads[ ]:标记过的坏通道
  • ch_name:通道名称
  • chs:有64个通道
  • custom_ref_applied: False,没有应用过重参考
  • highpass: 0.0 Hz、lowpass: 500.0 Hz:数据采集信息
  • nchan: 64:通道数量
  • sfreq: 1000.0 Hz:采样率,表示1s采1000个点

1.2 通道定位 绘制地形图

#通道定位 绘制地形图
#查看数据通道信息
# print(raw.ch_names)
# montage = mne.channels.read_custom_montage('standard-10-5-cap385.elp')
# raw.set_montage(montage)

#由于数据中的原始通道名称 没有办法被成功定位
#所以需要修改通道的名称信息
#这里'standard-10-5-cap385.elp'是国际标准10-5系统脑电通道定位文件(注意大小写,把key改为value)
mapping = {'FP1':'Fp1', 'FPZ':'Fpz','FP2':'Fp2', 'FZ':'Fz', 
           'FCZ':'FCz', 'CZ':'Cz', 'CPZ':'CPz', 'PZ':'Pz', 
           'PO5':'PO5', 'POZ':'POz', 'PO6':'PO6', 'OZ':'Oz', 
           'HEO':'HEOG', 'VEO':'VEOG'}
#修改通道的名称,用copy不会改变原数据
raw_rename_ch = raw.copy().rename_channels(mapping)
#读取通道定位文件
montage = mne.channels.read_custom_montage('standard-10-5-cap385.elp')
#进行通道定位
raw_rename_ch.set_montage(montage)

#绘制通道排布图(电极位置)
raw_rename_ch.plot_sensors()
#设置绘制的参数:通道类型 通道名称 和脑子轮廓的大小
raw_rename_ch.plot_sensors(ch_type = 'eeg', show_names = True, sphere = 0.075)
#绘制频谱响应 规定频率的范围(脑电数据随着频率的升高,能量越低;但图中50有激增,这是工频干扰,需要滤波,把干扰凹陷掉)
raw_rename_ch.plot_psd(fmin = 1, fmax = 70,spatial_colors = True)

在这里插入图片描述

1.3 去除无用电极

#去除无用电极 更改并选择通道类型
raw_select_ch = raw_rename_ch.copy()
#将HEOG和VEOG定义为眼电电极(此时info:chs: 62 EEG, 2 EOG)
raw_select_ch.set_channel_types({'HEOG':'eog','VEOG':'eog'})
raw_select_ch.info
#只保留eeg类型的数据(此时info:chs: 62 EEG)
raw_select_ch.pick(['eeg'])
raw_select_ch.info

若无用电极较多,可先去除电极再重命名通道。
复杂的数据可在eeglab中处理后,再导入python处理。

1.4 滤波

#滤波
#对数据进行0.1到30的带通滤波
#此处0.1-30Hz的滤波为有用数据,小于和大于的部分是衰减,而不是全部去除
raw_band = raw_select_ch.copy().filter(0.1,30,picks = 'eeg')
#绘制频谱响应图 方便观察滤波前后在频率响应上的变化
raw_band.plot_psd(fmin = 1, fmax = 70,spatial_colors = True)

#raw_band.plot()
#滤波后改变highpass: 0.1 Hz/lowpass: 30.0 Hz
raw_band.info 
#凹陷(带阻)滤波 去除工频干扰 中国是50Hz 国外是60Hz
#以50Hz为中心频率点 带阻的宽度为4Hz --> 48-52的带阻
#当前50Hz部分影响不大 效果不明显
raw_band_notch = raw_band.notch_filter(50, notch_widths = 4)
raw_band_notch.plot_psd(fmin = 1, fmax = 70,spatial_colors = True)

#对数据进行降采样  info:sfreq: 500.0 Hz
#我们能分析到的最大频率是采样率的一半 但实际能准确分析道的频率是采样率的1/3~1/4
#降采样的好处是缩减数据量 节约计算和存储成本 但要注意降采样后的数据对频域分析的影响
#建议先滤波再降采样
raw_resampled = raw_band_notch.copy().resample(sfreq = 500)
raw_resampled.info

在这里插入图片描述

1.5 分段 基线校正

#分段
#读取数据的marker,也就是mne中的events_from_annotations
events_from_anno, event_dict = mne.events_from_annotations(raw_resampled)
#event_dict中:marker的类型和标记名称之间的关系
print(event_dict)
#events_from_anno中:标记出现的时间点 持续时间(都是0) 类型信息
print(events_from_anno)

#定义想要对什么marker数据进行分段
#event_dict中有四种刺激 只取两种刺激marker(10/11),不关心反映marker(100/200)
#{'Stimulus/10': 10001, 'Stimulus/100': 10002, 'Stimulus/11': 10003, 'Stimulus/200': 10004}
custom_mapping = {'Stimulus/10': 10, 'Stimulus/11': 11}

#更改数据中的marker信息(此时类型信息只有10/11)
(events_from_anno,event_dict) = mne.events_from_annotations(raw_resampled,event_id = custom_mapping)
print(event_dict)
print(events_from_anno)

#对数据进行分段(定义分段的长度 和基线的范围)
my_epochs = mne.Epochs(raw_resampled, events_from_anno, tmin = -0.2, tmax = 0.8,baseline = (-0.2,0))

#基线校正
my_epochs.apply_baseline()
my_epochs.info


#保存刚分段好的数据
#用pickel把my_epochs变量存成my_epochs.pkl文件
import pickle
output = open('my_epochs.pkl','wb')
pickle.dump(my_epochs, output)
output.close()

#读数据
#将my_epochs.pkl文件读进来 读取在my_epochs变量中
del my_epochs
pkl_file = open('my_epochs.pkl','rb')
my_epochs = pickle.load(pkl_file)
pkl_file.close()
my_epochs.info

#这里存储的目的是:对比查看去除环段的效果 并存储备份

1.6 去除坏段

#去除坏段
my_epochs_good = my_epochs.copy()
#绘制数据 分段前的数据(定义绘制数据的时间长度) 分段后的数据(定义绘制的分段个数)
my_epochs_good.plot(n_epochs = 5,n_channels= 64)
#在上面的图中可手动标红认为是坏段的数据
#下面的代码是去除标记过的坏段 恢复状态
my_epochs_good.drop_bad
my_epochs_good.info
#查看剩余分段的信息(此时一共100个,10的50个,11的50个)
print(len(my_epochs_good.events))

#插值坏电极(=去除坏通道) 类似上面直接点击标记
my_epochs_good.plot(n_epochs = 5,n_channels= 64)
good_ch = my_epochs_good.load_data().copy().interpolate_bads(reset_bads=True)
good_ch.info
good_ch.plot(n_epochs = 5,n_channels= 64)
#这里一个错误提醒 执行1选择bads 执行2的info中才有
#good_ch.plot(n_epochs = 5,n_channels= 64)
#good_ch.info

#去除坏段/坏通道需手动选取,工作量较大,需备份反复处理尝试

1.7 ICA独立成分分析 去伪迹

脑电数据ICA典型成分识别:http://t.csdnimg.cn/TQojJ

#ICA独立成分分析
#在做ICA时 意图是去伪迹 但ICA不是万能的 
#比较好算出来的独立成分 是类似于眼电/肌点 在数据中对数据影响并不是非常大 而且规律出现的 
#建议在ICA之前先进行坏段去除/坏导插值 将规律的眼电信息保留
from mne.preprocessing import (ICA)
ica_data = good_ch.copy()
#定义ICA独立成分分析的数量 = 实际的电极数量 - 坏通道的数量
#但是当电极很多的时候 可以只进行64个独立成分的分解
ica = ICA(n_components= 50)
ica.fit(ica_data)
#绘制ICA的独立成分图 只有地形图
ica.plot_components()
#图像的结果分析(越往后的成分影响越小):ICA000眨眼成分等等
#不要随意去除 去经典眨眼眼动头动等成分就可以

#绘制一个一个独立的成分属性图 range(0,50) [0,50)
ica.plot_properties(good_ch, picks= [0,1])
ica.plot_properties(good_ch, picks= np.array(range(0,50)))
#查看某个特定成分去除前后对数据的整体影响 方便判断是否选择正确
#红和黑是完全重合 没必要去除 有尖可能是眨眼等 需去除
ica.plot_overlay(raw_resampled, exclude=[0], picks='eeg')


output = open('ica.pkl','wb')
pickle.dump(ica, output)
output.close()

pkl_file = open('ica.pkl','rb')
my_epochs = pickle.load(pkl_file)
pkl_file.close()

#去除伪迹成分
#指定要去除的成分 以及查看plot确认 (ICA000就是0,成分是从0开始)
ica.exclude = [0]
ica.plot_components([0])
ica_clean = good_ch.copy()
#导入数据
ica_clean.load_data()
#根据刚才指定的编号去除伪迹成分
ica.apply(ica_clean)

#查看去除前后数据 对比效果
ica_clean.plot(n_epochs = 5, scalings = 30e-6)
good_ch.plot(n_epochs = 5, scalings = 30e-6)

output = open('ica_clean.pkl','wb')
pickle.dump(ica_clean, output)
output.close()

pkl_file = open('ica_clean.pkl','rb')
good_ch = pickle.load(pkl_file)
pkl_file.close()

1.8 极端值去伪迹

#极端值去伪迹
extreme_values = ica_clean.copy()
#建立一个伪迹去除标准 100uv(一定要先ICA处理再极端值处理)
stronger_reject_criteria = dict(eeg=100e-6)
extreme_values.drop_bad(reject=stronger_reject_criteria)
#查看去除的各个分段的去除原因 人为/通道超过了自动拒绝标准
print(extreme_values.drop_log)
extreme_values.plot_drop_log()

output = open('extreme_values.pkl','wb')
pickle.dump(extreme_values, output)
output.close()

pkl_file = open('extreme_values.pkl','rb')
extreme_values = pickle.load(pkl_file)
pkl_file.close()

1.9 重参考

#重参考(选择参考很重要)
#在线记录的参考电极 > 重参考电极 > 要分析的电极 > 剩余电极
#重参考一般用双侧乳突['TP9', 'TP10'] 平均参考要先去除双侧乳突等非脑电电极 再进行平均参考
refered = extreme_values.copy().set_eeg_reference(ref_channels=['TP9', 'TP10'])
#refered = extreme_values.copy().set_eeg_reference(ref_channels='average')

output = open('refered.pkl','wb')
pickle.dump(refered, output)
output.close()

完整代码

单个数据处理

F:\data_Project\ml_part2\1_preprocessing\scripts\single_bacth.py

import os
os.chdir("C:/Users/Lenovo/Desktop/ml_part2/1_preprocessing/1_single_preprocessing/")
import mne
import numpy as np

#导入一例原始数据
raw =  mne.io.read_raw_brainvision('1.vhdr',preload=True)
#eeg1 = mne.io.read_epochs_eeglab('1_LH.set')
raw.info
print(raw)
dir(raw)
sampling_rate = raw.info['sfreq']
n_time_samps = raw.n_times
time_secs = raw.times
ch_names = raw.ch_names
n_ch = len(ch_names)
raw.plot()
raw.plot(n_channels= 64, duration=5, scalings = 30e-6)


#通道定位 绘制地形图
#查看数据通道信息
# print(raw.ch_names)
# montage = mne.channels.read_custom_montage('standard-10-5-cap385.elp')
# raw.set_montage(montage)

mapping = {'FP1':'Fp1', 'FPZ':'Fpz','FP2':'Fp2', 'FZ':'Fz', 
           'FCZ':'FCz', 'CZ':'Cz', 'CPZ':'CPz', 'PZ':'Pz', 
           'PO5':'PO5', 'POZ':'POz', 'PO6':'PO6', 'OZ':'Oz', 
           'HEO':'HEOG', 'VEO':'VEOG'}
raw_rename_ch = raw.copy().rename_channels(mapping)
montage = mne.channels.read_custom_montage('standard-10-5-cap385.elp')
raw_rename_ch.set_montage(montage)
raw_rename_ch.plot_sensors()
raw_rename_ch.plot_sensors(ch_type = 'eeg', show_names = True, sphere = 0.075)
raw_rename_ch.plot_psd(fmin = 1, fmax = 70,spatial_colors = True)


raw_select_ch = raw_rename_ch.copy()
raw_select_ch.set_channel_types({'HEOG':'eog','VEOG':'eog'})
raw_select_ch.info
raw_select_ch.pick(['eeg'])
raw_select_ch.info

#滤波
raw_band = raw_select_ch.copy().filter(0.1,30,picks = 'eeg')
raw_band.plot_psd(fmin = 1, fmax = 70,spatial_colors = True)

#raw_band.plot()
raw_band.info
raw_band_notch = raw_band.notch_filter(50, notch_widths = 4)
raw_band_notch.plot_psd(fmin = 1, fmax = 70,spatial_colors = True)



raw_resampled = raw_band_notch.copy().resample(sfreq = 500)
raw_resampled.info

#分段
events_from_anno, event_dict = mne.events_from_annotations(raw_resampled)
print(event_dict)
print(events_from_anno)
custom_mapping = {'Stimulus/10': 10, 'Stimulus/11': 11}

(events_from_anno,event_dict) = mne.events_from_annotations(raw_resampled,event_id = custom_mapping)
print(event_dict)
print(events_from_anno)
my_epochs = mne.Epochs(raw_resampled, events_from_anno, tmin = -0.2, tmax = 0.8,baseline = (-0.2,0))
my_epochs.apply_baseline()
my_epochs.info


#保存刚分段好的数据
import pickle
output = open('my_epochs.pkl','wb')
pickle.dump(my_epochs, output)
output.close()

del my_epochs
pkl_file = open('my_epochs.pkl','rb')
my_epochs = pickle.load(pkl_file)
pkl_file.close()
my_epochs.info


#去除坏段
my_epochs_good = my_epochs.copy()
my_epochs_good.plot(n_epochs = 5,n_channels= 64)
my_epochs_good.drop_bad
my_epochs_good.info
print(len(my_epochs_good.events))
#插值坏电极
my_epochs_good.plot(n_epochs = 5,n_channels= 64)
good_ch = my_epochs_good.load_data().copy().interpolate_bads(reset_bads=True)
good_ch.info
good_ch.plot(n_epochs = 5,n_channels= 64)


output = open('good_ch.pkl','wb')
pickle.dump(good_ch, output)
output.close()

pkl_file = open('good_ch.pkl','rb')
good_ch = pickle.load(pkl_file)
pkl_file.close()


from mne.preprocessing import (ICA)
ica_data = good_ch.copy()
ica = ICA(n_components= 50)
ica.fit(ica_data)
ica.plot_components()


#range(0,50) [0,50)
ica.plot_properties(good_ch, picks= [0,1])
ica.plot_properties(good_ch, picks= np.array(range(0,50)))
ica.plot_overlay(raw_resampled, exclude=[0], picks='eeg')


output = open('ica.pkl','wb')
pickle.dump(ica, output)
output.close()

pkl_file = open('ica.pkl','rb')
my_epochs = pickle.load(pkl_file)
pkl_file.close()

ica.exclude = [0]
ica.plot_components([0])
ica_clean = good_ch.copy()
ica_clean.load_data()
ica.apply(ica_clean)

ica_clean.plot(n_epochs = 5, scalings = 30e-6)
good_ch.plot(n_epochs = 5, scalings = 30e-6)

output = open('ica_clean.pkl','wb')
pickle.dump(ica_clean, output)
output.close()

pkl_file = open('ica_clean.pkl','rb')
good_ch = pickle.load(pkl_file)
pkl_file.close()



extreme_values = ica_clean.copy()
stronger_reject_criteria = dict(eeg=100e-6)
extreme_values.drop_bad(reject=stronger_reject_criteria)
print(extreme_values.drop_log)
extreme_values.plot_drop_log()

output = open('extreme_values.pkl','wb')
pickle.dump(extreme_values, output)
output.close()

pkl_file = open('extreme_values.pkl','rb')
extreme_values = pickle.load(pkl_file)
pkl_file.close()

refered = extreme_values.copy().set_eeg_reference(ref_channels=['TP9', 'TP10'])
#refered = extreme_values.copy().set_eeg_reference(ref_channels='average')

output = open('refered.pkl','wb')
pickle.dump(refered, output)
output.close()

大量数据处理

这里有部分步骤需要一个个赋值i去跑,例如ICA
F:\data_Project\ml_part2\1_preprocessing\scripts\preprocessing_batch.py

#先更改工作路径 记得使用正斜杠/
#定义工作路径
import os
#引入必要的模块
os.chdir("F:/data_Project/ml_part2/1_preprocessing/2_preprocessing_batch/")
import mne
import numpy as np
import matplotlib.pyplot as plt
import pickle

#定义数据的根目录
root = 'C:/Users/Lenovo/Desktop/ml_part2/1_preprocessing/2_preprocessing_batch/'
#定义可能用到的数据路径(每个步骤单独存储)
path_list = ['1_raw_data/','2_epoch_data/','3_rm_epochs_g_chs/',
             '4_ica_cleaned/','5_extreme_values_refered/']

for i in range(1,3):
    #拼接数据的文件名
    filename = os.path.join(root,path_list[0]) + str(i) + '.vhdr'
    print(filename)

    raw =  mne.io.read_raw_brainvision(filename,preload=True)
    mapping = {'FP1':'Fp1', 'FPZ':'Fpz','FP2':'Fp2', 'FZ':'Fz', 
           'FCZ':'FCz', 'CZ':'Cz', 'CPZ':'CPz', 'PZ':'Pz', 
           'PO5':'PO5', 'POZ':'POz', 'PO6':'PO6', 'OZ':'Oz', 
           'HEO':'HEOG', 'VEO':'VEOG'}
    raw_rename_ch = raw.copy().rename_channels(mapping)
    montage = mne.channels.read_custom_montage('standard-10-5-cap385.elp')
    raw_rename_ch.set_montage(montage)
    raw_select_ch = raw_rename_ch.copy()
    raw_select_ch.set_channel_types({'HEOG':'eog','VEOG':'eog'})
    raw_select_ch.pick(['eeg'])


    #滤波
    raw_band = raw_select_ch.copy().filter(0.1,30,picks = 'eeg')
    raw_band_notch = raw_band.notch_filter(50, notch_widths = 4)
    raw_resampled = raw_band_notch.copy().resample(sfreq = 500)
    #分段
    custom_mapping = {'Stimulus/10': 10, 'Stimulus/11': 11}
    (events_from_anno,event_dict) = mne.events_from_annotations(raw_resampled,event_id = custom_mapping)
    my_epochs = mne.Epochs(raw_resampled, events_from_anno, tmin = -0.2, tmax = 0.8,baseline = (-0.2,0))
    savename = os.path.join(root,path_list[1]) + str(i) + '.pkl'

    output = open(savename,'wb')
    pickle.dump(my_epochs, output)
    output.close()


i = 1
filename = os.path.join(root,path_list[1]) + str(i) + '.pkl'
pkl_file = open(filename,'rb')
my_epochs = pickle.load(pkl_file)
pkl_file.close()
    

#去除坏段
my_epochs_good = my_epochs.copy()
my_epochs_good.plot(n_epochs = 5)
my_epochs_good.drop_bad
my_epochs_good.info

#插值坏电极
good_ch = my_epochs_good.load_data().copy().interpolate_bads(reset_bads=False)
savename = os.path.join(root,path_list[2]) + str(i) + '.pkl'
output = open(savename,'wb')
pickle.dump(good_ch, output)
output.close()


from mne.preprocessing import (ICA)
i = 1
filename = os.path.join(root,path_list[2]) + str(i) + '.pkl'
pkl_file = open(filename,'rb')
good_ch = pickle.load(pkl_file)
pkl_file.close()

ica_data = good_ch.copy()
ica = ICA(n_components= 50)
ica.fit(ica_data)
ica.plot_components()

good_ch.load_data()
ica.plot_sources(good_ch, show_scrollbars=False)
#range(0,50) [0,50)
ica.plot_properties(good_ch, picks= [0,1])
ica.plot_properties(good_ch, picks= np.array(range(0,50)))
ica.plot_overlay(raw_resampled, exclude=[0], picks='eeg')

ica.exclude = [0]
ica_clean = good_ch.copy()
ica_clean.load_data()
ica.apply(ica_clean)

ica_clean.plot(n_epochs = 5, scalings = 30e-6)
good_ch.plot(n_epochs = 5, scalings = 30e-6)


savename = os.path.join(root,path_list[3]) + str(i) + '.pkl'
output = open(savename,'wb')
pickle.dump(ica_clean, output)
output.close()

for i in range(1,3):
    filename = os.path.join(root,path_list[3]) + str(i) + '.pkl'
    pkl_file = open(filename,'rb')
    ica_clean = pickle.load(pkl_file)
    pkl_file.close()

    reject_criteria = dict(eeg=100e-6)
    extreme_values = ica_clean.copy()
    stronger_reject_criteria = dict(eeg=100e-6)
    extreme_values.drop_bad(reject=stronger_reject_criteria)
    refered = extreme_values.copy().set_eeg_reference(ref_channels=['TP9', 'TP10'])
    #refered = extreme_values.copy().set_eeg_reference(ref_channels='average')

    savename = os.path.join(root,path_list[4]) + str(i) + '.pkl'
    output = open(savename,'wb')
    pickle.dump(refered, output)
    output.close()

2_EEGLAB软件介绍

3_EEG信号预处理及分析要点

脑机接口EEG信号分类算法 脑机接口技术中EEG信号的特征提取和模式识别算法 阅读详情

相关推荐

EEG脑电信号常用处理方法

一. 关于脑电信号 今年中旬,在马斯克召开的发布会,其名下Neuralink 的脑机接口植入技术引发热议,脑-机接口(brain-computer interface, BCI)技术也成为了当前信息交互的研究热点,意念控制似乎离我们不再遥远,而脑电信号(electroencephalography, EEG)由于易操作性,安全性等特点,受到了科研工作者的广泛关注,如何准确得利用脑电信号来实现操控,...

weixin_43361652的博客 2万+

使用python的MNE包分析EEG数据(2)——预处理(导入脑电数据)

python的MNE包工具网站:https://mne.tools/stable/index.html。

qq_43762088的博客 3764

脑电图(EEG)信号去噪方法简述

脑电图作为目前研究最为广泛的认知大脑的方式之一,其无创性、便携性、廉价等优点都表明该方式具有巨大的发展空间。但是由于颅骨和头皮对于电信号的传输影响,从头皮采集的电信号往往混杂着非常多的噪声,并且有效信息又非常少,所以对于去处噪声的算法的要求非常高。本文将对EEG降噪的算法做作一些介绍。

qq_44725872的博客 1万+

.e格式脑电数据的读取

由于收到了一批.e格式的脑电数据,稍微查了下,这些是比较老的.eeg格式数据,有些老设备会导出.e格式,而不能导出.eeg格式。通过fileio选项,然后选取.e文件即可,在读取的过程中出现一些弹框跟eeglab读取其他格式文件一样,空着就是默认,有些弹窗需要命名的可以命名。一般情况下filio这个读取文件的拓展包还需要额外下载,eeglab会提醒,下载即可。读取时间比较长,这边20m左右的数据,读取了大概10分钟左右,感觉效率不是很高。在读取的时候,如果存在报错,关于ft变量的相关报错。

qq_40181639的博客 1573

基于EEG的抑郁症诊断:SSPA-GCN模型PyTorch实现与避坑指南

EEG信号分析是脑机接口与神经疾病诊断的核心技术,其原理在于通过电极采集头皮电位,经滤波、频段功率提取等预处理后,利用图卷积网络建模电极间的空间拓扑关系。技术价值在于能捕捉通道与频段的差异化贡献,提升分类鲁棒性。在抑郁症辅助诊断、情绪识别等场景中,SSPA-GCN通过通道注意力和频段注意力机制重加权特征,结合ChebConv图卷积与按被试切分策略,有效缓解数据泄露与过拟合。本文围绕PyTorch实现,详解从邻接矩阵构建到FocalLoss训练的完整管线,并给出准确率虚高的排查经验。

weixin_28678151的博客 191

standard-10-5-cap385.elp

国际标准10-5系统脑电通道定位文件

STFT处理脑电信号

对于非平稳信号,短时傅里叶变换所采用的策略是在信号上面加窗,一般是hamming窗,当然也可以是其它类型的窗函数,加窗之后的信号被分割为一组短长度子序列,子序列可以近似的看为平稳序列,可以用傅里叶变换的方式去进行分析,这也是短时傅里叶变换的精髓所在。   用STFT进行脑电信号分析一般有两种思路,第一种是用STFT来分离EEG信号的波段,从而求得每一个波段的能量作为特征(alpha、beta、th...

Bebr的博客 3169

脑机接口BCI-eeglab安装包

脑机接口信号处理(预处理+滤波+ICA+特征提取)

EEG-MI 基于EEG信号的运动想象分类实验

文章目录1. 项目背景2. 实验目的3. 实验过程CNN部分分类器设计性能评估代码参考文献 1. 项目背景 “脑机接口”(Brain Cpmputer Interface, BCI)研究的核心是在大脑和外部设备之间建立直接的联通通路,因此脑机接口也被誉为“人工智能的顶级科学”。脑机接口(BCI)通过计算机信息处理技术理解人的意图,并将此意图转化为对外界的控制命令,实现大脑对外部世界的直接控制。目前的脑机接口应用主要有以下几个方面[1]: ① 脑机接口替代原有中枢神经系统的输出 ② 重建丧失的中枢神经系统的输

qq_45347185的博客 9481

英国埃塞克斯大学的脑电EEG数据集

英国埃塞克斯大学的脑电EEG数据集 (数据集中文件为 .npy 文件) 数据集包含12名健康受试者,年龄从 24 岁到 50 岁不等(58% 为女性,50% 未接受过 BCI) 用于训练和测试的模式数量为 178 个,每个模式包含 3600 个特征 这里使用的脑电图数据由 MI 生成。在这一范例中,肢体运动想象会产生一系列短暂的放大和衰减: 分别为事件相关非同步化(ERD)和事件相关同步化(ERS)。脑电图试验由 15 个电极记录(见图 1,采样率为 256 Hz),并通过离散小波变换(一种多分辨率分析(MRA))创建模式。 从每个电极获得的信号被分为连续且部分重叠的片段(共 20 个片段)。对每个片段进行 6 级小波 MRA,以产生近似和细节两种类型的系数集,系数集的大小以 2 的幂次递减(6 至 1 级分别为 128、64、32、16、8 和 4 个系数)。总之,一个脑电图模式有 2 × S × E × L 组系数,其中 S 是片段数,E 是电极数,L 是小波级别数。根据上述参数,S = 20,E = 15,L = 6。这意味着有 3 600 组系数,总共有 151200

湿敏电阻HR202的两种驱动方案实测:IO充放电法 vs. 交流方波ADC法,哪个更适合你?

本文深入评测湿敏电阻HR202的两种驱动方案:IO充放电法和交流方波ADC法。通过原理图分析、精度实测和资源占用对比,揭示交流方波ADC法在精度和稳定性上的优势,特别适合长期监测场景。同时提供IO充放电法在资源受限情况下的应用建议,帮助工程师根据项目需求做出最优选择。

weixin_30421809的博客 468

全面总结EEG信号中常见的干扰和噪声信号

全面总结EEG信号中常见的干扰和噪声信号 在EEG/ERP研究中,最令人头痛的问题之一是各种干扰和噪声信号混入到EEG/ERP信号中,因此,数据分析的第一步其实就是去除不同形式的伪迹信号。这些不同形式的干扰和噪声,有些可以在EEG数据采集时尽量避免甚至消除掉,而有些只能在后续的预处理中去除。此外,由于滤波、ICA等操作会不同程度造成EEG信号的“形变”,因此,有一个潜在的原则是:尽量在EEG信号采...

悦影科技 1万+

大疆mini 3 pro rtmp推流(带屏遥控器不支持)windows

大疆mini 3 pro无人机rtmp推流(带屏遥控器不支持)至windows电脑

xbsigeibwkouvfcj的博客 3432

基于分类任务的信号(EEG)处理——代码分步解析

本篇博文是对本人另一篇博文《基于分类任务的信号(EEG)处理》的扩展,另一篇博文是从宏观方面介绍利用EEG信号进行分类任务,本片博文是用详细的代码进行解析,大家可以两篇结合着来看,希望可以帮助到大家。 读取脑电信号 在读取设备采集的脑电信号上EEGLAB是一个非常强大的工具包,我在本文中就是使用这一工具包。首先在MATLAB的命令行输入eeglab(前提是你已经在MATLAB中添加了EEGLAB工...

快乐星球小怪兽的博客 9695

“Agent Harness”和“Harness Engineering”

摘要:2026年AI工程化领域,"Agent Harness"(AI代理运行控制系统)与"Harness Engineering"(马具工程方法论)常被混淆。前者是管理AI代理非推理事务的技术实体(工具调用、记忆管理、安全约束等7层架构),后者是设计优化该系统的工程学科。研究表明,优化的Harness设计可使同一模型性能提升10倍。两者关系如同"马具"与"制具工艺":Harness Engineering指导Agent Harn

几十年资深高级架构师,技术专家的技术笔记。专注C、Java、Python、微服务、云原生、AI工程化及高并发系统分布式架构实战,分享源码剖析、性能调优与架构治理经验。 848

Mac用户必看:Typora最新版永久激活+弹窗屏蔽保姆级教程(附崩溃解决方案)

本文为Mac用户提供了一份详尽的Typora最新版永久激活与弹窗屏蔽教程。通过修改关键JS文件,实现软件激活状态并彻底关闭成功提示弹窗。文章深入剖析了操作原理,并重点提供了解决由此引发的多文档崩溃问题的实用临时方案,同时客观讨论了该方法的局限性与潜在风险。

wine的专栏 2384

EEG 信号频带功率计算

目录前言信号功率谱密度(Power Spectral Density)计算基于 FFT 计算功率谱密度基于 scipy.signal.welch 计算功率谱密度基于 mne.time_frequency.psd_array_multitaper 计算功率谱密度特定频带绝对功率(Absolute Power)、相对功率(Relative Power)计算References 前言        EEG 信号与大脑的活动和状态密切相关,在脑机

Ascn_的博客 1万+

OAI骨关节炎数据集申请与DICOM下载全流程避坑指南

医学影像分析中,DICOM格式是存储与交换CT、MRI等数据的通用标准,其元数据Tag承载着像素间距、层厚等关键物理信息,直接影响定量分析的准确性。在骨关节炎研究领域,OAI数据集因样本量大、随访时间长而成为高价值资源,但获取需通过NDA协议申请,并借助nda-tools命令行工具完成TB级影像的批量下载与断点续传。这一流程涉及浏览器环境配置、DICOM格式转换及Python预处理等工程环节,任一细节疏漏都可能导致数据读取异常或分析偏差。掌握从申请到落地的完整链路,能显著提升医学影像AI研究的效率与可复现性

weixin_30843121的博客 278

《脑电信号分析方法与脑机接口技术》笔记——第二章 EEG信号

第二章 EEG信号 2.1 脑电图 1.脑电信号(EEG)是从人类或动物的头皮上记录到的电位变化,主要反映大脑的电活动特性。 2.脑电图是由电极记录下来的大脑细胞群在自发性生物电活动。以电位为纵轴,时间为横轴将它以曲线的形式显示出来,即脑电图,也称为脑波。 3.脑电图就是将人脑的电活动经过头皮电极引导、放大并显示或记录下来的图形。 4.脑电图可用作疾病诊断、睡眠或麻醉深度监护。 5.脑电信号是在...

小白家 1万+

SIMULINK开发项目实例 1000 例专栏之第960例--基于电力系统稳定性的建模与仿真场景:-含分布式电源的配电网电压稳定性研究

间歇性与随机性:例如,太阳能依赖于日照强度,风能依赖于风速,这使得它们的输出功率具有不确定性。逆变器接口:大多数分布式电源通过逆变器接入电网,这对电网的动态响应特性产生了影响。位置分散:通常分布在用户侧或靠近负荷中心的位置。本文详细介绍了如何使用Simulink结合Simscape Electrical 构建一个用于研究含分布式电源配电网电压稳定性的模型,并提供了详细的仿真流程说明。

xiaoheshang_123的博客 156

系统分析师论文范文(三)微服务

摘要(300字) 2024年4月,我作为系统分析师参与某省三甲医院云影像系统建设项目,负责系统分析与设计工作。该项目旨在响应国家"无胶片化"医疗政策,解决传统影像系统数据孤岛、调阅效率低等问题。系统基于DICOM 3.0和HL7国际标准,采用B/S架构与Spring Cloud Alibaba微服务技术栈,包含影像采集、智能分析、数据安全等核心模块,实现全院影像资源的云端统一管理与多端调阅。在架构设计上,通过微服务拆分、分布式事务控制及多层次安全防护机制,保障了系统的高可用性与数据一致性。系统于2024年1

echo的博客 223

脑电信号(EEG)简介:原理、应用与分析方法

脑电信号(EEG)是大脑活动的一种重要表现形式。本文将介绍EEG的基本原理,应用领域以及分析方法,为对脑电信号感兴趣的读者提供一个初步的认识。

332295505的博客 3万+

华为OD机试真题2026双机位C卷 C语言 实现【明日之星选举】

给定一组选票votes。votes[i]代表第 i 张选票的内容,包含一个字符串"zhangsan,hanmei",表示推荐zhangsan为明日之星,反对 hanmei 称为明日之星。赞成或反对使用逗号(,)分割。 给定一个数组n,表示最后将筛选出赞成票最多的n个人,如果赞成票相同,则反对票越少,排序越靠前;如果赞成票和反对票都相同,则按照姓名字典序升序排序。

MISAYAONE的博客 184

EEG代码实践:diffusion EEG——扩散模型生成EEG信号

在自己的原始实现结束后,尝试了使用diffuser库函数进行项目的重写,并获得了不错的成果。

SashiMoore的博客 2154

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

上一篇: 一、Python基础、数据加载及其可视化
下一篇: 三、特征提取、特征预处理
ITS_Oaij
博客等级 码龄6年 1857粉丝 51原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值