问题描述
首先,我必须说我对这些事情很陌生。我正在尝试将FFT算法应用于由EEG频段获得的某些值。 我找到了以下代码,但无法使其正常工作。 将numpy导入为np
fs = 200
#data = np.random.uniform(0,100,1024) # 2 sec of data b/w 0.0-100.0
data = np.array([(-0.27,-0.09,0.16,0.01,0.67,0.65,-1.59,0.11,-0.36,0.69,0.94,0.43,-0.53,-0.57,0.98,-0.97),(-0.74,-0.56,0.76,0.58,1.79,2.22,-4.96,-0.25,-1.19,1.57,2.95,1.47,-1.00,-1.06,2.97,-3.43),(-0.89,-1.50,1.76,1.72,2.09,4.04,-7.97,-1.30,-2.09,1.11,4.82,2.57,-0.01,0.05,4.64,-6.44),(-0.84,-2.78,3.00,2.88,2.00,6.36,-11.46,-2.36,-3.22,6.96,3.84,1.85,2.11,6.64,-10.31),(-0.39,-4.27,4.26,4.57,1.09,8.77,-14.78,-4.09,-4.40,-1.87,9.03,5.12,4.86,5.31,8.76,-14.77)])
print("After data")
# Get real amplitudes of FFT (only in postive frequencies)
fft_vals = np.absolute(np.fft.rfft(data))
print("After fft_vales")
print(fft_vals)
# Get frequencies for amplitudes in Hz
fft_freq = np.fft.rfftfreq(len(data),1.0/fs)
print("After fft_freq")
print(fft_freq)
# Define EEG bands
eeg_bands = {'Delta': (0,4),'Theta': (4,8),'Alpha': (8,12),'Beta': (12,30),'Gamma': (30,45)}
# Take the mean of the fft amplitude for each EEG band
eeg_band_fft = dict()
for band in eeg_bands:
freq_ix = np.where((fft_freq >= eeg_bands[band][0]) &
(fft_freq <= eeg_bands[band][1]))[0]
eeg_band_fft[band] = np.mean(fft_vals[freq_ix])
print(eeg_band_fft)
进入for
时出现以下错误。
/home/xxxx/.local/lib/python3.8/site-packages/numpy/core/fromnumeric.py:3372: RuntimeWarning: Mean of empty slice.
return _methods._mean(a,axis=axis,dtype=dtype,/home/xxxx/.local/lib/python3.8/site-packages/numpy/core/_methods.py:170: RuntimeWarning: invalid value encountered in double_scalars
ret = ret.dtype.type(ret / rcount)
我想念什么或出什么事了?
如上所述,我对此事非常陌生,请尝试尽可能简单地解释一切。
编辑1
这是我得到的结果:
band val
0 Delta 64.642945
1 Theta NaN
2 Alpha NaN
3 Beta NaN
4 Gamma 25.851368
解决方法
您只有一个错字,请更改此代码:
# Take the mean of the fft amplitude for each EEG band
eeg_band_fft = dict()
for band in eeg_bands:
freq_ix = np.where((fft_freq >= eeg_bands[band][0]) &
(fft_freq <= eeg_bands[band][1]))[0]
eeg_band_fft[band] = np.mean(fft_vals[freq_ix])
print(eeg_band_fft)
阅读
# Take the mean of the fft amplitude for each EEG band
eeg_band_fft = dict()
for band in eeg_bands:
freq_ix = np.where((fft_freq >= eeg_bands[band][0]) &
(fft_freq <= eeg_bands[band][1]))[0]
eeg_band_fft[band] = np.mean(fft_vals[freq_ix])
print(eeg_band_fft)
注意缩进一行。这样,您应该看到输出:
{'Alpha': nan,'Beta': nan,'Delta': 2.0749711266314317,'Gamma': 6.3502280534780855,'Theta': nan}
请注意,nan
的位置会发生错误,因为对于某些波段,fft_vals[freq_ix]
是空的。您可以通过为每个波段打印fft_vals[freq_ix]
的值来确认这一点。
还请注意,即使发生多次,numpy也只会打印一次这样的错误/警告。