Falcon Noise AnalysisΒΆ
The noise in the Falcon-style (dual-complement, single-disc) airborne gravity gradiometer is well characterised by the difference noise. Thus the noise in each component is half the standard deviation of the difference between complements):
where \(A_{NE}\) is the \(NE\) component of the gravity gradient as measured by the \(A\) complement, and similarly for \(A_{UV}\), \(B_{NE}\), and \(B_{UV}\). It is also useful to check for excess high frequency signal, and to check for any demodulation phase error as described below.
We will use the Canobie Falcon data for these examples so ensure you have run the Prepare_XYZ notebook first so that these data are prepared for review.
Import the required modules, set the path to the geowhizz files and list the channels.
from pathlib import Path
import galileoQC as qc
data_root = r'./CanobieData/'
canobieHDF_file = Path(data_root + r'Canobie.hdf5')
qc.reportChannels(canobieHDF_file)
---------------------------------------------------------------------------
FileNotFoundError Traceback (most recent call last)
Cell In[3], line 1
----> 1 qc.reportChannels(canobieHDF_file)
File ~/.local/lib/python3.12/site-packages/galileoQC/whizzFiles/reportData.py:158, in reportChannels(whizzFile, channel, verbose)
134 """
135 Prints a short summary of the channel names in a HDF5 Whizz file.
136
(...) 154
155 """
156 filename = str(whizzFile)
--> 158 with h5py.File(filename, 'r') as f:
160 whizzHeader = list(f.keys())[0]
161 g = f[whizzHeader]
File ~/.local/lib/python3.12/site-packages/h5py/_hl/files.py:555, in File.__init__(self, name, mode, driver, libver, userblock_size, swmr, rdcc_nslots, rdcc_nbytes, rdcc_w0, track_order, fs_strategy, fs_persist, fs_threshold, fs_page_size, page_buf_size, min_meta_keep, min_raw_keep, locking, alignment_threshold, alignment_interval, meta_block_size, track_times, **kwds)
546 fapl = make_fapl(driver, libver, rdcc_nslots, rdcc_nbytes, rdcc_w0,
547 locking, page_buf_size, min_meta_keep, min_raw_keep,
548 alignment_threshold=alignment_threshold,
549 alignment_interval=alignment_interval,
550 meta_block_size=meta_block_size,
551 **kwds)
552 fcpl = make_fcpl(track_order=track_order, track_times=track_times,
553 fs_strategy=fs_strategy, fs_persist=fs_persist,
554 fs_threshold=fs_threshold, fs_page_size=fs_page_size)
--> 555 fid = make_fid(name, mode, userblock_size, fapl, fcpl, swmr=swmr)
557 if isinstance(libver, tuple):
558 self._libver = libver
File ~/.local/lib/python3.12/site-packages/h5py/_hl/files.py:232, in make_fid(name, mode, userblock_size, fapl, fcpl, swmr)
230 if swmr:
231 flags |= h5f.ACC_SWMR_READ
--> 232 fid = h5f.open(name, flags, fapl=fapl)
233 elif mode == 'r+':
234 fid = h5f.open(name, h5f.ACC_RDWR, fapl=fapl)
File h5py/_objects.pyx:54, in h5py._objects.with_phil.wrapper()
---> 54 'Could not get source, probably due dynamically evaluated source code.'
File h5py/_objects.pyx:55, in h5py._objects.with_phil.wrapper()
---> 55 'Could not get source, probably due dynamically evaluated source code.'
File h5py/h5f.pyx:106, in h5py.h5f.open()
--> 106 'Could not get source, probably due dynamically evaluated source code.'
FileNotFoundError: [Errno 2] Unable to synchronously open file (unable to open file: name = 'CanobieData/Canobie.hdf5', errno = 2, error message = 'No such file or directory', flags = 0, o_flags = 0)
The diffNoiseVturb function plots the difference noise for each survey line against the turbulence for that line. Higher turbulence generally results in higher noise and the plot allows one to decide on a reasonable turbulence limit for the data. In addition, flight-lines with a difference noise that is off the general trend (high noise at low turbulence) should be questioned even if they meet specification.
In this example, we get very low noise estimates and there are no data off-trend.
The usual error_spec is \(5\,E\) but here we have set it to \(2.5\,E\) in order to force an error message, purely for an example. You can see that lines that fail the set specification are labeled on the plot.
qc.diffNoiseVturb(canobieHDF_file, eNE='Noise_NE', eUV='Noise_UV', turbulence='TURBULENCE',
error_spec=2.5, labelLines=True)
100060.000 fails with noise 2.80 > 2.5, mean turbulence = 0.66.
Any rectification process can down-convert high frequency vibration into the signal band of a sensor. Gravity gradiometers have an intrinsic rectification process via their sensitivity to products of rotational velocity so it is useful to check for excess high frequency signal since it may lead to error in the final data.
The function checkHighFreq checks for unusually high amplitude, high frequency signal in the raw gradient channels. The input gradient channels are high-pass filtered and a rolling standard deviation is used to find periods of higher amplitudes. High turbulence is sometimes associated with high frequency noise so the turbulence is also plotted for comparison.
Experience with Falcon data suggests that sections of data where checkHighFreq finds high frequency noise above \(15\,E\) are of concern and ought to be followed up with the service provider.
A plot showing where the high frequency noise occurs along line is shown for all lines that have excess high frequency signal. The Canobie data do not have any high frequency noise problems, so the noiseLimit has been artifically set here to \(6.5\,E\) just to get a plot for the example.
qc.checkHighFreq(canobieHDF_file, noiseLimit=6.5,
channels=['ANE_TC_2p67', 'AUV_TC_2p67', 'BNE_TC_2p67', 'BUV_TC_2p67'],
cutoffs=[0.15, 3.6], vertaccel='TURBULENCE', verbose=True, plot_flag=True)
Checked 6 lines; 1 line had high frequency signal above 6.5.
Line 100030.000: peak HF noise in ANE_TC_2p67 = 6.9.