This is an automated email from the git hooks/post-receive script. yoh pushed a commit to tag 0.4 in repository python-mne.
commit fd939de85cc4da3a7c0dfb94cd1eedef0b5b18d6 Author: Alexandre Gramfort <[email protected]> Date: Sun Jun 17 16:53:56 2012 +0300 ENH : new Raw.filter method to simply filtering --- doc/source/whats_new.rst | 6 ++-- mne/fiff/raw.py | 76 +++++++++++++++++++++++++++++++++++++++------- mne/fiff/tests/test_raw.py | 6 ++-- mne/preprocessing/ssp.py | 8 ++--- 4 files changed, 74 insertions(+), 22 deletions(-) diff --git a/doc/source/whats_new.rst b/doc/source/whats_new.rst index 4372f4b..b1c37bb 100644 --- a/doc/source/whats_new.rst +++ b/doc/source/whats_new.rst @@ -1,14 +1,14 @@ What's new ========== -.. _changes_0_3: - Current ----------- Changelog ~~~~~~~~~ + - Add Raw.filter method to more easily band pass data by `Alex Gramfort`_. + - Add method to regularize a noise covariance by `Alex Gramfort`_. - Read and write measurement info in forward and inverse operators for interactive visualization in mne_analyze by `Alex Gramfort`_. @@ -17,6 +17,8 @@ Changelog - Wrapper function and script (mne_maxfilter.py) for Elekta Neuromag MaxFilter(TM) by `Martin Luessi`_ +.. _changes_0_3: + Version 0.3 ----------- diff --git a/mne/fiff/raw.py b/mne/fiff/raw.py index e63db41..e0f4e9a 100644 --- a/mne/fiff/raw.py +++ b/mne/fiff/raw.py @@ -16,9 +16,11 @@ from .open import fiff_open from .meas_info import read_meas_info, write_meas_info from .tree import dir_tree_find from .tag import read_tag +from .pick import pick_types from ..filter import low_pass_filter, high_pass_filter, band_pass_filter from ..parallel import parallel_func +from ..utils import deprecated class Raw(object): @@ -360,6 +362,61 @@ class Raw(object): else: self.apply_function(hilbert, picks, np.complex64, n_jobs, verbose) + def filter(self, l_freq, h_freq, picks=None, filter_length=None, + n_jobs=1, verbose=5): + """Filter a subset of channels. + + Applies a zero-phase band-pass filter to the channels selected by + "picks". The data of the Raw object is modified inplace. + + The Raw object has to be constructed using preload=True (or string). + + Note: If n_jobs > 1, more memory is required as "len(picks) * n_times" + addtional time points need to be temporaily stored in memory. + + Parameters + ---------- + l_freq : float | None + Low cut-off frequency in Hz. If None the data are only low-passed. + + h_freq : float + High cut-off frequency in Hz. If None the data are only high-passed. + + picks : list of int | None + Indices of channels to filter. If None only the data (MEG/EEG) + channels will be filtered. + + filter_length : int (default: None) + Length of the filter to use (e.g. 4096). + If None or "n_times < filter_length", + (n_times: number of timepoints in Raw object) the filter length + used is n_times. Otherwise, overlap-add filtering with a + filter of the specified length is used (faster for long signals). + + n_jobs: int (default: 1) + Number of jobs to run in parallel. + + verbose: int (default: 5) + Verbosity level. + """ + fs = float(self.info['sfreq']) + if l_freq == 0: + l_freq = None + if h_freq > (fs / 2.): + h_freq = None + if picks is None: + picks = pick_types(self.info, meg=True, eeg=True) + if l_freq is None and h_freq is not None: + self.apply_function(low_pass_filter, picks, None, n_jobs, verbose, fs, + h_freq, filter_length=filter_length) + if l_freq is not None and h_freq is None: + self.apply_function(high_pass_filter, picks, None, n_jobs, verbose, fs, + l_freq, filter_length=filter_length) + if l_freq is not None and h_freq is not None: + self.apply_function(band_pass_filter, picks, None, n_jobs, verbose, fs, + l_freq, h_freq, filter_length=filter_length) + + @deprecated('band_pass_filter is deprecated please use raw.filter instead') def band_pass_filter(self, picks, l_freq, h_freq, filter_length=None, n_jobs=1, verbose=5): """Band-pass filter a subset of channels. @@ -372,7 +429,6 @@ class Raw(object): Note: If n_jobs > 1, more memory is required as "len(picks) * n_times" addtional time points need to be temporaily stored in memory. - Parameters ---------- picks : list of int @@ -396,10 +452,10 @@ class Raw(object): verbose: int (default: 5) Verbosity level. """ - fs = float(self.info['sfreq']) - self.apply_function(band_pass_filter, picks, None, n_jobs, verbose, fs, - l_freq, h_freq, filter_length=filter_length) + self.filter(l_freq, h_freq, picks, n_jobs=n_jobs, verbose=verbose, + filter_length=filter_length) + @deprecated('high_pass_filter is deprecated please use raw.filter instead') def high_pass_filter(self, picks, freq, filter_length=None, n_jobs=1, verbose=5): """High-pass filter a subset of channels. @@ -432,11 +488,10 @@ class Raw(object): verbose: int (default: 5) Verbosity level. """ + self.filter(freq, None, picks, n_jobs=n_jobs, verbose=verbose, + filter_length=filter_length) - fs = float(self.info['sfreq']) - self.apply_function(high_pass_filter, picks, None, n_jobs, verbose, - fs, freq, filter_length=filter_length) - + @deprecated('low_pass_filter is deprecated please use raw.filter instead') def low_pass_filter(self, picks, freq, filter_length=None, n_jobs=1, verbose=5): """Low-pass filter a subset of channels. @@ -469,9 +524,8 @@ class Raw(object): verbose: int (default: 5) Verbosity level. """ - fs = float(self.info['sfreq']) - self.apply_function(low_pass_filter, picks, None, n_jobs, verbose, - fs, freq, filter_length=filter_length) + self.filter(None, freq, picks, n_jobs=n_jobs, verbose=verbose, + filter_length=filter_length) def save(self, fname, picks=None, tmin=0, tmax=None, buffer_size_sec=10, drop_small_buffer=False): diff --git a/mne/fiff/tests/test_raw.py b/mne/fiff/tests/test_raw.py index 2321956..43e7908 100644 --- a/mne/fiff/tests/test_raw.py +++ b/mne/fiff/tests/test_raw.py @@ -148,13 +148,13 @@ def test_filter(): picks = picks_meg[:4] raw_lp = deepcopy(raw) - raw_lp.low_pass_filter(picks, 4.0, verbose=0, n_jobs=2) + raw_lp.filter(0., 4.0, picks=picks, verbose=0, n_jobs=2) raw_hp = deepcopy(raw) - raw_hp.high_pass_filter(picks, 8.0, verbose=0) + raw_lp.filter(8.0, None, picks=picks, verbose=0, n_jobs=2) raw_bp = deepcopy(raw) - raw_bp.band_pass_filter(picks, 4.0, 8.0, verbose=0) + raw_bp.filter(4.0, 8.0, picks=picks, verbose=0) data, _ = raw[picks, :] diff --git a/mne/preprocessing/ssp.py b/mne/preprocessing/ssp.py index 60713af..48b5b8c 100644 --- a/mne/preprocessing/ssp.py +++ b/mne/preprocessing/ssp.py @@ -141,12 +141,8 @@ def _compute_exg_proj(mode, raw, raw_event, tmin, tmax, picks = pick_types(raw.info, meg=True, eeg=True, eog=True, exclude=raw.info['bads'] + bads) - if l_freq is None and h_freq is not None: - raw.high_pass_filter(picks, h_freq, filter_length, n_jobs) - if l_freq is not None and h_freq is None: - raw.low_pass_filter(picks, h_freq, filter_length, n_jobs) - if l_freq is not None and h_freq is not None: - raw.band_pass_filter(picks, l_freq, h_freq, filter_length, n_jobs) + raw.filter(l_freq, h_freq, picks=picks, filter_length=filter_length, + n_jobs=n_jobs) epochs = Epochs(raw, events, None, tmin, tmax, baseline=None, picks=picks, reject=reject, proj=True) -- Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-med/python-mne.git _______________________________________________ debian-med-commit mailing list [email protected] http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/debian-med-commit
