home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol075 / fft.bas < prev    next >
Encoding:
BASIC Source File  |  1984-04-29  |  3.3 KB  |  123 lines

  1. 10 ' FFT PROGRAM FROM BYTE MAGAZINE, DECEMBER '78
  2. 20 PRINT"        *********************************"
  3. 30 PRINT"        *                *"
  4. 40 PRINT"        *            F F T         *
  5. 50 PRINT"        *                *"
  6. 60 PRINT"        *********************************"
  7. 70 PRINT:PRINT"A program to derive and display a 256 point"
  8. 80 PRINT"frequency-domain representation of a time-domain"
  9. 90 PRINT"function.   The required time-domain function can"
  10. 100 PRINT"be either generated within the program by patching"
  11. 110 PRINT"in an appropriate routine in lines 200 to 990, or else"
  12. 120 PRINT"input and stored from an A/D converter."
  13. 130 PRINT"(A sine generator is initially included)."
  14. 140 PRINT
  15. 150 PRINT"    **** PLEASE PRESS RETURN TO CONTINUE ****"
  16. 160 INPUT R
  17. 170 DIM X1(256),X2(256)
  18. 180 N=256: L=8: PI=3.14159
  19. 200 PRINT"    ---- GENERATING A TIME FUNCTION ----"
  20. 210 PRINT"        (1010Hz sinewave)"
  21. 220 T=0
  22. 230 FOR Z=0 TO N-1
  23. 240 X1(Z)=SIN(2*PI*1000*T)
  24. 250 T=T+1.95313E-04
  25. 260 NEXT Z
  26. 1000 PRINT "Do you want a listing of the generated time function";
  27. 1010 INPUT A$
  28. 1020 IF A$="NO" THEN 1120
  29. 1030 IF A$<>"YES" THEN 1000
  30. 1040 B=X1(0)
  31. 1050 FOR Z=0 TO N-1
  32. 1060 IF ABS(X1(Z))>B THEN B=ABS(X1(Z))
  33. 1070 NEXT Z
  34. 1080 FOR Z=0 TO N-1
  35. 1090 PRINT X1(Z);TAB(41+20*X1(Z)/B);"*"
  36. 1100 NEXT Z
  37. 1110 '    ---- SCALE INPUT FUNCTION ----
  38. 1120 FOR Z=0 TO N-1
  39. 1130 X1(Z)=X1(Z)/N
  40. 1140 NEXT Z
  41. 1150 '    ---- FFT IN PLACE ALGORITHM ----
  42. 1160 PRINT:PRINT"    ---- FFT CALCULATION IN PROGRESS ----"
  43. 1170 PRINT"    (Please give me a few minutes)""
  44. 1180 I1=N/2: I2=1: V=2*PI/N
  45. 1190 FOR I=1 TO L
  46. 1200 I3=0: I4=I1
  47. 1210 FOR K=1 TO I2
  48. 1220 X=INT(I3/I1)
  49. 1230 GOSUB 1840
  50. 1240 I5=Y
  51. 1250 Z1=COS(V*I5)
  52. 1260 Z2=-SIN(V*I5)
  53. 1270 FOR M=I3 TO I4-1
  54. 1280 A1=X1(M): A2=X2(M)
  55. 1290 B1=Z1*X1(M+I1)-Z2*X2(M+I1)
  56. 1300 B2=Z2*X1(M+I1)+Z1*X2(M+I1)
  57. 1310 X1(M)=A1+B1: X2(M)=A2+B2
  58. 1320 X1(M+I1)=A1-B1: X2(M+I1)=A2-B2
  59. 1330 NEXT M
  60. 1340 I3=I3+2*I1: I4=I4+2*I1
  61. 1350 NEXT K
  62. 1360 I1=I1/2: I2=2*I2
  63. 1370 NEXT I
  64. 1380 '---- OUTPUT RESULTS ----
  65. 1390 PRINT"In what form do you want the output?"
  66. 1400 PRINT"    Magnitude spectrum plot        (1)"
  67. 1410 PRINT"    Table of values            (2)"
  68. 1420 INPUT A
  69. 1430 IF A=1 THEN 1470
  70. 1440 IF A=2 THEN 1660
  71. 1450 PRINT"INCORRECT INPUT, 1 OR 2 PLEASE!": GOTO 1390
  72. 1460 '    ---- OUTPUT MAGNITUDE SPECTRUM PLOT ----
  73. 1470 B=0
  74. 1480 PRINT:PRINT"    ---- MORE CALCULATIONS IN PROGRESS ----"
  75. 1490 FOR Z=0 TO N/2
  76. 1500 X=Z
  77. 1510 GOSUB 1930
  78. 1520 IF X3>B THEN B=X3
  79. 1530 NEXT Z
  80. 1540 FOR Z=0 TO N/2
  81. 1550 X=Z
  82. 1560 GOSUB 1930
  83. 1570 X4=INT(56*X3/B)
  84. 1580 C=0
  85. 1590 PRINT Z;TAB(5);"!";
  86. 1600 C=C+1
  87. 1610 IF C<X4 THEN PRINT"=";: GOTO 1600
  88. 1620 PRINT ""
  89. 1630 NEXT Z
  90. 1640 GOTO 1780
  91. 1650 '    ---- OUTPUT TABLE OF VALUES ----
  92. 1660 U=0
  93. 1670 Z=0
  94. 1680 PRINT"HARMONIC";TAB(14);"REAL";TAB(30);
  95. 1690 PRINT"IMAGINARY";TAB(50);"MAGNITUDE"
  96. 1700 X=U
  97. 1710 GOSUB 1930
  98. 1720 PRINT U;TAB(10);X1(Y);TAB(30);X2(Y);TAB(50);X3
  99. 1730 U=U+1: Z=Z+1
  100. 1740 IF Z>9 THEN 1670
  101. 1750 IF U>N/2 THEN 1780
  102. 1760 GOTO 1700
  103. 1770 '    ---- TERMINATE? ----
  104. 1780 PRINT"DO you want another output (YES, NO)";
  105. 1790 INPUT A$
  106. 1800 IF A$="YES"THEN 1390
  107. 1810 IF A$<>"NO" THEN 1780
  108. 1820 END
  109. 1830 '    ---- SCRAMBLER ROUTINE ----
  110. 1840 Y=0: N1=N
  111. 1850 FOR W=1 TO L
  112. 1860 N1=N1/2
  113. 1870 IF X<N1 THEN 1900
  114. 1880 Y=Y+2^(W-1)
  115. 1890 X=X-N1
  116. 1900 NEXT W
  117. 1910 RETURN
  118. 1920 '    ---- MAGNITUDE (X3) SUBROUTINE ----
  119. 1930 GOSUB 1840
  120. 1940 X3=SQR(X1(Y)^2+X2(Y)^2)
  121. 1950 RETURN
  122. 1960 END
  123.