我正在尝试使用 Python 的 ObsPy 以 SEG-Y 格式保存数据。我在数据类型方面遇到问题。我需要比 float32 更高的精度,因为我的采样率非常高(10 MSamples/sec),所以时间间隔只有 0.1 微秒。同样,我的 high_cut_frequency 为 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)