📄 readsu.m
字号:
% ReadSu : Reads a SU formatted file (Seismic Unix)%% Call :% [Data,SuTraceHeaders,SuHeader]=ReadSu(filename);%% To read in big endian format (default):% [Data,SuTraceHeaders,SuHeader]=ReadSu(filename,'endian','b');% To read in little endian format :% [Data,SuTraceHeaders,SuHeader]=ReadSu(filename,'endian','l');%%% To read in trace data as 'int32' :% [Data,SuTraceHeaders,SuHeader]=ReadSu(filename,'DataFormat','int32');% To read time slice 0.5<t<5 :% [Data,SuTraceHeaders,SuHeader]=ReadSu(filename,'trange',.5,3);% Skip every 5th trace :% [Data,SuTraceHeaders,SuHeader]=ReadSu(filename,'jump',5);% Read data in a CDP header range : 5000<cdp<5800 % (change cdp to any other valid TraceHeader value)% [Data,SuTraceHeaders,SuHeader]=ReadSu(filename,'minmax','cdp'5000,5800);%% Combine any combination of the above% [Data,SuTraceHeaders,SuHeader]=ReadSu(filename,'jump',1,'minmax','cdp',5300,5400);%%%% (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%%% %% 0.1 : INitial Release% 0.2 : Added SkipData var, to skip reading of data.% 0.3 : May 01, 2002 % Added ability to read in ever 'jump' traces.% Added ability to read in time range.% Added abiliy to read in header range (ex. mincdp to maxcdp).%function [Data,SuTraceHeaders,SuHeader,HeaderInfo]=ReadSu(filename,varargin);if ~(exist(filename)==2'), SegymatVerbose([mfilename,' : ', filename,' does not exist !']) Data=[];SuTraceHeaders=[];SuHeader=[];HeaderInfo=[]; returnend% SET THE NEXT FLAG TO 1, IF YOU ARE SURE ALL TRACES HAVE THE SAME LENGT% THIS WILL GREATLT INCREASE READING WHEN USING 'JUMP'FixedTraceLength=1;% NEXT TWO LINES TO ENUSRE THAT VARARGIN CAN BE PASSED TO FUNCTIONif nargin==2 % CALL USING VARARGIN local_nargin=1+length(varargin{1}); varargin=varargin{1};else % DIRECT CALL local_nargin=length(varargin);end%% HERE SHOULD BE A CALL TO A DEFAULT SEGY HEADER !!!!%SegyHeader.SegyFormatRevisionNumber=1; SegyHeader.DataSampleFormat=5; SegyHeader.Rev=GetSegyHeaderBasics;% TRANSFORM VARARGING INTO PARAMETERScargin=1;while (cargin<local_nargin) if strcmp(varargin{cargin},'endian') cargin=cargin+1; eval(['endian=char(varargin{cargin});']) if strcmp(endian,'b'),SegymatVerbose(['Reading BIG ENDIAN STYLE']);end if strcmp(endian,'l'),SegymatVerbose(['Reading LITTLE ENDIAN STYLE']);end end if strcmp(varargin{cargin},'DataFormat') cargin=cargin+1; eval(['DataFormat=char(varargin{cargin});']) if strcmp(DataFormat,'float32'), SegyHeader.DataSampleFormat=5; % IEEE end if strcmp(DataFormat,'int32'), SegyHeader.DataSampleFormat=2; % 4 Byte, two's % complement integer end if strcmp(DataFormat,'int16'), SegyHeader.DataSampleFormat=3; % 2 Byte, two's % complement integer end if strcmp(DataFormat,'int8'), SegyHeader.DataSampleFormat=8; % 2 Byte, two's % complement integer end SegymatVerbose(['DataFormat : ',num2str(SegyHeader.DataSampleFormat)]) end 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 cargin=cargin+1; end%% MAYBE DATA FORMATS CAN VARY ?% but for now we use float32 if nothing else is set%if exist('SegyHeader')==0, SegyHeader.DataSampleFormat=5; % IEEEend%% SU DATA CAN BE EITHER BIG OR SMALL ENDIAN% DEFAULT IS BIG ENDIAN%if exist('endian')==0, segyid = fopen(filename,'r'); % USE LOCAL BUTE ORDER AS DEFAULTelse segyid = fopen(filename,'r',endian); end if ~(exist(filename)==2'), SegymatVerbose([mfilename,' : ', filename,' does not exist !']) Data=[];SegyTraceHeaders=[];SegyHeader=[]; returnendif exist('SkipData')==0, SkipData=0; % [0] READ ONLY HEADER VALUES, [1] READ IN ALL DATAendif SkipData==1, SegymatVerbose(['Not reading data - headers only']), end% SEGY HEADER FORMAT INFORevision=SegyHeader.SegyFormatRevisionNumber;if Revision>0, Revision=1; endFormat=SegyHeader.Rev(Revision+1).DataSampleFormat(SegyHeader.DataSampleFormat).name;BPS=SegyHeader.Rev(Revision+1).DataSampleFormat(SegyHeader.DataSampleFormat).bps;SegymatVerbose([mfilename,' : ',Format])% GET SIZE OF FILEfseek(segyid,0,'eof'); DataEnd=ftell(segyid);fseek(segyid,0,'bof'); % Go to the beginning of the file%txt=['SegyRevision ',sprintf('%0.4g',Revision),', ',Format,'(',num2str(SegyHeader.DataSampleFormat),')'];txt=[Format,'(',num2str(SegyHeader.DataSampleFormat),')'];hw=waitbar(0,['Reading SU-file -',txt]);traceinfile=0;outtrace=0;existJump=exist('jump');existHeader=exist('header');existtmin=exist('tmin');existtmmax=exist('tmax');tic;while (~(ftell(segyid)>=DataEnd)) traceinfile=traceinfile+1; usetrace=1; %if exist('jump') if existJump==1; if (traceinfile/jump)~=round(traceinfile/jump), usetrace=0; end end if ((usetrace==0)&(FixedTraceLength==1)&(exist('ns')==1)) skip=240+(SegyHeader.BytesPerSample/8)*ns; fseek(segyid,skip,'cof'); else % Read Trace Header SingleSuTraceHeader=GetSegyTraceHeader(segyid); ns=SingleSuTraceHeader.ns; % IF HEADER MIN MAX HAS BEEN CHOSEN, THEN CHECK THAT TRACE IS GOOD ENOUGH if ((existHeader==1)&(usetrace==1)) headervalue=getfield(SingleSuTraceHeader,header); if ((headervalue<headermin)|(headervalue>headermax)) usetrace=0; end end if usetrace==1; % Read Segy Trace Data SkipData=0; else SkipData=1; end SingleSuData.data=GetSegyTraceData(segyid,SingleSuTraceHeader.ns,SegyHeader,SkipData); end % END READ TRACE OR NO FIXED LENGTH if (usetrace==1) %% IF TIME RANGE IS SPECIFIED, THEN EXTRACT THIS if (existtmin)&(existtmax) % NEXT LINE SHOULD CONSIDER THAT ns in Trace and Segy Header could vary !!! origtrange=[1:1:SingleSuTraceHeader.ns].*SingleSuTraceHeader.dt.*1e-6+SingleSuTraceHeader.DelayRecordingTime; gooddata=find(origtrange>tmin & origtrange<tmax); SingleSuData.data=SingleSuData.data(gooddata); % CHECK NEXT LINE TAHT DelatRec... is in micro seconds SingleSuTraceHeader.DelayRecordingTime=tmin; SingleSuTraceHeader.ns=length(gooddata); ns=length(gooddata); % for use below end outtrace=outtrace+1; SuTraceHeaders(outtrace)=SingleSuTraceHeader; SuData(outtrace).data=SingleSuData.data; end waitbar(ftell(segyid)/DataEnd,hw);endclose(hw)SegymatVerbose([mfilename,' : Elapsed time ',num2str(toc)]);ns=SuTraceHeaders(1).ns;dt=SuTraceHeaders(1).dt;nt=length(SuData);% DefaultSegyHeaderSuHeader=SegyHeader;SuHeader.ns=ns;SuHeader.nsOrig=ns;SuHeader.dt=dt;SuHeader.dtOrig=dt;SuHeader.FixedLengthTraceFlag=1; % CHECK THAT THIS IS TRUESuHeader.SegyFormatRevisionNumber=1;SuHeader.NumberOfExtTextualHeaders=0;Data=zeros(ns,nt);try for it=1:nt Data(:,it)=SuData(it).data; endcatch SegymatVerbose([mfilename,' Could not collect data in one matrix - check byte order'])end[HeaderInfo]=TraceheaderToInfo(SuTraceHeaders);return
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -