def test_iirfilter(): # dataset with one feature from two waves t = np.linspace(0, 1.0, 2001) xlow = np.sin(2 * np.pi * 5 * t) xhigh = np.sin(2 * np.pi * 250 * t) x = xlow + xhigh ds = Dataset(x, sa={'sid': np.arange(len(x))}, fa={'fid':['theone']}) # butterworth filter with a cutoff between the waves from scipy import signal b, a = signal.butter(8, 0.125) mds = iir_filter(ds, b, a, padlen=150) # check we get just the slow wave out (compensate for edge artifacts) assert_false(np.sum(np.abs(mds.samples[100:-100,0] - xlow[100:-100]) > 0.001)) assert_equal(len(ds.sa), len(mds.sa)) assert_equal(len(ds.fa), len(mds.fa)) assert_array_equal(ds.fa.fid, mds.fa.fid) assert_array_equal(ds.sa.sid, mds.sa.sid)
def run(args): if not args.chunks is None: # apply global "chunks" setting for cattr in ('detrend_chunks', 'zscore_chunks'): if getattr(args, cattr) is None: # only overwrite if individual option is not given args.__setattr__(cattr, args.chunks) ds = arg2ds(args.data) if not args.poly_detrend is None: if not args.detrend_chunks is None \ and not args.detrend_chunks in ds.sa: raise ValueError( "--detrend-chunks attribute '%s' not found in dataset" % args.detrend_chunks) from mvpa2.mappers.detrend import poly_detrend verbose(1, "Detrend") poly_detrend(ds, polyord=args.poly_detrend, chunks_attr=args.detrend_chunks, opt_regs=args.detrend_regrs, space=args.detrend_coords) if args.filter_passband is not None: from mvpa2.mappers.filters import iir_filter from scipy.signal import butter, buttord if args.sampling_rate is None or args.filter_stopband is None: raise ValueError("spectral filtering requires specification of " "--filter-stopband and --sampling-rate") # determine filter type nyquist = args.sampling_rate / 2.0 if len(args.filter_passband) > 1: btype = 'bandpass' if not len(args.filter_passband) == len(args.filter_stopband): raise ValueError( "passband and stopband specifications have to " "match in size") wp = [v / nyquist for v in args.filter_passband] ws = [v / nyquist for v in args.filter_stopband] elif args.filter_passband[0] < args.filter_stopband[0]: btype = 'lowpass' wp = args.filter_passband[0] / nyquist ws = args.filter_stopband[0] / nyquist elif args.filter_passband[0] > args.filter_stopband[0]: btype = 'highpass' wp = args.filter_passband[0] / nyquist ws = args.filter_stopband[0] / nyquist else: raise ValueError("invalid specification of Butterworth filter") # create filter verbose(1, "Spectral filtering (%s)" % (btype, )) try: ord, wn = buttord(wp, ws, args.filter_passloss, args.filter_stopattenuation, analog=False) b, a = butter(ord, wn, btype=btype) except OverflowError: raise ValueError( "cannot contruct Butterworth filter for the given " "specification") ds = iir_filter(ds, b, a) if args.zscore: from mvpa2.mappers.zscore import zscore verbose(1, "Z-score") zscore(ds, chunks_attr=args.zscore_chunks, params=args.zscore_params) verbose(3, "Dataset summary %s" % (ds.summary())) # invariants? if not args.strip_invariant_features is None: from mvpa2.datasets.miscfx import remove_invariant_features ds = remove_invariant_features(ds) # and store ds2hdf5(ds, args.output, compression=args.hdf5_compression) return ds
def run(args): if args.chunks is not None: # apply global "chunks" setting for cattr in ("detrend_chunks", "zscore_chunks"): if getattr(args, cattr) is None: # only overwrite if individual option is not given args.__setattr__(cattr, args.chunks) ds = arg2ds(args.data) if args.poly_detrend is not None: if args.detrend_chunks is not None and not args.detrend_chunks in ds.sa: raise ValueError("--detrend-chunks attribute '%s' not found in dataset" % args.detrend_chunks) from mvpa2.mappers.detrend import poly_detrend verbose(1, "Detrend") poly_detrend( ds, polyord=args.poly_detrend, chunks_attr=args.detrend_chunks, opt_regs=args.detrend_regrs, space=args.detrend_coords, ) if args.filter_passband is not None: from mvpa2.mappers.filters import iir_filter from scipy.signal import butter, buttord if args.sampling_rate is None or args.filter_stopband is None: raise ValueError("spectral filtering requires specification of " "--filter-stopband and --sampling-rate") # determine filter type nyquist = args.sampling_rate / 2.0 if len(args.filter_passband) > 1: btype = "bandpass" if not len(args.filter_passband) == len(args.filter_stopband): raise ValueError("passband and stopband specifications have to " "match in size") wp = [v / nyquist for v in args.filter_passband] ws = [v / nyquist for v in args.filter_stopband] elif args.filter_passband[0] < args.filter_stopband[0]: btype = "lowpass" wp = args.filter_passband[0] / nyquist ws = args.filter_stopband[0] / nyquist elif args.filter_passband[0] > args.filter_stopband[0]: btype = "highpass" wp = args.filter_passband[0] / nyquist ws = args.filter_stopband[0] / nyquist else: raise ValueError("invalid specification of Butterworth filter") # create filter verbose(1, "Spectral filtering (%s)" % (btype,)) try: ord, wn = buttord(wp, ws, args.filter_passloss, args.filter_stopattenuation, analog=False) b, a = butter(ord, wn, btype=btype) except OverflowError: raise ValueError("cannot contruct Butterworth filter for the given " "specification") ds = iir_filter(ds, b, a) if args.zscore: from mvpa2.mappers.zscore import zscore verbose(1, "Z-score") zscore(ds, chunks_attr=args.zscore_chunks, params=args.zscore_params) verbose(3, "Dataset summary %s" % (ds.summary())) # invariants? if args.strip_invariant_features is not None: from mvpa2.datasets.miscfx import remove_invariant_features ds = remove_invariant_features(ds) # and store ds2hdf5(ds, args.output, compression=args.hdf5_compression) return ds