1

Python の ObsPy を使用して SEG-Y 形式でデータを保存しようとしています。データ型に問題があります。サンプリング レートが非常に高く (10 M サンプル/秒)、時間間隔がわずか 0.1 マイクロ秒であるため、float32 よりも高い精度が必要です。同様に、私の 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 に答える