我试图用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)
在SEG-Y标准中,采样间隔必须指定为以微秒为单位的整数。如果低于1微秒,将超出SEG-Y格式的范围。在
你打算怎么处理这些数据?可能有更好的选择(例如DZT格式)。在
相关问题 更多 >
编程相关推荐