You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 12:40:21