1

我正在尝试使用 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)
4

1 回答 1

1

在 SEG-Y 标准中,必须将采样间隔指定为以微秒为单位的整数。如果你低于 1 微秒,你将超出 SEG-Y 格式的范围。

你打算用这些数据做什么?可能有更好的选择(例如 DZT 格式)。

于 2014-03-27T22:35:16.500 回答