home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
HAM Radio 1
/
HamRadio.cdr
/
tech
/
design3
/
filplt.bas
< prev
next >
Wrap
BASIC Source File
|
1979-12-31
|
10KB
|
269 lines
10 REM FILPLT.BAS FILTER GAIN AND PHASE RESPONSE
20 REM EMMY DENTON 7/28/84
30 DIM AP(3,200):DIM B(40):DIM FO(40):DIM JMPV(40):DIM Q(40):DIM FIL$(8)
40 DIM FZ(40):DIM DF(40):DIM QZ(40):DIM DQ(40)
50 HZ$=" Hz":KHZ=0
60 FIL$(1)="HIGHPASS":FIL$(2)="LOWPASS":FIL$(3)="HIGHPASS":FIL$(4)="LOWPASS":FIL$(5)="BANDPASS":FIL$(6)="ALLPASS":FIL$(7)="NOTCH"
70 INPUT "Is filter design on file (ENTER Y OR N)";FDES$
80 IF FDES$="Y" OR FDES$="y" THEN 120
90 IF FDES$="N" OR FDES$="n"THEN 100 ELSE GOTO 70
100 N1=0:NU2=0:NZ=0:GOSUB 2040
110 GOTO 130
120 N1=0:NU2=0:NZ=0:GOSUB 1410
130 PRINT"Enter the starting frequency of the response in "HZ$; :INPUT FS
140 PRINT"Enter the ending frequency of the response in "HZ$;:INPUT FE
150 PRINT"Would you like linear or logarithmic steps (Enter lin or log)";:INPUT A$
160 IF A$="LIN" OR A$="LOG" OR A$="lin" OR A$="log" THEN GOTO 180
170 GOTO 150
180 PRINT"How many steps would you like in the response";:INPUT ST
190 IF ST<=0 THEN GOTO 180
200 ST=ST+1
210 PRINT"Would you like the gain response normalized to 1 at a particular frequency?"
220 PRINT "If YES then enter the frequency, in " HZ$ ", if not enter N";:INPUT NORM$
230 NORM=VAL(NORM$)
240 IF NORM$="N" OR NORM$="n" THEN NORM=-1:GOTO 270
250 IF ASC(NORM$)=48 OR NORM>0 THEN 270
260 GOTO 210
270 GOSUB 2530
280 GOSUB 810
290 GOSUB 1350
300 REM
310 FOR N=1 TO N1+NU2
320 W=6.28318*FS:WO=6.28318*FO(N):Q=Q(N)
330 IF N>N1 THEN WZ=6.28318*FZ(N-N1)
340 ON JMPV(N) GOSUB 910,930,950,970,990,1010,1030
350 NEXT N
360 NORML=NORML+1
370 IF NORM>=0 AND NORML=1 THEN FSN=FS:FS=NORM:GOTO 310
380 IF NORML=2 AND NORM>=0 THEN FS=FSN
390 NORML=0
400 I=0:I2=0:ST2=0
410 IF ST=ST2 THEN 530
420 I2=1+I2
430 IF ST>I2*20 THEN ST2=I2*20:I=(ST2-19):GOTO 450
440 ST2=ST:I=((I2-1)*20)+1
450 FOR N=I TO ST2
460 PRINT"FREQ="AP(3,N) HZ$ TAB( 25)"GAIN="AP(1,N)"DB"TAB( 50)"PHASE="AP(2,N)"DEG"
470 NEXT N
480 IF ST=ST2 AND ST2-I<17 THEN 530
490 IF NORM>=0 THEN PRINT "FILTER RESPONSE NORMALIZED AT "NORM HZ$ " "AMPN"dB."
500 PRINT"PRESS RETURN TO CONTINUE WITH OUTPUT OR E TO END OUTPUT";:INPUT V$
510 IF V$="E" OR V$="e" THEN 530
520 GOTO 410
530 REM
540 IF NORM>=0 THEN PRINT "FILTER RESPONSE NORMALIZED AT "NORM HZ$ " "AMPN"dB."
550 PRINT"FILTER RESPONSE COMPLETE ....."
560 PRINT" PRESS P - PRINT RESPONSE ON LINE PRINTER"
570 PRINT" V - VIEW RESPONSE AGAIN"
580 PRINT" D - DESIGN ANOTHER FILTER"
590 PRINT" E - END(EXIT TO OPERATING SYSTEM)"
600 PRINT" R - RERUN FILTER RESPONSE"
610 INPUT V$
620 IF V$="E" OR V$="e" THEN SYSTEM
630 IF V$="D" OR V$="d" THEN RUN "FILDES.EXE"
640 IF V$="P" OR V$="p" THEN I=0:I2=0:ST2=0:GOTO 680
650 IF V$="V" OR V$="v" THEN ST2=0:I=0:I2=0:GOTO 410
660 IF V$="r" OR V$="R" THEN ST=ST-1:GOTO 1720
670 GOTO 530
680 REM PRINT ROUTINE
690 LPRINT
700 LPRINT:LPRINT:LPRINT
710 IF ST=ST2 THEN 530
720 I2=I2+1
730 IF ST>I2*60 THEN ST2=I2*60:I=(ST2-59):GOTO 760
740 ST2=ST:I=(I2*60)-59
750 IF NORM>=0 THEN LPRINT "FILPTER RESPONSE NORMALIZED AT "NORM HZ$ " "AMPN"dB"
760 FOR N=I TO ST2
770 LPRINT "FREQ="AP(3,N) HZ$ TAB( 25)"GAIN="AP(1,N)"DB"TAB( 50)"PHASE="AP(2,N)"DEG"
780 NEXT N
790 IF N=I2*60 THEN LPRINT CHR$(12)
800 GOTO 700
810 REM lin/log
820 IF A$="log" OR A$="LOG" THEN GOTO 870
830 IF A$="lin" OR A$="LIN" THEN GOTO 850
840 GOTO 150
850 SS=6.28318*(FE-FS)/(ST-1):B=1
860 GOTO 900
870 B=0
880 IF FS=0 THEN FS=.1
890 SS=(FE/FS)^(1/(ST-1))
900 RETURN
910 A1=0:A2=1:A3=0:B1=0:B2=1:B3=WO
920 GOTO 1040
930 A1=0:A2=0:A3=WO:B1=0:B2=1:B3=WO
940 GOTO 1040
950 A1=1:A2=0:A3=0:B1=1:B2=WO/Q:B3=WO^2
960 GOTO 1040
970 A1=0:A2=0:A3=WO^2:B1=1:B2=WO/Q:B3=A3
980 GOTO 1040
990 A1=0:A2=WO/Q:A3=0:B1=1:B2=A2:B3=WO^2
1000 GOTO 1040
1010 A1=1:A2=-WZ/QZ:A3=WZ^2:B1=1:B2=WO/Q:B3=WO^2
1020 GOTO 1040
1030 A1=1:A2=0:A3=WZ^2:B1=1:B2=WO/Q:B3=WO^2
1040 IF NORML=1 THEN 1060
1050 FOR NO=1 TO ST
1060 W2=W^2:A4=A3-A1*W2:B4=B3-B1*W2
1070 R=A4*B4+A2*B2*W2
1080 IF R=0 THEN R=1E-09
1090 I=(A2*B4-B2*A4)*W
1100 IF I=0 THEN I=1E-09
1110 D=B4^2+(B2^2)*W2
1120 AMP=((R^2+I^2)^.5)/D
1130 IF REGY=3 THEN 1150
1140 IF WZ>WO AND JMPV(N)=7 THEN AMP=B3/A3*AMP
1150 AMPD=20*.43429*LOG(AMP)
1160 IF NORML=1 THEN 2010
1170 IF R=0 AND I>0 THEN PH=1.5708:GOTO 1210
1180 IF R=0 AND I<0 THEN PH=-1.5708:GOTO 1210
1190 RAD=I/R
1200 PH=ATN(RAD)
1210 PHA=PH
1220 IF R<0 AND I>0 THEN PHA=3.1415+PH
1230 IF R<0 AND I<0 THEN PHA=-3.1415-PH
1240 IF PHA>3.14159 THEN PHA=PHA-3.14159
1250 IF PHA<-3.14159 THEN PHA=PHA+3.14159
1260 PHA=PHA*180/3.14159
1270 AP(1,NO)=AP(1,NO)+AMPD:REM PRINT AP(1,NO)
1280 AP(2,NO)=AP(2,NO)+PHA:REM PRINT AP(2,NO)
1290 AP(3,NO)=W/6.28318:REM PRINT AP(3,NO)
1300 IF B=0 THEN W=W*SS:GOTO 1330
1310 IF B=1 THEN W=W+SS:GOTO 1330
1320 PRINT"ERROR IN B"
1330 NEXT NO
1340 RETURN
1350 FOR X=1 TO ST
1360 FOR Y=1 TO 3
1370 AP(Y,X)=0
1380 NEXT Y
1390 NEXT X
1400 RETURN
1410 OPEN "I",1,"PLTDATA"
1420 INPUT #1,REGY,T,NUMB
1430 FOR I=1 TO NUMB
1440 INPUT #1,DF(I),DQ(I)
1450 NEXT I
1460 CLOSE 1
1470 N1=0:NU2=0:NZ=0
1480 FOR I=1 TO NUMB
1490 IF DQ(I)=O THEN N1=N1+1:FO(N1)=DF(I):GOTO 1520
1500 IF DQ(I)<0 THEN NZ=NZ+1:FZ(NZ)=DF(I):GOTO 1520
1510 NU2=NU2+1
1520 NEXT I
1530 FOR I=1 TO NUMB
1540 IF DQ(I)<=0 THEN 1570
1550 Q(I+N1)=DQ(I):FO(N1+I)=DF(I)
1560 NEXT I
1570 FOR I=1 TO N1+NU2
1580 IF N1=0 OR N1<I THEN 1620
1590 IF REGY=1 THEN JMPV(I)=2:GOTO 1640
1600 IF REGY=2 THEN JMPV(I)=1:GOTO 1640
1610 PRINT"ERROR IN PLTDATA":END
1620 IF NU2=0 THEN 1640
1630 GOSUB 1660
1640 NEXT I
1650 RETURN
1660 IF REGY=1 THEN JMPV(I)=4
1670 IF REGY=2 THEN JMPV(I)=3
1680 IF REGY=3 THEN JMPV(I)=5
1690 IF REGY=4 THEN JMPV(I)=7
1700 IF T=3 AND I<=NZ THEN JMPV(I)=7
1710 RETURN
1720 X=0:NORM2=NORM
1730 PRINT "ENTER ","CURRENT VALUE"
1740 PRINT " FS - STARTING FREQUENCY OF RESPONSE",FS, HZ$
1750 PRINT " FE - ENDING FREQUENCY OF RESPONSE",FE, HZ$
1760 PRINT " ST - LINear OR LOGarithmic RESPONSE",A$
1770 PRINT " NU - NUMBER OF STEPS IN RESPONSE",ST
1780 PRINT " FN - FREQUENCY OF NORMALIZATION",;
1790 IF NORM2>=0 THEN PRINT NORM2 HZ$ ELSE PRINT
1800 PRINT " A - CHANGE ALL PARAMETERS"
1810 PRINT " E - END OF CHANGES"
1820 INPUT V$
1830 IF V$="A" OR V$="a" THEN 60
1840 IF V$="FN" OR V$="fn" THEN 1850 ELSE GOTO 1870
1850 PRINT "ENTER VALUE IN "HZ$;:INPUT NORM2:X=X^X
1860 IF NORM2<0 GOTO 1850
1870 IF V$="FE" OR V$="fe" THEN PRINT"ENTER VALUE OF ENDING FREQUENCY IN "HZ$;:INPUT FE:X=2
1880 IF V$="FS" OR V$="fs" THEN PRINT"ENTER VALUE OF STARTING FREQUENCY IN "HZ$;:INPUT FS:X=2
1890 IF V$="NU" OR V$="nu" THEN INPUT "ENTER NUMBER OF STEPS IN RESPONSE";ST:X=2
1900 IF V$="ST" OR V$="st" THEN INPUT "ENTER LIN OR LOG";A$:X=2
1910 IF V$="E" OR V$="e" THEN ST=ST+1:GOTO 1930
1920 GOTO 1730
1930 IF X>=2 THEN 1980
1940 IF X=1 AND NORM2><NORM THEN AMPD=-AMPN ELSE GOTO 560
1950 GOSUB 2010
1960 NORML=0:AMPD=0:AMPN=0:NORM=NORM2:X=0:GOTO 360
1970 REM
1980 REM
1990 NORML=0:AMPD=0:AMPN=0:X=0:NORM=NORM2
2000 GOTO 270
2010 FOR N0=1 TO ST:AP(1,N0)=AP(1,N0)-AMPD:NEXT N0
2020 AMPN=AMPN+AMPD
2030 RETURN
2040 PRINT "ENTER:"
2050 PRINT " 1 - SINGLE ORDER LOWPASS"
2060 PRINT " 2 - SINGLE ORDER HIGHPASS"
2070 PRINT " 3 - 2ND ORDER LOWPASS"
2080 PRINT " 4 - 2ND ORDER HIGHPASS"
2090 PRINT " 5 - 2ND ORDER BANDPASS"
2100 PRINT " 6 - 2ND ORDER ALLPASS"
2110 PRINT " 7 - 2ND ORDER NOTCH OR ELLIPTIC LOWPASS,HIGHPASS,BANDPASS"
2120 PRINT " 8 - END OF DATA ENTRY"
2130 INPUT REGY
2140 IF REGY=8 THEN 2300
2150 IF REGY=1 THEN N1=N1+1:JMPV(N1+NU2)=2:Q(N1+NU2)=0:GOTO 2230
2160 IF REGY=2 THEN N1=N1+1:JMPV(N1+NU2)=1:Q(N1+NU2)=0:GOTO 2230
2170 IF REGY=3 THEN NU2=NU2+1:JMPV(N1+NU2)=4:REGY=2:T=4:GOTO 2240
2180 IF REGY=4 THEN NU2=NU2+1:JMPV(N1+NU2)=3:REGY=1:T=4:GOTO 2240
2190 IF REGY=5 THEN NU2=NU2+1:JMPV(N1+NU2)=5:REGY=3:T=4:GOTO 2240
2200 IF REGY=6 THEN NU2=NU2+1:NZ=NZ+1:JMPV(N1+NU2)=6:GOTO 2250
2210 IF REGY=7 THEN NU2=NU2+1:NZ=NZ+1:JMPV(N1+NU2)=7:GOTO 2270
2220 GOTO 2040
2230 PRINT"ENTER THE CUTOFF FREQUENCY IN "HZ$;:INPUT FO(N1+NU2):GOTO 2040
2240 PRINT"ENTER THE CUTOFF FREQUENCY IN "HZ$", AND Q";:INPUT FO(N1+NU2),Q(N1+NU2):GOTO 2040
2250 PRINT"ENTER THE REAL POLE PAIR FREQUENCY(FO) IN "HZ$",Q, ZERO FREQUENCY(FZ) IN "HZ$" AND ZERO Q(QZ):"
2260 INPUT FO(N1+NU2),Q(N1+NU2),FZ(NU2),QZ(NU2):GOTO 2040
2270 PRINT"ENTER THE REAL POLE PAIR FREQUENCY(FO) IN "HZ$",Q AND ZERO FREQUENCY(FZ) IN "HZ$":"
2280 INPUT FO(N1+NU2),Q(N1+NU2),FZ(NU2)
2290 GOTO 2040
2300 FOR N=1 TO N1+NU2
2310 IF JMPV(N)=7 THEN 2340
2320 NEXT N
2330 GOTO 2400
2340 INPUT "What is the overall response type of this elliptic (Enter N-otch, L-owpass, H-ighpass, B-andpass" ;REGY$
2350 IF REGY$="N" OR REGY$="n" THEN REGY=4:GOTO 2400
2360 IF REGY$="L" OR REGY$="l" THEN REGY=2:GOTO 2400
2370 IF REGY$="H" OR REGY$="h" THEN REGY=1:GOTO 2400
2380 IF REGY$="B" OR REGY$="n" THEN REGY=3:GOTO 2400
2390 GOTO 2340
2400 T=3
2410 PRINT "SECTION"TAB( 10)"ORDER"TAB( 20)"TYPE"TAB( 30)"Fo"TAB( 40)"Q"TAB( 50)"Fz"TAB( 60)"Qz"
2420 IF N1>0 THEN 2430 ELSE GOTO 2460
2430 FOR I=1 TO N1
2440 PRINT TAB( 4) I TAB( 11) "1" TAB( 15) FIL$(JMPV(I)) TAB( 29) FO(I) HZ$
2450 NEXT I
2460 IF NU2>0 THEN 2470 ELSE GOTO 2520
2470 FOR I=N1+1 TO N1+NU2
2480 IF JMPV(I)=7 THEN FIL$(8)="ELLIPTIC":N=8:GOTO 2500
2490 N=JMPV(I)
2500 PRINT TAB( 4) I TAB( 11) "2" TAB( 18) FIL$(N) TAB( 29) FO(I) HZ$ TAB( 39) Q(I) TAB( 49) FZ(I-N1) HZ$ TAB( 59) QZ(I-N1)
2510 NEXT I
2520 RETURN
2530 IF FS>1000 OR FE>1000 THEN GOTO 2630
2540 FOR N=1 TO NU2+N1
2550 IF FO(N)>1000 OR FZ(N)>1000 GOTO 2630
2560 NEXT N
2570 IF KHZ=0 THEN HZ$=" Hz":GOTO 2620
2580 IF KHZ=1 THEN HZ$="KHz":GOTO 2620
2590 IF KHZ=2 THEN HZ$="MHz":GOTO 2620
2600 IF KHZ=3 THEN HZ$="GHz":GOTO 2620
2610 IF KHZ>=4 THEN PRINT "INPUT FREQUENCY(S) ARE TO GREAT!!!":GOTO 560
2620 RETURN
2630 KHZ=KHZ+1
2640 FS=FS/1000:FE=FE/1000:NORM=NORM/1000
2650 FOR N=1 TO NU2+N1
2660 FO(N)=FO(N)/1000:FZ(N)=FZ(N)/1000
2670 NEXT N
2680 GOTO 2530