home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
HAM Radio 1
/
HamRadio.cdr
/
tech
/
design2
/
sabinfix.asc
< prev
next >
Wrap
Text File
|
1986-10-29
|
18KB
|
432 lines
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