New function to derive SNR, returns SNR and SNR[dB].
This commit is contained in:
parent
5b52f718fe
commit
45eb138717
66
pylot/core/pick/getSNR.py
Normal file
66
pylot/core/pick/getSNR.py
Normal file
@ -0,0 +1,66 @@
|
||||
#!/usr/bin/python
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
Created Mar/Apr 2015
|
||||
Function to calculate SNR of certain part of seismogram relativ
|
||||
to given time. Returns SNR and SNR [dB].
|
||||
|
||||
:author: Ludger Kueperkoch /MAGS EP3 working group
|
||||
"""
|
||||
from obspy.core import Stream
|
||||
import numpy as np
|
||||
|
||||
def getSNR(X, TSNR, t1):
|
||||
'''
|
||||
Function to calculate SNR of certain part of seismogram relative to
|
||||
given time (onset) out of given noise and signal windows. A safety gap
|
||||
between noise and signal part can be set. Returns SNR and SNR [dB].
|
||||
|
||||
:param: X, time series (seismogram)
|
||||
:type: `~obspy.core.stream.Stream`
|
||||
|
||||
:param: TSNR, length of time windows [s] around t1 (onset) used to determine SNR
|
||||
:type: tuple (T_noise, T_gap, T_signal)
|
||||
|
||||
:param: t1, initial time (onset) from which noise and signal windows are calculated
|
||||
:type: float
|
||||
'''
|
||||
|
||||
assert isinstance(X, Stream), "%s is not a stream object" % str(X)
|
||||
|
||||
SNR = None
|
||||
SNRdB = None
|
||||
x = X[0].data
|
||||
t = np.arange(0, X[0].stats.npts / X[0].stats.sampling_rate, X[0].stats.delta)
|
||||
#some parameters needed:
|
||||
tnoise = TSNR[0] #noise window length for calculating noise level
|
||||
tsignal = TSNR[2] #signal window length
|
||||
tsafety = TSNR[1] #safety gap between signal onset and noise window
|
||||
#get noise window
|
||||
inoise = np.where((t <= max([t1 - tsafety, 0])) \
|
||||
& (t >= max([t1 - tnoise - tsafety, 0])))
|
||||
#get signal window
|
||||
isignal = np.where((t <= min([t1 + tsignal + tsafety, len(x)])) \
|
||||
& (t >= t1))
|
||||
if np.size(inoise) < 1:
|
||||
print 'getSNR: Empty array inoise, check noise window!'
|
||||
return
|
||||
elif np.size(isignal) < 1:
|
||||
print 'getSNR: Empty array isignal, check signal window!'
|
||||
return
|
||||
|
||||
#calculate ratios
|
||||
SNR = max(abs(x[isignal])) / np.mean(abs(x[inoise]))
|
||||
SNRdB = 20 * np.log10(SNR)
|
||||
|
||||
return SNR, SNRdB
|
||||
|
||||
if __name__ == "__main__":
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument('--X', type=~obspy.core.stream.Stream, help='time series (seismogram) read with obspy module read')
|
||||
parser.add_argument('--TSNR', type=tuple, help='length of time windows around pick used to determine SNR \
|
||||
[s] (Tnoise, Tgap, Tsignal)')
|
||||
parser.add_argument('--t1', type=float, help='initial time from which noise and signal windows are calculated')
|
||||
args = parser.parse_args()
|
||||
getSNR(args.X, args.TSNR, args.t1)
|
||||
|
Loading…
Reference in New Issue
Block a user