当前位置: 首页 > news >正文

基于Python的脑电图(EEG)信号分析(4)

背景

脑电图(EEG)和稳态视觉诱发电位(SSVEP)

        脑电图(EEG)是一种测量大脑电活动的非侵入性方法,通过在头皮上放置电极来捕捉大脑神经元群体的电活动。这些信号可以提供关于大脑功能状态和响应的宝贵信息,例如认知过程、感知活动和注意力分配。

        稳态视觉诱发电位(SSVEP)是一种常用的EEG应用,用于研究大脑对视觉刺激的响应。在SSVEP实验中,被试者注视屏幕上以不同频率闪烁的视觉刺激,例如灯闪烁的频率为6Hz、10Hz或15Hz。大脑的EEG信号将显示与这些频率相对应的振荡模式,这种现象对于研究注意力和视觉处理具有重要意义。

数据分析与Python

        Python作为一种功能强大且灵活的编程语言,被广泛应用于神经科学领域的数据分析和处理。借助Python的丰富库和工具,如MNE(MNE-Python)和SciPy,研究人员能够有效地处理EEG数据、实施信号处理技术,并进行高级的统计分析和模型建立。

        在本篇文章中,我们将利用Python和相关的库来分析和理解SSVEP数据,重点介绍了典型相关分析(CCA)在SSVEP数据集上的应用。CCA是一种多变量分析技术,用于找出不同频率下脑电信号与视觉刺激频率之间的关联,从而帮助解释和预测大脑对视觉刺激的响应模式。

        通过本文的学习,读者将了解如何利用Python进行EEG信号的预处理、频谱分析和典型相关分析,进而深入探索脑-机接口技术和认知神经科学的前沿研究。

代码实现

1. 数据加载与预处理

        我们首先从SSVEP数据集中加载数据,并准备进行后续的处理和分析。

import pandas as pd
import numpy as np
import matplotlib.pyplot as pltimport mne
from mne import create_info
from mne.io import RawArray
from mne.time_frequency import psd_welch# 加载数据
df = pd.read_csv('data/ssvep-20trials-3s-chaky-bigsquare.csv')
df.rename(columns={'Unnamed: 1':'O1','Unnamed: 2':'Oz', 'Unnamed: 3':'O2'}, inplace=True)
df = df.drop(["timestamps", "Unnamed: 4", "Unnamed: 5", "Unnamed: 6", "Unnamed: 7", "Unnamed: 8"], axis=1)

2. 数据转换为MNE对象

        将数据转换为MNE库的RawArray对象,以便进行后续的信号处理和频谱分析。

def df_to_raw(df):sfreq = 125  # 我们的OpenBCI头戴设备采样率ch_names = list(df.columns)ch_types = ['eeg'] * (len(df.columns) - 1) + ['stim']ten_twenty_montage = mne.channels.make_standard_montage('standard_1020')df = df.Tdf[:-1] *= 1e-6  # 将数据从微伏转换为伏特(MNE库默认单位)info = create_info(ch_names=ch_names, ch_types=ch_types, sfreq=sfreq)raw = mne.io.RawArray(df, info)raw.set_montage(ten_twenty_montage)   return rawraw = df_to_raw(df)

3. 预处理

带阻滤波器

        去除50Hz电源线噪声及其谐波,并进行带通滤波以提取特定频率带的信号。

raw.notch_filter([25, 50], filter_length='auto', phase='zero')
raw.filter(4, 62, method='iir')

4. 时域分析和频谱分析

        使用Epochs对象对数据进行切分,并进行频谱分析以探索不同刺激频率的特征。

from mne import Epochs, find_eventsdef getEpochs(raw, event_id, tmin, tmax, picks):events = find_events(raw)epochs = Epochs(raw, events=events, event_id=event_id, tmin=tmin, tmax=tmax, baseline=None, preload=True, verbose=False, picks=picks)print('样本丢失 %: ', (1 - len(epochs.events)/len(events)) * 100)return epochsevent_id = {'6Hz': 1, '10Hz' : 2, '15Hz' : 3}
tmin=-0.5
tmax=3
eeg_channels = mne.pick_types(raw.info, eeg=True)
picks= eeg_channels
epochs = getEpochs(raw, event_id, tmin, tmax, picks=picks)# 频谱分析
fig = plt.figure(figsize=(10, 4))
axes = fig.add_axes([0.1, 0.1, 0.8, 0.8])psd1, freq1 = psd_welch(epochs['6Hz'], n_fft=1028, n_per_seg=256 * 3)
psd2, freq2 = psd_welch(epochs['10Hz'], n_fft=1028, n_per_seg=256 * 3)
psd3, freq3 = psd_welch(epochs['15Hz'], n_fft=1028, n_per_seg=256 * 3)logpsd1 = 10 * np.log10(psd1)
logpsd2 = 10 * np.log10(psd2)
logpsd3 = 10 * np.log10(psd3)log_psd1_mean = logpsd1.mean(0)
log_psd2_mean = logpsd2.mean(0)
log_psd3_mean = logpsd3.mean(0)axes.plot(freq1, log_psd1_mean[[0,2], :].mean(0), color='b', label='6Hz')
axes.plot(freq2, log_psd2_mean[[0,2], :].mean(0), color='r', label='10Hz')
axes.plot(freq3, log_psd3_mean[[0,2], :].mean(0), color='g', label='15Hz')axes.set_ylabel('Power Spectral Density (dB)')
axes.set_xlim(4, 30)
axes.set_ylim(-170, -100)
axes.legend()plt.show()

