一、神经信号基础:脑电图(EEG)原理、信号采集设备、常见伪影类型、神经信号数字化基础
各位同学,咱们今天聊点实在的。神经信号处理这个领域,说白了就是跟大脑的“电活动”打交道。你想想看,大脑里上千亿个神经元在不停地放电,我们怎么把这些微弱的信号抓出来、看懂它?这就是EEG要做的事。
我个人习惯把EEG比作“听诊器”——只不过听的不是心跳,而是大脑皮层神经元的集体电活动。嗯,这个比喻虽然糙了点,但道理是通的。
1.1 EEG原理:神经元怎么“说话”的?
先搞清楚一个核心问题:EEG到底在测什么?
我们的大脑皮层里,密密麻麻排着锥体神经元。这些神经元兴奋时,会产生突触后电位——说白了就是离子在细胞膜内外跑来跑去,形成微小的电压变化。单个神经元这点电压,你根本测不到。但成千上万个神经元同步放电,叠加起来的电场就能穿透头皮,被电极捕捉到。
这里有个关键点:EEG记录的不是单个神经元的动作电位,而是大量神经元同步活动的总和。我在项目中遇到过不少新手,总以为EEG能读出“某个神经元在想什么”,这是误解。EEG的空间分辨率确实有限,但时间分辨率极高——毫秒级的信号变化都能捕捉到。
核心要点:EEG信号频率范围通常在0.5-100Hz,幅度在微伏(μV)级别。常见的节律包括:
- δ波 (0.5-4 Hz):深度睡眠时占主导
- θ波 (4-8 Hz):困倦、冥想状态
- α波 (8-13 Hz):放松、闭眼时明显
- β波 (13-30 Hz):清醒、专注、思考
- γ波 (>30 Hz):高级认知处理
1.2 信号采集设备:从电极到放大器
讲完原理,咱们看看实际怎么采集。EEG设备的核心部件就三样:电极、放大器、模数转换器。
电极是直接接触头皮的部分。常见的有湿电极(需要导电膏)和干电极(直接接触)。我个人更推荐湿电极——虽然麻烦点,但信号质量确实好。干电极方便是方便,但阻抗高,信号容易漂移。
电极的放置位置遵循国际10-20系统。这个系统以鼻根和枕骨隆突为基准,按10%和20%的间距划分电极位置。比如Fz代表额叶中线,Cz代表中央中线,Pz代表顶叶中线。
| 电极代号 | 位置 | 常见用途 |
|---|---|---|
| Fp1, Fp2 | 前额 | 眼动伪影检测 |
| C3, C4 | 中央区 | 运动想象BCI |
| O1, O2 | 枕区 | 视觉诱发电位 |
| T3, T4 | 颞区 | 听觉处理 |
放大器这块,我建议重点关注共模抑制比(CMRR)。EEG信号只有几微伏到几十微伏,而环境噪声可能达到毫伏级。好的放大器CMRR要在100dB以上,才能把有用的差分信号从噪声里捞出来。
实战经验:我曾经在一个项目中,用了某款廉价放大器,CMRR只有80dB。结果采集到的信号里全是50Hz工频干扰,后处理怎么滤都滤不干净。后来换了高CMRR的放大器,问题迎刃而解。所以,放大器别省钱。
1.3 常见伪影类型:那些“假信号”
做EEG最头疼的是什么?不是信号太弱,而是伪影太多。伪影说白了就是“不是大脑产生的电信号,但混进了EEG里”。
我按来源把伪影分成三类:
- 生理伪影:眨眼、眼动、心跳、肌肉活动、出汗。其中眨眼伪影最典型——前额电极上会出现一个大幅度的尖峰,频率在1-3Hz左右。
- 环境伪影:50Hz工频干扰(国内是50Hz,国外有些地方是60Hz)、电磁干扰、电极移动。工频干扰是最常见的,你想想看,实验室里到处都是电源线,怎么可能不受影响?
- 设备伪影:电极接触不良、放大器饱和、线缆晃动。这类伪影通常表现为突然的基线漂移或高频噪声。
避坑指南:我曾经在采集静息态EEG时,发现数据里每隔几秒就有一个大尖峰。排查了半天,结果是受试者戴的金属耳环在晃动。所以,采集前一定要检查受试者身上有没有金属物品——眼镜、耳环、发夹,统统摘掉。
1.4 神经信号数字化基础
模拟的EEG信号要变成计算机能处理的数字信号,得经过三个步骤:采样、量化、编码。
采样:根据奈奎斯特定理,采样频率至少是信号最高频率的两倍。EEG信号最高频率通常不超过100Hz,所以200Hz的采样率理论上就够了。但我建议用250Hz或500Hz——留点余量,万一后面要做高频分析呢?
量化:把连续的电压值映射到离散的数值上。量化位数决定了分辨率。16位ADC可以区分65536个电平,对于微伏级的EEG信号来说,足够了。24位ADC当然更好,但成本也上去了。
编码:把量化后的数值用二进制表示。常见的格式有int16、float32等。我个人习惯用float32保存原始数据——虽然占空间大点,但后续处理时不用来回转换精度。
下面是一个简单的Python代码示例,演示如何读取和查看EEG数据的基本信息:
import numpy as np
import matplotlib.pyplot as plt
# 模拟一段EEG数据
fs = 250 # 采样率 250Hz
t = np.arange(0, 10, 1/fs) # 10秒时长
eeg_signal = 10 * np.sin(2*np.pi*10*t) + 5 * np.random.randn(len(t))
# 查看基本信息
print(f"采样率: {fs} Hz")
print(f"数据长度: {len(eeg_signal)} 个采样点")
print(f"持续时间: {len(eeg_signal)/fs:.2f} 秒")
print(f"信号范围: {eeg_signal.min():.2f} ~ {eeg_signal.max():.2f} μV")
# 绘制波形
plt.figure(figsize=(12, 4))
plt.plot(t, eeg_signal)
plt.xlabel('时间 (秒)')
plt.ylabel('幅值 (μV)')
plt.title('模拟EEG信号')
plt.grid(True)
plt.show()
这段代码虽然简单,但能帮你理解数字EEG信号的基本结构——时间轴、幅值、采样率。实际项目中,你拿到的数据可能来自EDF、BDF或SET格式,但底层逻辑是一样的。
数字化关键参数总结:
- 采样率:250-1000 Hz(推荐500 Hz)
- 量化位数:16-24 bit(推荐24 bit)
- 输入范围:±100 mV 至 ±1 V(取决于放大器)
- 共模抑制比:>100 dB
- 输入阻抗:>10 MΩ
好了,这一章的内容就到这里。EEG的基础知识是后续所有深度学习模型优化的根基——你连信号怎么来的、有什么坑都不知道,后面怎么调模型?嗯,下一章咱们会深入讨论预处理和特征提取,但先把今天的内容消化透。