2. Filtering a TimeSeries
with a ZPK filter¶
Several data streams read from the LIGO detectors are whitened before being
recorded to prevent numerical errors when using single-precision data
storage.
In this example we read such channel
and undo the
whitening to show the physical content of these data.
First, we import the TimeSeries
and get()
the data:
from gwpy.timeseries import TimeSeries
white = TimeSeries.get(
'L1:OAF-CAL_DARM_DQ', 'March 2 2015 12:00', 'March 2 2015 12:30')
Now, we can re-calibrate these data into displacement units by first applying
a highpass
filter to remove the low-frequency noise,
and then applying our de-whitening filter in ZPK
format
with five zeros at 100 Hz and five poles at 1 Hz (giving an overall DC
gain of 10 -10:
hp = white.highpass(4)
displacement = hp.zpk([100]*5, [1]*5, 1e-10)
We can visualise the impact of the whitening by calculating the ASD
FrequencySeries
before and after the filter,
whiteasd = white.asd(8, 4)
dispasd = displacement.asd(8, 4)
and plotting:
from gwpy.plot import Plot
plot = Plot(whiteasd, dispasd, separate=True, sharex=True,
xscale='log', yscale='log')
Here we have passed the two
spectra
in order,
then separate=True
to display them on separate Axes, sharex=True
to tie
the XAxis
of each of the Axes
together.
Finally, we prettify our plot with some limits, and some labels:
plot.axes[0].set_ylabel('ASD [whitened]')
plot.axes[1].set_ylabel(r'ASD [m/$\sqrt{\mathrm{Hz}}$]')
plot.axes[1].set_xlabel('Frequency [Hz]')
plot.axes[1].set_ylim(1e-20, 1e-15)
plot.axes[1].set_xlim(5, 4000)
plot.show()
(png)