SpikeCascade / preprocessing.py
zeechimp's picture
Create preprocessing.py
97277f9 verified
Raw History Blame Contribute Delete
1.07 kB
import numpy as np
from scipy.signal import butter, sosfiltfilt
def bandpass_filter(
voltage: np.ndarray, sample_rate: int, low_hz: float, high_hz: float
) -> np.ndarray:
"""
Zero-phase Butterworth bandpass along the sample axis.
voltage: (n_channels, n_samples)
"""
sos = butter(
4,
[low_hz / (sample_rate / 2), high_hz / (sample_rate / 2)],
btype="band",
output="sos",
)
return sosfiltfilt(sos, voltage, axis=1).astype(np.float32)
def extract_snippets(
spike_band: np.ndarray, positions: np.ndarray, length: int
) -> np.ndarray:
"""
Extract fixed-length snippets centred on the given positions.
Pads with zeros at the edges.
Returns: (n_spikes, n_channels, length)
"""
half = length // 2
n_channels, n_samples = spike_band.shape
padded = np.pad(spike_band, ((0, 0), (half, half)), mode="constant")
out = np.empty((len(positions), n_channels, length), dtype=np.float32)
for i, p in enumerate(positions):
out[i] = padded[:, p : p + length]
return out