EEG特征提取:如何为特定通道绘制各频段波形?
修改代码针对特定通道绘制EEG频段波形
要实现针对特定通道的频段波形绘制,核心是把原来遍历全通道的逻辑,改成只处理你指定的单个/多个通道,具体步骤和示例如下:
1. 确定目标通道的索引或名称
首先明确你要关注的通道:
- 如果你的EEG数据是
(n_channels, n_samples)形状的NumPy数组,直接用通道索引(比如选第2个通道,索引为1,因为Python从0开始计数); - 如果数据带通道名称(比如
['Fp1', 'Fp2', 'Fz', ...]),可以通过名称匹配找到对应索引。
2. 修改频段提取逻辑(针对单通道)
假设你原来用PyWavelets做DWT分解,原来的代码可能是遍历所有通道处理,现在改成仅提取目标通道的数据做分解:
import pywt import numpy as np import matplotlib.pyplot as plt # 假设你的EEG数据:shape=(n_channels, n_samples),采样率250Hz eeg_data = np.random.randn(19, 2500) # 示例数据:19通道,10秒数据 channel_names = ['Fp1', 'Fp2', 'Fz', 'F3', 'F4', 'C3', 'C4', 'P3', 'P4', 'O1', 'O2', 'F7', 'F8', 'T7', 'T8', 'P7', 'P8', 'Fz', 'Cz'] # --- 修改点:指定目标通道 --- target_channel_name = 'Fp1' # 通过名称找索引 target_channel_idx = channel_names.index(target_channel_name) # 提取目标通道的原始数据 target_eeg = eeg_data[target_channel_idx, :] # DWT分解提取各频段(以db4小波,5层分解为例,对应常用EEG频段) wavelet = 'db4' levels = 5 coeffs = pywt.wavedec(target_eeg, wavelet, level=levels) # 定义频段对应的系数(根据采样率250Hz,对应关系如下) # Delta: 0-4Hz → cA5 (近似系数) # Theta: 4-8Hz → d5 # Alpha: 8-13Hz → d4 # Beta:13-30Hz → d3 # Gamma:30-100Hz → d2 delta = pywt.waverec([coeffs[0]] + [np.zeros_like(c) for c in coeffs[1:]], wavelet)[:len(target_eeg)] theta = pywt.waverec([np.zeros_like(coeffs[0])] + [np.zeros_like(c) for c in coeffs[1:5]] + [coeffs[5]] + [np.zeros_like(c) for c in coeffs[6:]], wavelet)[:len(target_eeg)] alpha = pywt.waverec([np.zeros_like(coeffs[0])] + [np.zeros_like(c) for c in coeffs[1:4]] + [coeffs[4]] + [np.zeros_like(c) for c in coeffs[5:]], wavelet)[:len(target_eeg)] beta = pywt.waverec([np.zeros_like(coeffs[0])] + [np.zeros_like(c) for c in coeffs[1:3]] + [coeffs[3]] + [np.zeros_like(c) for c in coeffs[4:]], wavelet)[:len(target_eeg)] gamma = pywt.waverec([np.zeros_like(coeffs[0])] + [coeffs[2]] + [np.zeros_like(c) for c in coeffs[3:]], wavelet)[:len(target_eeg)] # 整理各频段数据 bands = { 'Delta (0-4Hz)': delta, 'Theta (4-8Hz)': theta, 'Alpha (8-13Hz)': alpha, 'Beta (13-30Hz)': beta, 'Gamma (30-100Hz)': gamma }
3. 修改绘图逻辑(仅绘制目标通道的各频段)
把原来遍历全通道绘图的代码,改成只绘制目标通道的5个频段,用子图展示更清晰:
# --- 修改点:仅绘制目标通道的各频段 --- fig, axes = plt.subplots(nrows=5, ncols=1, figsize=(12, 10), sharex=True) time = np.arange(len(target_eeg)) / 250 # 时间轴(秒) for ax, (band_name, band_data) in zip(axes, bands.items()): ax.plot(time, band_data) ax.set_title(f'{target_channel_name} - {band_name}') ax.set_ylabel('Amplitude') axes[-1].set_xlabel('Time (s)') plt.tight_layout() plt.show()
补充说明
- 如果要同时处理多个特定通道,只需把目标通道改成一个列表,比如
target_channels = ['Fp1', 'Cz'],然后循环遍历每个通道重复上述处理和绘图即可; - 注意DWT分解的层数和频段对应关系需要根据你的EEG采样率调整,比如采样率128Hz时,频段对应的分解层数会有变化,你可以根据实际情况修改系数的选取逻辑。
内容的提问来源于stack exchange,提问作者Rishi Garg
相关产品推荐
相关产品推荐

