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

📄 sufft.c

📁 su 的源代码库
💻 C
字号:
/* Copyright (c) Colorado School of Mines, 2006.*//* All rights reserved.                       *//* SUFFT: $Revision: 1.28 $ ; $Date: 2006/11/07 22:58:42 $		*/#include "su.h"#include "segy.h"/*********************** self documentation **********************/char *sdoc[] = {" 									"," SUFFT - fft real time traces to complex frequency traces		"," 									"," suftt <stdin >sdout sign=1 						"," 									"," Required parameters:							"," none									"," 									"," Optional parameters:							"," sign=1			sign in exponent of fft			"," dt=from header		sampling interval			"," verbose=1		=0 to stop advisory messages			"," 									"," Notes: To facilitate further processing, the sampling interval	"," in frequency and first frequency (0) are set in the			"," output header.							"," 									"," sufft | suifft is not quite a no-op since the trace			"," length will usually be longer due to fft padding.			"," 									"," Caveats: 								"," No check is made that the data IS real time traces!			"," 									"," Output is type complex. To view amplitude, phase or real, imaginary	"," parts, use    suamp 							"," 									"," Examples: 								"," sufft < stdin | suamp mode=amp | .... 				"," sufft < stdin | suamp mode=phase | .... 				"," sufft < stdin | suamp mode=real | .... 				"," sufft < stdin | suamp mode=imag | .... 				"," 									",NULL};/* Credits: * *	CWP: Shuki Ronen, Chris Liner, Jack K. Cohen *	CENPET: Werner M. Heigl - added well log support * * Note: leave dt set for later inversion * * Trace header fields accessed: ns, dt, d1, f1 * Trace header fields modified: ns, d1, f1, trid *//**************** end self doc ***********************************/#define LOOKFAC	2	/* Look ahead factor for npfaro	  */#define PFA_MAX	720720	/* Largest allowed nfft	          */segy tr;intmain(int argc, char **argv){	register float *rt;	/* real trace				*/	register complex *ct;	/* complex transformed trace		*/	int nt;			/* number of points on input trace	*/	int nfft;		/* transform length			*/	int nf;			/* number of frequencies		*/	int sign;		/* sign in exponent of transform	*/	int verbose;		/* flag to get advisory messages	*/	float dt;		/* sampling interval in secs		*/	float d1;		/* output sample interval in Hz		*/	cwp_Bool seismic;	/* is this seismic data? */	/* Initialize */	initargs(argc, argv);	requestdoc(1);	if (!getparint("verbose", &verbose))	verbose=1;	/* Get info from first trace */ 	if (!gettr(&tr))  err("can't get first trace");	nt = tr.ns;	/* check for seismic or well log data */	seismic = ISSEISMIC(tr.trid);			if (seismic) {		if (verbose)	warn("input is seismic data, trid=%d",tr.trid);		dt = ((double) tr.dt)/1000000.0;	}	else {		if (verbose)	warn("input is not seismic data, trid=%d",tr.trid);		dt = tr.d1;        }	if (!dt) {		dt = .004;		if (verbose) warn("dt or d1 not set, assumed to be .004");	}	/* Set up pfa fft */	nfft = npfaro(nt, LOOKFAC * nt);	if (nfft >= SU_NFLTS || nfft >= PFA_MAX)  err("Padded nt=%d--too big", nfft);	nf = nfft/2 + 1;	d1 = 1.0/(nfft*dt);	if (!getparint("sign", &sign)) sign = 1;	if (sign != 1 && sign != -1)   err("sign = %d must be 1 or -1", sign);	rt = ealloc1float(nfft);	ct = ealloc1complex(nf);	/* If dt not set, issue advisory on frequency step d1 */	if (dt && verbose)  warn("d1=%f", 1.0/(nfft*dt));	/* Main loop over traces */	do {		register int i;		/* Load trace into rt (zero-padded) */		memcpy((void *) rt, (const void *) tr.data, nt*FSIZE);		memset((void *) (rt + nt), 0, (nfft-nt)*FSIZE);		/* FFT */		pfarc(sign, nfft, rt, ct);		/* Store values */		for (i = 0; i < nf; ++i) {			tr.data[2*i]   = ct[i].r;			tr.data[2*i+1] = ct[i].i;		}		/* Set header values--npfaro makes nfft even */		tr.ns = 2 * nf;		tr.trid = FUNPACKNYQ;		tr.d1 = d1;		tr.f1 = 0.0;		puttr(&tr);	} while (gettr(&tr));	return(CWP_Exit());}

⌨️ 快捷键说明

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