CTITLEMVAV -- SMOOTHING AND FLATTENING FILTER 00000010 C*********************************************************************** C COPYRIGHT ATLANTIC RICHFIELD COMPANY 1991 * C*********************************************************************** CA AUTHOR D. D. THOMPSON 00000020 CA DESIGNER D. D. THOMPSON / J. E. BEITZEL 00000030 CA LANGUAGE S/370 FORTRAN H EXTENDED 00000040 CA SYSTEM IBM OR CRAY CA WRITTEN 1971 00000050 C REVISED 1976 00000060 C REVISED 07-07-86 JMP. DUAL IBM/CRAY VERSION. C REVISED 11-13-89 RDK. REMOVE S1ATP EXTERNAL. C 00000070 CA 00000080 CA 00000090 CA CALL MVAV (A, N, MW, B) 00000100 CA INPUT A = ARRAY TO BE SMOOTHED OR FLATTENED. R4 00000110 CA INPUT N = LENGTH OF A AND B. I4 00000120 CA INPUT MW = WINDOW LENGTH. I4 00000130 CA IF EVEN, THEN IABS(MW) + 1 IS USED 00000140 CA IF MW >=0 B RETURNS SMOOTHED 00000150 CA VERSION OF A 00000160 CA IF MW < 0 B RETURNS A MINUS ITS 00000170 CA SMOOTHED VERSION (FLATTENING) 00000180 CA OUTPUT B = ARRAY FOR RESULT R4 00000190 CA 00000200 CA 00000210 CA NOTE THAT WINDOW SHRINKS SYMETRICALLY ON EACH 00000220 CA END SO THAT B(1) = A(1) AND B(N) = A(N) FOR SMOOTHING 00000230 CA OR B(1) = B(N) = 0 FOR FLATTENING. 00000240 CA 00000250 CA 00000260 CA THIS ROUTINE PERFORMS A SLIDING WINDOW SMOOTHING 00000270 CA OR FLATTENING OF THE INPUT ARRAY. 00000280 C 00000290 C 00000300 C 00000310 C SUBROUTINES CALLED: 00000320 C 00000330 C S1ATP - ARMVE,ARSET 00000340 C IABS 00000350 C 00000360 C==================================================================== 00000370 SUBROUTINE MVAV(A,N,MW,B) 00000380 CAEND 00000390 C 00000400 DOUBLE PRECISION S DIMENSION A(1),B(1) 00000420 C EXTERNAL S1ATP 00000430 C IF(1.EQ.2) CALL S1ATP C NW=IABS(MW) 00000440 K=(NW-1)/2 00000450 IF(K.NE.0) GO TO 10 00000460 CALL ARMVE(A,B,N) 00000470 IF(MW.LT.0) CALL ARSET(B,N,0.0) 00000480 RETURN 00000490 C 00000500 10 NV=2*K+1 00000510 S=A(1) 00000520 KP=K+1 00000530 B(1)=A(1) 00000540 IF(N.EQ.1) RETURN 00000550 J=2 00000560 C 00000570 DO 40 00000580 * I=2,N 00000590 IF(I.GT.KP) GO TO 20 00000600 S= S+A(J)+A(J+1) 00000610 J=J+2 00000620 B(I)=S/(2*I-1) 00000630 GO TO 40 00000640 C 00000650 20 IF(I.GT.N-K) GO TO 30 00000660 J=I-K-1 00000670 S=S+A(I+K)-A(J) 00000680 B(I)=S/NV 00000690 GO TO 40 00000700 C 00000710 30 S=S-A(J+1)-A(J+2) 00000720 J=J+2 00000730 B(I)=S/((N-I)*2+1) 00000740 C 00000750 40 CONTINUE 00000760 C 00000770 IF(MW.GT.0) RETURN 00000780 C 00000790 DO 50 00000800 * I=1,N 00000810 C 00000820 50 B(I)=A(I)-B(I) 00000830 C 00000840 RETURN 00000850 END 00000860