Signal processing¶
In a wide-array of applications, the original data recorded from a digital system must be manipulated in order to extract the greatest amount of information.
GWpy provides a suite of functions to simplify and extend the excellent digital signal processing suite in scipy.signal.
Spectral density estimation¶
Spectral density estimation
is a common way of investigating the frequency-domain content of a time-domain
signal.
GWpy provides wrappers of power spectral density (PSD) estimation methods
from scipy.signal to simplify calculating a
FrequencySeries from a TimeSeries.
The gwpy.signal.spectral sub-package provides the following
PSD estimation averaging methods:
'bartlett'- mean average of non-overlapping periodograms'median'- median average of overlapping periodograms'welch'- mean average of overlapping periodograms
Each of these can be specified by passing the function name as the
method keyword argument to any of the relevant TimeSeries
instance methods:
|
Calculate the PSD |
|
Calculate the ASD |
|
Calculate the average power spectrogram of this |
|
Calculate the non-averaged power |
e.g, TimeSeries.psd():
>>> ts = TimeSeries(...)
>>> psd = ts.psd(..., method='median', ...)
See scipy.signal.welch() for more detailed documentation on the PSD
estimation method used.
Time-domain filtering¶
The TimeSeries object comes with a number of instance methods that should make filtering data trivial for a number of common use cases.
Available methods include:
Filter this |
|
Filter this |
|
Filter this |
|
Filter this |
|
Whiten this |
|
Filter this |
Each of the above methods eventually calls out to TimeSeries.filter() to apply a digital linear filter, normally via cascaded second-order-sections (requires scipy >= 0.16).
For a worked example of how to filter LIGO data to discover a gravitational-wave signal, see the example Filtering a TimeSeries to detect gravitational waves.
Frequency-domain filtering¶
Additionally, the TimeSeries object includes a number of instance methods to generate frequency-domain information for some data.
Available methods include:
Calculate the PSD |
|
Calculate the ASD |
|
Calculate the average power spectrogram of this |
|
Scan a |
|
Calculate the Rayleigh |
|
Calculate the Rayleigh statistic spectrogram of this |
For a worked example of how to load data and calculate the Amplitude Spectral Density FrequencySeries, see the example Calculating and plotting a FrequencySeries.
Filter design¶
The gwpy.signal provides a number of filter design methods which, when combined with the BodePlot visualisation, can be used to create a number of common filters:
Design a low-pass filter for the given cutoff frequency |
|
Design a high-pass filter for the given cutoff frequency |
|
Design a band-pass filter for the given cutoff frequencies |
|
Design a ZPK notch filter for the given frequency and sampling rate |
|
Concatenate a list of zero-pole-gain (ZPK) filters |
Each of these will return filter coefficients that can be passed directly into zpk (default for analogue filters) or filter (default for digital filters).
For a worked example of how to filter LIGO data to discover a gravitational-wave signal, see the example Filtering a TimeSeries to detect gravitational waves.
Cross-channel correlations:
Calculate the frequency-coherence between this |
|
Calculate the coherence spectrogram between this |
For a worked example of how to compare channels like this, see the example Calculating the coherence between two channels.
Reference/API¶
-
filter_design.bandpass(fhigh, sample_rate, fstop=
None, gpass=2, gstop=30, type='iir', **kwargs)[source]¶ Design a band-pass filter for the given cutoff frequencies
- Parameters:¶
- flow
float lower corner frequency of pass band
- fhigh
float upper corner frequency of pass band
- sample_rate
float sampling rate of target data
- fstop
tupleoffloat, optional (low, high)edge-frequencies of stop band- gpass
float, optional, default: 2 the maximum loss in the passband (dB)
- gstop
float, optional, default: 30 the minimum attenuation in the stopband (dB)
- type
str, optional, default:'iir' the filter type, either
'iir'or'fir'- **kwargs
other keyword arguments are passed directly to
iirdesign()orfirwin()
- flow
- Returns:¶
- filter
the formatted filter. the output format for an IIR filter depends on the input arguments, default is a tuple of
(zeros, poles, gain)
Notes
By default a digital filter is returned, meaning the zeros and poles are given in the Z-domain in units of radians/sample.
Examples
To create a band-pass filter for 100-1000 Hz for 4096 Hz-sampled data:
>>> from gwpy.signal.filter_design import bandpass >>> bp = bandpass(100, 1000, 4096)To view the filter, you can use the
BodePlot:>>> from gwpy.plot import BodePlot >>> plot = BodePlot(bp, sample_rate=4096) >>> plot.show()(
png)
-
filter_design.lowpass(sample_rate, fstop=
None, gpass=2, gstop=30, type='iir', **kwargs)[source]¶ Design a low-pass filter for the given cutoff frequency
- Parameters:¶
- frequency
float corner frequency of low-pass filter (Hertz)
- sample_rate
float sampling rate of target data (Hertz)
- fstop
float, optional edge-frequency of stop-band (Hertz)
- gpass
float, optional, default: 2 the maximum loss in the passband (dB)
- gstop
float, optional, default: 30 the minimum attenuation in the stopband (dB)
- type
str, optional, default:'iir' the filter type, either
'iir'or'fir'- **kwargs
other keyword arguments are passed directly to
iirdesign()orfirwin()
- frequency
- Returns:¶
- filter
the formatted filter. the output format for an IIR filter depends on the input arguments, default is a tuple of
(zeros, poles, gain)
Notes
By default a digital filter is returned, meaning the zeros and poles are given in the Z-domain in units of radians/sample.
Examples
To create a low-pass filter at 1000 Hz for 4096 Hz-sampled data:
>>> from gwpy.signal.filter_design import lowpass >>> lp = lowpass(1000, 4096)To view the filter, you can use the
BodePlot:>>> from gwpy.plot import BodePlot >>> plot = BodePlot(lp, sample_rate=4096) >>> plot.show()(
png)
-
filter_design.highpass(sample_rate, fstop=
None, gpass=2, gstop=30, type='iir', **kwargs)[source]¶ Design a high-pass filter for the given cutoff frequency
- Parameters:¶
- frequency
float corner frequency of high-pass filter
- sample_rate
float sampling rate of target data
- fstop
float, optional edge-frequency of stop-band
- gpass
float, optional, default: 2 the maximum loss in the passband (dB)
- gstop
float, optional, default: 30 the minimum attenuation in the stopband (dB)
- type
str, optional, default:'iir' the filter type, either
'iir'or'fir'- **kwargs
other keyword arguments are passed directly to
iirdesign()orfirwin()
- frequency
- Returns:¶
- filter
the formatted filter. the output format for an IIR filter depends on the input arguments, default is a tuple of
(zeros, poles, gain)
Notes
By default a digital filter is returned, meaning the zeros and poles are given in the Z-domain in units of radians/sample.
Examples
To create a high-pass filter at 100 Hz for 4096 Hz-sampled data:
>>> from gwpy.signal.filter_design import highpass >>> hp = highpass(100, 4096)To view the filter, you can use the
BodePlot:>>> from gwpy.plot import BodePlot >>> plot = BodePlot(hp, sample_rate=4096) >>> plot.show()(
png)
-
filter_design.notch(sample_rate, type=
'iir', output='zpk', **kwargs)[source]¶ Design a ZPK notch filter for the given frequency and sampling rate
- Parameters:¶
- frequency
float,Quantity frequency (default in Hertz) at which to apply the notch
- sample_rate
float,Quantity number of samples per second for
TimeSeriesto which this notch filter will be applied- type
str, optional, default: ‘iir’ type of filter to apply, currently only ‘iir’ is supported
- output
str, optional, default: ‘zpk’ output format for notch
- **kwargs
other keyword arguments to pass to
scipy.signal.iirdesign
- frequency
- Returns:¶
- filter
the formatted filter; the output format for an IIR filter depends on the input arguments, default is a tuple of
(zeros, poles, gain)
See also
scipy.signal.iirdesignfor details on the IIR filter design method and the output formats
Notes
By default a digital filter is returned, meaning the zeros and poles are given in the Z-domain in units of radians/sample.
Examples
To create a low-pass filter at 1000 Hz for 4096 Hz-sampled data:
>>> from gwpy.signal.filter_design import notch >>> n = notch(100, 4096)To view the filter, you can use the
BodePlot:>>> from gwpy.plot import BodePlot >>> plot = BodePlot(n, sample_rate=4096) >>> plot.show()(
png)
- filter_design.concatenate_zpks()[source]¶
Concatenate a list of zero-pole-gain (ZPK) filters
- Parameters:¶
- Returns:¶
- zeros
numpy.ndarray the concatenated array of zeros
- poles
numpy.ndarray the concatenated array of poles
- gain
float the overall gain
- zeros
Examples
Create a lowpass and a highpass filter, and combine them:
>>> from gwpy.signal.filter_design import ( ... highpass, lowpass, concatenate_zpks) >>> hp = highpass(100, 4096) >>> lp = lowpass(1000, 4096) >>> zpk = concatenate_zpks(hp, lp)Plot the filter:
>>> from gwpy.plot import BodePlot >>> plot = BodePlot(zpk, sample_rate=4096) >>> plot.show()(
png)