⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 putsegyheader.m

📁 matlab编写的地震数据格式转换
💻 M
字号:
% PutSegyHeader : Writes SEG-Y header to disk.% PutSegyHeader(segyid,SegyHeader)%% (C) 2001-2004, Thomas Mejer Hansen, tmh@gfy.ku.dk/thomas@cultpenguin.com% %    This program is free software; you can redistribute it and/or modify%    it under the terms of the GNU General Public License as published by%    the Free Software Foundation; either version 2 of the License, or%    (at your option) any later version.%%    This program is distributed in the hope that it will be useful,%    but WITHOUT ANY WARRANTY; without even the implied warranty of%    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the%    GNU General Public License for more details.%%    You should have received a copy of the GNU General Public License%    along with this program; if not, write to the Free Software%    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA%function SegyHeader=PutSegyHeader(segyid,SegyHeader);NA=0;if isfield(SegyHeader,'Rev')==0  SegyHeader.Rev=GetSegyHeaderBasics;endif (isfield(SegyHeader,'DataSampleFormat')==0)&(isfield(SegyHeader,'SegyFormatRevisionNumber')==0)  SegyHeader.DataSampleFormat=5; % '5'->4-byte IEEE floating point   SegyHeader.SegyFormatRevisionNumber=100;  SegymatVerbose([mfilename,' : Using datasample format : ',SegyHeader.Rev(2).DataSampleFormat(SegyHeader.DataSampleFormat).name],1)  SegymatVerbose([mfilename,' : Using SEG Y revision : ',num2str(floor(SegyHeader.SegyFormatRevisionNumber/100))],1)end% SET Revsion number. Always use revision 1, if not otherwise specified.if (isfield(SegyHeader,'SegyFormatRevisionNumber')==0)  SegyHeader.SegyFormatRevisionNumber=100;  SegymatVerbose([mfilename,' : Using SEG Y revision : ',num2str(floor(SegyHeader.SegyFormatRevisionNumber/100))],1)end% SET DATA SAMPLE FORMAT IF NOT SPECIFIED% Rev0->IBM FLOATING POINT% Rev1->IEEE FLOATING POINTif (isfield(SegyHeader,'DataSampleFormat')==0)  if SegyHeader.SegyFormatRevisionNumber==0    SegyHeader.DataSampleFormat=1; % '1'->IBM floating point    SegymatVerbose([mfilename,' : Using datasample format : ',SegyHeader.Rev(1).DataSampleFormat(SegyHeader.DataSampleFormat).name],1)  else    SegyHeader.DataSampleFormat=5; % '5'->4-byte IEEE floating point     SegymatVerbose([mfilename,' : Using datasample format : ',SegyHeader.Rev(2).DataSampleFormat(SegyHeader.DataSampleFormat).name],1)  endendif isfield(SegyHeader,'TextualFileHeader')  % MAKE SURE LENGTH IF Text.. is 3200  if length(SegyHeader.TextualFileHeader)<3200    dummyTXT=SegyHeader.TextualFileHeader;    SegyHeader.TextualFileHeader=zeros(3200,0);    SegyHeader.TextualFileHeader(1:length(dummyTXT))=dummyTXT;  end  else  SegyHeader.TextualFileHeader=sprintf('%3200s','SEGY READER (tmh@gfy.ku.dk)');endif ~isfield(SegyHeader,'Job'), SegyHeader.Job=NA; endif ~isfield(SegyHeader,'Line'), SegyHeader.Line=NA; endif ~isfield(SegyHeader,'Reel'), SegyHeader.Reel=NA; endif ~isfield(SegyHeader,'DataTracePerEnsemble'), SegyHeader.DataTracePerEnsemble=NA;endif ~isfield(SegyHeader,'AuxiliaryTracePerEnsemble'), SegyHeader.AuxiliaryTracePerEnsemble=0;endif ~isfield(SegyHeader,'dt'), SegyHeader.dt=4000; endif ~isfield(SegyHeader,'dtOrig'), SegyHeader.dtOrig=NA; endif ~isfield(SegyHeader,'ns'), SegyHeader.ns=NA; endif ~isfield(SegyHeader,'nsOrig'), SegyHeader.nsOrig=NA; endif ~isfield(SegyHeader,'DataSampleFormat'), SegyHeader.DataSampleFormat=5; end % '5'->4-byte IEEE floating point if ~isfield(SegyHeader,'EnsembleFold'), SegyHeader.EnsembleFold=NA; endif ~isfield(SegyHeader,'TraceSorting'), SegyHeader.TraceSorting=NA; endif ~isfield(SegyHeader,'VerticalSumCode'), SegyHeader.VerticalSumCode=NA; endif ~isfield(SegyHeader,'SweepFrequencyStart');SegyHeader.SweepFrequencyStart=NA; endif ~isfield(SegyHeader,'SweepFrequencyEnd');SegyHeader.SweepFrequencyEnd=NA; endif ~isfield(SegyHeader,'SweepLength');SegyHeader.SweepLength=NA; endif ~isfield(SegyHeader,'SweepType');SegyHeader.SweepType=NA; endif ~isfield(SegyHeader,'SweepChannel');SegyHeader.SweepChannel=NA; endif ~isfield(SegyHeader,'SweepTaperlengthStart');SegyHeader.SweepTaperlengthStart=NA; endif ~isfield(SegyHeader,'SweepTaperLengthEnd');SegyHeader.SweepTaperLengthEnd=NA; endif ~isfield(SegyHeader,'TaperType');SegyHeader.TaperType=NA; endif ~isfield(SegyHeader,'CorrelatedDataTraces');SegyHeader.CorrelatedDataTraces=NA; endif ~isfield(SegyHeader,'BinaryGain');SegyHeader.BinaryGain=NA; endif ~isfield(SegyHeader,'AmplitudeRecoveryMethod');SegyHeader.AmplitudeRecoveryMethod=NA; endif ~isfield(SegyHeader,'MeasurementSystem');SegyHeader.MeasurementSystem=1; end %1-Meters, 2-Feetif ~isfield(SegyHeader,'ImpulseSignalPolarity');SegyHeader.ImpulseSignalPolarity=NA; endif ~isfield(SegyHeader,'VibratoryPolarityCode');SegyHeader.VibratoryPolarityCode=NA; end% 3261-3500 UNASSIGNEDif ~isfield(SegyHeader,'Unassigned1');SegyHeader.Unassigned1=NA*ones(1,120); end%if ~isfield(SegyHeader,'SegyFormatRevisionNumber'); SegyHeader.SegyFormatRevisionNumber=100; end % ACCORDING TO SEGY REV1 draft 6if ~isfield(SegyHeader,'FixedLengthTraceFlag');SegyHeader.FixedLengthTraceFlag=1; end % ALL TRACES HAVE THE SAME dt AND nsif ~isfield(SegyHeader,'NumberOfExtTextualHeaders'); SegyHeader.NumberOfExtTextualHeaders=0; end % WE DO NOT YET USE TEXTURAL HEADERS as can be done according to draft 6% 3506-3600 UNASSIGNEDif ~isfield(SegyHeader,'Unassigned2');SegyHeader.Unassigned2=NA*ones(1,47); end% IF EXTENDED TEXTUAL FILE HEADERS EXISTS THEN WRITE THEM TO DISK%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% WRITE TO DISK%fseek(segyid,0,'bof');fwrite(segyid,SegyHeader.TextualFileHeader(1:3200),'uchar');         % 1-3200fwrite(segyid,SegyHeader.Job,'int32');                           % 3204 fwrite(segyid,SegyHeader.Line,'int32');                          % 3208fwrite(segyid,SegyHeader.Reel,'int32');                          % 3212fwrite(segyid,SegyHeader.DataTracePerEnsemble,'int16');        % 3214fwrite(segyid,SegyHeader.AuxiliaryTracePerEnsemble,'int16');   % 3216fwrite(segyid,SegyHeader.dt,'uint16');                          % 3218fwrite(segyid,SegyHeader.dtOrig,'uint16');                      % 3220fwrite(segyid,SegyHeader.ns,'uint16');                          % 3222fwrite(segyid,SegyHeader.nsOrig,'uint16');                      % 3224fwrite(segyid,SegyHeader.DataSampleFormat,'int16');            % 3226fwrite(segyid,SegyHeader.EnsembleFold,'int16');fwrite(segyid,SegyHeader.TraceSorting,'int16');               % 3228fwrite(segyid,SegyHeader.VerticalSumCode,'int16');            % 3230fwrite(segyid,SegyHeader.SweepFrequencyStart,'int16');        % 3232fwrite(segyid,SegyHeader.SweepFrequencyEnd,'int16');          % 3234fwrite(segyid,SegyHeader.SweepLength,'int16');                % 3236fwrite(segyid,SegyHeader.SweepType,'int16');                  % 3238fwrite(segyid,SegyHeader.SweepChannel,'int16');               % 3240fwrite(segyid,SegyHeader.SweepTaperlengthStart,'int16');               % 3242fwrite(segyid,SegyHeader.SweepTaperLengthEnd,'int16');               % 3244fwrite(segyid,SegyHeader.TaperType,'int16');               % 3246fwrite(segyid,SegyHeader.CorrelatedDataTraces,'int16');               % 3248fwrite(segyid,SegyHeader.BinaryGain,'int16');               % 3250fwrite(segyid,SegyHeader.AmplitudeRecoveryMethod,'int16');               % 3252fwrite(segyid,SegyHeader.MeasurementSystem,'int16');               % 3254fwrite(segyid,SegyHeader.ImpulseSignalPolarity,'int16');               % 3256fwrite(segyid,SegyHeader.VibratoryPolarityCode,'int16');               % 3258% 3261-3500 UNASSIGNED1 => (120 int32 = 240 bytes)fwrite(segyid,SegyHeader.Unassigned1,'int16');               % 3260%SegymatVerbose(ftell(segyid),10);%fseek(segyid,3500,'bof');fwrite(segyid,SegyHeader.SegyFormatRevisionNumber,'uint16');   % 3500fwrite(segyid,SegyHeader.FixedLengthTraceFlag,'int16');        % 3502fwrite(segyid,SegyHeader.NumberOfExtTextualHeaders,'uint16');        % 3504% 3506-3600 UNASSIGNED2 => 94/2=47 int16fwrite(segyid,SegyHeader.Unassigned2,'int16');               % 3506%% %if SegyHeader.NumberOfExtTextualHeaders>0  n=SegyHeader.NumberOfExtTextualHeaders;  SegymatVerbose(sprintf('Writing %d Extended Textual File Headers',n));  if isfield(SegyHeader,'ExtTextualHeader')    % MAKE SURE LENGTH IF Text.. is 3200*n    if length(SegyHeader.ExtTextualHeader)<(3200*n)      dummyTXT=SegyHeader.ExtTextualHeader;      SegyHeader.ExtTextualHeader=zeros(n*3200,0);      SegyHeader.ExtTextualHeader(1:length(dummyTXT))=dummyTXT;    end    else    SegyHeader.ExtTextualHeader=sprintf('%3200s','SEGY READER (tmh@gfy.ku.dk)');    for i=2:n,      SegyHeader.ExtTextualHeader=[SegyHeader.ExtTextualHeader,sprintf('%3200s','SEGY READER (tmh@gfy.ku.dk)')];    end  end  % WRITE TEXTUAL FILE HEADER  fwrite(segyid,SegyHeader.ExtTextualHeader(1:(n*3200)),'uchar');         % 1:(n*3200)endRevision=SegyHeader.SegyFormatRevisionNumber;if Revision>0, Revision=1; endFormat=SegyHeader.Rev(Revision+1).DataSampleFormat(SegyHeader.DataSampleFormat).name;SegymatVerbose([mfilename,' - SegyRevision ',sprintf('%0.4g',Revision),', ',Format],2)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -