You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

173 lines
5.9 KiB
C++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/**
* @file SegdReader.h
* @brief SegD格式文件读取类
* @author
* @date 2011-11-15
*/
#pragma once
#include "SegDHeader.h"
#include "SeisLineData.h"
namespace NSegD
{
typedef struct stuSegDFileHeader
{
unsigned short ver; //版本号1=版本1.02=版本2.03=版本3.0(目前不支持3.0版)
int fileNumber; //文件号
unsigned short formatCode; //格式代码
//时序
//0x0015 20 bit binary multiplexed
//0x0022 8 bit quaternary multiplexed
//0x0024 16 bit quaternary multiplexed
//0x0036 24 bit 2's compliment integer multiplexed
//0x0038 32 bit 2's compliment integer multiplexed
//0x0042 8 bit hexadecimal multiplexed
//0x0044 16 bit hexadecimal multiplexed
//0x0048 32 bit hexadecimal multiplexed
//0x0058 32 bit IEEE multiplexed
//道序
//0x8015 20 bit binary demultiplexed
//0x8022 8 bit quaternary demultiplexed
//0x8024 16 bit quaternary demultiplexed
//0x8036 24 bit 2's compliment integer demultiplexed
//0x8038 32 bit 2's compliment integer demultiplexed
//0x8042 8 bit hexadecimal demultiplexed
//0x8044 16 bit hexadecimal demultiplexed
//0x8048 32 bit hexadecimal demultiplexed
//0x8058 32 bit IEEE demultiplexed
//无效
//0200 Illegal, do not use
//0000 Illegal, do not use
unsigned short scanInterval; //采样间隔
int recordLength; //记录长度
//通常一次记录过程中的记录道数和采集参数是不变化的所以通常仅有1个扫描类型
unsigned short scanTypesNum; //扫描类型个数
unsigned short channelNumPerScanType; //一个扫描类型内包含的道组数
int totalChannelsNumber; /* total number of channels */
unsigned short sampleSkewNum; //采样时偏头段个数
unsigned short trailerNum; /* 13-14 General trailer number */
unsigned short generalHeaderNum; /* 12 Number blocks in general header 头段块的个数高四位通用头段块个数至少2个*/
unsigned short extendedHeaderNum; //扩展头段个数
int externalHeaderNum; //外部头个数
//头块长度
//( generalHeaderNum + scanTypesNum*(channelNumPerScanType+sampleSkewNum) + extendedHeaderNum + externalHeaderNum + 1 ) * 32
unsigned short year; //Year (0-99)
unsigned short day; //Day (1-366)
unsigned short hour; /* 14 Hour of day(0-23) */
unsigned short minute; /* 15 Minute of hour(0-59) */
unsigned short second; /* 16 Second of minute(0-59) */
//仅对时序保存方式有效////////////////////////////////////////////////
//每块的扫描个数为sb + 2^sbx
unsigned short sb; /* 25 Number of scans per block */
unsigned short sbx; /* 24 sb的指数范围0-15 */
int scanBytes; //每个扫描字节数,仅时序
} SEGD_FILE_HEADER;
typedef struct stuSegDTraceHeader
{
int fileNumber; //文件号
unsigned short scanType; //扫描类型
unsigned short channelSetNum; //道集数
unsigned short traceNumber; /* 05-06 trace number 道号 */
unsigned short extendHeaderNum; /* 10 trace header extensions 扩展道头的个数 */
unsigned short sampleSkew; /* 11 sample skew of the first sample of the trace.
It is a part of the fractional part of the base scan interval.
Res :1/256 scan interval */
int samplesNumber; /* 每道采样点个数*/
} SEGD_TRACE_HEADER;
class AFX_EXT_CLASS CSegdReader
{
public:
CSegdReader(void);
~CSegdReader(void);
bool Read(LPCTSTR lpszFileName);
//包括充填CSegdFileHeader对象
bool ReadFileHeader(CFileSegy& fr); //读取文件头信息
bool ReadOneRecordBlock(CFileSegy& fr); //读取一个记录块
bool ReadTapeLabel(CFileSegy& fr); //读取版本2的磁带头信息并设置版本号
bool ReadTraceHeader(CFileSegy& fr); //读取道头
bool ReadDataTrace(CFileSegy& fr, CSeisTraceData& td); //读取道数据
SEGD_FILE_HEADER& GetFileHeader() { return m_fileHeader; }
SEGD_TRACE_HEADER& GetTraceHeader() { return m_traceHeader; }
bool IsGain() { return m_bGain; }
protected:
bool InitializeTraceHeader(SEGD_DEMUX_TRACE_HEADER& traceHeader);
bool InitializeFileHeader(SEGD_GENERAL_HEADER_1& header1, SEGD_GENERAL_HEADER_2& header2);
bool InitializeFileHeader(SEGD_GENERAL_HEADER_1& header1);
CSeisLineData m_tracesData; //所有道数据
SEGD_FILE_HEADER m_fileHeader;
SEGD_TRACE_HEADER m_traceHeader;
bool m_bGain; /* flag for applying gain 是否使用增益*/
void ClearChannelHeader(void);
SEGD_CHANNEL_SET_HEADER* GetChannelSetHeader(int i, int j);
float* GetGain(int i, int j);
int GetBytesLength(int nSampleNum, int code);
private:
//文件头
SEGD_TAPE_LABEL m_stuTapeLabel; //版本2 格式的磁带标签定义
SEGD_GENERAL_HEADER_1 m_stuGHeader1; //头段块1
SEGD_GENERAL_HEADER_2 m_stuGHeader2; //头段块2
SEGD_GEN_HEAD_SN358 m_stuGHeaderSN358;
SEGD_GENERAL_HEADER_N m_stuGHeaderN; //扩展头段
SEGD_SAMPLE_SKEW m_stuSampleSkew; //采样时偏
SEGD_EXTENDED_HEADER m_stuExtendedHeader;//扩展头段
SEGD_EXTERNAL_HEADER m_stuExternalHeader;//外部头段
SEGD_CHANNEL_SET_HEADER* m_pChannelHeader; //扫描类型头段,array[scanTypesNum][channelNumPerScanType]
float* m_pGain; //增益,array[scanTypesNum][channelNumPerScanType] for escaling exponent
//道头
SEGD_DEMUX_TRACE_HEADER m_stuTraceHeader; //道头
SEGD_TRACE_HEADER_EXT m_stuTraceHeaderExt; //道头扩展
/* repair byte swap of MP gain */
int imp0;
int imp1;
int icvt2s; /* Sercel glitch flag */
protected:
bool Read(CFileSegy& fr, SEGD_GENERAL_HEADER_1& header1);
void F8015_to_float (char *from, float* to, int len, int cvt2s);
void F8022_to_float (char *from, float* to, int len, int cvt2s);
void F8024_to_float (char *from, float* to, int len, int cvt2s);
void F8036_to_float (unsigned char *from, float* to, int len);
void F8038_to_float (char *from, float* to, int len);
void F8042_to_float (char *from, float* to, int len);
void F8044_to_float (char *from, float* to, int len);
void F8048_to_float (char *from, float* to, int len);
void F8058_to_float (char *from, float* to, int len);
int BCD(unsigned char * ptr , int begin , int n);
short GET_S(char* from);
char GET_C(char *f);
unsigned int GET_UC(unsigned char *f) { return f[0]; }
unsigned short GET_US(unsigned char *f);
};
}//namespace