home *** CD-ROM | disk | FTP | other *** search
- 10 PRINT:PRINT "WAVEFORM ANALYSIS:"
- 20 PRINT "DERIVED FROM W.E. SABIN - EDN JUNE 1983 - PAGE 243"
- 22 PRINT "MODIFIED AND EXTENDED BY R.B. KOLBLY - MARCH 11, 1985
- 30 INPUT "ENTER EXPONENT M ";M
- 40 N=2^M: PI=3.1415928159#:E1=2
- 50 DIM X(N+1,5)
- 60 INPUT "Time Interval";TT
- 70 S1$="Time":S2$=S1$
- 110 REM ****************************************************************
- 120 REM * X(I,0) REAL, X(I,1) IMAGINARY *
- 130 REM * EVALUATE REAL, IMAGINARY IN LINES 190 - 269 *
- 140 REM * FOR AUTOCORRELATION, AUTOSPEC. USE X(I,0), X(I,1) *
- 150 REM * FOR CROSS SPECTRUM, CROSS CORRELATION *
- 160 REM * AND CONVOLUTION, *
- 170 REM * USE X(I,0),X(I,1) AND X(I,2),X(I,3) *
- 180 REM ****************************************************************
- 190 REM
- 200 FOR J=0 TO N
- 210 IF J<N/2 THEN X(J,0)=1 ELSE X(J,0)=0
- 220 NEXT J
- 230 GOSUB 4100
- 240 GOTO 5000
- 250 REM
- 260 REM
- 270 PRINT
- 280 PRINT: PRINT "ITEMS 1-7 FOR X(I,0), X(I,1) ONLY":PRINT
- 290 PRINT " 1 -Forward Transform 9- Correlation"
- 300 PRINT " 2 -Inverse Transform 10-Convolution"
- 310 PRINT " 3 -List Real,Imaginary 11-Save Data in file"
- 320 PRINT " 4 -Sine,Cosine 12-Exit Program"
- 330 PRINT " 5 -Magnitude & Phase 13-Exchange Seq 1 & 2"
- 340 PRINT " 6 -Smoothing 14-Deseq 1=Seq1*Seq2"
- 350 PRINT " 7 -Windowing 15-"
- 360 PRINT " 8 -Power Spectrum 16-"
- 420 PRINT
- 430 INPUT "Type in selection by number";X
- 440 ON X GOTO 470,480,500,600,600,1450,1690,1790,2000,2310,1230,2770,460,450
- 450 FOR I=1 TO N:X(I,4)=X(I,0)*X(I,2)-X(I,1)*X(I,3): X(I,5)=X(I,0)*X(I,3)+X(I,2)*X(I,1):X(I,0)=X(I,4): X(I,1)=X(I,5):NEXT:GOTO 270
- 460 FOR I=1 TO N:X(I,4)=X(I,0):X(I,5)=X(I,1):X(I,0)=X(I,2):X(I,1)=X(I,3): X(I,2)=X(I,4):X(I,3)=X(I,5):NEXT:GOTO 270
- 470 REM ******** COMPUTE FORWARD TRANSFORM **********
- 471 INPUT "Transform Sequence 1 or Sequence 2";S$:S=INT(VAL(S$))
- 472 IF S<1 OR S>2 THEN PRINT "1 or 2 Only!":GOTO 471
- 473 IF S=1 THEN S=0 ELSE S=2
- 474 D=0:GOSUB 2480
- 475 IF S=0 THEN S1$="Frequency" ELSE S2$="Frequency"
- 476 A$="Fwd Transform":GOSUB 4000
- 477 GOTO 5000
- 480 ' ******* COMPUTE INVERSE TRANSFORM *****
- 481 INPUT "Transform Sequence 1 or Sequence 2";S$:S=INT(VAL(S$))
- 482 IF S<1 OR S>2 THEN PRINT "1 or 2 Only!":GOTO 481
- 483 IF S=1 THEN S=0 ELSE S=2
- 484 D=1:GOSUB 2480
- 485 IF S=0 THEN S1$="Time" ELSE S2$="Time"
- 486 A$="Inv Transform":GOSUB 4000
- 487 GOTO 5000
- 500 REM ******** DISPLAY EXPONENTIALS **************
- 501 INPUT "Display sequence 1 or 2";Q$
- 502 IF Q$="1" OR Q$="2" THEN GOTO 504
- 503 PRINT "Sequence 1 or 2 only!":GOTO 501
- 504 INPUT "Minimum,maximum display values";TMIN,TMAX
- 505 TMIN=INT(TMIN):TMAX=INT(TMAX):IF TMIN>TMAX THEN SWAP TMIN,TMAX
- 506 IF TMAX>N THEN TMAX=N
- 507 IF TMIN<1 THEN TMIN=1
- 508 IF Q$="1" THEN K=0 ELSE K=1
- 509 DISP$="#### ##.###^^^^ ##.###^^^^ ##.###^^^^"
- 510 HEAD$=" N Value Real Imaginary"
- 511 IF K=0 THEN S$=LEFT$(S1$,1) ELSE S$=LEFT$(S2$,1)
- 512 IF S$="T" THEN KK=TT/N ELSE KK=N/TT
- 513 COUNT=0:PRINT HEAD$:PRINT
- 514 J=COUNT+TMIN
- 515 PRINT USING DISP$;J,KK*J,X(J,K),X(J,K+1)
- 516 COUNT=COUNT+1
- 517 IF COUNT MOD 20=0 THEN GOTO 519
- 518 IF COUNT+TMIN>TMAX THEN GOTO 530 ELSE GOTO 514
- 519 PRINT:PRINT "Press 'Q' to quit, any other key to go on";
- 520 Q$=INKEY$:IF Q$="" THEN GOTO 520
- 521 IF Q$="Q" OR Q$="q" THEN GOTO 5000 ELSE PRINT HEAD$:PRINT
- 522 GOTO 518
- 530 PRINT "Press any key to continue";
- 540 Q$=INKEY$:IF Q$="" THEN GOTO 540
- 550 GOTO 5000
- 560 PRINT J+K-G-1;TAB(6)X(J+K,0);TAB(25)X(J+K,1)
- 570 NEXT K
- 580 PRINT: PRINT "PRESS 'Q' TO QUIT, ANY OTHER KEY TO CONTINUE"
- 581 D$=INPUT$(1): IF D$="Q" THEN GOTO 270
- 582 PRINT:NEXT J
- 590 GOTO 270
- 600 REM ********** CALCULATE SINE, COSINE ****************
- 610 D=0:GOSUB 2480
- 620 X(1,2)=X(1,0):X(1,4)=X(1,1)
- 630 FOR I=2 TO N/2
- 640 X(I,2)=X(I,0)+X(N+2-I,0)
- 650 X(I,3)=X(N+2-I,1)-X(I,1)
- 660 X(I,4)=X(N+2-I,1)+X(I,1)
- 670 X(I,5)=X(I,0)-X(N+2-I,0)
- 680 NEXT I
- 690 REM ******* PRINT SIN/COS OF FIND MAG ***********
- 700 IF X=5 GOTO 880
- 710 PRINT:PRINT "REAL PART SINE, COSINE":PRINT
- 720 FOR J=0 TO N/2 STEP 10
- 730 PRINT "N" TAB(6)"COSINE" TAB(25)"SINE":PRINT
- 740 FOR K=1 TO 10
- 750 IF J+K>N/2 GOTO 270
- 760 PRINT J+K-1 TAB(6)X(J+K,2) TAB(25)X(J+K,3)
- 770 NEXT K
- 780 GET E$:PRINT:NEXT J
- 790 PRINT:PRINT "IMAG PART, SINE, COSINE:P":PRINT
- 800 FOR J=0 TO N/2 STEP 10
- 810 PRINT "N" TAB(6)"COSINE"TAB(325)"SINE":PRINT
- 820 FOR K=1 TO 10
- 830 IF J+K>N/2 GOTO 850
- 840 PRINT J+K-1 TAB(6)X(J+K),4)TAB(25,)X(J+K,5)
- 850 NEXT K
- 860 PRINT:INPUT "PRESS <RET> TO CONTINUE:";D$:PRINT:NEXT J:GOTO 270
- 870 REM ******** EMD SINE COSINE ROUTINE **********
- 880 REM ****** ** START AMPLITUDE, PHASE **********
- 890 FOR I=1 TO N/2
- 900 V=SQR(X(I,2)^2+X(I,3)^2)
- 910 EW=DQSQR(X(I,4)^2+X(I,5)^2)
- 920 IF ABS(X(I,2))<1E-12 THEN X(I,2)=1E-12
- 930 IF ABS(X(I,4))<1E-12 THEN X(I,4)=1E-12
- 940 Y=ATN(X(I,3)/X(I,2))*57.2958
- 950 IF X(I,2)<0 AND X(I,3)>0 THEN Y=Y+180
- 960 IF X(I,2)<0 AND X(I,3)<0 THEN Y=Y-180
- 970 X(I,2)=V:X(I,3)=Y
- 980 Y=ATN(X(I,5)/X(I,4))*57.2958
- 990 IF X(I,4)<0 AND X(I,5)>0 THEN Y=Y+180
- 1000 IF X(I,4)<0 AND X(I,5)<0 THEN Y=Y-180
- 1010 X(I,4)=W:X(I,5)=Y
- 1020 NEXT I
- 1030 PRINT CHR$(26):PRINT:PRINT "MAGNITUDE AND PHASE":PRINT
- 1040 PRINT "REAL PART":PRINT
- 1050 FOR J=0 TO N/2 STEP 10
- 1060 PRINT "N" TAB(6)"MAG" TAB(25) "PHASE":PRINT
- 1070 FOR K=1 TO 10
- 1080 IF J+K>N/2 GOTO 1100
- 1090 PRINT J+K-1 TAB(6)X(J+K,2) TAB(25)X(J+K,3)
- 1100 NEXT K
- 1110 PRINT:INPUT "PRESS <RET> TO CONTINUE";D$:PRINT:NEXT J
- 1120 PRINT: PRINT "IMAGINARY PART::":PRINT
- 1130 FOR J=0 TO N/2 STEP 10
- 1140 PRINT "N" TAB(6) "MAG" TAB(25) "PHASE":PRINT
- 1150 FOR K=1 TO 10
- 1160 IF J+K>N/2 GOTO 1180
- 1170 PRINT J+K-1 TAB(6) X(J+K,4) TAB(25) X(J+K,5)
- 1180 NEXT K
- 1190 PRINT:INPUT "PRESS <RET> TO CONTINUE";D$:PRINT:NEXT J
- 1200 GOTO 270
- 1210 REM ******* END MAG,PHASE ******
- 1220 REM ****** OUTPUT DATA FILE ****
- 1230 PRINT CHR$(26):PRINT:PRINT "INSTRUCTIONS TO SAVE DATA IN DATA FILE"
- 1240 PRINT "SAVE X OR MAGNITUDE OR PHASE":PRINT
- 1250 PRINT "X IS X(N),X(K) , SPEC.,CONV.,CORR.":PRINT
- 1260 PRINT "0=X(I,0) REAL"
- 1270 PRINT "1=X(I,1) IMAGINARY"
- 1280 PRINT "2=MAGNITUDE, REAL PART"
- 1290 PRINT "3=PHASE, REAL PART"
- 1300 PRINT "4=MAGNITUDE, IMAGINARY PART"
- 1310 PRINT "5=PHASE, IMAGINARY PART"
- 1320 INPUT R
- 1330 Q=1
- 1340 IF R>1 THEN Q=2
- 1350 DIM A(N/Q)
- 1360 FOR I=1 TO N/Q:A(I)=X(I,R):NEXT
- 1370 INPUT "NAME OF FILE TO SAVE DATA";F$
- 1371 OPEN "O",1,F$
- 1372 FOR I=1 TO N/Q
- 1373 PRINT #1,A(I)
- 1374 NEXT I
- 1375 CLOSE #1
- 1380 PRINT CHR$(13):PRINT "DATA FILED"
- 1390 GOTO 270
- 1400 REM ********* END DATA OUTPUT ************
- 1440 REM ******** SMOOTHING ************
- 1450 PRINT:PRINT "Sequence Smoothing":PRINT
- 1451 INPUT "Sequence to Smooth (1/2)";S
- 1452 IF S=1 THEN S=0:GOTO 1460
- 1453 IF S=2 THEN GOTO 1460
- 1454 PRINT "Sequence 1 or 2 only!":GOTO 1451
- 1460 PRINT "Type 1 for Low-Pass"
- 1470 PRINT "Type 2 for High-Pass"
- 1480 INPUT Z:Z=INT(Z)
- 1481 IF Z<1 OR Z>2 THEN GOTO 1460
- 1482 IF S=0 AND Z=1 THEN SMO1$="Low-Pass"
- 1483 IF S=0 AND Z=2 THEN SMO1$="High-Pass"
- 1484 IF S=2 AND Z=1 THEN SMO2$="Low-Pass"
- 1485 IF S=2 AND Z=2 THEN SMO2$="High-Pass"
- 1486 A$="Smoothing"
- 1490 ON Z GOTO 1500, 1590
- 1500 X(1,5)=.25*X(N,S)+.5*X(I1,S)+.25*X(2,S)
- 1510 X(N,5)=.25*X(N-1,S)+.5*X(1,S)+.25*X(2,S)
- 1520 FOR J=2 TO N-1:X(J,5)=.25*X(J-1,S)+.5*X(J,S)+.25*X(J+1,S):NEXT
- 1530 FOR J=1 TO N:X(J,S)=X(J,5):NEXT
- 1540 X(1,T5)=.25*X(N,S+1)+.5*JX(1,S+1)+.25*X(2,S+1)
- 1550 X(N,5)=.25*X(N-1,S+1)+.5*X(N,S+1)+.25*X(1,S+1)
- 1560 FOR J=2 TO N-1:X(J,5)=.25*X(J-1,S)+.5*X(J,S+1)+.25*X(J+1,S+1):NEXT J
- 1570 FOR J=1 TO N:X(J,S+1)=X(J,5):NEXT J
- 1575 GOSUB 4000
- 1580 GOTO 5000
- 1590 X(1,5)=-.25*X(N,S)+.5*X(1,S)-.25*X(2,S)
- 1600 X(N,5)=-.25*X(N-1,S)+.5*X(N,S)-.25*X(1,S)
- 1610 FOR J=2 TO N-1:X(J,5)=-.25*X(J-1,S+1)+.5*X(J,S)-.25*X(J+1,S):NEXT
- 1620 FOR J=1 TO N:X(J,S)=X(J,5):NEXT J
- 1630 X(1,5)=-.25*X(N,S+1)+.5*X(1,S+1)-.25*X(2,S+1)
- 1640 X(N,5)=-.25*X(N-1,S+1)+.5*X(N,S+1)-.25*X(2,S+1)
- 1650 FOR J=2 TO N-1:X(J,5)=-.25*X(J-1,S+1)+.5*X(J,S+1)-.25*X(J+1,S+1):NEXT J
- 1660 FOR J=1 TO N:X(J,S+1)=X(J,5):NEXT J
- 1665 GOSUB 4000
- 1670 GOTO 5000
- 1680 REM ******** WINDOWING ************
- 1690 PRINT:PRINT: PRINT "Sequence Window":PRINT
- 1691 INPUT "Sequence to Window (1/2)";S
- 1692 IF S=1 THEN S=0:GOTO 1700
- 1693 IF S=2 THEN GOTO 1700
- 1694 PRINT "Sequence 1 or 2 only!":GOTO 1691
- 1700 PRINT "Type 1 FOR Hanning"
- 1710 PRINT "Type 2 FOR Hamming"
- 1720 INPUT Q
- 1721 Q=INT(Q):IF Q<1 THEN GOTO 1700
- 1722 IF Q>2 THEN GOTO 1700
- 1723 IF Q=1 AND S=0 THEN WIN1$="Hanning"
- 1724 IF Q=2 AND S=0 THEN WIN1$="Hamming"
- 1725 IF Q=1 AND S=2 THEN WIN2$="Hanning"
- 1726 IF Q=2 AND S=2 THEN WIN2$="Hamming"
- 1727 A$="Windowing"
- 1730 IF Q=2 THEN Q=.8519
- 1740 FOR I=1 TO N
- 1750 X(I,S)=X(I,S)*(1-Q*COS(2*PI*(I-1)/N))
- 1760 X(I,S+1)=X(I,S+1)*(1-Q*COS (2*PI*(I-1)/N))
- 1770 NEXT I
- 1771 GOSUB 4000
- 1780 GOTO 5000
- 1790 REM ******** POWER SPECTRUM ***********
- 1800 REM ******* AUTO SPEC. USE X(I,0),X(I,1) ***********
- 1810 REM ****** CROSS SPEC. USE X(I,0),X(I,1) AND X(I,2),X(I,3) ********
- 1820 PRINT CHR$(26):PRINT:PRINT "TWO-SIDED POWER SPECTRUM":PRINT
- 1830 PRINT "TYPE 1 FOR SPECTRUM OF SEQUENCE ONE"
- 1840 PRINT "TYPE 2 FOR SPECTRUM OF SEQUENCE TWO"
- 1850 PRINT "TYPE 3 FOR CROSS SPECTRUM"
- 1860 INPUT F:PRINT
- 1870 ON F GOTO 1890,1880,1920
- 1880 FOR I=1 TO N: X(I,0)=X(I,2):X(I,1)=X(I,3):NEXT
- 1890 D=0:GOSUB 2480
- 1900 FOR I=1 TO N:X(I,0)=X(I,0)*X(I,0)+X(I,1)*X(I,1):X(I,1)=0:NEXT
- 1910 PRINT:PRINT "AUTOSPECTRUM":PRINT:GOTO 1980
- 1920 FOR I=1 TO N:X(I,4)=X(I,0):X(I,5)=X(I,1):X(I,0)=X(I,2):X(I,1)=X(I,3):NEXT
- 1930 D=0:GOSUB 2480
- 1940 FOR I=1 TO N:X(I,2)=X(I,0):X(I,3)=X(I,1):X(I,0)=X(I,4):X(I,1)=X(I,5):NEXT
- 1950 D=0:GOSUB 2480
- 1960 FOR I=1 TO N:X(I,4)=X(I,0)*X(I,2)+X(I,1)*X(I,3):X(I,5)=X(I,1)*X(I,2)-X(I,0)*X(I,3):X(I,0)=X(I,4):X(I,1)=X(I,5):NEXT
- 1970 PRINT:PRINT "CROSS SPECTRUM":PRINT
- 1980 PRINT "TYPE 3 TO LIST POWER SPECTRUM":PRINT:GOTO 290
- 1990 REM ******* CORRELATION *************
- 2000 PRINT CHR$(26):PRINT:PRINT "CORRELATION"
- 2010 PRINT: PRINT "FOR LINEAR CORRELATION, DOUBLE THE VALUE OF N AND FILL IN ";"ZEROS FROM N/2 TO N-1 IN X(N) BEFORE PROCEEDING"
- 2020 PRINT:PRINT "TYPE 1 FOR AUTOCORRELATION OF SEQUENCE X(N) IN X(I,0),X(I,1)"
- 2030 PRINT "TYPE 2 FOR AUTOCORRELATION OF SEQUENCE X(N) IN X(I,2),X(I,3)."
- 2040 PRINT "TYPE 3 FOR CROSS-CORRELATION"
- 2050 INPUT C
- 2060 PRINT:PRINT "TYPE 1 FOR CORRELATION:"
- 2070 PRINT "TYPE 2 FOR COVARIANCE."
- 2080 INPUT Q
- 2090 PRINT:PRINT "TYPE 1 IF LINEAR"
- 2100 PRINT "TYPE 2 IF CIRCULAR"
- 2110 INPUT E1
- 2120 IF Q=2 THEN GOSUB 2280
- 2130 ON C GOTO 2150,2140,2160
- 2140 FOR I=1 TO N:X(I,0)=X(I,2):X(I,1)=X(I,3):NEXT
- 2150 D=0:GOSUB 2480:GOSUB 2200:D=1:GOSUB 2480:GOSUB 2210:GOTO 2170
- 2160 D=0:GOSUB 2480:GOSUB 2260:D=0:GOSUB 2480:GOSUB 2270:D=1:GOSUB 2480:GOSUB 2210
- 2170 PRINT: ON Q GOTO 2180,2190
- 2180 PRINT "TYPE 3 TO LIST CORRELATION":PRINT:GOTO 290
- 2190 PRINT "TYPE 3 TO LIST COVARIANCE":PRINT:GOTO 290
- 2200 FOR I=1 TO N:X(I,0)=X(I,0)^2+X(I,1)^2:X(I,1)=0:NEXT
- 2210 IF E1=2 GOTO 2250
- 2220 FOR I=1 TO N:X(I,0)=X(I,0)*2:X(I,1)=X(I,1)*2:NEXT
- 2230 FOR I=1 TO N/2:X(I+N/2,4)=X(I,0):X(I,4)=X(I+N/2,0):X(I+N/2,5)=X(I,1):X(I,5)=X(I+N/2,1):NEXT
- 2240 FOR I=1 TO N:X(I,0)=X(I,4):X(I,1)=X(I,5):NEXT
- 2250 RETURN
- 2260 FOR I=1 TO N:X(I,4)=X(I,0):X(I,5)=X(I,1):X(I,0)=X(I,2):X(I,1)=X(I,3):NEXT:RETURN
- 2270 FOR I=1 TO N:X(I,2)=X(I,0)*X(I,4)+X(I,1)*X(I,5):X(I,3)=X(I,0)*X(I,5)-X(I,1)*X(I,4):X(I,0)=X(I,2):X(I,1)=X(I,3):NEXT:RETURN
- 2280 U=N/(3-E1):AA=0:BB=0:CC=0:DD=0
- 2290 FOR I=1 TO U:AA=AA+X(I,0):BB=BB+X(I,1):CC=CC+X(I,2):DD=DD+X(I,3):NEXT
- 2300 FOR I=1 TO U:X(I,0)=X(I,0)-AA/U:X(I,1)=X(I,1)-BB/U:X(I,2)=X(I,2)-CC/U:X(I,3)=X(I,3)=-DD/U:NEXT:RETURN
- 2310 REM ********* CONVOLUTION ************
- 2320 PRINT CHR$(26):PRINT:PRINT "CONVOLUTION":PRINT
- 2330 PRINT "SEQUENCE 1 IN X(I,0),X(I,1)"
- 2340 PRINT "SEQUENCE 2 IN X(I,3),X(I,4)":PRINT
- 2350 PRINT "FOR LINEAR CONVOLUTION, DOUBLE THE VALUE OF N AND ";"ARGUMENT WITH ZEROS IN BOTH SEQUENCES"
- 2360 PRINT:PRINT "TYPE 1 IF LINEAR"
- 2370 PRINT "TYPE 2 IF CIRCULAR"
- 2380 INPUT QQ
- 2390 D=0:GOSUB 2480:GOSUB 2440:GOSUB 2480:GOSUB 2450:D=1:GOSUB 2480:GOSUB 2460
- 2400 PRINT:PRINT TYPE 1 TO "TYPE 1 TO MULTIPLY FOR N"
- 2410 GET A$:PRINT A$
- 2420 IF A$="1" THEN: FOR I=1 TO N:X(I,0)=X(I,0)*N:X(I,1)=X(I,1)*N:NEXT
- 2430 PRINT:PRINT "TYPE 3 TO LIST CONVOLUTION OF X(1,N) AND X2(N).":PRINT:GOTO 290
- 2440 FOR I=1 TO N:X(I,4)=X(I,0):X(I,5)=X(I,1):X(I,0)=X(I,2):X(I,1)=X(I,3):NEXT:RETURN
- 2450 FOR I=1 TO N:X(I,2)=X(I,0)*X(I,4)-X(I,1)*X(I,5):X(I,3)=X(I,0)*X(I,5)+X(I,4)*X(I,1):X(I,0)=X(I,2):X(I,1)=X(I,3):NEXT:RETURN
- 2460 IF QQ=1 THEN: FOR I=1 TO N:X(I,0)=2*X(I,0):X(I,1)=2*X(I,1):NEXT:RETURN
- 2470 RETURN
- 2480 REM ***** FFT ROUTINE, COMPLEX DATA ARRAY ******
- 2490 REM ****** X(I,0) REAL, X(I,1) IMAGINARY ******
- 2500 REM ****** D=0, FORWARD. D-=1, REVERSE **********
- 2505 REM ****** S=0, SEQUENCE 1. S=2, SEQUENCE 2 **********
- 2510 N2=N/2:N1=N-1:J=1
- 2520 FOR I=1 TO N1
- 2530 IF I>=J THEN 2550
- 2540 T1=X(J,S):T2=X(J,S+1):X(J,S)=X(I,S):X(J,S+1)=X(I,S+1):X(I,S)=T1:X(I,S+1)=T2
- 2550 K=N2
- 2560 IF K>=J THEN 2590
- 2570 J=J-K:K=K/2
- 2580 GOTO 2560
- 2590 J=J+K
- 2600 NEXT I
- 2610 S1=-1
- 2620 IF D=0 THEN 2640
- 2630 S1=1
- 2640 FOR L=1 TO M
- 2650 L1=2^L:L2=L1/2:U1=1:U2=0:W1=COS(PI/L2):W2=S1*SIN(PI/L2)
- 2660 FOR J=1 TO L2
- 2670 FOR I=J TO N STEP L1
- 2680 I1=I+L2
- 2690 V1=X(I1,S)*U1-X(I1,S+1)*U2:V2=X(I1,S+1)*U1+X(I1,S)*U2
- 2700 X(I1,S)=X(I,S)-V1:X(I1,S+1)=X(I,S+1)-V2:X(I,S)=X(I,S)+V1:X(I,S+1)=X(I,S+1)+V2
- 2710 NEXT I
- 2720 U3=U1:U4=U2:U1=U3*W1-U4*W2:U2=U4*W1+U3*W2
- 2730 NEXT J,L
- 2740 IF D=1 THEN 2760
- 2750 FOR I=1 TO N:X(I,S)=X(I,S)/N:X(I,S+1)=X(I,S+1)/N:NEXT
- 2760 RETURN
- 2770 PRINT:PRINT "END":END
- 3000 ' File Handling Routines - R. B. Kolbly 3-6-85
- 3010 ' Load a file into array
- 3020 INPUT "Name of file to load (<cr> for directory)";F$
- 3030 IF LEN(F$)=0 THEN FILES:GOTO 3020
- 3040 IF RIGHT$(F$,1)=":" AND LEN(F$)=2 THEN FILES F$:GOTO 3020
- 3050 INPUT "Sequence to load";S$:S=INT(VAL(S$))
- 3060 IF S=1 THEN K=0:GOTO 3090
- 3070 IF S=2 THEN K=2:GOTO 3090
- 3080 PRINT "Sequence 1 or 2 only!":GOTO 3050
- 3090 INPUT "Real or imaginary part (R/I)";S$:S$=LEFT$(S$,1)
- 3100 IF S$="R" OR S$="r" THEN GOTO 3130
- 3110 IF S$="I" OR S$="i" THEN K=K+1:GOTO 3130
- 3120 GOTO 3090
- 3125 OPEN "I",#1,F$
- 3130 FOR J=0 TO N
- 3140 IF EOF(1) THEN 3160
- 3150 INPUT #1,D,X(N,K):GOTO 3170
- 3160 NULL=NULL+1
- 3170 NEXT J
- 3180 IF EOF(1) AND NULL=0 THEN GOTO 3270
- 3190 IF NULL=0 THEN GOTO 3230
- 3200 PRINT "The number of data points in the file did not fill the array."
- 3210 PRINT USING "The last ### points were loaded with zero";NULL
- 3220 GOTO 3270
- 3230 INPUT #1,D,E:NULL=NULL+1
- 3240 IF EOF(1) THEN 3260
- 3250 GOTO 3230
- 3260 PRINT USING "File longer than array by ### elements!";NULL
- 3270 CLOSE #1:A$="Loaded "+F$
- 3280 GOSUB 4000
- 3290 RETURN
- 3500 ' Save data in file compatable with PC-PLOT. Data are
- 3510 ' automatically scaled to the time/frequency values used.
- 3520 INPUT "Name of file to save data";F$
- 3530 IF RIGHT$(F$,1)=":" AND LEN(F$)=2 THEN FILES F$:GOTO 3520
- 3540 IF LEN(F$)=0 THEN FILES:GOTO 3520
- 3550 INPUT "Sequence to save (1/2)";S$:S$=INT(VAL(LEFT$(S$,1)))
- 3560 IF S=1 THEN K=0:GOTO 3590
- 3570 IF S=2 THEN K=2:GOTO 3590
- 3580 PRINT "Sequence 1 or 2 only!":GOTO 3550
- 3590 INPUT "Real or Imaginary (R/E) component";S$:S$=LEFT$(S$,1)
- 3600 IF S$="R" OR S$="r" THEN GOTO 3630
- 3610 IF S$="I" OR S$="i" THEN K=K+1:GOTO 3630
- 3620 GOTO 3590
- 3630 IF K<3 THEN STATE=STATE1 ELSE STATE=STATE2
- 3635 OPEN "O",#1,F$
- 3640 FOR J=0 TO N
- 3650 IF STATE=0 THEN X1=J*T/N ELSE X1=J*N/T
- 3660 WRITE #1,X1,X(J,K)
- 3670 NEXT J
- 3680 CLOSE #1:A$="Saved Seq "+STR$(S)+" in "+F$
- 3690 GOSUB 4000
- 3700 RETURN
- 4000 IF S>=2 THEN GOTO 4060:' MAINTAIN ACTION ARRAY
- 4010 FOR J=4 TO 0 STEP -1
- 4020 A$(J+1)=A$(J)
- 4030 NEXT J
- 4040 A$(0)=A$
- 4050 GOTO 4100:' RETURN
- 4060 FOR J=4 TO 0 STEP -1
- 4070 B$(J+1)=B$(J)
- 4080 NEXT J
- 4090 B$(0)=A$:' RETURN
- 4100 FOR J=0 TO 3
- 4110 MMX(0,J)=X(0,J):' Minimum Values
- 4120 MMX(1,J)=X(1,J):' Maximum values
- 4130 NEXT J
- 4140 FOR J=1 TO N
- 4150 FOR K=0 TO 3
- 4160 IF X(J,K)<MMX(0,K) THEN MMX(0,K)=X(J,K)
- 4170 IF X(J,K)>MMX(1,K) THEN MMX(1,K)=X(J,K)
- 4180 NEXT K
- 4190 NEXT J
- 4200 RETURN
- 5000 ' MENU DISPLAY SUBROUTINE
- 5010 CLS:KEY OFF:LOCATE 1,20:PRINT "Lockheed-California Co. Signal Analyzer"
- 5020 LOCATE 2,22:PRINT "by Richard B. Kolbly, Dept. 72-52"
- 5030 LOCATE 4,33:PRINT USING "#### Steps";N
- 5040 LOCATE 5,6:PRINT "Sequence #1":LOCATE 5,52:PRINT "Sequence #2"
- 5050 LOCATE 7,7:PRINT "Source:":LOCATE 7,53:PRINT "Source:"
- 5060 LOCATE 7,18:PRINT F1$:LOCATE 7,65:PRINT F2$
- 5070 LOCATE 8,7:PRINT "State:":LOCATE 8,53:PRINT "State:"
- 5080 LOCATE 8,18:PRINT S1$:LOCATE 8,65:PRINT S2$
- 5090 LOCATE 9,7:PRINT "Windowing:":LOCATE 9,53:PRINT "Windowing:"
- 5100 LOCATE 9,18:PRINT WIN1$:LOCATE 9,65:PRINT WIN2$
- 5110 LOCATE 10,7:PRINT "Smoothing:":LOCATE 10,53:PRINT "Smoothing:"
- 5120 LOCATE 10,18:PRINT SMO1$:LOCATE 10,65:PRINT SMO2$
- 5130 LOCATE 12,11:PRINT " Real Imaginary"
- 5140 LOCATE 12,56:PRINT " Real Imaginary"
- 5150 LOCATE 14,1: PRINT USING "Maximum ##.##^^^^ ##.##^^^^";MMX(1,0),MMX(1,1)
- 5160 LOCATE 14,46:PRINT USING "Maximum ##.##^^^^ ##.##^^^^";MMX(1,2),MMX(1,3)
- 5170 LOCATE 15,1: PRINT USING "Minimum ##.##^^^^ ##.##^^^^";MMX(0,0),MMX(0,1)
- 5180 LOCATE 15,46:PRINT USING "Minimum ##.##^^^^ ##.##^^^^";MMX(0,2),MMX(0,3)
- 5190 FOR J=0 TO 5
- 5200 LOCATE 17+J,7:PRINT A$(J)
- 5210 LOCATE 17+J,52:PRINT B$(J)
- 5220 NEXT J
- 5230 Q$=INKEY$:IF Q$="" THEN GOTO 5230
- 5240 GOTO 270