【发布时间】:2017-04-19 08:18:11
【问题描述】:
我有一个 4D 结构,其中包含形状为 (3432,1,30,512) 的 EEG 数据
这代表 3432 次数据试验,其中每个试验包含 30 个电极的 512 个时间样本
对于每次试验,我想用某些过滤参数过滤每个电极,从而产生一个新的 2D (30,512) 过滤数组。然后,我想将它们沿 4D 结构的轴 1 堆叠。
目前,我正在迭代每个试验,然后是每个电极,过滤信号并将所有内容重新插入 4D:
from scipy import signal
NUM_CHANS = 30
NUM_TIMESTAMPS = 512
FREQ_BANDS = ((0.1, 3), (4, 7), (8, 13), (16, 31))
all_data = np.reshape(all_data, (-1, 1, NUM_CHANS, NUM_TIMESTAMPS)) # (3432,1,30,512)
for i in range(all_data.shape[0]):
num_band = 1
for band in FREQ_BANDS:
lower = float(band[0])/(SAMPLE_RATE/2)
upper = float(band[1])/(SAMPLE_RATE/2)
# Design new filter for the current frequency band
b, a = signal.butter(2, [lower, upper], 'bandpass')
temp_trial = np.zeros((NUM_CHANS, NUM_TIMESTAMPS))
for ch in range(NUM_CHANS):
# Filter the current electrode
output_signal = signal.filtfilt(b, a, all_data[i,0,ch,:])
temp_trial[ch,:] = output_signal
# Insert temp_trial (2D) into all_data (4D) along axis 1
num_band += 1
迭代试验和电极非常慢(完成整个循环大约需要 2 小时)。是否有更有效的方法将此过滤器应用于所有电极/试验?
我一直在尝试找到一种在 2D 上应用过滤器的方法,因此我不需要迭代电极,但找不到任何东西。
编辑:
这是使用filtfilt 轴参数的正确方法吗?
all_data = np.reshape(all_data, (-1, 1, NUM_CHANS, NUM_TIMESTAMPS))
filtered_data = [all_data]
for band in FREQ_BANDS:
lower = float(band[0])/(SAMPLE_RATE/2)
upper = float(band[1])/(SAMPLE_RATE/2)
b, a = signal.butter(2, [lower, upper], 'bandpass')
output_signal = signal.filtfilt(b, a, all_data, axis=3)
filtered_data.append(output_signal)
all_data = np.concatenate(filtered_data, axis=1)
【问题讨论】:
-
嗯,您可能想查看MNE-Python,这是一个用于 M/EEG 分析的 Python 包。
-
我尝试过 MNE,但我找不到将过滤器应用于除原始数据之外的任何内容的方法。我拥有的 4D 结构实际上是划时代的数据。如果我想使用跨国公司过滤 Id 必须读取原始数据、过滤、纪元,然后重复整个过程,这似乎有点多余(即我宁愿只读取一次数据)。有没有办法将过滤器应用于时代数据,而不仅仅是原始数据?
-
也许可以试试
mne.filter.filter_data? -
为什么
all_data中有一个平凡的(长度为 1)维度?为什么不把它做成 3D 呢? -
它是因为我需要沿该维度堆叠每个频带,所以我最终得到形状
(3432, 5, 30, 512)。我没有包含这个代码,只是有一个占位符注释
标签: python numpy scipy filtering signal-processing