def spectralWhitening(data, sr=None, smoothi=None, freq_domain=False, apply_filter=None): """ Apply spectral whitening to data. sr: sampling rate (only needed for smoothing) smoothi: None or int Data is divided by its smoothed (Default: None) amplitude spectrum. """ if freq_domain: mask = False spec = data else: mask = np.ma.getmask(data) N = len(data) nfft = nextpow2(N) spec = fft(data, nfft) #df = sr/N spec_ampl = np.sqrt(np.abs(np.multiply(spec, np.conjugate(spec)))) if isinstance(smoothi, basestring) and isnumber(smoothi) and smoothi > 0: smoothi = int(smoothi * N / sr) spec /= ifftshift(smooth(fftshift(spec_ampl), smoothi)) else: spec /= spec_ampl if apply_filter is not None: spec *= filterResp(*apply_filter, sr=sr, N=len(spec), whole=True)[1] if freq_domain: return spec else: ret = np.real(ifft(spec, nfft)[:N]) if USE_FFTW3: ret = ret.copy() return fillArray(ret, mask=mask, fill_value=0.)
def filter2(self, freqmin=None, freqmax=None, corners=2, zerophase=False): """ Wrapper for Trace.filter, make entry in self.stats.filter. """ if self.stats.is_fft: self.data *= filterResp(freqmin, freqmax, corners=corners, zerophase=zerophase, sr=self.stats.sampling_rate, N=self.stats.nfft, whole=True)[1] self.stats.filter += 'BP%4.2f,%4.2f,%d,%d' % (freqmin, freqmax, corners, zerophase) else: mask = np.ma.getmask(self.data) if freqmin and freqmax: self.filter("bandpass", freqmin=freqmin, freqmax=freqmax, corners=corners, zerophase=zerophase) self.stats.filter += 'BP%4.2f,%4.2f,%d,%d' % (freqmin, freqmax, corners, zerophase) elif not freqmin and freqmax: self.filter("lowpass", freq=freqmax, corners=corners, zerophase=zerophase) self.stats.filter += 'LP%4.2f,%d,%d' % (freqmax, corners, zerophase) elif freqmin and not freqmax: self.filter("highpass", freq=freqmin, corners=corners, zerophase=zerophase) self.stats.filter += 'HP%4.2f,%d,%d' % (freqmin, corners, zerophase) self.data = fillArray(self.data, mask=mask, fill_value=0.)
def filter2(self, freqmin=None, freqmax=None, corners=2, zerophase=False): """ Wrapper for Trace.filter, make entry in self.stats.filter. """ if self.stats.is_fft: self.data *= filterResp(freqmin, freqmax, corners=corners, zerophase=zerophase, sr=self.stats.sampling_rate, N=self.stats.nfft, whole=True)[1] self.stats.filter += 'BP%4.2f,%4.2f,%d,%d' % (freqmin, freqmax, corners, zerophase) else: mask = np.ma.getmask(self.data) if freqmin and freqmax: self.filter("bandpass", freqmin=freqmin, freqmax=freqmax, corners=corners, zerophase=zerophase) self.stats.filter += 'BP%4.2f,%4.2f,%d,%d' % ( freqmin, freqmax, corners, zerophase) elif not freqmin and freqmax: self.filter("lowpass", freq=freqmax, corners=corners, zerophase=zerophase) self.stats.filter += 'LP%4.2f,%d,%d' % (freqmax, corners, zerophase) elif freqmin and not freqmax: self.filter("highpass", freq=freqmin, corners=corners, zerophase=zerophase) self.stats.filter += 'HP%4.2f,%d,%d' % (freqmin, corners, zerophase) self.data = fillArray(self.data, mask=mask, fill_value=0.)