Thread View: alt.lang.basic
1 messages
1 total messages
Started by kwj
Mon, 16 Nov 1992 16:42
FFT.BAS
Author: kwj
Date: Mon, 16 Nov 1992 16:42
Date: Mon, 16 Nov 1992 16:42
201 lines
5498 bytes
5498 bytes
DECLARE SUB working ()
DECLARE SUB test (x#(), N%)
DECLARE SUB printout (x#(), N%)
DECLARE SUB fftsetup (x#(), N%)
DECLARE SUB XFFT (x#(), NN%)
DEFDBL A-H, O-Z
DEFINT I-N
'$DYNAMIC
DIM x(1 TO 8192)
CONST filenotfound = 53
CONST badfilename = 64
CONST pi = 3.1415926535898#
ON ERROR GOTO ErrorHandler
CALL fftsetup(x(), N)
LOCATE 10, 1: PRINT "Calculating FFT.";
CALL XFFT(x(), N)
CALL printout(x(), N)
END
ErrorHandler:
IF ERR = filenotfound THEN
CLS
' get another file name
LOCATE 5, 5: PRINT "File "; UCASE$(file$); " not found."
LOCATE 6, 5: INPUT "Enter Data Filename: ", file$
RESUME
ELSEIF ERR = badfilename THEN
CLS
' get another file name
LOCATE 5, 5: PRINT "File "; UCASE$(file$); " is a bad filename."
LOCATE 6, 5: INPUT "Enter Data Filename: ", file$
RESUME
ELSE
PRINT "FFT Choked: Error Code"; ERR
END
END IF
REM $STATIC
SUB fftsetup (x(), N)
CLS
10 :
LOCATE 5, 10: PRINT " Power Number"
LOCATE 6, 10: PRINT " ------- --------"
LOCATE 7, 10: PRINT " 0 1 "
LOCATE 8, 10: PRINT " 1 2 "
LOCATE 9, 10: PRINT " 2 4 "
LOCATE 10, 10: PRINT " 3 8 "
LOCATE 11, 10: PRINT " 4 16 "
LOCATE 12, 10: PRINT " 5 32 "
LOCATE 13, 10: PRINT " 6 64 "
LOCATE 14, 10: PRINT " 7 128 "
LOCATE 15, 10: PRINT " 8 256 "
LOCATE 16, 10: PRINT " 9 512 "
LOCATE 17, 10: PRINT " 10 1024 "
LOCATE 18, 10: PRINT " 11 2048 "
LOCATE 19, 10: PRINT " 12 4096 "
LOCATE 21, 5: INPUT "Enter Power of Record Length: ", ans$
M = INT(VAL(ans$))
IF M > 12 THEN
CLS
LOCATE 22, 5: PRINT "*** Power Must be Lower than 13 ***"
GOTO 10
ELSEIF M <= 0 THEN
CLS
LOCATE 22, 5: PRINT "*** Power Must be Greater than 0 ***"
GOTO 10
END IF
LOCATE 22, 5: PRINT " "
LOCATE 22, 5: INPUT "Enter Data Filename: ", file$
OPEN file$ FOR INPUT AS #1
k = 1
N = 2 ^ M
CLS
LOCATE 9, 1: PRINT "Reading data."
DO WHILE NOT EOF(1) AND k <= 2 * N - 1
working
INPUT #1, x(k)
x(k + 1) = 0 'imaginary component
k = k + 2
LOOP
DO UNTIL k > 2 * N - 1
x(k) = 0 'Real Data Component
x(k + 1) = 0 'Imaginary Data Component
k = k + 2
LOOP
CLOSE #1
END SUB
SUB printout (x(), N)
LOCATE 11, 1: PRINT "Writing to FFT.PRN."
OPEN "c:\fft.prn" FOR OUTPUT AS #1
wcount = 0
FOR i = 1 TO 2 * N - 1 STEP 2
working
PRINT #1, USING "##### +.####^^^^^ +.####^^^^^ i"; (i - 1) / 2; CSNG(x(i)); CSNG(x(i + 1))
NEXT i
CLOSE #1
LOCATE 5, 1: PRINT " "
LOCATE 9, 1: PRINT " "
LOCATE 10, 1: PRINT " "
LOCATE 11, 1: PRINT " "
LOCATE 12, 1: PRINT "Program Finished."
END SUB
DEFSNG A-Z
SUB working STATIC
IF iter = 0 THEN wcount = 15
IF wcount = 15 THEN
iter = iter + 1
IF iter = 5 THEN iter = 1
COLOR 7
LOCATE 5, 1: PRINT "Working ..."
COLOR 3
SELECT CASE iter
CASE 1
LOCATE 5, 13: PRINT "-";
CASE 2
LOCATE 5, 13: PRINT "\";
CASE 3
LOCATE 5, 13: PRINT "|";
CASE 4
LOCATE 5, 13: PRINT "/";
END SELECT
COLOR 7
wcount = 0
END IF
wcount = wcount + 1
workingend:
END SUB
DEFINT I-N
DEFDBL A-H, O-Z
SUB XFFT (x(), NN)
N = 2 * NN
j = 1
FOR i = 1 TO N STEP 2 'Bit Reversal
IF j > i THEN
Tempr = x(j)
Tempi = x(j + 1)
x(j) = x(i)
x(j + 1) = x(i + 1)
x(i) = Tempr
x(i + 1) = Tempi
END IF
M = N / 2
1 :
IF M >= 2 AND j > M THEN
j = j - M
M = M / 2
GOTO 1
END IF
j = j + M
NEXT i
Mmax = 2
2 :
IF N > Mmax THEN
Istep = 2 * Mmax
Theta = 2 * pi / (Mmax)
Wpr = -2! * SIN(.5 * Theta) ^ 2
Wpi = -SIN(Theta)
Wr = 1
Wi = 0
FOR M = 1 TO Mmax STEP 2
working
FOR i = M TO N STEP Istep
j = i + Mmax
Tempr = Wr * x(j) - Wi * x(j + 1)
Tempi = Wr * x(j + 1) + Wi * x(j)
x(j) = x(i) - Tempr
x(j + 1) = x(i + 1) - Tempi
x(i) = x(i) + Tempr
x(i + 1) = x(i + 1) + Tempi
NEXT i
Wtemp = Wr
Wr = Wr * Wpr - Wi * Wpi + Wr
Wi = Wi * Wpr + Wtemp * Wpi + Wi
NEXT M
Mmax = Istep
GOTO 2
END IF
END SUB
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads