📄 s_gain.m
字号:
function [gseismic,tgain]=s_gain(seismic,varargin)% Function computes and applies a gain function to the input data set and% outputs the gained data set as well as the gain function (if two output % data sets are specified)%% Written by: E. R.: July 14, 2000% Last updated: October 2, 2001: Handle NaNs in data (at least in some cases}%% [gseismic,tgain]=s_gain(seismic,varargin)% INPUT% seismic seismic data structure% varagin one or more cell arrays; the first element of each cell array is % a keyword, the other elements are parameters. % Presently, keywords are:% 'type' Type of gain. Possible values are 'trace' (each trace is % gained individually) and 'dataset' (one gain for the whole data set).% Default: {type','trace'}% 'average' Type of average to use when one gain is used for the whole dataset.% Possible values are: 'mean' (i.e. mean of absolute values) and % 'median' (i.e. median of absolute values).% Default: {average','median'}% 'window' Window length (ms) for automatic gain calculation.% Default: {'wlength',500)% OUTPUT% gseismic seismic data structure with gained input data set% tgain gain applied to input seismic data set.if ~isstruct(seismic) error(' First input argument must be seismic structure')end[nsamp,ntr]=size(seismic.traces);% Set default valuesgain.average='median';gain.type='trace';gain.window=500;% Decode and assign input argumentsgain=assign_input(gain,varargin);% Set window length in sampleswlength=fix(gain.window/seismic.step)+1;if wlength > nsamp wlength=nsamp;endif ~mod(wlength,2) wlength=max(wlength-1,1);endif isfield(seismic,'null') & isnan(seismic.null) if 1 error(' NaNs in seismic dataset not yet allowed.') end if strcmpi(gain.type,'trace') tgain_traces=trace_gain(seismic.traces,wlength); gseismic.traces=seismic.traces./tgain_traces; htext='trace gain'; elseif strcmpi(gain.type,'dataset') tgain_traces=trace_gain4nans(seismic.traces,wlength); gseismic.traces=seismic.traces./tgain_traces; htext='suite gain'; else error('Unknown gain type') endelse if strcmpi(gain.type,'trace') tgain_traces=trace_gain(seismic.traces,wlength); gseismic.traces=seismic.traces./tgain_traces; htext='trace gain'; elseif strcmpi(gain.type,'dataset')% nsamp=size(seismic.traces,1); tgain_traces=suite_gain(seismic.traces,wlength,gain.average); for ii=1:ntr gseismic.traces(:,ii)=seismic.traces(:,ii)./tgain_traces; end htext='suite gain'; else error('Unknown gain type') endend% Copy rest of fieldsgseismic=copy_fields(seismic,gseismic);% Append history fieldhtext=[htext,', window length = ',num2str(gain.window),' ',seismic.units];gseismic=s_history(gseismic,'append',htext);% Convert tgain to seismic structureif nargout > 1 tgain=s_convert(tgain_traces,seismic.first,seismic.step, ... seismic.units); tgain=s_history(tgain,'add',htext);end%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%function gain=suite_gain(in,wl,average)% Function computes time-varying gain over window of wl samples length for % the whole dataset% gain=tv_gain(in,wl,average)% INPUT% in input traces% wl window length in samples (should be odd);% average type of averaging ('mean' or 'median')% OUTPUT% gain gain functionwlh=floor(wl/2);if strcmpi(average,'mean') amps=mean(abs(in),2);else amps=median(abs(in),2);endamps=[0;cumsum(amps)];gf=amps(wl+1:end)-amps(1:end-wl);ga=gf(1);ge=gf(end);gain=[ga(ones(wlh,1),:);gf;ge(ones(wlh,1))]+eps;gain=gain/mean(gain);%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%function gain=trace_gain(in,wl)% Function computes, for each trace, time-varying gain over window of wl samples length% gain=trace_gain(in,wl)% INPUT% in input traces% wl window length in samples (should be odd);% OUTPUT% gain gain functionm=size(in,2);wlh=floor(wl/2);amps=[zeros(1,m);cumsum(abs(in))];gf=amps(wl+1:end,:)-amps(1:end-wl,:);ga=gf(1,:);ge=gf(end,:);gain=[ga(ones(wlh,1),:);gf;ge(ones(wlh,1),:)]+eps;mgain=mean(gain(:));for ii=1:m gain(:,ii)=gain(:,ii)/mgain;end%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%function gain=trace_gain4nans(in,wl)% Function computes, for each trace, time-varying gain over window of wl samples length% gain=trace_gain(in,wl)% INPUT% in input traces% wl window length in samples (should be odd);% OUTPUT% gain gain functionwlh=floor(wl/2);[n,m]=size(in);scf=ones(n+1,m);lidx=isnan(in);in(lidx)=0;scf(lidx)=0;scf=cumsum(scf);amps=[zeros(1,m);cumsum(abs(in))];gf=(amps(wl+1:end,:)-amps(1:end-wl,:))./(scf(wl+1:end,:)-scf(1:end-wl,:)+eps);ga=gf(1,:);ge=gf(end,:);gain=[ga(ones(wlh,1),:);gf;ge(ones(wlh,1),:)]+eps;mgain=mean(gain(:));for ii=1:m gain(:,ii)=gain(:,ii)/mgain;end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -