Source code for tonic.functional.denoise
import numpy as np
[docs]def denoise_numpy(events, filter_time=10000):
"""Drops events that are 'not sufficiently connected to other events in the recording.' In
practise that means that an event is dropped if no other event occured within a spatial
neighbourhood of 1 pixel and a temporal neighbourhood of filter_time time units. Useful to
filter noisy recordings where events occur isolated in time.
Parameters:
events: ndarray of shape [num_events, num_event_channels]
filter_time: maximum temporal distance to next event, otherwise dropped.
Lower values will mean higher constraints, therefore less events.
Returns:
filtered set of events.
"""
assert "x" and "y" and "t" in events.dtype.names
events_copy = np.zeros_like(events)
copy_index = 0
width = int(events["x"].max()) + 1
height = int(events["y"].max()) + 1
timestamp_memory = np.zeros((width, height)) + filter_time
for event in events:
x = int(event["x"])
y = int(event["y"])
t = event["t"]
timestamp_memory[x, y] = t + filter_time
if (
(x > 0 and timestamp_memory[x - 1, y] > t)
or (x < width - 1 and timestamp_memory[x + 1, y] > t)
or (y > 0 and timestamp_memory[x, y - 1] > t)
or (y < height - 1 and timestamp_memory[x, y + 1] > t)
):
events_copy[copy_index] = event
copy_index += 1
return events_copy[:copy_index]