运动想象 EEG 信号分析

news/2024/5/19 17:00:59 标签: python, BCI, EEG

基于运动想象的公开数据集:Data set IVa (BCI Competition III)1
数据描述参考前文:https://blog.csdn.net/qq_43811536/article/details/134224005?spm=1001.2014.3001.5501

本文使用公开数据集 Data set IVa 中的部分被试数据,数据已公开可以从网盘获取:
链接:https://pan.quark.cn/s/5425ee5918f4
提取码:hJFz


目录

  • 1. 实验介绍
  • 2. EEG 信号分析
    • 2.1 EEG 的时域特征
    • 2.2 EEG 的频域/时频特征
      • 2.2.1 频域特征
      • 2.2.2 时频特征
    • 2.3 EEG 的空域(电极位置)特征
  • 3. 分析代码


1. 实验介绍

本任务的实验数据来自一名健康受试者,代号al。受试者在视觉提示出现后3.5s内完成以下3个运动想象中的一个:(L)左手,(R)右手,(F)右脚。分类任务中的数据只包括了右手和右脚两类,共280个试次。实验过程中使用脑电帽记录了118个通道的EEG信号,电极位置如图1所示。采集到的EEG信号首先经过带通滤波(0.05-200Hz),再经过数字化和下采样,得到采样率为100Hz的信号。

在这里插入图片描述

图1 电极位置

EEG__19">2. EEG 信号分析

EEG__21">2.1 EEG 的时域特征

我们首先绘制EEG的时域图,图2(a)和图2(b)分别展示了10个通道和所有通道10s内的信号,可以观察到EEG信号的随机性较强。

在这里插入图片描述

(a)                                                                  (b)
图2 EEG时域波形。(a)10个通道的EEG。(b)所有通道的EEG

EEG__28">2.2 EEG 的频域/时频特征

2.2.1 频域特征

EEG信号是随机信号,通常使用功率谱描述其频域特征。我们截取了100s的EEG信号,使用welch算法估计其功率谱,结果如图3所示。图4则将功率谱按照各电极的位置进行了排列。可以看出:(1)10Hz左右具有明显的峰值,即alpah波;(2)相邻通道的功率谱具有较高的一致性;(3)不同脑区的功率谱具有较大的差异,Alpha波主要出现在枕叶和顶叶区域。

在这里插入图片描述

图3 所有通道的功率谱

在这里插入图片描述

图4 功率谱按电极位置排列

2.2.2 时频特征

EEG信号具有非平稳的特点,因此需要同时考虑时域和频域。这里,为了更加精细地观察,我们对提示出现后0.5s至3.5s的信号进行分析,并将频率范围限制在12Hz至28Hz。使用Morlet小波变换进行时频域分析,得到的结果如图5所示。可以看出,频率变化在13Hz左右较明显,且枕叶的变化尤为明显。
在这里插入图片描述

图5 EEG时频分析结果图

EEG__44">2.3 EEG 的空域(电极位置)特征

进一步,我们从空域的角度分析EEG,计算两次运动想象期间的功率谱并绘制了5个典型频段的功率谱密度拓扑图,如图6所示。

在这里插入图片描述

图6 功率谱密度拓扑图。每一行代表一次事件,每一列代表一个频段

3. 分析代码

  • 主要使用Python的MNE包进行分析
  • MNE Tutorials 官网:https://mne.tools/stable/auto_tutorials/index.html
  • 部分变量说明:
    • raw:由 mne.io.RawArray() 函数创建,代表原始EEG数据
    • epochs:由 mne.Epochs() 函数创建,代表一个事件(event)对应的所有数据,在该数据集中一个事件即 “右手”或者“脚”的想象运动
python"># time domain
raw.crop(tmax=100)
# plot electrode position
plt.figure(figsize=(4,6))
raw.plot_sensors(title='Channel positions')
plt.savefig('Results\sensors.png')
plt.show()

# plot raw eeg data
plt.figure(figsize=(4,6))
raw.plot(n_channels=10, scalings='auto', title='Raw EEG Signals')
plt.show()

plt.figure(figsize=(4,6))
raw.plot(n_channels=118,scalings='auto', title='Raw EEG Signals')
plt.show()

