CTITLESATRFL -- MULTIPLE TRACE FILTER IN CORE C*********************************************************************** C COPYRIGHT ATLANTIC RICHFIELD COMPANY 1991 * C*********************************************************************** CA AUTHOR J. M. PONTON CA DESIGNER J. M. PONTON CA LANGUAGE VSFORTRAN CA SYSTEM IBM OR CRAY CA WRITTEN 04-29-86 C REVISED 02-22-88 RDK. MODIFY TO USE AMPLITUDE OF FILTER C SPECTRUM INSTEAD OF ITS SQUARE. C ALSO ELIMINATE ROUNDING OF 'MAG'. CA CA CALL SATRFL(OPER, TRACES, OPFFT, STAT) CA CA IN/OUT ARGUMENT TYPE DESCRIPTION CA ------ -------- ---- ----------- CA IN OPER R4 ARRAY OF CONTROL WORDS + OPERATOR. CA CA IN/OUT TRACES R4 ARRAY OF TRACES TO BE FILTERED. CA CA IN/OUT OPFFT L1 =.TRUE. IF THE OPERATOR HAS BEEN TRANSFORMED. CA =.FALSE. OTHERWISE. CA IF OPFFT IS .FALSE., SATRFL TRANSFORMS IT AND CA RETURNS OPFFT = .TRUE. CA CA OUT STAT I4 RETURN STATUS. CA (0 = OK, OTHERWISE THE VALUE OF 'STAT' CA IS THE 'MAG' VALUE FROM A FFT ROUTINE CA THAT DIDN'T WORK. CA CA THIS ROUTINE PERFORMS A TIME-INVARIANT FILTERING OPERATION ON CA AN ARRAY OF SEISMIC TRACES. ON INPUT, THE TRACE ARRAY CONTAINS CA THE TRACES, PADDED OUT WITH ZEROES TO THE PROPER LENGTH FOR THE CA FFT OPERATION. ON OUTPUT, THE TRACES ARRAY CONTAINS THE TRACES CA PACKED BY THEIR NORMAL LENGTH. CA CA THE FORMAT OF OPER IS : CA 1. NXFLT = NUMBER OF TRACES TO FILTER. CA 2. WINLEN = TRACE WINDOW LENGTH (RETURN LENGTH). CA 3. FFTLEN = LENGTH FOR FFT OPERATION. CA 4-9 = UNUSED. CA 10-10+FFTLEN = OPERATOR TO APPLY (REAL-VALUED, PADDED WITH CA ZEROES). CA C EJECT C SUBROUTINE SATRFL(OPER, TRACES, OPFFT, STAT) C IMPLICIT INTEGER (A-Z) C COMMON /SYSTEM/SYSTEM, SYBYPW, SYLOCF, JAPNMS C REAL OPER(10) REAL TRACES(1) REAL AMPMAX REAL XMAG REAL SCFACT LOGICAL OPFFT C STAT = 0 CALL S1MVCH(OPER(1), 1, NXFLT, 1, SYBYPW) CALL S1MVCH(OPER(2), 1, WINLEN, 1, SYBYPW) CALL S1MVCH(OPER(3), 1, FFTLEN, 1, SYBYPW) NY = FFTLEN / 2 + 1 XMAG = ALOG(FLOAT(FFTLEN))/ALOG(2.) C MAG = ALOG(FLOAT(FFTLEN))/ALOG(2.) C MAG = NINT(XMAG) IXOP = 11 SCFACT = 1. / (2. * FFTLEN) IF (OPFFT) GO TO 25 C C TRANSFORM THE OPERATOR. C CALL S2DFT2(MAG, OPER(IXOP), *50) C C FORCE TO ZERO PHASE. C AMPMAX = 0. C DO 10 I = 1, NY J = 2 * (I - 1) + IXOP OPER(J) = SQRT(OPER(J) * OPER(J) + OPER(J+1) * OPER(J+1)) AMPMAX = AMAX1(AMPMAX, OPER(J)) OPER(J+1) = 0. 10 CONTINUE C C NORMALIZE THE OPERATOR. C AMPMAX = 1. / AMPMAX DO 20 I = 1, NY J = 2 * (I - 1) + IXOP OPER(J) = OPER(J) * AMPMAX 20 CONTINUE C OPFFT = .TRUE. C 25 CONTINUE C C LOOP TO PERFORM TIME-INVARIANT FILTERING. C DO 40 LOOP = 1, NXFLT IXTRC = (LOOP-1) * FFTLEN + 1 IXOUT = (LOOP-1) * WINLEN + 1 C C TRANSFORM THE TRACE. C CALL S2DFT2(MAG, TRACES(IXTRC), *50) C C MULTIPLY THE TRANSFORM OF THE OPERATOR. C CALL ARMPC(OPER(IXOP), TRACES(IXTRC), TRACES(IXTRC), NY) C C PERFORM THE INVERSE TRANSFORM. C CALL S2DFI2(MAG, TRACES(IXTRC), *50) C C TRACE SCALING DUE TO TRANSFORM. C DO 30 I = 1, WINLEN TRACES(IXTRC+I-1) = TRACES(IXTRC+I-1) * SCFACT 30 CONTINUE C C MOVE THE TRACE BACK TO ITS OUTPUT SLOT. C IF (IXTRC .NE. IXOUT) CALL ARMVE(TRACES(IXTRC), TRACES(IXOUT), * WINLEN) C 40 CONTINUE C RETURN C C ERROR IN FFT ROUTINE. C 50 CONTINUE STAT = MAG RETURN END