Ich habe eine 4D-Struktur mit Form EEG-Daten enthält (3432,1,30,512)
Python Filtern von Signalen in einer 4D-Struktur
Dies entspricht 3432 Studien von Daten, wobei jeder Versuch 512 Zeitproben für 30 Elektroden
Für jeden Versuch enthält, Ich möchte jede Elektrode mit bestimmten Filterparametern filtern, was zu einem neuen gefilterten Array führt. Dann möchte ich diese entlang der Achse 1 der 4D-Struktur stapeln.
Derzeit bin ich über jeden Versuch laufen, dann jede Elektrode, Filtern des Signals und alles wieder in die 4D Einfügen:
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
Iterieren über Studien und Elektroden ist extrem langsam (dauert ca. 2 Stunden vervollständige die ganze Schleife). Gibt es einen effizienteren Weg diesen Filter über alle Elektroden/Versuche anzuwenden?
Ich habe versucht, einen Weg zu finden, den Filter über 2D anzuwenden, so dass ich nicht über Elektroden iterieren muss, aber nichts gefunden habe.
EDIT:
Wäre dies der richtige Weg sein filtfilt
Achse Argument zu benutzen?
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)
Hmm vielleicht wollen Sie in [MNE-Python] (http://martinos.org/mne/stable/index.html), ein Python-Paket für M/EEG-Analyse. – Jakub
Ich habe MNE versucht, aber ich kann keinen Weg finden, den Filter auf irgendetwas außer den rohen Daten anzuwenden. Die 4D-Struktur habe ich tatsächlich epoched Daten. Wenn ich MNEs filtern will, muss ich die Rohdaten lesen, filtern, epochieren und dann den gesamten Prozess wiederholen, der ein bisschen redundant erscheint (d. H. Id lese lieber die Daten nur einmal).Gibt es eine Möglichkeit, Filter auf Epochendaten anzuwenden, statt nur auf Rohdaten? – Simon
Vielleicht versuchen ['mne.filter.filter_data'] (http://martinos.org/mne/dev/generated/mne.filter.filter_data.html)? – Jakub