def test_decim(): """Test evoked decimation.""" rng = np.random.RandomState(0) n_channels, n_times = 10, 20 dec_1, dec_2 = 2, 3 decim = dec_1 * dec_2 sfreq = 10. sfreq_new = sfreq / decim data = rng.randn(n_channels, n_times) info = create_info(n_channels, sfreq, 'eeg') with info._unlock(): info['lowpass'] = sfreq_new / float(decim) evoked = EvokedArray(data, info, tmin=-1) evoked_dec = evoked.copy().decimate(decim) evoked_dec_2 = evoked.copy().decimate(decim, offset=1) evoked_dec_3 = evoked.decimate(dec_1).decimate(dec_2) assert_array_equal(evoked_dec.data, data[:, ::decim]) assert_array_equal(evoked_dec_2.data, data[:, 1::decim]) assert_array_equal(evoked_dec.data, evoked_dec_3.data) # Check proper updating of various fields assert evoked_dec.first == -2 assert evoked_dec.last == 1 assert_array_equal(evoked_dec.times, [-1, -0.4, 0.2, 0.8]) assert evoked_dec_2.first == -2 assert evoked_dec_2.last == 1 assert_array_equal(evoked_dec_2.times, [-0.9, -0.3, 0.3, 0.9]) assert evoked_dec_3.first == -2 assert evoked_dec_3.last == 1 assert_array_equal(evoked_dec_3.times, [-1, -0.4, 0.2, 0.8]) # make sure the time nearest zero is also sample number 0. for ev in (evoked_dec, evoked_dec_2, evoked_dec_3): lowest_index = np.argmin(np.abs(np.arange(ev.first, ev.last))) idxs_of_times_nearest_zero = \ np.where(np.abs(ev.times) == np.min(np.abs(ev.times)))[0] # we use `in` here in case two times are equidistant from 0. assert lowest_index in idxs_of_times_nearest_zero assert len(idxs_of_times_nearest_zero) in (1, 2) # Now let's do it with some real data raw = read_raw_fif(raw_fname) events = read_events(event_name) sfreq_new = raw.info['sfreq'] / decim with raw.info._unlock(): raw.info['lowpass'] = sfreq_new / 4. # suppress aliasing warnings picks = pick_types(raw.info, meg=True, eeg=True, exclude=()) epochs = Epochs(raw, events, 1, -0.2, 0.5, picks=picks, preload=True) for offset in (0, 1): ev_ep_decim = epochs.copy().decimate(decim, offset).average() ev_decim = epochs.average().decimate(decim, offset) expected_times = epochs.times[offset::decim] assert_allclose(ev_decim.times, expected_times) assert_allclose(ev_ep_decim.times, expected_times) expected_data = epochs.get_data()[:, :, offset::decim].mean(axis=0) assert_allclose(ev_decim.data, expected_data) assert_allclose(ev_ep_decim.data, expected_data) assert_equal(ev_decim.info['sfreq'], sfreq_new) assert_array_equal(ev_decim.times, expected_times)
def test_decim(): """Test evoked decimation.""" rng = np.random.RandomState(0) n_channels, n_times = 10, 20 dec_1, dec_2 = 2, 3 decim = dec_1 * dec_2 sfreq = 10. sfreq_new = sfreq / decim data = rng.randn(n_channels, n_times) info = create_info(n_channels, sfreq, 'eeg') info['lowpass'] = sfreq_new / float(decim) evoked = EvokedArray(data, info, tmin=-1) evoked_dec = evoked.copy().decimate(decim) evoked_dec_2 = evoked.copy().decimate(decim, offset=1) evoked_dec_3 = evoked.decimate(dec_1).decimate(dec_2) assert_array_equal(evoked_dec.data, data[:, ::decim]) assert_array_equal(evoked_dec_2.data, data[:, 1::decim]) assert_array_equal(evoked_dec.data, evoked_dec_3.data) # Check proper updating of various fields assert evoked_dec.first == -1 assert evoked_dec.last == 2 assert_array_equal(evoked_dec.times, [-1, -0.4, 0.2, 0.8]) assert evoked_dec_2.first == -1 assert evoked_dec_2.last == 2 assert_array_equal(evoked_dec_2.times, [-0.9, -0.3, 0.3, 0.9]) assert evoked_dec_3.first == -1 assert evoked_dec_3.last == 2 assert_array_equal(evoked_dec_3.times, [-1, -0.4, 0.2, 0.8]) # Now let's do it with some real data raw = read_raw_fif(raw_fname) events = read_events(event_name) sfreq_new = raw.info['sfreq'] / decim raw.info['lowpass'] = sfreq_new / 4. # suppress aliasing warnings picks = pick_types(raw.info, meg=True, eeg=True, exclude=()) epochs = Epochs(raw, events, 1, -0.2, 0.5, picks=picks, preload=True) for offset in (0, 1): ev_ep_decim = epochs.copy().decimate(decim, offset).average() ev_decim = epochs.average().decimate(decim, offset) expected_times = epochs.times[offset::decim] assert_allclose(ev_decim.times, expected_times) assert_allclose(ev_ep_decim.times, expected_times) expected_data = epochs.get_data()[:, :, offset::decim].mean(axis=0) assert_allclose(ev_decim.data, expected_data) assert_allclose(ev_ep_decim.data, expected_data) assert_equal(ev_decim.info['sfreq'], sfreq_new) assert_array_equal(ev_decim.times, expected_times)
def _prepare_epochs_data(self, epochs, top_min, top_max): ep_data = epochs.get_data() evoked = EvokedArray(ep_data[0], epochs.info) if self.fourier is False: self._get_topographies(evoked, top_min, top_max) temp_list = list() for ie, _e in enumerate(ep_data): if self.subsample is not None: if ie == 0: print('Subsampling data with step {0}'.format( self.subsample)) temp_list.append(_e[:, self.s_min:self.s_max + 1:self.subsample]) else: temp_list.append(_e[:, self.s_min:self.s_max + 1]) return np.hstack(temp_list) elif self.fourier is True: tstep = 1 / evoked.info['sfreq'] evoked_f = evoked.copy() evoked_f.data *= np.hamming(evoked.data.shape[1]) evoked_f.data = (np.fft.rfft(evoked_f.data)) freqs = np.fft.rfftfreq(evoked.data.shape[1], tstep) print('Data have been converted to the frequency domain.') self._get_topographies(evoked_f, top_min, top_max, freqs=freqs) temp_list = list() temp_list2 = list() for ie, _e in enumerate(ep_data): _e *= np.hamming(_e.shape[1]) _e_f = np.fft.rfft(_e) if self.subsample is not None: if ie == 0: print('Subsampling data with step {0}'.format( self.subsample)) temp_list.append(_e_f[:, self.s_min:self.s_max + 1:self.subsample]) else: temp_list.append(_e_f[:, self.s_min:self.s_max + 1]) for _data_temp in temp_list: for l in _data_temp.T: temp_list2.append( np.vstack([np.real(l), np.imag(l)]).T) return np.hstack(temp_list2) else: raise ValueError