gusucode.com > DSISoft是由加拿大地质调查局发布的用于垂直地震剖面(VSP)数据处理的免费软件包 > dsisoftv3/dsisoftv3/dsisoftv3/fkfilter/fkpoly.m
function fkpoly(action) %fkpoly % %Interactive module used to pick a polygone for fk filtering. The option is now %available to view results of filtering using user selected polygon within the %module. For processing data, polygon is usually picked in the program then %passed to the 'fkfilt' processing module from a processing script. % %INPUT %input parameters should be specified in the menu of this module. %Data should be in DSI format. %Max. Freq. is the maximum frequency to be examined in the data %dx is the spacing between traces %the 'polygone' input parameter is optional. It allows visualization of %polygones that have been saved previously % %OUTPUT %x,y coordinates of the corners of filter polygone; give name at prompt % %There are buttons on the display screen for zoom, full (zooming out), %menu (brings menu screen to the front), quit (exits program, prompts for %name of variable in which to save picked polygon), pick (initiates picking %of a new polygone. Pick with left mouse button, use right button to close %polygon) and clear (clears existing polygon from screen). There are four %radio buttons that control the display. 'FK' displays the fk spectrum and %allows picking, 'unfiltered' displays the unfiltered data, 'pass' displays %the data with a pass filter applied and 'reject' does the same except the %contents of the polygone is rejected. % %note - requires files fkfig3, fkquit, fkmenu, pickfk, and fkfilt % % %DSI customized VSP processing software %developed by G. Perron and K.S. Beaty %$Id: fkpoly.m,v 3.0 2000/06/13 19:19:28 gilles Exp $ %$Log: fkpoly.m,v $ %Revision 3.0 2000/06/13 19:19:28 gilles %Release 3 % %Revision 2.1 2000/06/13 19:08:12 gilles %fix return with Matlab 5 % %Revision 2.0 1999/05/21 18:44:52 mah %Release 2 % %Revision 1.2 1999/05/19 17:06:16 perron %*** empty log message *** % %Revision 1.1 1999/01/06 19:08:49 kay %Initial revision % % %Copyright (C) 1998 Seismology and Electromagnetic Section/ %Continental Geosciences Division/Geological Survey of Canada % %This library is free software; you can redistribute it and/or %modify it under the terms of the GNU Library General Public %License as published by the Free Software Foundation; either %version 2 of the License, or (at your option) any later version. % %This library 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 %Library General Public License for more details. % %You should have received a copy of the GNU Library General Public %License along with this library; if not, write to the %Free Software Foundation, Inc., 59 Temple Place - Suite 330, %Boston, MA 02111-1307, USA. % %DSI Consortium %Continental Geosciences Division %Geological Survey of Canada %615 Booth St. %Ottawa, Ontario %K1A 0E9 % %email: dsi@cg.nrcan.gc.ca if nargin==0 fkmenu; return end %if switch action case 'getdataset' dataset=get(gcbo,'userdata'); set(findobj(gcf,'Tag','EditRec1'),'String','1') rec2=dataset.fh{12}; set(findobj(gcf,'Tag','EditRec2'),'String',num2str(rec2)) int=dataset.fh{8}; fn=1/(2*int); %Nyquist frequency m=dataset.fh{7}; %number of points per trace freq=round(fn-fn*2/(2^nextpow2(m))); %highest frequency to be plotted set(findobj(gcf,'Tag','EditFreq'),'String',num2str(freq)) dx=dataset.th{1}(56,2)-dataset.th{1}(56,1); %distance between traces set(findobj(gcf,'Tag','EditDx'),'String',num2str(dx)) case 'plot' clear global fktemp H=findobj('Name','F-K Filter Menu'); datain=get(findobj(H,'Tag','EditText1'),'userdata'); rec=str2num(get(findobj(H,'Tag','EditRec1'),'String')); freq=str2num(get(findobj(H,'Tag','EditFreq'),'String')); dx=get(findobj(H,'Tag','EditDx'),'String'); polycoord=get(findobj(H,'Tag','EditPolyname'),'Userdata'); if isempty(dx) msgbox('Check all fields and try again.','Warning','warn'); return end %if dx=str2num(dx); if rec>datain.fh{12} msgbox(['This dataset only has ',num2str(datain.fh{12},' records. Try again.','Warning','warn'); return end %if int=datain.fh{8}; %sampling interval (s) datain=datain.dat{rec}; %----------finding nextpow2------------- [m,n]=size(datain); m2=2^nextpow2(m); n2=2^nextpow2(n); fkdata=fft2(datain,m2,n2); fkdata=fftshift(fkdata); kn=1/(2*dx); %Nyquist wavenumber fn=1/(2*int); %Nyquist frequency a.x=[-kn+kn*2/n2:kn*2/n2:kn]; a.y=[0:2*fn/m2:freq]; %-------------picking polygon------------- G=findobj('Name','Pick fk-polygon'); if isempty(G) fkfig3; else figure(G); end %if %imagesc(x,y,abs(fkdata(m2/2-length(y):m2/2+1,:))) a.z=abs(fkdata(m2/2+1:m2/2+length(a.y),:)); imagesc(a.x,a.y,a.z) set(gca,'ydir','normal') xlabel('Wavenumber (m^-^1)') ylabel('Frequency (Hz)') set(gcf,'userdata',a) if ~isempty(polycoord) global fktemp hold on fktemp=line(polycoord(:,1),polycoord(:,2),'erasemode','normal'); set(fktemp,'color','r','linewidth',[2]) hold off end %if case 'menu' H=findobj('Name','F-K Filter Menu'); figure(H) case 'quitall' nfig=findobj('type','figure'); if length(nfig)==1 close all return end %if close(findobj(nfig,'Name','Pick fk-polygon')) fkpoly quit; case 'quit' global fktemp polyname=get(findobj(findobj('name','F-K Filter Menu'), 'tag','EditPolyname'),'string'); close(gcbf) fkquit set(findobj(gcf,'tag','EditText1'),'String',polyname) clear global fktemp case 'pick' rads=findobj(gcf,'style','radiobutton'); set(rads,'userdata','') pick_fk; case 'clear' global fktemp delete(fktemp) clear global fktemp set(gcf,'windowbuttonmotionfcn','') case {'FK','unfiltered','pass','reject'} set(gcf,'pointer','watch') rads=findobj(gcf,'style','radiobutton'); set(rads,'value',0) set(gcbo,'value',1) a=get(gcf,'userdata'); global fktemp if ~isnan(fktemp) a.xpoly=get(fktemp,'xdata'); a.ypoly=get(fktemp,'ydata'); set(gcf,'userdata',a) end %if if strcmp(action,'FK') imagesc(a.x,a.y,a.z) xlabel('Wavenumber (m^-^1)') ylabel('Frequency (Hz)') set(gca,'ydir','normal') hold on fktemp=line(a.xpoly,a.ypoly,'erasemode','normal'); set(fktemp,'color','r','linewidth',[2]) hold off set(findobj(gcf,'string','Pick'),'enable','on') set(findobj(gcf,'string','Clear'),'enable','on') else if isempty(fktemp) msgbox('Pick a polygon before attempting to filter','Warning','warn') fkpoly FK; set(gcf,'pointer','fullcross') return; end %if no polygon has been picked fktemp=NaN; H=findobj('Name','F-K Filter Menu'); data=get(findobj(H,'Tag','EditText1'),'userdata'); c='k'; rec=str2num(get(findobj(H,'Tag','EditRec1'),'String')); if ~strcmp(action,'unfiltered') temp=get(gcbo,'userdata'); c='b'; if isempty(temp) %ie filtering has not yet been performed taper=10; freq=str2num(get(findobj(H,'Tag','EditFreq'),'String')); dx=str2num(get(findobj(H,'Tag','EditDx'),'String')); poly=[a.xpoly' a.ypoly']; if strcmp(action,'pass') filtflg=0; else filtflg=1; end %if pass data=fkfilt(data,poly,freq,taper,filtflg,dx,rec); disp('allo') set(gcbo,'userdata',data) else data=temp; end %if isempty(temp) end %if not unfiltered set(findobj(gcf,'string','Pick'),'enable','off') set(findobj(gcf,'string','Clear'),'enable','off') seisplot(data.dat{rec},data.fh{9},data.fh{10},1,data.th{rec}(12,1),data.fh{8},1,0,1.5,c,data.fh{9}); end %if set(gcf,'pointer','fullcross') end %switch