如何计算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
相关产品推荐
相关产品推荐

