////////////////////////////////////////////////////////////////////////////// //文件: SegY文件操作类 //主要功能: // //程序编写: 2011-4-1 // // ///////////////////////////////////////////////////////////////////////////// #pragma once #include "databuffer.h" #include "SeisFileHeader.h" #include "TInterval.h" namespace NSeis { //地震数据道规一化方式 enum EUniformType { ufoTypeNone = 0, ufoTypeRMS = 1, //均方根 ufoTypeAvg, //平均值 ufoTypeMax, //最大值 }; //一道数据的相关统计数据 class AFX_EXT_CLASS CSeisTraceDataInfo { public: CSeisTraceDataInfo() { m_dMaxValue = 0; //最大值 m_dMinValue = 0; //最小值 m_dRms = 0; //均方根值 m_dAverage = 0; //平均值 } double m_dMaxValue; //最大值 double m_dMinValue; //最小值 double m_dRms; //均方根值 double m_dAverage; //平均值 //double m_dSum; //振幅和 //double m_dSumSquare; //振幅平方和 //double m_dSumSquareW; //带有权重的振幅平方和 //double m_dMedian; //中值 //获得规一化因子 double GetUniformFactor(EUniformType ut); }; //一道数据 class AFX_EXT_CLASS CSeisTraceData : public CDataBuffer { public: CSeisTraceData(void); ~CSeisTraceData(void); void Create(int num, int samBytes); void Create(int num, CFileSegy::EDataType dt); void Attach(BYTE* pData, int nSampleNum, int nSampleBytes); void Attach(BYTE* pData, int nSampleNum, CFileSegy::EDataType dt); virtual void Clear(void); void Serialize(CArchive& ar, const short &ver); CSeisTraceData& operator=(CSeisTraceData& dbf); CSeisTraceDataInfo& GetDataInfo() { return dataInfo; } void SetDataInfo(CSeisTraceDataInfo& di) { dataInfo = di; } void RestatDataInfo(CFileSegy::EDataType& dt); //重新统计振幅数据并填充m_dataInfo,一般情况在Read中进行 inline double GetValue(int nIndex, CFileSegy::EDataType& dt); //获得该道中第nIndex个索引振幅值 //快速排序 void QuickSort(CFileSegy::EDataType& dt); public: //将道数据保存为指定格式,一般用于该SegY为速度数据时 enum EOutType { outTypeCurve = 1, //双狐曲线格式:X振幅、Y时间 outTypeTV, //未匹配坐标的速度谱格式 outTypeStationV, //匹配后的速度谱格式 outTypeXYTA, //坐标(XY)、时间(T)、振幅(A) outTypeXYICTA, //坐标(XY)、主测线(I)、联络线(C)、时间(T)、振幅(A) }; //参数CSeisTraceHeader中保存有坐标及线道号 //参数TIntervalStep中为开始结束索引号及步长,0 <= 索引号 <= 道数据个数-1 //参数bRemoveBeginZero:是否移除开始的0数据 void Write( CFile& fw, CSeisTraceInfo& sti, TIntervalStep ts, EOutType wt, CFileSegy::EDataType& dt, bool bRemoveBeginZero ); //索引号范围 void Write( CFile& fw, CSeisTraceInfo& sti, TIntervalStep ts, EOutType wt, CFileSegy::EDataType& dt, double offsetTime, bool bRemoveBeginZero ); //时间范围,需要插值 void Write( CFile& fw, double sample_interval, TIntervalStep ts, double offsetTime, EOutType wt, CFileSegy::EDataType& dt, bool bRemoveBeginZero ); //////////////////////////////////////////////////////////////// CRowCol m_rowcol; //该道的线道号 CPoint2D m_coor; //该道的坐标 protected: //道数据的统计信息,包括道的最大最小值、均方根值,为float型 CSeisTraceDataInfo dataInfo; }; inline double CSeisTraceData::GetValue(int nIndex, CFileSegy::EDataType& dt) { switch(dt) { case CFileSegy::typeIbmGainLong: case CFileSegy::typeIbmFloat: case CFileSegy::typeIeeFloat: return GetDataFloat()[nIndex]; case CFileSegy::typeIbmShort: case CFileSegy::typeIeeShort: return GetDataShort()[nIndex]; case CFileSegy::typeIbmLong: case CFileSegy::typeIeeLong: return GetDataLong()[nIndex]; case CFileSegy::typeIeeDouble: return GetDataDouble()[nIndex]; case CFileSegy::typeChar: return GetDataChar()[nIndex]; } return 0.0; } }//namespace using namespace NSeis;