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

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

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

谢谢大家的支持!

相关推荐
databook12 小时前
Manim实现闪光轨迹特效
后端·python·动效
Juchecar13 小时前
解惑:NumPy 中 ndarray.ndim 到底是什么?
python
用户83562907805113 小时前
Python 删除 Excel 工作表中的空白行列
后端·python
Json_13 小时前
使用python-fastApi框架开发一个学校宿舍管理系统-前后端分离项目
后端·python·fastapi
数据智能老司机20 小时前
精通 Python 设计模式——分布式系统模式
python·设计模式·架构
数据智能老司机21 小时前
精通 Python 设计模式——并发与异步模式
python·设计模式·编程语言
数据智能老司机21 小时前
精通 Python 设计模式——测试模式
python·设计模式·架构
数据智能老司机21 小时前
精通 Python 设计模式——性能模式
python·设计模式·架构
c8i21 小时前
drf初步梳理
python·django
每日AI新事件21 小时前
python的异步函数
python