需要更高精度将数据保存为SEG-Y格式使用ObsPy
我正在尝试使用Python的ObsPy库将数据保存为SEG-Y格式。但是我在数据类型上遇到了问题。我需要比float32更高的精度,因为我的采样率非常高(每秒10百万个样本),这意味着时间间隔只有0.1微秒。同样,我的高频截止频率是20MHz,这超出了float32的处理能力(20000000)。当我写入头信息时,这些值会被默认值(1.0或0.0)覆盖。这种情况在SEG-Y头和通用的ObsPy头中都发生了。请问是否可以使用float64保存?或者有没有其他方法可以在SEG-Y中获得我需要的精度?根据我了解的数据编码,只允许使用float32。
下面是基本的代码,并在生成错误的行上添加了注释:
import numpy as np
from numpy import matrix
import sys
import getopt
import time
from obspy import read, Trace, Stream, UTCDateTime
from obspy.core.trace import Stats
from obspy.core import AttribDict
from obspy.segy.segy import SEGYTraceHeader, SEGYBinaryFileHeader
from obspy.segy.core import readSEGY
dataStream=Stream()
averages = np.random.rand(10)
data = np.require(averages, dtype='float32')
trace = Trace(data=data)
stats = Stats()
trace.stats.starttime = UTCDateTime()
if not hasattr(trace.stats, 'segy.trace_header'):
trace.stats.segy = {}
trace.stats.segy.trace_header = SEGYTraceHeader()
trace.stats.segy.trace_header.lag_time_B = 154
trace.stats.segy.trace_header.scalar_to_be_applied_to_times = -4
trace.stats.segy.trace_header.sample_interval_in_ms_for_this_trace = 10 #100 microseconds *10-4 = 0.01 us: shows up as 1.0 when I read the file.
trace.stats.segy.trace_header.high_cut_frequency = 20000000 #error: number to large with 20MHz
trace.stats.segy.trace_header.number_of_samples_in_this_trace = len(trace)
trace.stats.delta = 0.1*10**-6 # this will work for 1 us, but not 0.1 us!!
dataStream.stats = AttribDict()
dataStream.stats.binary_file_header = SEGYBinaryFileHeader()
dataStream.stats.binary_file_header.number_of_data_traces_per_ensemble = 1
dataStream.stats.binary_file_header.number_of_samples_per_data_trace = len(trace)
dataStream.write('Test.sgy', format='SEGY', data_encoding=1, byteorder=sys.byteorder)
1 个回答
1
在SEG-Y标准中,采样间隔必须用微秒表示,并且要是整数。如果你想用小于1微秒的间隔,那就超出了SEG-Y格式的范围。
你打算怎么处理这些数据呢?可能还有更好的选择,比如DZT格式。