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)