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

如何分析多通道脑电波信号的时频谱?附Python示例代码需求

多通道脑电波信号时频谱分析实现

针对多通道脑电波信号的时频谱分析需求,这里基于PyTorch给出适配多通道场景的实现方案,同时修正原有单信号逻辑在多通道下的问题:

原有代码的问题点

你提供的代码中,spectrum = torch.norm(Zxx, dim=0)是对通道维度求范数,这会直接把12个通道的STFT结果合并成单通道,丢失了多通道脑电的关键特征——这和RGB图像保留多通道信息的思路相悖。正确的做法应该是对每个通道分别计算时频谱,保留通道维度。

修正后的多通道时频谱分析代码

import torch
import matplotlib.pyplot as plt

# 模拟12通道脑电波信号:[通道数, 采样点数]
signal = torch.randn(12, 64000)

# 配置STFT参数
n_fft = 1024
hop_length = 512
window = torch.hann_window(n_fft).to(signal.device)

# 对多通道信号执行STFT
# 返回结果维度:[通道数, 频率点数, 时间帧数, 2](最后一维是实部、虚部)
f, t, Zxx = torch.stft(signal, n_fft=n_fft, hop_length=hop_length, window=window, return_complex=False)

# 计算每个通道的时频谱:对实虚部维度求L2范数
# 结果维度:[通道数, 频率点数, 时间帧数]
spectrum = torch.norm(Zxx, dim=-1)

# 可选:对每个通道的时频谱做归一化(便于可视化和后续处理)
spectrum_norm = (spectrum - spectrum.min(dim=-1, keepdim=True)[0].min(dim=-2, keepdim=True)[0]) / \
                (spectrum.max(dim=-1, keepdim=True)[0].max(dim=-2, keepdim=True)[0] - spectrum.min(dim=-1, keepdim=True)[0].min(dim=-2, keepdim=True)[0])

# 可视化前4个通道的时频谱
fig, axes = plt.subplots(2, 2, figsize=(12, 8))
axes = axes.flatten()
for i in range(4):
    im = axes[i].pcolormesh(t, f, spectrum_norm[i].numpy(), shading='gouraud')
    axes[i].set_title(f'通道{i+1}时频谱')
    axes[i].set_xlabel('时间(s)')
    axes[i].set_ylabel('频率(Hz)')
fig.colorbar(im, ax=axes, label='归一化幅值')
plt.tight_layout()
plt.show()

关键进阶说明

  • 多通道特征保留:最终的spectrum保留了通道维度,结构类似[通道数, 频率, 时间],和RGB图像的[通道, 高度, 宽度]维度逻辑一致,方便后续做基于多通道的特征提取或模型输入。
  • 频谱泄漏抑制:汉宁窗是脑电信号处理的常用选择,若需更强的泄漏抑制,可替换为torch.blackman_window(n_fft)。
  • 维度适配:如果后续要输入到CNN模型,只需调整维度顺序为[通道数, 频率, 时间]或[通道数, 时间, 频率],匹配模型输入要求即可。
  • 多通道融合:若需要将多通道信息融合为单一时频谱,可对通道维度做平均(torch.mean(spectrum, dim=0))或采用注意力加权等进阶方法,根据任务需求选择。

内容的提问来源于stack exchange,提问作者assa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 14:15:33