def xcorr_eta(self): """Compute the normalized cross-correlation estimate of the HRFs for different kinds of events Returns ------- A time-series object, shape[:-2] are dimensions corresponding to the to shape[:-2] of the EventRelatedAnalyzer data, shape[-2] corresponds to the different kinds of events used (ordered according to the sorted order of the unique components in the events time-series). shape[-1] corresponds to time, and has length = len_et (xcorr looks both back and forward for half of this length) """ #Make a list to put the outputs in: h = [0] * self._len_h for i in range(self._len_h): data = self.data[i] u = np.unique(self.events[i]) event_types = u[np.unique(self.events[i]) != 0] h[i] = np.empty((event_types.shape[0], self.len_et // 2), dtype=complex) for e_idx in range(event_types.shape[0]): this_e = (self.events[i] == event_types[e_idx]) * 1.0 if self._zscore: this_h = tsa.freq_domain_xcorr_zscored( data, this_e, -self.offset + 1, self.len_et - self.offset - 2) else: this_h = tsa.freq_domain_xcorr( data, this_e, -self.offset + 1, self.len_et - self.offset - 2) h[i][e_idx] = this_h h = np.array(h).squeeze() ## t0 for the object returned here needs to be the central time, not ## the first time point, because the functions 'look' back and forth ## for len_et bins return ts.TimeSeries(data=h, sampling_rate=self.sampling_rate, t0=-1 * self.len_et * self.sampling_interval, time_unit=self.time_unit)
def test_xcorr_zscored(): """ Test this function, which is not otherwise tested in the testing of the EventRelatedAnalyzer """ cycles = 10 l = 1024 unit = 2 * np.pi / l t = np.arange(0, 2 * np.pi + unit, unit) signal = np.sin(cycles * t) events = np.zeros(t.shape) #Zero crossings: idx = np.where(np.abs(signal) < 0.03)[0] #An event occurs at the beginning of every cycle: events[idx[:-2:2]] = 1 a = tsa.freq_domain_xcorr_zscored(signal, events, 1000, 1000) npt.assert_almost_equal(np.mean(a), 0, 1) npt.assert_almost_equal(np.std(a), 1, 1)