运动想象 EEG 信号分析

news2024/11/22 16:33:52

基于运动想象的公开数据集: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 电极位置

2. EEG 信号分析

2.1 EEG 的时域特征

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

在这里插入图片描述

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

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时频分析结果图

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)对应的所有数据,在该数据集中一个事件即 “右手”或者“脚”的想象运动
# 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.coloradmin.cn/o/1181854.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Rust和Pytho写一段采集公众号代码

首先,我们需要安装Rust和Python的requests库。Rust的requests库可以用来发送HTTP请求,而Python的requests库可以用来处理HTTP响应。 // 导入所需的库 use std::io; use std::env;// 使用rustc命令来编译我们的程序 fn main() {// 获取命令行参数let args…

GuLi商城-商品服务-API-三级分类-查询-递归树形结构数据获取

导入sql语句 insert into pms_category(cat_id,name,parent_cid,cat_level,show_status,sort,icon,product_unit,product_count) values (1,图书、音像、电子书刊,0,1,1,0,NULL,NULL,0),(2,手机,0,1,1,0,NULL,NULL,0),(3,家用电器,0,1,1,0,NULL,NULL,0),(4,数码,0,1,1,0,NULL…

分享六个 Vue3 开发必备的 VSCode 插件

今天分享 6 个 Vue3 开发必备的 VSCode 插件,可以直接用过 VSCode 的插件中心直接安装使用。 1. Volar 🔥 下载数 153 万 相信使用 VSCode 开发 Vue2 的同学一定对 Vetur 插件不会陌生,作为 Vue2 配套的 VSCode 插件,它的主要作…

混合云中 DevOps 的最佳实践

近年来,出现了各种工具、技术和框架,其目标是增强灵活性、性能和可扩展性。传统的整体方法已被微服务和纳米服务等更加模块化的方法所取代。此外,云计算的兴起导致本地软件被云环境所取代,云环境提供了以前无法提供的广泛优势和功…

获取狮子座明年恋爱运势预测API接口

获取狮子座明年恋爱运势预测API接口的功能是通过API接口获取狮子座明年恋爱运势的预测结果,为用户提供恋爱运势指导。 首先,使用挖数据平台该API接口需要先申请API密钥。在获取API密钥后,可以使用该接口进行开发。 API接口地址为&#xff1a…

[LC 总结] 前缀和(Prefix Sum)总结 10 道相关练习题

[LC 总结] 前缀和(Prefix Sum)总结& 10 道相关练习题 类型与题目列表如下: 题目的解法都做过了,会留在最后一个部分,接下来就梳理一下 prefix sum,列举的题目从简单到 -> 困难 基础 prefix sum 其…

【深蓝学院】手写VIO第9章--课程总结--笔记

0. 内容 1. 课程回顾 最大后验概率MAP,如果不知道先验则是MLE,如果观测服从高斯分布(关于为什么服从高斯分布有个pdf)则可转化为LSP。 残差构建主要讲了IMU残差的构建,包括预积分模型,误差模型(…

使用Android Jetpack Compose渲染效果打造酷炫的动画效果

如何在Android Jetpack Compose中使用渲染效果打造令人惊艳的视觉体验 学习示例:如何使用渲染效果来改变UI界面 引言 Jetpack Compose提供了各种工具和组件来构建引人入胜的UI,而在Compose中较为鲜为人知的一个宝藏是RenderEffect。 在这篇博文中&a…

freertos任务参数

实现多个任务利用同一个函数,传进不同的任务参数,打印不同的任务内容。多个人用同一个电脑干不同工作,美工用电脑干美工,程序员用电脑敲代码 #include "stm32f10x.h" // Device header #include &quo…

.NET开源全面方便的第三方登录组件集合 - MrHuo.OAuth

前言 我相信做开发的同学应该都对接过各种各样的第三方平台的登录授权,来获取用户信息(如:微信登录、支付宝登录、QQ登录、GitHub登录等等)。今天给大家推荐一个.NET开源好用的、全面的、方便第三方登录组件集合框架:…

【ES专题】ElasticSearch功能详解与原理剖析

目录 前言要点阅读对象阅读导航前置知识笔记正文一、ES数据预处理1.1 Ingest Node:摄入节点1.2 Ingest Pipeline:摄入管道1.3 Processor:预处理器——简单加工1.4 Painless Script:脚本——复杂加工1.5 简单实用案例 二、文档/数据…

C语言——从键盘任意输人一个三位数的自然数,求该数个位、十位、百位上的数字之和

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h> int main() {int i,ge,shi,bai;printf("输入一个三位数整数&#xff1a;\n");scanf("%d",&i);gei%10; //个位shii%100/10; //十位baii/100; //百位printf("个位:%d,十位:%d,百位:…

51基于matlab模拟退火算法矩形排样

基于matlab模拟退火算法矩形排样&#xff0c;基于最低水平线算法完成矩形板材下料优化&#xff0c;输出最优剩料率和最后的水平线&#xff0c;可替换自己的数据进行优化&#xff0c;程序已调通&#xff0c;可直接运行。 51matlab模拟退火算法矩形排样 (xiaohongshu.com)

两个栈实现队列

要用两个栈实现队列&#xff0c;就需要了解栈和队列的特性&#xff0c;栈是先进后出&#xff0c;队列是先进先出。基本思路是&#xff0c;把数据先压入栈1中&#xff0c;然后数据在栈1中输出再压入栈2&#xff0c;输出后就能实现队列的先进先出。 package Package;import java.…

实施数字工厂管理系统对印刷企业来说有什么意义

随着科技的飞速发展&#xff0c;数字化转型已成为各行各业不可避免的趋势。对于印刷企业而言&#xff0c;实施数字工厂管理系统不仅意味着技术的升级&#xff0c;更关乎企业整体的运营效率、成本控制、市场竞争力等方面的提升。本文将详细分析实施数字工厂管理系统对印刷企业的…

Redis7--基础篇2(Redis的十大数据类型及常用命令)

1. Redis的十大数据类型及常用命令 Redis是key-value键值对类型的数据库&#xff0c;我们所说的数据类型指的是value的数据类型&#xff0c;key的数据类型都是字符串。 1.1 字符串&#xff08;String&#xff09; string是redis最基本的类型&#xff0c;一个key对应一个val…

Docker 学习路线 10:容器安全

容器安全是实施和管理像Docker这样的容器技术的关键方面。它包括一组实践、工具和技术&#xff0c;旨在保护容器化应用程序及其运行的基础架构。在本节中&#xff0c;我们将讨论一些关键的容器安全考虑因素、最佳实践和建议。 容器隔离 隔离对于确保容器化环境的强大性和安全…

CSDN每日一题学习训练——Java版(对给定的两个日期之间的日期进行遍历、子集 II、填充每个节点的下一个右侧节点指针)

版本说明 当前版本号[20231107]。 版本修改说明20231107初版 目录 文章目录 版本说明目录对给定的两个日期之间的日期进行遍历题目解题思路代码思路参考代码 子集 II题目解题思路代码思路参考代码 填充每个节点的下一个右侧节点指针题目解题思路代码思路参考代码 对给定的两…

【计算机组成】实模式/保护模式下地址分段(基段地址+偏移地址)的原因

一.硬编码/静态重定向 我们先来观察下没有地址分段时代CPU是怎么和内存们打交道&#xff0c;在8086CPU以前的老大哥们&#xff0c;访问内存时通常就是实打实的“指哪打哪”&#xff0c;程序指定要放在哪个地址&#xff0c;那就老老实实地放在哪个地址&#xff0c;比如程序A要放…

如何使新手小白编码能力暴涨之Devchat-AI

在这个快速发展的时代&#xff0c;开发者的任务越来越繁重&#xff0c;要求他们快速、高效地完成开发任务。然而&#xff0c;传统的开发方式已经无法满足这个需求。在这种情况下&#xff0c;Devchat的出现给开发者带来了新的帮助。Devchat是一个研发效能分析平台&#xff0c;它…