gusucode.com > DSISoft是由加拿大地质调查局发布的用于垂直地震剖面(VSP)数据处理的免费软件包 > dsisoftv3/dsisoftv3/dsisoftv3/qc_dsi/qc_dsi.m
function [datatot]=qc_dsi(datain,headw1,tstart,tend,comp1,comp2) % % Please note: Software does not check for reasonable parameters or dead traces % % %by G. Perron (Nov 15th, 1996) % %based on rot3c_dirp from S. Guest and D. Eaton+ %$Id: qc_dsi.m,v 3.0 2000/06/13 19:17:59 gilles Exp $ %$Log: qc_dsi.m,v $ %Revision 3.0 2000/06/13 19:17:59 gilles %*** empty log message *** % % %Copyright (C) 1998 Seismology and Electromagnet+ic 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 datarot=rot3c(datain,headw1,tstart,tend,comp1,comp2); disp('angle rot:'); datarot.th{1}(5,:) disp('S2R azimuth:'); datarot.th{1}(9,:) for i=1:datarot.fh{13} if (datarot.th{1}(9,i) <= 180) datarot.th{1}(9,i)=360-(180-datarot.th{1}(9,i)); datarot.th{2}(9,i)=datarot.th{1}(9,i); datarot.th{3}(9,i)=datarot.th{1}(9,i); else datarot.th{1}(9,i)=(datarot.th{1}(9,i)-180); datarot.th{2}(9,i)=datarot.th{1}(9,i); datarot.th{3}(9,i)=datarot.th{1}(9,i); end if datarot.th{1}(9,i)-datarot.th{1}(5,i)<=0 h1pos(i)=(360-datarot.th{1}(5,i))+datarot.th{1}(9,i); else h1pos(i)=datarot.th{1}(9,i)-datarot.th{1}(5,i); end end sroff=datarot.th{1}(53,:); %sroff=sqrt(((datarot.th{1}(29,:)-datarot.th{1}(35,:)).^2) + ((datarot.th{1}(31,:)-datarot.th{1}(37,:)).^2)); sraz=datain.th{1}(9,:); relev=datarot.th{1}(39,:); seisdata=datain; disp('[dataout]=qc_dsi(datain,headw1,tstart,tend,comp1,comp2)'); w=pi/180; trclength=datain.fh{7}; %number of points per trace smpint=datain.fh{8}; %smpint is the sampling interval %dataout=datain; %check to make sure data is separated into components %ntr is the number of traces in each record for COUNT=3:-1:1 %get number of traces in each component ntr(COUNT)=datain.th{COUNT}(12,1); end %for if (ntr(1)~=ntr(2)) | (ntr(1)~=ntr(3)) error('check data format - different number of traces in components'); end%if if length(datain.dat)~=3 error('data must have only 3 records - one for each of x, y and z'); end %if %************************************************************************* %create a look-up table of sin and cos values for COUNT=0:360 cosang(COUNT+1)=cos(COUNT*w); sinang(COUNT+1)=sin(COUNT*w); end %for COUNT ntr=ntr(1); angmx(1:ntr)=0; %initialize angmx vector for storing rotation angles sheet=qcsheet; %hold on hr=findobj(sheet,'Tag','rotations'); ha=findobj(sheet,'Tag','amplitudes'); hs{1}=findobj(sheet,'Tag','seis1'); hs{2}=findobj(sheet,'Tag','seis2'); hs{3}=findobj(sheet,'Tag','seis3'); hs{4}=findobj(sheet,'Tag','seis4'); hs{5}=findobj(sheet,'Tag','seis5'); hpol=findobj(sheet,'Tag','Polar1'); a={'-r','-g','-b','-m','-k','-c'}; b={'*r','*g','*b','*m','*k','*c'}; c={'-*r','-*g','-*b','-*m','-*k','-*c'}; ledg=num2str(datain.th{1}(26,:)'); seisdata=sortrec_new(seisdata,13); datarot=sortrec_new(datarot,13); datatot=seisdata; for i=1:datatot.fh{12} datatot.dat{i}(:,4:6)=datarot.dat{i}(:,:); datatot.th{i}(:,4:6)=datarot.th{i}(:,:); datatot.th{i}(12,:)=datatot.th{i}(12,:)+3; end datatot.fh{1}=datatot.fh{1}*2; datatot.fh{13}=datatot.fh{13}+3; for COUNT1=1:ntr samp1=round((datain.th{1}(headw1,COUNT1)-datain.fh{9})/smpint)-round(tstart/smpint)+1; %calulates start of interval to be analyzed samp2=round((datain.th{1}(headw1,COUNT1)-datain.fh{9})/smpint)+round(tend/smpint)+1; %calulates end of interval to be analyzed %this following loops over specified angles and returns the angle within %those specified that maximizes the radial component cmax=0; %initializing the max. energy of a component datawin=samp1:samp2; %the window over which the data is to be analyzed lendatawin=length(datawin); %length of the data window xy=[datain.dat{comp1}(datawin,COUNT1), datain.dat{comp2}(datawin,COUNT1)]; %the window of data to be analyzed z=datain.dat{3}(datawin,COUNT1); tr1=1; tr2=6; t1=(samp1*seisdata.fh{8}); t2=(samp2*seisdata.fh{8}); smp=seisdata.fh{8}; datarotin=subset(datatot,tr1,tr2,t1,t2,COUNT1,COUNT1); vert=sum(z.*z); horiz1=sum(xy(:,1).*xy(:,1)); horiz2=sum(xy(:,2).*xy(:,2)); horiztot=horiz1+horiz2; ratio(COUNT1)=sroff(COUNT1)/relev(COUNT1); ratio_obs(COUNT1)=horiztot/vert; allamps=[horiz1 horiz2 vert horiztot]; rt=zeros(lendatawin,2); axes(hs{COUNT1}); hold on plot(datarotin.th{1}(15,:),'.r'); seisplot2(datarotin.dat{1},t1,t2,1,6,smp,1,0,1,a{COUNT1},t1); for COUNT2=0:359 %checks from 0 to 90 degrees %the following applies the rotation matrix and sums over each component rt(:,1)=xy(:,1)*cosang(COUNT2+1)+xy(:,2)*sinang(COUNT2+1); rt(:,2)=-xy(:,1)*sinang(COUNT2+1)+xy(:,2)*cosang(COUNT2+1); c1rms=sum(rt(:,1).*rt(:,1)); c1rms2(COUNT2+1)=c1rms; c2rms=sum(rt(:,2).*rt(:,2)); c2rms2(COUNT2+1)=c2rms; ang(COUNT2+1)=COUNT2; end %for COUNT2 ang=datain.th{1}(9,COUNT1)-ang; for i=1:length(ang) if ang(i) <= 0 ang(i)=360+ang(i); end end l=find(c1rms2==max(c1rms2)); w=[ang' c1rms2']; w=sortrows(w,1); axes(hr) hold on semilogy(w(:,1),w(:,2),a{COUNT1}); xlabel('Azimuth of H2') ylabel('RMS Amplitude') box on grid on axes(ha) hold on semilogy(allamps,c{COUNT1}) hold on xlabel('H1 H2 Z Htot') ylabel('RMS Amplitude') box on grid on end %for COUNT1 axes(hr) legend(ledg(1),ledg(2),ledg(3),ledg(4),ledg(5)); %legend(ledg) %hold off h1pos compinfo=[h1pos' round(sroff)' [1 2 3 4 5]' round(sraz)']; cinfosort=sortrows(compinfo,2); fcisort=flipud(cinfosort); for i=1:datarot.fh{12} axes(hpol); newplot; fcisort(i,1)=fcisort(i,1).*pi/180; [x,y]=pol2cart(fcisort(i,1),fcisort(i,2)); theta=fcisort(i,4)*(pi/180)+pi; rho=fcisort(i,2); compass(x,y,a{fcisort(i,3)}); hold on polar(theta,rho,b{fcisort(i,3)}); hold on end set(gca,'view',[90 -90]); h=num2str(datain.th{1}(56,1)); suptitle(['Level ',h]) %hratio=figure(2); %plot(ratio,'-*r') %hold on %plot(ratio_obs,'-*b') %xlabel('Trace Number') %ylabel('HSUM/VERT') %grid on %legend(gca,'Theorical Amplitude Ratio','Observed Amplitude Ratio');