📄 segy.h
字号:
#include "hash.h"#define SEGY_EBCDIC_HDR_SIZE 3200#define SEGY_REEL_HDR_SIZE 400#define SEGY_TRACE_HDR_SIZE 240#ifndef UINT8_T#define UINT8_Ttypedef unsigned char uint8_t;#endif#ifndef INT16_T#define INT16_Ttypedef short int16_t;#endif#ifndef INT32_T#define INT32_Ttypedef long int32_T;#endif//===文本卷头typedef struct segy_ebcdic_hdr { uint8_t buffer[SEGY_EBCDIC_HDR_SIZE];} segy_ebcdic_hdr;//===二进制卷头typedef struct segy_reel_hdr { int32_T job_id_number; // 3201-3204 4 作业标识号 int32_T line_number; // 3205-3208 4 测线号(每卷只能记一条线) int32_T reel_number; // 3209-3212 4 卷号 int16_t traces_per_record; // 3213-3214 2= 每个记录的数据道数(包括空道和冲零道) int16_t aux_traces_per_record; // 3215-3216 2 每个记录的辅助道数 int16_t sample_data_interval_ms; // 3217-3218 2= 采样间隔(μs) int16_t original_data_interval_ms; // 3219-3220 2 以微秒计算的原始野外记录的采样间隔 int16_t samples_per_trace; // 3221-3222 2= 本卷上每个数据道的采样个数 int16_t original_samples_per_trace; // 3223-3224 2 野外原始记录每个数据道的采样个数 int16_t data_sample_format_code; // 3225-3226 2= 数据采样格式码:1-浮点(4字节);2-定点(4字节);3-定点(2字节);4-带有增益码的定点(4字节),辅助道每个样点用同样的字节数 int16_t CDP_fold; // 3227-3228 2= CDP覆盖次数 int16_t trace_sorting_code; // 3229-3230 2= 道分选码:1-原始记录(炮集);2-CDP道集;3-单次覆盖剖面;4-水平迭加 int16_t vertical_sum_code; // 3231-3232 2 垂直迭加代码:1-未迭加;2-二次迭加;……;n-n次迭加 int16_t sweep_frequency_start_hz; // 3233-3234 2 起始扫描频率(Hz) int16_t sweep_frequency_end_hz; // 3235-3236 2 终了扫描频率(Hz) int16_t sweep_length_ms; // 3237-3238 2 扫描长度(ms) int16_t sweep_type_code; // 3239-3240 2 扫描类型代码:1-线性;2-抛物线;3-指数;4-其他 int16_t trace_number_of_sweep_channel; // 3241-3242 2 扫描通道的道号 int16_t sweep_trace_taper_length_start_ms; // 3243-3244 2 如果有斜坡,为起始时的扫描斜坡长度(ms)(斜坡起点在时间零) int16_t sweep_trace_taper_length_end_ms; // 3245-3246 2 结束时的斜坡长度(斜坡起点为扫描长度减尾部的斜坡长) int16_t taper_type_code; // 3247-3248 2 斜坡类型:1-线形;2-COS^2;3-其他 int16_t correlated_data_traces_flag; // 3249-3250 2 相关数据道代码:1-未相关;2-相关 int16_t binary_gain_recovered_flag; // 3251-3252 2 二进制增益恢复:1-恢复;2-未恢复 int16_t amplitude_recovery_method_code; // 3253-3254 2 振幅恢复方式:1-未恢复;2-球面扩散;3-AGC;4-其他 int16_t measurement_system; // 3255-3256 2= 长度单位:1-米;2-英尺 int16_t impulse_signal_polarity; // 3257-3258 2 脉冲信号极性:1-磁带上的负值为压力增加或检波器上跳;2-磁带上的正值为压力增加或检波器上跳 int16_t vibratory_polarity_code; // 3259-3260 2 可控震源极性代码 uint8_t buffer[340]; // 12 bytes + 12 bytes + 36 bytes + 340 buffer bytes = REEL_HDR_SIZE // 3261-3600 340 预留,用户自定义} segy_reel_hdr;//===道头typedef struct segy_trace_hdr { int32_T trace_sequence_number_within_line; // 1-4 4 一条测线的道序号,如果一条线有多卷带,道序号是连续增加的 int32_T trace_sequence_number_within_reel; // 5-8 4 本卷带的道序号。每卷带从序号1开始 int32_T original_field_record_number; // 9-12 4* 原始野外记录号(炮号) int32_T trace_sequence_number_within_original_field_record; // 13-16 4 原始野外记录的道号 int32_T energy_source_point_number; // 17-20 4 震源点号 int32_T cdp_ensemble_number; // 21-24 4* CDP号(或CMP, CRP) int32_T trace_sequence_number_within_cdp_ensemble; // 25-28 4* 在CDP道集中的道号。每个道集的起始道号为1 int16_t trace_identification_code; // 29-30 2 道识别 int16_t number_of_vertically_summed_traces_yielding_this_trace; // 31-32 2 垂直叠加字,本道由多少道叠加而成 int16_t number_of_horizontally_stacked_traced_yielding_this_trace; // 33-34 2 CDP覆盖次数 int16_t data_use; // 35-36 2 数据性质,1=成果,2=实验 int32_T distance_from_source_point_to_receiver_group; // 37-40 4* 炮点到检波点距离(负值表示与测线放炮方向相反) int32_T receiver_group_elevation; // 41-44 4 检波器的高度;在海平面以上为正,以下为负 int32_T surface_elevation_at_source; // 45-48 4 震源的水平高度 int32_T source_depth_below_surface; // 49-52 4 震源在水平下的深度(是一个正数) int32_T datum_elevation_at_receiver_group; // 53-56 4 检波器的海拔 int32_T datum_elevation_at_source; // 57-60 4 震源的海拔 int32_T water_depth_at_source; // 61-64 4 震源的水深 int32_T water_depth_at_receiver_group; // 65-68 4 检波器的水深 int16_t scalar_for_elevations_and_depths; // 69-70 2 比例因子,对字节41~68的高程和深度使用比例因子后求得真值。比例因子为1、±10、±100、±1000或±10000,如果为正,乘上 int16_t scalar_for_coordinates; // 71-72 2 比例因子,对字节73~88、199~206的高程和深度使用比例因子后求得真值。比例因子为1、±10、±100、±1000或±10000,如果为正,乘上比例因子;如果为负,除以比例因子。 int32_T x_source_coordinate; // 73-76 4 震源的坐标-X int32_T y_source_coordinate; // 77-80 4 震源的坐标-Y int32_T x_receiver_group_coordinate; // 81-84 4 检波器的坐标-X int32_T y_receiver_group_coordinate; // 85-88 4 检波器的坐标-Y int16_t coordinate_units; // 89-90 2 坐标单位:1=长度(米或英尺) 2=弧度的秒 int16_t weathering_velocity; // 91-92 2 风化层速度 int16_t subweathering_velocity; // 93-94 2 降速层速度 int16_t uphole_time_at_source; // 95-96 2 在震源处的井口时间 int16_t uphole_time_at_group; // 97-98 2 在检波点处的井口时间 int16_t source_static_correction; // 99-100 2 炮点静校正 int16_t group_static_correction; // 101-102 2 检波器静校正 int16_t total_static_applied; // 103-104 2 应用的总静校正量(如果未使用,则为零) int16_t lag_time_a; // 105-106 2 延迟时间A(ms)。记录的第一个样点和时间信号之间的时间。240字节道标识头与时间信号之间的时间。如果为正,时间信号出现在道标识头结束之后;如果为负,时间信号出现在道标识头结束之前 int16_t lag_time_b; // 107-108 2 延迟时间B(ms)。时间信号和震源起爆时间之间的时间 int16_t delay_according_time; // 109-110 2 延迟记录时间(ms)。震源起爆时间和开始记录采样时间之间的时间(深水时使用) int16_t mute_time_start; // 111-112 2 起始切除时间 //brute_time_start int16_t mute_time_end; // 113-114 2 终了切除时间 int16_t samples_in_this_trace; // 115-116 2* 本道采样点数 int16_t sample_intervall; // 117-118 2* 采样间隔 int16_t gain_type_instruments; // 119-120 2 野外仪器的增益类型:1=固定 2=二进制 3=浮点型 4=可选的其它 int16_t igc; // 121-122 2 仪器增益常数 int16_t igi; // 123-124 2 仪器早期和最初的增益 int16_t corr; // 125-126 2 相关性:1=没有 2=有 int16_t sfs; // 127-128 2 在开始时的扫描频率 int16_t sfe; // 129-130 2 在结束时的扫描频率 int16_t slen; // 131-132 2 扫描长度以毫秒为单位 int16_t styp; // 133-134 2 扫描类型 1 线性 2抛物线性 3指数型 int16_t stas; // 135-136 2 在开始时的扫描道长 int16_t stae; // 137-138 2 在结束时的扫描道长 int16_t tatyp; // 139-140 2 扫描类型 1 线性 2抛物线性 3指数型 int16_t afilf; // 141-142 2 Alias滤波器频率,如果使用了 int16_t afils; // 143-144 2 Alias滤波器斜率 int16_t nofilf; // 145-146 2 陷波滤波器频率 int16_t nofils; // 147-148 2 陷波滤波器斜率 int16_t lcf; // 149-150 2 低切频 int16_t hcf; // 151-152 2 高切频 int16_t lcs; // 153-154 2 低切斜 int16_t hcs; // 155-156 2 高切斜率 int16_t year; // 157-158 2 记录的年 int16_t day; // 159-160 2 这年的第几天 int16_t hour; // 161-162 2 这天的第几小时 int16_t minute; // 163-164 2 这个小时的第几分 int16_t sec; // 165-166 2 这分的第几秒 int16_t timbas; // 167-168 2 时间码 I = local. 2 = GMT. 3 = other. int16_t trwf; // 169-170 2 trace weighting factor int16_t grnors; // 171-172 2 geophone group number of roll switch position one int16_t grnofr; // 173-174 2 geophone group number of trace one within original field record int16_t grnlof; // 175-176 2 geophone group number of last trace within original field record int16_t gaps; // 177-178 2 gap size (total number of groups dropped) int16_t otrav; // 179-180 2 overtravel taper code: 1 = down (or behind) 2 = up (or ahead) int32_T user_define[15]; // 181-240 60 预留,用户自定义 //uint8_t buffer[120]; //old,替换为上面更详细字段} segy_trace_hdr;class SegyReader{public: SegyReader(const char * fileNameData, const char * fileNameIndex, short componentFlag, int arraySum=12); bool makeIndexFile(); float * getSegyData(int shotNo, int arrayNo); bool buildIndexFile(); bool phaseIndexFile(); void printIndexbuf(); protected: void * SEGY_realloc (void* ptr, size_t size, size_t oldsize); void SwapWordByteOrder (char * data_array, int word_count); void SwapNybbleByteOrder (char * data_array, int nybble_count); int ConvertBinary (void * data, int size, int count);private: char fileNameData[256]; char fileNameIndex[256]; short componentFlag; long shotMin; //本文件内最小炮号 long shotMax; //本文件内最大炮号 long shotSum; //本文件内总炮数 int arraySum; int traceSumEachArray; CHash *cHash; long ** indexBuf; struct segy_ebcdic_hdr ebcdic_hdr; struct segy_reel_hdr reel_hdr; struct segy_trace_hdr trace_hdr; };
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -