📄 putsegyheader.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 + -