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)