elephant.phase_analysis.spike_triggered_phase(hilbert_transform, spiketrains, interpolate)[source]

Calculate the set of spike-triggered phases of a neo.AnalogSignal.

hilbert_transformneo.AnalogSignal or list of neo.AnalogSignal

neo.AnalogSignal of the complex analytic signal (e.g., returned by the elephant.signal_processing.hilbert function). If hilbert_transform is only one signal, all spike trains are compared to this signal. Otherwise, length of hilbert_transform must match the length of spiketrains.

spiketrainsneo.SpikeTrain or list of neo.SpikeTrain

Spike trains on which to trigger hilbert_transform extraction.


If True, the phases and amplitudes of hilbert_transform for spikes falling between two samples of signal is interpolated. If False, the closest sample of hilbert_transform is used.

phaseslist of np.ndarray

Spike-triggered phases. Entries in the list correspond to the neo.SpikeTrain`s in `spiketrains. Each entry contains an array with the spike-triggered angles (in rad) of the signal.

amplist of pq.Quantity

Corresponding spike-triggered amplitudes.

timeslist of pq.Quantity

A list of times corresponding to the signal. They correspond to the times of the neo.SpikeTrain referred by the list item.


If the number of spike trains and number of phase signals don’t match, and neither of the two are a single signal.


Create a 20 Hz oscillatory signal sampled at 1 kHz and a random Poisson spike train, then calculate spike-triggered phases and amplitudes of the oscillation:

>>> import neo
>>> import elephant
>>> import quantities as pq
>>> import numpy as np
>>> f_osc = 20. * pq.Hz
>>> f_sampling = 1 * pq.ms
>>> tlen = 100 * pq.s
>>> time_axis = np.arange(
...     0, tlen.magnitude,
...     f_sampling.rescale(pq.s).magnitude) * pq.s
>>> analogsignal = neo.AnalogSignal(
...     np.sin(2 * np.pi * (f_osc * time_axis).simplified.magnitude),
...     units=pq.mV, t_start=0*pq.ms, sampling_period=f_sampling)
>>> spiketrain = (elephant.spike_train_generation.
...     homogeneous_poisson_process(
...     50 * pq.Hz, t_start=0.0*pq.ms, t_stop=tlen.rescale(pq.ms)))
>>> phases, amps, times = elephant.phase_analysis.spike_triggered_phase(
...     elephant.signal_processing.hilbert(analogsignal),
...     spiketrain,
...     interpolate=True)
>>> phases
[array([-0.57890515,  1.03105904, -0.82241075, ...,  0.90023903,
         2.23702263,  2.93744259])]
>>> amps
[array([0.86117412, 1.08918248, 0.98256318, ..., 1.05760518, 1.08407016,
    1.01927305]) * dimensionless]
>>> times
[array([6.41327152e+00, 2.02715221e+01, 1.05827312e+02, ...,
    9.99692942e+04, 9.99808429e+04, 9.99870120e+04]) * ms]