⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nodefind.m

📁 基于matlab的反演程序,用于地球物理勘探中射线追踪及偏移成像程序.
💻 M
字号:
function dataout=nodefind(arg1,arg2,arg3,arg4);
%****************
%*** NODEFIND ***
%****************
%
% dataout=nodelack(trc,midpt,lockto);
% dataout=nodelack(trc,midpt,lockto,nhood);
%
% NODELOCK enables users to lock to specific nodes on a set of data that
% has been inputted.  The choices are peaks, troughs, zerocrossings
%
% trc: The single column array.  The trace will be normalized
%
% midpt: The point from which NODELOCK will search
%
% lockto: Choices are 'peak', 'trough', 'zerocross+', 'zerocross-'
%
% nhood: The number of samples away from the midpoint that will be searched
% for the lockto argument. (default == 10 samples)
%
% Christopher Harrison, 2004
%
% NOTE: It is illegal for you to use this software for a purpose other
% than non-profit education or research UNLESS you are employed by a CREWES
% Project sponsor. By using this software, you are agreeing to the terms
% detailed in this software's Matlab source file.
%
% BEGIN TERMS OF USE LICENSE
%
% This SOFTWARE is maintained by the CREWES Project at the Department
% of Geology and Geophysics of the University of Calgary, Calgary,
% Alberta, Canada.  The copyright and ownership is jointly held by
% its author (identified above) and the CREWES Project.  The CREWES
% project may be contacted via email at:  crewes@geo.ucalgary.ca
%
% The term 'SOFTWARE' refers to the Matlab source code, translations to
% any other computer language, or object code
%
% Terms of use of this SOFTWARE
%
% 1) Use of this SOFTWARE by any for-profit commercial organization is
%    expressly forbidden unless said organization is a CREWES Project
%    Sponsor.
%
% 2) A CREWES Project sponsor may use this SOFTWARE under the terms of the
%    CREWES Project Sponsorship agreement.
%
% 3) A student or employee of a non-profit educational institution may
%    use this SOFTWARE subject to the following terms and conditions:
%    - this SOFTWARE is for teaching or research purposes only.
%    - this SOFTWARE may be distributed to other students or researchers
%      provided that these license terms are included.
%    - reselling the SOFTWARE, or including it or any portion of it, in any
%      software that will be resold is expressly forbidden.
%    - transfering the SOFTWARE in any form to a commercial firm or any
%      other for-profit organization is expressly forbidden.
%
% END TERMS OF USE LICENSE

dataout=[];
trc=arg1;
midpt=arg2;
lockto=arg3;
if(nargin<3)
    stringinfo=['Not enough arguments for NODEFIND'];
    helpdlg(stringinfo,'Check NODEFIND help file');
    return
elseif(nargin>4)
    stringinfo=['To many arguments for NODEFIND'];
    helpdlg(stringinfo,'Check NODEFIND help file');
    return
elseif(nargin==3)
    nhood=10;
else
    nhood=arg4;
end
% Checking arguments
checklockto='peak trough zerocross+ zerocross- inflection';
if(~isnumeric(trc))
    stringinfo=['Trace has to be numeric for NODEFIND'];
    helpdlg(stringinfo,'Check NODEFIND help file');
    return
elseif(~isnumeric(midpt))
    stringinfo=['Midpoint must be numeric for NODEFIND'];
    helpdlg(stringinfo,'Check NODEFIND help file');
    return
elseif(midpt~=abs(midpt))|(midpt~=round(midpt))
    stringinfo=['Midpoint must a positive interger NODEFIND'];
    helpdlg(stringinfo,'Check NODEFIND help file');
    return
elseif(midpt>length(trc))
    stringinfo=['Midpoint must be on trace for NODEFIND'];
    helpdlg(stringinfo,'Check NODEFIND help file');
    return
elseif(~ischar(lockto))
    stringinfo=['Lock to must be a string for NODEFIND'];
    helpdlg(stringinfo,'Check NODEFIND help file');
    return
elseif(~findstr(checklockto,deblank(lower(lockto))))
    stringinfo=['Lock to must be "peak", "trough", or "zerocross" for NODEFIND'];
    helpdlg(stringinfo,'Check NODEFIND help file');
    return
elseif(~isnumeric(nhood)|abs(nhood)~=nhood)
    stringinfo=['NHOOD must numeric and positive for NODEFIND'];
    helpdlg(stringinfo,'Check NODEFIND help file');
    return
else
    lockto=deblank(lower(lockto));
    % All Files have been checked an all is well.
    normtrc=trc-mean(trc);
    normtrc=normtrc/(max(normtrc));
    difftrc=diff(trc);  
    % differentiating trace to break the samples into positive values for
    % positive slopes, negative values for negative slopes, and zero values
    % for flat responses.
    switch lockto(1:4)
        case 'peak'
            % peaks occure when positves go to negatives in difftrc
            trcfind=find(difftrc>0)+1;   % sample # on trc (+1 makes it so)
        case 'trou'
            % troughs occur when negatives go to positives in difftrc
            trcfind=find(difftrc<0)+1;   % sample # on trc (+1 makes it so)
        case 'zero'
            trcfind=find(normtrc==0);
            if(isempty(trcfind)) trcfind=[]; end
            holdtrc=normtrc;
            holdtrc(find(holdtrc>0))=1;
            holdtrc(find(holdtrc<0))=-1;
            if(strcmp(lockto,'zerocross'))
                % all cross over points 
                trcfind2=find(abs(diff(holdtrc))==2)+1;
            elseif(strcmp(lockto,'zerocross+'))
                % only positive cross over points
                trcfind2=find(diff(holdtrc)==2)+1;
            elseif(strcmp(lockto,'zerocross-'))
                % only negative cross over points
                trcfind2=find(diff(holdtrc)==-2)+1;
            end
            if(isempty(trcfind2)) trcfind2=[]; end
            trcfind=sort(cell2mat({trcfind trcfind2}));
        case 'infl'
            % there should me more choices, but right now we are not going
            % there.  
            
    end
    % peaks or troughs occure when numbers in the trcfind array are not
    % concurent, finding none concurrent samples
    trcfind=trcfind(find(diff(trcfind)~=1));   % plus one is need to line up with trc properly
    % trcfind number correspond to peaks on trc
    % finding if they occure in nhood area of wvltmid
    trcfind=trcfind(find(trcfind>=midpt-nhood));
    trcfind=trcfind(find(trcfind<=midpt+nhood));
    % trcfind is now a neighboorhood of peaks / troughs / zerocross
    dataout=trcfind(find(abs(trcfind-midpt)==min(abs(trcfind-midpt))));
    if(length(dataout)>=2)
        % sometimes two peaks are equidistance from one another, taking the
        % first value.
        dataout=dataout(1);
    end
end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -