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

如何计算mu频段(8-13Hz)平均功率?FFT实现EEG ERDS计算问题求助

问题排查及修正方案

1. 核心逻辑错误:混淆FFT幅值和功率

你当前代码仅对FFT结果取绝对值得到的是信号幅值,但计算频段平均功率需要对幅值取平方,这是结果不符合预期的最主要原因。如果需要得到可对比的真实物理功率,还需要补充FFT归一化步骤,避免不同信号长度对结果的干扰:

# 错误写法:仅计算幅值,未转换为功率
fft_vals = np.absolute(np.fft.rfft(lrest))

# 正确写法:计算功率并做归一化
N = len(lrest)
fft_vals = np.square(np.absolute(np.fft.rfft(lrest))) / N
# 实信号rfft的能量被拆分到正负频率,除直流和奈奎斯特点外其余点需要乘2修正
fft_vals[1:-1] *= 2

2. 右侧试次代码存在大量变量名误用

你在右侧试次的计算逻辑中大量错误沿用左侧试次的变量名,还存在未定义变量的问题,直接会导致结果计算错误:

  • 右侧静息期平均功率错误赋值给meanlrest,需修正为meanrrest
  • 右侧想象期计算FFT频率时,错误传入左侧想象期长度len(limagery),需修正为len(rimagery)
  • 右侧想象期平均功率错误赋值给meanlimg,需修正为meanrimg
  • 右侧ERDS计算结果错误赋值给ERDS_left,需修正为ERDS_right

修正后的右侧试次完整代码:

# right trial (C3)--------------------------------------
rrest = np.array(right_df.loc[right_df['Rest/Imagery'] == 'rest','C3'])
rimagery = np.array(right_df.loc[right_df['Rest/Imagery'] == 'imagery','C3'])

### rest period    
N = len(rrest)
fft_vals = np.square(np.absolute(np.fft.rfft(rrest))) / N
fft_vals[1:-1] *= 2
fft_freq = np.fft.rfftfreq(len(rrest),1.0/fs)
freq_ix = np.where((fft_freq >= low) & (fft_freq <= high))
meanrrest = np.mean(fft_vals[freq_ix])

### imagery period
N = len(rimagery)
fft_vals = np.square(np.absolute(np.fft.rfft(rimagery))) / N
fft_vals[1:-1] *= 2
fft_freq = np.fft.rfftfreq(len(rimagery),1.0/fs)
freq_ix = np.where((fft_freq >= low) & (fft_freq <= high))
meanrimg = np.mean(fft_vals[freq_ix])

ERDS_right = (meanrimg - meanrrest)/meanrrest
ERDS_subject_right_fourier.append(ERDS_right)

3. 可选优化建议

如果静息期和想象期的信号长度差异较大,建议使用Welch法等短时光谱估计方法代替直接FFT,得到的功率估计结果会更稳定,减少长度差异和噪声带来的误差。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 12:21:01