taper.c

来自「seismic software,very useful」· C语言 代码 · 共 188 行

C
188
字号
#include "rmig.h"/* amplitude tapering arount predicted arrival times *//*    input:	nt		number of samples of trace	t0		time of first sample (in s)	dt 		sampling interval (in s)	trace[nt] 	trace to be tapered 	nray		number of rays computed at this trace location 	tray[nray]	arrival times of the rays  (in s)	lpass 		length of passing zone at each side of arrival time			(in s)	ltaper 		length of tapering zone at each side of passing zones			(in s)   output:	trace[nt]       tapered trace output   author:	zhiming li	      		3/4/93*/void taper(int nt, float t0, float dt, float *trace, int nray, float *tray,	float lpass, float ltaper) {	int *index;	float *amp, tmp;	int it;	int lt, lp;	int ir, ir1, ir2, ip2, ip1, it2, it1;	int i1,i2;	if(lpass>0.5*nt*dt) return;	tmp = lpass/dt + 0.5;	lp = tmp;	index = (int*) malloc(nray*sizeof(int));	if(ltaper>=0.) {		tmp = ltaper/dt + 0.5;		lt = tmp;		amp = (float*) malloc(lt*sizeof(float));		tmp = 0.;		if(lt>0.) tmp = 1./lt;		for(it=0;it<lt;it++) {			amp[it] = (lt - it)*tmp;		}	}	for(ir=0;ir<nray;ir++) index[ir] = ir;       	qkisort(nray,tray,index);	/* before first arrival time */	tmp = (tray[index[0]]-t0)/dt + 0.5;	ir2 = tmp;	ip2 = ir2 -lp;	it2 = ip2 - lt;	ir1 = 0;	it1 = 0;	ip1 = 0;	if(ip1<ip2) {		if(ltaper>=0.) {			if(it1>ip2) it1 = ip2;			i1 = (ip1>=0)?ip1:0;			i2 = (it1<nt)?it1:nt-1;			for(it=i1;it<i2;it++) {				trace[it] = trace[it]*amp[it-ip1];			}			if(it2<ip1) it2 = ip1;			i1 = (it2>=0)?it2:0;			i2 = (ip2<nt)?ip2:nt-1;			for(it=i1;it<i2;it++) {				trace[it] = trace[it]*amp[ip2-it-1];			}			i1 = (it1>=0)?it1:0;			i2 = (it2<nt)?it2:nt-1;			for(it=i1;it<i2;it++) {				trace[it] = 0.;			}		}else{			it2 = 0;			tmp = ip2 - it2;			if(tmp!=0.) tmp = 1./tmp;			i1 = (it2>=0)?it2:0;			i2 = (ip2<nt)?ip2:nt-1;			for(it=i1;it<i2;it++) {				trace[it] = trace[it]*(it-it2+1)*tmp;			}		}	}/* between first and last arrival times */        for(ir=0;ir<nray-1;ir++) {		tmp = (tray[index[ir]]-t0)/dt + 0.5;		ir1 = tmp;		ip1 = ir1 + lp;		it1 = ip1 + lt;		tmp = (tray[index[ir+1]]-t0)/dt + 0.5;		ir2 = tmp;		ip2 = ir2 - lp;		it2 = ip2 - lt;		if(ip1>=ip2) continue;		if(ltaper>=0.) {			if(it1>ip2) it1 = ip2;			i1 = (ip1>=0)?ip1:0;			i2 = (it1<nt)?it1:nt-1;			for(it=i1;it<i2;it++) {				trace[it] = trace[it]*amp[it-ip1];			}			if(it2<ip1) it2 = ip1;			i1 = (it2>=0)?it2:0;			i2 = (ip2<nt)?ip2:nt-1;			for(it=i1;it<i2;it++) {				trace[it] = trace[it]*amp[ip2-it-1];			}			i1 = (it1>=0)?it1:0;			i2 = (it2<nt)?it2:nt-1;			for(it=i1;it<i2;it++) {				trace[it] = 0.;			}		} else {			it1 = (ip1 + ip2)/2;			it2 = it1+1;			tmp = it1-ip1;			if(tmp!=0.) tmp = 1./tmp;			i1 = (ip1>=0)?ip1:0;			i2 = (it1<nt)?it1:nt-1;			for(it=i1;it<i2;it++) {				trace[it] = trace[it]*(it1-it)*tmp;			}			tmp = ip2 - it2;			if(tmp!=0.) tmp = 1./tmp;			i1 = (it2>=0)?it2:0;			i2 = (ip2<nt)?ip2:nt-1;			for(it=i1;it<i2;it++) {				trace[it] = trace[it]*(it-it2+1)*tmp;			}		}    	}/* after last arrival times */ 	tmp = (tray[index[nray-1]]-t0)/dt + 0.5;	ir1 = tmp;	ip1 = ir1 + lp;	it1 = ip1 + lt;	ir2 = nt - 1;	it2 = nt - 1;	ip2 = nt - 1;	if(ip1<ip2) {		if(ltaper>=0.) {			if(it1>ip2) it1 = ip2;			i1 = (ip1>=0)?ip1:0;			i2 = (it1<nt)?it1:nt-1;			for(it=i1;it<i2;it++) {				trace[it] = trace[it]*amp[it-ip1];			}			if(it2<ip1) it2 = ip1;			i1 = (it2>=0)?it2:0;			i2 = (ip2<nt)?ip2:nt-1;			for(it=i1;it<i2;it++) {				trace[it] = trace[it]*amp[ip2-it-1];			}			i1 = (it1>=0)?it1:0;			i2 = (it2<nt)?it2:nt-1;			for(it=i1;it<i2;it++) {				trace[it] = 0.;			}		}else{				it1 = nt-1;			tmp = it1 - ip1; 			if(tmp!=0.) tmp = 1./tmp; 			i1 = (ip1>=0)?ip1:0;			i2 = (it1<nt)?it1:nt-1;			for(it=i1;it<i2;it++) {				trace[it] = trace[it]*tmp*(it1-it);			}					}	}        free(index);	if(ltaper>=0.) free(amp);}

⌨️ 快捷键说明

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