基于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数据集中加载数据,并准备进行后续的处理和分析。

python 复制代码
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

import 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对象,以便进行后续的信号处理和频谱分析。

python 复制代码
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.T
    df[:-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 raw

raw = df_to_raw(df)

3. 预处理

带阻滤波器

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

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

4. 时域分析和频谱分析

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

python 复制代码
from mne import Epochs, find_events

def 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 epochs

event_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)技术对不同刺激频率的信号进行分类和分析。

python 复制代码
from scipy.stats import pearsonr
from sklearn.cross_decomposition import CCA

def cca_analysis(epochs):
    cca = CCA(n_components=1)
    # 提取数据
    X = epochs.get_data()
    y = epochs.events[:, -1]
    # 应用CCA
    cca.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 = 3

def 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信号的复杂性及其在情感、认知和视觉处理中的应用潜力。未来的工作将继续探索更多先进的分析方法和模型,以提高对大脑活动模式理解的深度和准确性

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

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

谢谢大家的支持!

相关推荐
Kisorge26 分钟前
【C语言】指针数组、数组指针、函数指针、指针函数、函数指针数组、回调函数
c语言·开发语言
轻口味1 小时前
命名空间与模块化概述
开发语言·前端·javascript
晓纪同学2 小时前
QT-简单视觉框架代码
开发语言·qt
威桑2 小时前
Qt SizePolicy详解:minimum 与 minimumExpanding 的区别
开发语言·qt·扩张策略
飞飞-躺着更舒服2 小时前
【QT】实现电子飞行显示器(简易版)
开发语言·qt
明月看潮生3 小时前
青少年编程与数学 02-004 Go语言Web编程 16课题、并发编程
开发语言·青少年编程·并发编程·编程与数学·goweb
明月看潮生3 小时前
青少年编程与数学 02-004 Go语言Web编程 17课题、静态文件
开发语言·青少年编程·编程与数学·goweb
Java Fans3 小时前
C# 中串口读取问题及解决方案
开发语言·c#
盛派网络小助手3 小时前
微信 SDK 更新 Sample,NCF 文档和模板更新,更多更新日志,欢迎解锁
开发语言·人工智能·后端·架构·c#
算法小白(真小白)3 小时前
低代码软件搭建自学第二天——构建拖拽功能
python·低代码·pyqt