信号处理应用:生物医学信号处理_(8).脑电图信号处理与分析
脑电图信号处理与分析
1. 脑电图信号的基本概念
brainwave(Brainwave, BW)是一种捕捉大脑电信号的技术,在头皮上安装特定设备后即可实现操作。该技术通过特定的电极阵列来捕捉大脑电信号的变化特征,并能实时追踪大脑的状态变化。由此可知,在临床诊断、神经工程学研究以及认知科学等多个领域中具有广泛应用的价值。
1.1 EEG信号的生成和采集
EEG 信号主要来源于大脑皮层神经元之间的同步电信号活动。这些电信号通过头皮上的 EEG 电极记录,并转化为电信号。在 EEG 采集过程中,常用多导联 EEG montage(EEG 导联组)来获取多个通道的信号信息。其中每个 montage 包含多个 EEG 通道,在实际应用中需要根据研究需求选择合适的排列方式以确保数据质量
1.1.1 EEG信号的频段
EEG信号可以分为不同的频段,每个频段对应不同的脑电活动特征:
- Δ波(0.5-4Hz):Δ波与其深度睡眠及意识状态密切关联。
- Θ波(4-8Hz):Θ带电活动通常与非REM浅层睡眠及觉醒前状态相关联。
- α带电活动(8-12Hz):α电位常见于人眼被遮盖且处于轻度觉醒状态时。
- β带电活动(12-30Hz):β带电活动涉及大脑皮层的不同半区协调工作,并与复杂的认知活动如注意、记忆及学习等过程密切相关。
- γ带电活动(30-100Hz):γ带电活动通常与其空间定位能力及复杂认知任务的应用密切相关。
1.2 EEG信号的特点
EEG信号具有以下特点:
- 高时空分辨能力:以微秒为单位的时间分辨率使EEG能够捕捉大脑活动的快速变化。
- 较低的空间分辨能力:由于电极安装于头部表面,EEG信号的空间分辨能力较低,在定位信号来源时存在一定的局限性。
- 环境干扰:EEG信号容易受到外源性环境干扰(如电磁辐射)以及内源性生理干扰(如眼动、肌肉活动等)的影响。
2. EEG信号的预处理
在现代 signal analysis 中扮演着关键角色的是 EEG 信号的预处理过程,在这一过程中主要完成了 signal 的降噪(noise reduction)、采样率转换(resampling)以及滤波(filtering)等多个环节。通过执行这些基本操作可以显著提升 data 的质量,并为其后续的数据分析提供了更为可靠的基础
2.1 信号去噪
EEG信号中典型的干扰源包括环境噪音、眼动干扰和肌电干扰等。通常采用的降噪手段主要包括:采用高阻抗头盔减少外源性噪音的影响;通过高速采样系统降低 aliasing 效应;以及运用自适应滤波器去除特定频率成分等方法。
- 环境噪声 :通过滤波技术和接地电路降低外界电磁干扰。
- 眼动噪声 :检测系统采用Ey electrooculogram (EEOG)信号作为测量依据。
- 肌肉噪声 :检测系统采用Ey electromyography (EMyography)信号作为测量依据。
2.1.1 使用ICA去噪
ICA是一种常见的降噪手段,在处理EEG信号时能够提取出其中的独立源,并进而有效去除噪声。
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import butter, lfilter
from mne import Epochs, set_log_level
from mne.preprocessing import ICA
from mne.io import read_raw_edf
# 读取EEG数据
raw = read_raw_edf('example.edf', preload=True)
set_log_level('WARNING') # 设置日志级别
# 进行ICA
ica = ICA(n_components=20, random_state=97, max_iter=800)
ica.fit(raw)
# 查看ICA成分
ica.plot_components()
# 去除噪声成分
ica.exclude = [1, 2] # 假设第1和第2个成分是噪声
raw_clean = ica.apply(raw)
# 绘制去噪前后对比图
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(15, 10))
ax1.plot(raw.get_data()[0, :1000], label='Original')
ax2.plot(raw_clean.get_data()[0, :1000], label='Cleaned')
ax1.set_title('Original EEG Signal')
ax2.set_title('Cleaned EEG Signal')
plt.tight_layout()
plt.show()
2.2 重采样
Resampling是一种将electroencephalogram( EEG)信号从一个采样率转换为另一个采样率的方法。这种技术在处理来自不同设备采集的数据时非常有效,并能保证所有信号都能达到一致的采样率。
2.2.1 重采样示例
import mne
# 读取原始EEG数据
raw = read_raw_edf('example.edf', preload=True)
# 原始采样率
orig_sfreq = raw.info['sfreq']
print(f'Original sampling frequency: {orig_sfreq} Hz')
# 重采样到256 Hz
new_sfreq = 256
raw_resampled = raw.resample(new_sfreq)
# 新采样率
new_sfreq = raw_resampled.info['sfreq']
print(f'New sampling frequency: {new_sfreq} Hz')
# 绘制重采样前后对比图
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(15, 10))
ax1.plot(raw.get_data()[0, :1000], label='Original')
ax2.plot(raw_resampled.get_data()[0, :1000], label='Resampled')
ax1.set_title('Original EEG Signal')
ax2.set_title('Resampled EEG Signal')
plt.tight_layout()
plt.show()
2.3 滤波
Filtering,即通过消除EEG信号中特定频率范围的干扰信号来实现数据处理的过程。
常见的Filtering装置通常涉及如低通Filtering装置、高通Filtering装置及带通Filtering装置等技术方案。
2.3.1 带通滤波示例
import mne
from scipy.signal import butter, lfilter
# 读取原始EEG数据
raw = read_raw_edf('example.edf', preload=True)
# 定义带通滤波器
def butter_bandpass(lowcut, highcut, fs, order=5):
nyquist = 0.5 * fs
low = lowcut / nyquist
high = highcut / nyquist
b, a = butter(order, [low, high], btype='band')
return b, a
def butter_bandpass_filter(data, lowcut, highcut, fs, order=5):
b, a = butter_bandpass(lowcut, highcut, fs, order=order)
y = lfilter(b, a, data)
return y
# 滤波参数
lowcut = 1
highcut = 40
fs = raw.info['sfreq']
# 滤波处理
filtered_data = butter_bandpass_filter(raw.get_data()[0, :], lowcut, highcut, fs)
# 绘制滤波前后对比图
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(15, 10))
ax1.plot(raw.get_data()[0, :1000], label='Original')
ax2.plot(filtered_data[:1000], label='Filtered')
ax1.set_title('Original EEG Signal')
ax2.set_title('Filtered EEG Signal')
plt.tight_layout()
plt.show()
3. EEG信号的特征提取
特征识别(Feature Extraction)是通过将EEG信号转化为便于分析的形式而实现的。常见的方法主要包括频域分析法、时域分析法以及多模态分析法。
3.1 频域分析
频域分析(Frequency Domain Analysis)利用傅里叶变换将EEG信号从时域转化到频域,并以此来考察信号的频率组成;这种技术可用于计算不同频段之间的能量比例以及功率谱密度等指标。
3.1.1 计算功率谱密度
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import welch
# 读取预处理后的EEG数据
raw_clean = read_raw_edf('clean_example.edf', preload=True)
# 选择一个通道的数据
channel_data = raw_clean.get_data()[0, :]
# 计算功率谱密度
frequencies, psd = welch(channel_data, fs=raw_clean.info['sfreq'], nperseg=1024)
# 绘制功率谱密度图
plt.figure(figsize=(10, 6))
plt.semilogy(frequencies, psd)
plt.title('Power Spectral Density (PSD) of EEG Signal')
plt.xlabel('Frequency (Hz)')
plt.ylabel('Power/Frequency (dB/Hz)')
plt.grid()
plt.show()
3.2 时域分析
时域分析(Time Domain Analysis)主要在时域中对EEG信号进行分析研究;常用的分析手段包括计算均值、方差以及峰峰值等参数
3.2.1 计算均值和方差
# 读取预处理后的EEG数据
raw_clean = read_raw_edf('clean_example.edf', preload=True)
# 选择一个通道的数据
channel_data = raw_clean.get_data()[0, :]
# 计算均值和方差
mean_value = np.mean(channel_data)
var_value = np.var(channel_data)
print(f'Mean value: {mean_value}')
print(f'Variance value: {var_value}')
# 绘制信号及其均值和方差
plt.figure(figsize=(10, 6))
plt.plot(channel_data, label='EEG Signal')
plt.axhline(y=mean_value, color='r', linestyle='--', label='Mean')
plt.axhline(y=mean_value + np.sqrt(var_value), color='g', linestyle='--', label='Mean + Std')
plt.axhline(y=mean_value - np.sqrt(var_value), color='g', linestyle='--', label='Mean - Std')
plt.title('EEG Signal with Mean and Variance')
plt.xlabel('Time (samples)')
plt.ylabel('Amplitude (uV)')
plt.legend()
plt.show()
3.3 时频分析
时频分析(Time-Frequency Analysis)系统性地整合了时间域与频率域分析的优势特点,在信号处理方面具有显著优势;该方法能够全面地揭示信号的时间-频率特性信息,并广泛应用于多个领域研究。在实际应用中,主要采用短时傅里叶变换(STFT)和小波变换(WT)等算法进行具体实现。
3.3.1 使用STFT进行时频分析
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import stft
# 读取预处理后的EEG数据
raw_clean = read_raw_edf('clean_example.edf', preload=True)
# 选择一个通道的数据
channel_data = raw_clean.get_data()[0, :]
# 进行STFT
frequencies, times, stft_data = stft(channel_data, fs=raw_clean.info['sfreq'], nperseg=128)
# 绘制时频图
plt.figure(figsize=(10, 6))
plt.pcolormesh(times, frequencies, np.abs(stft_data), shading='gouraud')
plt.title('STFT of EEG Signal')
plt.ylabel('Frequency (Hz)')
plt.xlabel('Time (s)')
plt.colorbar(label='Amplitude')
plt.show()
4. EEG信号的分类与识别
EEG信号的分类与识别 (Classification as well as recognition) refers to the process of categorizing EEG signals into distinct states or events. Typically, classification methods include support vector machines (SVM), random forests (RF), and deep learning approaches.
4.1 使用SVM进行EEG信号分类
Support vector machine (SVM) is a widely used classification algorithm, capable of handling high-dimensional data, and is particularly suitable for classification tasks involving EEG signals.
4.1.1 SVM分类示例
import numpy as np
import matplotlib.pyplot as plt
from sklearn.svm import SVC
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import make_pipeline
from mne import Epochs, read_events, read_epochs
from mne.io import read_raw_edf
# 读取EEG数据
raw = read_raw_edf('example.edf', preload=True)
events = read_events('example-eve.fif')
event_id = {'event1': 1, 'event2': 2}
# 切分数据
epochs = Epochs(raw, events, event_id, tmin=-0.2, tmax=0.5, baseline=(None, 0), preload=True)
# 提取特征
X = epochs.get_data() # 三维数据:(事件, 通道, 时间)
y = epochs.events[:, -1] # 事件标签
# 降维
X = X.reshape(X.shape[0], -1) # 二维数据:(事件, 特征)
# 训练SVM模型
model = make_pipeline(StandardScaler(), SVC(kernel='linear'))
model.fit(X, y)
# 预测
predictions = model.predict(X)
# 绘制混淆矩阵
from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay
cm = confusion_matrix(y, predictions, labels=model.classes_)
disp = ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=model.classes_)
disp.plot()
plt.title('Confusion Matrix for SVM Classification')
plt.show()
4.2 使用深度学习进行EEG信号分类
深度学习技术中的一种是卷积神经网络(Convolutional Neural Network, CNN),另一种是循环神经网络(Recurrent Neural Network, RNN)。这些方法在EEG信号分类任务中均表现优异。
4.2.1 CNN分类示例
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense
from tensorflow.keras.utils import to_categorical
from mne import Epochs, read_events, read_epochs
from mne.io import read_raw_edf
# 读取EEG数据
raw = read_raw_edf('example.edf', preload=True)
events = read_events('example-eve.fif')
event_id = {'event1': 1, 'event2': 2}
# 切分数据
epochs = Epochs(raw, events, event_id, tmin=-0.2, tmax=0.5, baseline=(None, 0), preload=True)
# 提取特征
X = epochs.get_data() # 三维数据:(事件, 通道, 时间)
y = epochs.events[:, -1] # 事件标签
# 将标签转换为分类格式
y = to_categorical(y - 1)
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 构建CNN模型
model = Sequential()
model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(X_train.shape[1], X_train.shape[2], 1)))
model.add(MaxPooling2D((2, 2)))
model.add(Flatten())
model.add(Dense(64, activation='relu'))
model.add(Dense(2, activation='softmax'))
# 编译模型
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
# 训练模型
X_train = X_train[:, :, :, np.newaxis]
X_test = X_test[:, :, :, np.newaxis]
model.fit(X_train, y_train, epochs=10, batch_size=32, validation_data=(X_test, y_test))
# 评估模型
loss, accuracy = model.evaluate(X_test, y_test)
print(f'Test accuracy: {accuracy}')
# 预测
predictions = model.predict(X_test)
predicted_labels = np.argmax(predictions, axis=1)
true_labels = np.argmax(y_test, axis=1)
# 绘制混淆矩阵
from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay
cm = confusion_matrix(true_labels, predicted_labels)
disp = ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=['event1', 'event2'])
disp.plot()
plt.title('Confusion Matrix for CNN Classification')
plt.show()
5. EEG信号的应用
EEG信号记录在不同领域的广泛应用中可见一斑,其中一项重要的应用领域是临床诊断技术的开发与应用;另一个重要的应用领域是脑机接口技术的研究与进展;此外,在认知科学研究方面也展现出巨大的潜力。
5.1 临床诊断
在临床诊断中,EEG信号通常用于检测如癫痫、睡眠障碍等神经系统疾病。通过对特定频段的EEG信号特征进行分析,从而帮助医生判断患者的大脑活动状态。
5.1.1 检测癫痫发作
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import welch
from mne import read_raw_edf
# 读取EEG数据
raw = read_raw_edf('epilepsy_example.edf', preload=True)
# 选择一个通道的数据
channel_data = raw.get_data()[0, :]
# 计算功率谱密度
frequencies, psd = welch(channel_data, fs=raw.info['sfreq'], nperseg=1024)
# 查找高频段的峰值
high_freq_psd = psd[(frequencies >= 20) & (frequencies <= 40)]
high_freq_frequencies = frequencies[(frequencies >= 20) & (frequencies <= 40)]
peak_index = np.argmax(high_freq_psd)
peak_frequency = high_freq_frequencies[peak_index]
peak_power = high_freq_psd[peak_index]
print(f'Peak frequency: {peak_frequency} Hz')
print(f'Peak power: {peak_power} dB')
# 绘制功率谱密度图
plt.figure(figsize=(10, 6))
plt.semilogy(frequencies, psd)
plt.axvline(x=peak_frequency, color='r', linestyle='--', label=f'Peak at {peak_frequency} Hz')
plt.title('Power Spectral Density (PSD) of EEG Signal')
plt.xlabel('Frequency (Hz)')
plt.ylabel('Power/Frequency (dB/Hz)')
plt.legend()
plt.grid()
plt.show()
5.2 脑机接口
该技术通过EEG信号实现了人脑与计算机间的直接交互,在辅助残疾人及脑控设备等多个领域展现出显著的应用价值。该系统通常涵盖信号采集、预处理以及特征提取等关键步骤。
5.2.1 简单的BCI示例
作为简化的BCI示例,在本段内容中我们展示了如何利用支持向量机(SVM)对EEG电信号进行分类,并完成基本脑机接口控制任务。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.svm import SVC
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import make_pipeline
from mne import Epochs, read_events, read_epochs
from mne.io import read_raw_edf
# 读取EEG数据
raw = read_raw_edf('bci_example.edf', preload=True)
events = read_events('bci_example-eve.fif')
event_id = {'left': 1, 'right': 2}
# 切分数据
epochs = Epochs(raw, events, event_id, tmin=-0.2, tmax=0.5, baseline=(None, 0), preload=True)
# 提取特征
X = epochs.get_data() # 三维数据:(事件, 通道, 时间)
y = epochs.events[:, -1] # 事件标签
# 降维
X = X.reshape(X.shape[0], -1) # 二维数据:(事件, 特征)
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 构建SVM模型
model = make_pipeline(StandardScaler(), SVC(kernel='linear'))
model.fit(X_train, y_train)
# 预测
predictions = model.predict(X_test)
# 评估模型
accuracy = np.mean(predictions == y_test)
print(f'Test accuracy: {accuracy}')
# 绘制混淆矩阵
from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay
cm = confusion_matrix(y_test, predictions, labels=model.classes_)
disp = ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=['left', 'right'])
disp.plot()
plt.title('Confusion Matrix for BCI Classification')
plt.show()
5.3 认知科学研究
认知科学领域中,EEG技术则被用来探究大脑在不同认知任务中的活动模式。通过对EEG数据的分析,研究者能够深入解析大脑在信息处理、决策制定以及记忆等方面的工作机制。
5.3.1 研究工作记忆
以下是一个探讨工作记忆功能的研究案例。通过EEG信号分析不同任务条件下的脑电信号变化, 能够深入探讨大脑在工作记忆过程中的活动机制。
import numpy as np
import matplotlib.pyplot as plt
from mne import Epochs, read_events, read_epochs
from mne.io import read_raw_edf
from scipy.signal import welch
# 读取EEG数据
raw = read_raw_edf('working_memory_example.edf', preload=True)
events = read_events('working_memory_example-eve.fif')
event_id = {'low_load': 1, 'high_load': 2}
# 切分数据
epochs = Epochs(raw, events, event_id, tmin=-0.2, tmax=0.5, baseline=(None, 0), preload=True)
# 提取特征
X_low_load = epochs['low_load'].get_data() # 低负载条件下的数据
X_high_load = epochs['high_load'].get_data() # 高负载条件下的数据
# 计算平均功率谱密度
psd_low_load = np.mean([welch(ch_data, fs=raw.info['sfreq'], nperseg=1024)[1] for ch_data in X_low_load], axis=0)
psd_high_load = np.mean([welch(ch_data, fs=raw.info['sfreq'], nperseg=1024)[1] for ch_data in X_high_load], axis=0)
# 绘制功率谱密度对比图
frequencies = welch(X_low_load[0, 0, :], fs=raw.info['sfreq'], nperseg=1024)[0]
plt.figure(figsize=(10, 6))
plt.semilogy(frequencies, psd_low_load, label='Low Load')
plt.semilogy(frequencies, psd_high_load, label='High Load')
plt.title('Power Spectral Density (PSD) Comparison for Working Memory')
plt.xlabel('Frequency (Hz)')
plt.ylabel('Power/Frequency (dB/Hz)')
plt.legend()
plt.grid()
plt.show()
6. 总结
脑电图(EEG)信号处理与分析是一项繁琐的过程,主要涉及EEG信号的生成与采集、预处理以及特征提取等环节。通过这些步骤,从中提取具有参考价值的信息,可用于临床诊断、脑机接口及认知科学研究等多个领域。随着技术的进步,EEG信号分析方法不断优化,未来有望在更多领域发挥更重要的作用
6.1 未来展望
- 更高的空间分辨率 :通过改进电极和信号采集技术,提高EEG的空间分辨率,使其更精确地定位大脑活动。
- 更强大的去噪方法 :开发更有效的去噪方法,减少外界和生理噪声的干扰,提高信号质量。
- 更先进的特征提取技术 :结合机器学习和深度学习方法,开发更强大的特征提取技术,提高分类和识别的准确性。
- 实时处理与分析 :实现EEG信号的实时处理与分析,提高脑机接口等应用的响应速度和用户体验。
借助一系列创新措施和技术进步, EEG信号处理与分析将在医疗、科研和日常生活中起到更为关键的作用, 为人类的健康和生活质量带来深远的影响。

