📄 s_seismic2wavelet.m
字号:
function wavelet=s_seismic2wavelet(seismic,varargin)% Function computes wavelet with about the spectrum expected on the basis of the% seismic data. The wavelet can be minimum-phase, zero-phase, or% maximum-phase. The amplitude is based on the windowed autocorrelation of the% seismic data.%% Written by: E. R.: June 15, 2001% Last updated: September 2, 2007: general update%% wavelet=s_seismic2wavelet(seismic,varargin)% INPUT% seismic seismic structure% varargin one or more cell arrays; the first element of each cell array is a% keyword,the other elements are parameters. Presently, keywords are:% 'nodc' Determines if DC component of wavelet should be removed (no DC).% Possible values are: true (yes) and false (no)% Default: {'nodc',true}% 'wlength' wavelet length. For symmetric wavelets this should be an even% multiple of the sample interval. An optional second parameter% can be used to indicate if the wavelet length is to be exact % ('exact') or an approximation ('approx'). In the latter case% the actual length of the wavelet is chosen so that it ends % just prior to a zero crossing % Default: {'length',80,'approx'}% 'color' Color of reflectivity. Possible values are 'white' and 'blue'.% If 'blue', the amplitude spectrum of the reflectivity is assumed to be % proportional to the square root of the frequency.% Default: {'color','blue'} % 'type' type of wavelet. Possible options are:% 'zero-phase' zero-phase wavelet% 'min-phase' minimum-phase wavelet% 'max-phase' maximum-phase wavelet% Default: {'type','zero-phase'}% 'window' type of window to use. Possible values are (not case-sensitive): % 'Hamming', 'Hanning', 'Nuttall', 'Papoulis', 'Harris',% 'Rect', 'Triang', 'Bartlett', 'BartHann', 'Blackman'% 'Gauss', 'Parzen', 'Kaiser', 'Dolph', 'Hanna',% 'Nutbess', 'spline', 'none'% (the empty string means no window, 'Rect' and 'none' are % equivalent)% Default: {'window','Hanning'}% % OUTPUT% wavelet seismic structure with desired wavelet; the wavelet is scaled% in such a way that the maximum of the absolute value of the% wavelet samples is equal to 1.%% EXAMPLE% % Compute minimum-phase wavelet from seismic data% seismic=s_data;% minwav=s_seismic2wavelet(seismic,{'color','blue'},{'type','min-phase'},{'wlength',80});% s_wplot(minwav)% s_spectrum(minwav,{'plot','both'},{'timezero','actual'})global S4Mhistory=S4M.history;S4M.history=false;% Assign default values of input argumentsparam.color='blue';param.dc=[];param.length=[];param.nodc=true;param.type='zero-phase';param.window='Hanning';param.wlength=80;% Decode and assign input argumentsparam=assign_input(param,varargin,'s_seismic2wavelet');% Handle legacy parameterif ~isempty(param.length) alert('Use of keyword "length" is obsolete. Use "wlength" instead.') param.wlength=param.length;endif ~isempty(param.dc) alert('Use of keyword "dc" is obsolete. Please use "nodc" instead (see help s_seismic2wavelet.') param.nodc=param.dc;end% Check if "wlength" has a second parameter.if iscell(param.wlength) len=param.wlength{1}; param.lopt=param.wlength{2};else len=param.wlength; param.lopt='approx';endparam.nlag=round(0.5*len/seismic.step);param.lag=param.nlag*seismic.step;if strcmpi(param.window,'none') param.window='rect';end%ntr=size(seismic.traces,2);% Remove leading and trailing null values in the trace data and replace others by zerosif isnull(seismic) seismic=s_rm_trace_nulls(seismic); disp(['Dataset "',seismic.name,'" has null values; they have been replaced by zeros.'])endswitch param.type case 'zero-phase'wavelet=zero_phase_wavelet_no1(seismic,param); case {'min-phase','max-phase'}wavelet=min_max_phase_wavelet_no2(seismic,param); otherwiseerror([' Unknown or un-implemented type: "',param.type,'"']) end % End of switch block% Scalingwavelet.traces=wavelet.traces/max(abs(wavelet.traces));S4M.history=history;wavelet.tag='wavelet';wavelet.window_type=param.window;if strcmpi(param.color,'blue') wavelet.info={'Wavelet estimation method: ', ... 'Wavelet estimate from seismic (blue reflectivity)'};else wavelet.info={'Wavelet estimation method: ', ... 'Wavelet estimate from seismic (white reflectivity)'};endif isfield(seismic,'history') wavelet.history=seismic.history; wavelet=s_history(wavelet,'append',['Window-type: ',param.window, ... '; length: ',num2str(len),' ms']);end%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%function wavelet=zero_phase_wavelet_no1(seismic,param)% Compute zero-phase wavelet from seismic% Compute the spectrum of the waveletaspectrum=compute_spectrum_no3(seismic,param);% Raw waveletfilt=fftshift(real(ifft(aspectrum)));% Determination of wavelet lengthnlag=param.nlag;if strcmp(param.lopt,'approx') index=find(filt(1:nlag+1).*filt(2:nlag+2) <= 0,1,'last'); if isempty(index) filt=filt(nlag+1:end-nlag); else nlag=index; filt=filt(nlag+1:end-nlag); endelse filt=filt(nlag+1:end-nlag);endif isyes(param.nodc) % Remove DC component filt=filt-0.5*(filt(1)+filt(end)); filt=lf_dc_removal(filt,1);else filt([1,end])=0.5*filt([1,end]);endhtext='Zero phase wavelet';first=0.5*(1-length(filt))*seismic.step;wavelet=s_convert(filt,first,seismic.step,htext,seismic.units);wavelet.name='Zero-phase wavelet from seismic';%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%function wavelet=min_max_phase_wavelet_no2(seismic,param)% Compute minimum-phase or maximum-phase wavelet from seismic% Compute the spectrum of the waveletaspectrum=compute_spectrum_no3(seismic,param,64*param.nlag);nlag2=round(param.wlength/seismic.step)+1;filt=minimum_phase(aspectrum,nlag2);%sort(abs(roots(filt)))'if strcmp(param.lopt,'approx') index=find(filt(nlag2-1:end-1).*filt(nlag2:end) <= 0,1); if ~isempty(index) nlag2=index+nlag2-2; filt=filt(1:nlag2); endendif strcmpi(param.type,'min-phase') htext='Minimum-phase wavelet'; wavelet=s_convert(filt,0,seismic.step,htext,seismic.units); wavelet.name='Minimum-phase wavelet from seismic';else htext='Maximum-phase wavelet'; wavelet=s_convert(flipud(filt),(1-nlag2)*seismic.step,seismic.step,htext, ... seismic.units); wavelet.name='Maximum-phase wavelet from seismic';end%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%function aspectrum=compute_spectrum_no3(seismic,param,nfft)% Compute the amplitude spectrum of a wavelet from seismic datalag2=2*param.lag;% Compute the mean autocorrelation of the seismictemp=s_correlate(seismic,seismic,{'lags',-lag2,lag2},{'normalize','no'}, ... {'option','corresponding'});[nsamp,ntr]=size(temp.traces);if ntr > 1 traces=mean(temp.traces,2);end% Apply taper (if requested)if ~isempty(param.window) || strcmpi(param.window,'none') || strcmpi(param.window,'rect') w=mywindow(nsamp,param.window); traces=w.*traces;end% Remove the DC component (if requested)if isyes(param.nodc) traces=lf_dc_removal(traces,1);end% Compute spectrum of waveletif nargin > 2 aspectrum=sqrt(abs(fft(traces,nfft)));else aspectrum=sqrt(abs(fft(traces)));end% Correct the spectrum for the color of the reflectivityswitch param.colorcase 'blue' nsamp=length(aspectrum)-1; refl=min((1:nsamp)',(nsamp:-1:1)'); %#ok This is still the better approach refl=sqrt(refl); aspectrum(2:end)=aspectrum(2:end)./refl; aspectrum(1)=0;case 'bluish' % Mixture of white and blue nsamp=length(aspectrum)-1; refl=min((1:nsamp)',(nsamp:-1:1)'); %#ok This is still the better approach refl=sqrt(refl); [dummy,index]=max(aspectrum); %#ok First output argument is not required refl=refl+refl(index); aspectrum(2:end)=aspectrum(2:end)./refl; aspectrum(1)=0;case 'white' % do nothingotherwise error('Unknown color of reflectivity has been specified. Possible values are: "blue" and "white".')end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -