/* Simple_FFT_DEMO.rexx */ /* This ARexx version needs this dependency: */ /* http://aminet.net/package/util/rexx/RexxMathLib */ CALL ADDLIB('rexxmathlib.library',0,-30,0) NUMERIC DIGITS 14 SAY "" SAY "An experimental method to do an FFT in ARexx using the standard test values." SAY "It requires rexxmathlib.library for the SIN and COS." SAY "$VER Simple_FFT_DEMO.rexx_(C)06-09-2018_B.Walker_issued_under_GPL2." SAY "" /* Create standard test _ARRAYS_ REAL and IMAGINARY. */ /* These MUST be powers of 2 and greater than 2 in size. */ /* Real values, '1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0' */ /* Imag values, '0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0' */ /* Not really ARRAYS but good enough for this DEMO! */ DO N=0 TO 3 BY 1 REAL_ARRAY.N=1.0 END DO N=4 TO 7 BY 1 REAL_ARRAY.N=0.0 END DO N=0 TO 7 BY 1 IMAG_ARRAY.N=0.0 END /* Display them. */ SAY "Input, REAL: IMAG:" DO N=0 TO 7 BY 1 SAY " "||REAL_ARRAY.N||" "||IMAG_ARRAY.N END /* Only constant required, 14 decimal places. */ PI=3.14159265358979 /* N should be 8 by default in this DEMO. */ /* SAY "Number of elements = "||N||"..." */ N=N-1 CALL FFT SAY "" DO N=0 TO 7 BY 1 SAY "REAL: "||+OUT_REAL.N||", IMAG: "||+OUT_IMAG.N END SAY "" SAY "Final FFT values to 5 decimal places:" STR="" DO N=0 TO 7 BY 1 CALL ABS_COMPLEX NUMERIC DIGITS 14 IF +ABS <= 0.000000000001 THEN ABS=0 ENDIF NUMERIC DIGITS 6 STR=STR||+ABS||" " END SAY STR SAY "" EXIT /* Create the subroutines required. */ /* FFT subroutine. */ FFT: DO K=0 TO N BY 1 SUMREAL=0.0 SUMIMAG=0.0 DO T=0 TO N BY 1 ANGLE=(2.0*PI*T*K)/(N+1) SUMREAL=SUMREAL+(REAL_ARRAY.T*COS(ANGLE))+(IMAG_ARRAY.T*SIN(ANGLE)) SUMIMAG=SUMIMAG-(REAL_ARRAY.T*SIN(ANGLE))+(IMAG_ARRAY.T*COS(ANGLE)) END OUT_REAL.K=SUMREAL OUT_IMAG.K=SUMIMAG END RETURN /* FFT subroutine end. */ /* Absolute value of complex number subroutine. */ ABS_COMPLEX: ABS=SQRT( (OUT_REAL.N**2)+(OUT_IMAG.N**2) ) RETURN /* Absolute value of complex number subroutine end. */