================== plot frequency spectrum
raw.compute_psd().plot()
plt.tight_layout()
plt.savefig('Results\spectrum.png')
plt.show()
raw.compute_psd().plot_topo(color="k", fig_facecolor="w", axis_facecolor="w")
plt.tight_layout()
plt.savefig('Results\spectrum_all.png')
plt.show()



============================ plot time-frequency features
freqs = np.logspace(*np.log10([12, 28]), num=8)
n_cycles = freqs / 2.0  # different number of cycle per frequency
power, itc = mne.time_frequency.tfr_morlet(
    epochs,
    freqs=freqs,
    n_cycles=n_cycles,
    use_fft=True,
    return_itc=True,
    decim=3,
    n_jobs=None,
)
power.plot_joint(
    baseline=(0, 0.5), mode="mean", tmin=0, tmax=3.5,
    timefreqs=[(0.5, 13), (1, 13),(2.8, 13)]
)
plt.show()


epochs[right_id].compute_psd().plot_topomap(ch_type="eeg", agg_fun=np.mean, normalize=True)
plt.savefig(r'Results\right_compute_psd_plot_topomap.png')
plt.show()
epochs[foot_id].compute_psd().plot_topomap(ch_type="eeg", agg_fun=np.mean, normalize=True)
plt.savefig(r'Results\foot_compute_psdplot_topomap.png')
plt.show()

  1. https://bbci.de/competition/iii/desc_IVa.html ↩︎


http://www.niftyadmin.cn/n/5159992.html

相关文章

VMware17安装教程

1、双击安装包 2、等待进度条走满 3、点击下一步 4、点击我接受 下一步 5、修改安装目录 添加path路径 下一步 6、取消用户体验设置 下一步 7、点击下一步 8、 点击安装 9、等待进度条走满 10、点击许可证 输入秘钥 11、 点击输入秘钥 12、 点击完成 完成安装 此时已经完成了安…

React动态生成二维码和毫米(mm)单位转像素(px)单位

一、使用qrcode.react生成二维码,qrcode.react - npm 很简单,安装依赖包,然后引用就行了 npm install qrcode.react或者 yarn add qrcode.react直接上写好的代码 import React, {useEffect, useState} from react; import QRCode from qr…

SDUT OJ《算法分析与设计》动态规划

A - 高数Umaru系列(9)——哈士奇 Description 由于高数巨养的喵星人太傲娇了,要天天吃新鲜猫粮而且还经常欺负高数巨,所以高数巨决定买几条哈士奇尝尝鲜。这天高数巨来到了二手狗市场买哈士奇,高数巨看完了所有的哈士…

Python基础入门(19)----Python单元测试基础:unittest模块的基本使用

文章目录 创建测试用例测试套件断言运行测试测试固件Python的unittest模块是基于Java的JUnit框架开发出来的,提供了编写和运行单元测试的工具。这篇文章将介绍unittest模块的基本使用,涵盖创建测试用例、测试套件、断言、运行测试以及测试固件的使用。 创建测试用例 在unit…

14.序列化和文件的输入/输出 保存对象

14.1 保存对象状态 你已经奏出完美的乐章,现在会想把它储存起来。你可以抓个文房四宝把它记下来,但也可以按下储存按钮(或按下File菜单上的Save)。然后你帮文件命名,并希望这个文件不会让屏幕变成蓝色的画面。 储存状态的选择有很多种&…

`dump` 和 `load` 以及 `dumps` 和 `loads`的用法

dump 和 load 以及 dumps 和 loads 是 Python 中用于序列化和反序列化数据的方法,通常用于处理 JSON 数据。这些方法的区别在于它们的输入和输出形式以及使用场景。 dump 和 load: dump: 这是用于将 Python 对象序列化为 JSON 格式并将其写入文件对象的方法。它接受…

ubuntu连接蓝牙耳机

本人也是经历了重重困难,特写此篇希望对读者能够带来帮助 1. 编辑 /etc/bluetooth/main.conf 文件,设定ControllerMode bredr 这一步使用vim编写完成后,保存退出的时候,会显示说没有修改权限,执行以下命令 sudo chm…

895. 最长上升子序列

题目&#xff1a; 895. 最长上升子序列 - AcWing题库 思路&#xff1a;dp 代码&#xff1a; #include<iostream> #include<cstdio> #include<cmath> using namespace std; typedef long long ll; const int N1010; int f[N];//表示以i结尾的最大上升子序列…