我试图使用Python的ObsPy以SEG格式保存数据。我在数据类型方面有问题。我需要比float32更高的精度,因为我有一个很高的采样率(10 MSamples/秒),所以时间间隔只有0.1微秒。同样,我的high_cut_frequency是20 the,这超出了float32 (20000000)的容量。当我编写头信息时,这些值会被默认值(1.0或0.0)覆盖。这与SEG头和通用ObsPy头一起使用。可以在float64中保存吗?或者,还有另一个技巧来获得我所需要的SEG的精度?据我所收集的,数据编码只允许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)发布于 2014-03-27 22:35:16
在SEG标准中,采样间隔必须以微秒为单位指定为整数.如果你在1微秒以下,你将超出SEG格式的范围.
你打算怎么处理这些数据?可能有更好的选择(例如,DZT格式)。
https://stackoverflow.com/questions/22597478
复制相似问题