5. 典型相关分析(CCA)

        使用典型相关分析(CCA)技术对不同刺激频率的信号进行分类和分析。

from scipy.stats import pearsonr
from sklearn.cross_decomposition import CCAdef cca_analysis(epochs):cca = CCA(n_components=1)# 提取数据X = epochs.get_data()y = epochs.events[:, -1]# 应用CCAcca.fit(X, y)return cca# 执行CCA分析
X1 = epochs['6Hz'].get_data()
X2 = epochs['10Hz'].get_data()
X3 = epochs['15Hz'].get_data()list_freqs = [6, 10, 15]
fs = 250
num_harms = 2
num_fbs = 3def fbcca(eeg, list_freqs, fs, num_harms=3, num_fbs=5):# 实现滤波器组和CCA参考信号的生成,以及CCA计算# 省略具体实现细节以保持简洁print("6Hz: =============================================")
fbcca(X1, list_freqs, fs, num_harms, num_fbs)print("10Hz: ============================================")
fbcca(X2, list_freqs, fs, num_harms, num_fbs)print("15Hz: ============================================")
fbcca(X3, list_freqs, fs, num_harms, num_fbs)

结语

        通过本篇文章,我们深入探讨了如何使用Python和MNE库对脑电图(EEG)信号进行分析,特别是在SSVEP数据集上应用典型相关分析(CCA)的方法。我们从数据加载和预处理开始,到频谱分析和典型相关分析的实施,展示了如何利用计算工具深入研究神经科学中的信号处理问题。这些分析不仅有助于理解大脑在视觉刺激下的反应模式,还为未来基于EEG的脑机接口技术和认知神经科学研究提供了新的视角和方法。

通过这一系列的文章,我们逐步深入了解了EEG信号的复杂性及其在情感、认知和视觉处理中的应用潜力。未来的工作将继续探索更多先进的分析方法和模型,以提高对大脑活动模式理解的深度和准确性

如果你觉得这篇博文对你有帮助,请点赞、收藏、关注我,并且可以打赏支持我!

欢迎关注我的后续博文,我将分享更多关于人工智能、自然语言处理和计算机视觉的精彩内容。

谢谢大家的支持!

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 《程序猿入职必会(9) · 用代码生成器快速开发》
  • 【JavaScript】详解数组方法 fill()
  • 【已解决】VSCode连接Linux云服务器,代码写着写着服务器突然挂了是怎么回事?
  • 【爬虫实战】利用代理爬取电商数据
  • 【Python】Django Web 框架
  • STM32Cubemxide使用freertos的消息队列(QUEUE)
  • xss漏洞(五,xss-labs靶场搭建及简单讲解)
  • 03 LVS+Keepalived群集
  • Windows应急响应-排查方式
  • C++ 中基本数据类型所占字节简单说明
  • IsaacLab | Workflow 中 rsl_rl 的 play.py 脚本精读
  • Linux useradd命令
  • pytorch学习笔记6 tensor拼接和拆分
  • ts-node 报错 ERR_UNKNOWN_FILE_EXTENSION
  • XXE-lab-master靶场:PHP_xxe
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • canvas绘制圆角头像
  • Javascript基础之Array数组API
  • JSONP原理
  • leetcode388. Longest Absolute File Path
  • markdown编辑器简评
  • Sublime text 3 3103 注册码
  • Yii源码解读-服务定位器(Service Locator)
  • 人脸识别最新开发经验demo
  • 入口文件开始,分析Vue源码实现
  • 一些css基础学习笔记
  • ​​​​​​​GitLab 之 GitLab-Runner 安装,配置与问题汇总
  • ‌前端列表展示1000条大量数据时,后端通常需要进行一定的处理。‌
  • !$boo在php中什么意思,php前戏
  • ###C语言程序设计-----C语言学习(6)#
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (六)DockerCompose安装与配置
  • (三)Kafka离线安装 - ZooKeeper开机自启
  • (十)c52学习之旅-定时器实验
  • (一)python发送HTTP 请求的两种方式(get和post )
  • (杂交版)植物大战僵尸
  • (转)关于pipe()的详细解析
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • .[backups@airmail.cc].faust勒索病毒的最新威胁:如何恢复您的数据?
  • .L0CK3D来袭:如何保护您的数据免受致命攻击
  • .net(C#)中String.Format如何使用
  • .NET性能优化(文摘)
  • @Autowired @Resource @Qualifier的区别
  • @Builder注释导致@RequestBody的前端json反序列化失败,HTTP400
  • @Controller和@RestController的区别?
  • @RestController注解的使用
  • [000-01-030].Zookeeper学习大纲
  • [001-03-007].第07节:Redis中的事务
  • [20190401]关于semtimedop函数调用.txt
  • [240527] 谷歌 CEO 承认 AI 编造虚假信息问题难解(此文使用 @gemini 命令二次创作)| ICQ 停止运作
  • [51nod1610]路径计数
  • [Android]使用Retrofit进行网络请求