📄 readsegyfast.m
字号:
% ReadSegyFast : Reads a SEG Y rev 1 formatted file, without header values (faster than ReadSegy)%% Call :% [Data]=ReadSegyFast(filename);% and equivalent to :% [Data]=ReadSegy(filename);% %% Read only the data of a SegFile - NOT Their headers.% Much faster than ReadSegy%% 'minmax', 'skip'%% Implemented using the syntax of the SEG-Y revised format :% SEGY-Y rev 0, SEG-Y rev 1 as described in % http://seg.org/publications/tech-stand/%% Extended Textual Header is not yet tested% If you would like it implemented, please send me an SEGY file with% that sort of information, as well as a description of the segy file%%% (C) 2001, Thomas Mejer Hansen, 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 [Data]=ReadSegyFast(filename,varargin); mfilename='ReadSegyFast'; if nargin==0, SegymatVerbose([mfilename,' : ', filename,' does not exist !']) Data=[];SegyTraceHeaders=[];SegyHeader=[];HeaderInfo=[]; return end % Initialize varargin values dsf=[]; revision=[]; endian_tight=[]; tmin=[];tmax=[]; headermin=[];headermax=[];header=[]; jump=[]; SegyHeader=[]; segyid = fopen(filename,'r','b'); % ALL DISK FILES ARE IN BIG % ENDIAN FORMAT, ACCORDING TO SEG % Y rev 1 fseek(segyid,0,'eof'); BytesInFile = ftell(segyid); fseek(segyid,0,'bof'); ninput=nargin;% NEXT TWO LINES TO ENUSRE THAT VARARGIN CAN BE PASSED TO FUNCTIONif ninput==2 % CALL USING VARARGIN ninput=1+length(varargin{1}); varargin=varargin{1};else % DIRECT CALL ninput=length(varargin);end% TRANSFORM VARARGING INTO PARAMETERScargin=1;while (cargin<ninput) if strcmp(varargin{cargin},'jump') cargin=cargin+1; eval(['jump=',num2str(varargin{cargin}),';']); SegymatVerbose(['JUMP : Read only every ',num2str(jump),'th trace']) end if strcmp(varargin{cargin},'minmax') cargin=cargin+1; eval(['header=''',varargin{cargin},''';']); cargin=cargin+1; eval(['headermin=',num2str(varargin{cargin}),';']); cargin=cargin+1; eval(['headermax=',num2str(varargin{cargin}),';']); SegymatVerbose(['MIN MAX : Using header ',header,' from ',num2str(headermin),' to ',num2str(headermax)]) end if strcmp(varargin{cargin},'trange') cargin=cargin+1; eval(['tmin=',num2str(varargin{cargin}),';']); cargin=cargin+1; eval(['tmax=',num2str(varargin{cargin}),';']); SegymatVerbose(['TRANGE : tmin=',num2str(tmin),' tmax=',num2str(tmax)]) end if strcmp(varargin{cargin},'revision') cargin=cargin+1; eval(['revision=',num2str(varargin{cargin}),';']); SegymatVerbose(['USING REVISION : rev=',num2str(revision)]) end if strcmp(varargin{cargin},'dsf') cargin=cargin+1; eval(['dsf=',num2str(varargin{cargin}),';']); SegymatVerbose(['USING Data Sample Format : dsf=',num2str(dsf)]) end if strcmp(varargin{cargin},'SegyHeader') cargin=cargin+1; SegyHeader=varargin{cargin}; SegymatVerbose(['USING LOADED SEGYHEADER']) end cargin=cargin+1; end% SKIP DATA SEEMS OUTDATED, COMMENTING OUT 2003-10-24%if exist('SkipData')==0,% SkipData=0; % [0] READ ONLY HEADER VALUES, [1] READ IN ALL DATA%end%%%%if SkipData==1, SegymatVerbose(['Not reading data - headers only']), end%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% BINARY HEADERSif isempty(SegyHeader)==1, SegyHeader=GetSegyHeader(segyid);else SegymatVerbose([mfilename,' - Using supplied SegyHeader'])end% APPLY CHANGES TO SEGY HEADER IF NEEDEif isempty(revision)==0, SegyHeader.SegyFormatRevisionNumber=revision; SegymatVerbose([mfilename,' - Manually set SEG-Y revision to ',num2str(revision)])endif isempty(dsf)==0, SegyHeader.DataSampleFormat=dsf; end% JUST SOME INFORMATION TO WRITE TO SCREEN :Revision=SegyHeader.SegyFormatRevisionNumber;if Revision>0, Revision=1; endFormatName=SegyHeader.Rev(Revision+1).DataSampleFormat(SegyHeader.DataSampleFormat).name;Format=SegyHeader.Rev(Revision+1).DataSampleFormat(SegyHeader.DataSampleFormat).format; BPS=SegyHeader.Rev(Revision+1).DataSampleFormat(SegyHeader.DataSampleFormat).bps; txt=['SegyRevision ',sprintf('%0.4g',Revision),', ',FormatName,'(',num2str(SegyHeader.DataSampleFormat),')'];ns=SegyHeader.ns;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% READ TEXTURAL FILE HEADER EXTENSION IF NEEDED%if SegyHeader.NumberOfExtTextualHeaders~=0% SegymatVerbose(['---------------------------------------------------'])% SegymatVerbose(['extendeD textual file headers are not supported yet'])% SegymatVerbose(['They are simply skipped'])% SegymatVerbose(['---------------------------------------------------'])%end%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% READ DATA%Segy=fread(segyid,4000,'float32');fseek(segyid,0,'eof'); DataEnd=ftell(segyid);DataStart=3600+3200*SegyHeader.NumberOfExtTextualHeaders;fseek(segyid,DataStart,'bof'); % Go to the beginning of the filentraces=(DataEnd-DataStart)./(240+(SegyHeader.ns)*(BPS/8));SegymatVerbose(['Number of Samples Per Trace=',num2str(SegyHeader.ns)])SegymatVerbose(['Number of Traces=',num2str(ntraces)])% Set Format :Revision=SegyHeader.SegyFormatRevisionNumber;if Revision>0, Revision=1; endFormat=SegyHeader.Rev(Revision+1).DataSampleFormat(SegyHeader.DataSampleFormat).format; bitpersample=SegyHeader.Rev(Revision+1).DataSampleFormat(SegyHeader.DataSampleFormat).bps;bytepersample=bitpersample/8;ntraceheader=240/bytepersample;Data=fread(segyid,[ns+ntraceheader ntraces],Format);Data=Data([ntraceheader+1:1:ns+ntraceheader],:);%SegymatVerbose(['Now=',num2str(ftell(segyid)),' END=',num2str(DataEnd)])% THE FOLLOWING DOES NOT WORK FOR OCTAVE (uint32)if (strcmp(Format,'uint32')==1), % IBM FLOATING POINT % CONVERT FROM FLOATING POINT
verbose=1; if verbose>1, SegymatVerbose([mfilename,'Converting from IBM, DataFormat :',SegyHeader.DataFormat]); end Data=ibm2num(uint32(Data));end;existJump=1-isempty(jump);existHeader=1-isempty(header);existTmin=1-isempty(tmin);existTmax=1-isempty(tmax);if existJump usetraces=[jump:jump:ntraces]; ntraces=length(usetraces); Data=Data(:,usetraces);endif (existTmin==1)&(existTmax==1) SegymatVerbose('TRANGE') % NEXT LINE SHOULD CONSIDER THAT ns in Trace and Segy Header could vary !!! origtrange=[1:1:SegyHeader.ns].*SegyHeader.dt.*1e-6; gooddata=find(origtrange>tmin & origtrange<tmax); Data=Data(gooddata,:);end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -