home *** CD-ROM | disk | FTP | other *** search
GW-BASIC | 1987-02-10 | 5.5 KB | 174 lines |
- 100 CLS :REM "BRMATCH"
- 110 REM T.R. APEL -1983
- 120 PRINT TAB(26);"**** BROADBAND MATCHING ****" :PRINT :PRINT :PRINT
- 130 PRINT "THIS PROGRAM COMPUTES MINIMUM-ELEMENT MATCHING NETWORKS AND PROVIDES"
- 140 PRINT "INSERTION LOSS & VSWR DATA." :PRINT :PRINT :PRINT
- 150 DIM G(25),C(25),PD(25),S(25),T(25),TR(25) :PI=4*ATN(1)
- 160 FOR I=1 TO 100 :NEXT I :JJ=0 :K=0
- 170 PRINT :BEEP :INPUT "ENTER LOAD TYPE ,i.e., [SL,SC,PL,PC]";T$
- 180 PRINT :BEEP :INPUT "ENTER BANDWIDTH IN MHz [F1,F2]";F1,F2
- 190 BW=ABS(F2-F1) :FO=SQR(F1*F2) :QT=FO/BW :WO=FO*0.000999999
- 200 PRINT :BEEP :PRINT "IS REACTIVE LOAD FIXED? (Y/N)" :PRINT
- 210 A$=INKEY$ :IF A$="" THEN 210
- 220 IF A$="N" THEN LV=0 :GOTO 280
- 230 IF A$<>"Y" THEN 210
- 240 IF T$="SL" OR T$="PL" THEN 250 ELSE 260
- 250 PRINT :BEEP :INPUT "ENTER VALUE OF THE LOAD L (nh)";LV
- 260 IF T$="SC" OR T$="PC" THEN 270 ELSE 280
- 270 PRINT :BEEP :INPUT "ENTER VALUE OF THE LOAD C (pf)";LV
- 280 PRINT :BEEP :INPUT "ENTER HIGHER IMPEDANCE PORT Z (ohms)";HZ
- 290 PRINT :BEEP :INPUT "ENTER LOWER IMPEDANCE PORT Z (ohms)";LZ :TD=HZ/LZ
- 300 IF LV<0.000999999 THEN QL=0.5 :GOTO 360
- 310 IF T$="SL" THEN QL=LV*2*PI*WO/LZ :GOTO 360
- 320 IF T$="SC" THEN QL=1/(LV*2*PI*WO*0.000999999*LZ) :GOTO 360
- 330 IF T$="PL" THEN QL=HZ/(LV*2*PI*WO) :GOTO 360
- 340 IF T$="PC" THEN QL=LV*2*PI*WO*0.000999999*HZ :GOTO 360
- 350 GOTO 160
- 360 IF QL/QT<0.25 THEN LV=0
- 370 PRINT :BEEP :INPUT "ENTER NETWORK ORDER [MULTIPLE OF 4]";N
- 380 N=N/2 :G1=QL/QT
- 390 QT=INT(QT*100)/100 :GOTO 710
- 400 X=(1/GN1+1/G1)*SIN(PI/(2*N))
- 410 Y=(1/GN1-1/G1)*SIN(PI/(2*N))
- 420 IF LV<=0.000999999 THEN X=(2/GN1)*SIN(PI/(2*N)) :Y=0 :G1=GN1
- 430 FOR J=2 TO N
- 440 I=J-1
- 450 P1=4*SIN((2*I-1)*PI/(2*N))*SIN((2*I+1)*PI/(2*N))
- 460 Q1=X*X+Y*Y+SIN(I*PI/N)^2-2*X*Y*COS(I*PI/N)
- 470 G(J)=P1/Q1 :NEXT J
- 480 G(0)=1 :G(1)=G1
- 490 FOR H=2 TO N :IF H>2 THEN 510
- 500 GH1=G1
- 510 G(H)=G(H)/GH1
- 520 GH1=G(H) :NEXT H
- 530 G(N+1)=GN1/GH1
- 540 FOR I=0 TO N+1 :IF G(I)<0.000999999 THEN JJ=1
- 550 NEXT I
- 560 IF T$>"S" THEN GOSUB 1540
- 570 RETURN
- 580 DEF FNI(Z)=LOG(Z+SQR(Z*Z+1))
- 590 DEF FNS(Z)=(EXP(Z)-EXP(-Z))/2
- 600 DEF FNC(Z)=(EXP(Z)+EXP(-Z))/2
- 610 A=FNI(X) :B=FNI(Y) :NA=N*A :NB=N*B
- 620 R1=ABS(FNC(NB)/FNC(NA))
- 630 R2=ABS(FNS(NB)/FNS(NA))
- 640 L1=-0.000999999*INT(10000*LOG(1-R1*R1)/LOG(10))
- 650 L2=-0.000999999*INT(10000*LOG(1-R2*R2)/LOG(10))
- 660 V1=(1+R1)/(1-R1) :V1=INT(V1*100)/100
- 670 V2=(1+R2)/(1-R2) :V2=INT(V2*100)/100
- 680 PRINT :PRINT "MAXIMUM LOSS=";L1;"DB";TAB(40);"MAXIMUM VSWR=";V1;":1"
- 690 PRINT :PRINT "MINIMUM LOSS=";L2;"DB";TAB(40);"MINIMUM VSWR=";V2;":1"
- 700 RETURN
- 710 X1=2*QL/QT :K=0 :GN1=X1
- 720 GOSUB 820
- 730 D1=NT :X2=ABS(X1*1.0001) :GN1=X2
- 740 GOSUB 820
- 750 D2=NT :K=K+1
- 760 IF ABS(ER/TD)<9.99E-07 THEN 910
- 770 IF D1=D2 THEN 790 :IF K>50 THEN 790 :IF JJ=1 THEN 790
- 780 GN1=X1+ER*X1*9.9999E-05/(D2-D1) :X1=GN1 :GOTO 720
- 790 PRINT :PRINT "RL/RS RATIO OR RIPPLE IS TOO SMALL FOR AVAILABLE PRECISION."
- 800 PRINT :PRINT "INCREASE BANDWIDTH OR TRANSFORM RATIO." :PRINT :GOTO 160
- 810 PRINT :PRINT TAB(28);"NO MATCH!! REENTER DATA" :PRINT :GOTO 160
- 820 GOSUB 400
- 830 G(2*N+1)=G(N+1)
- 840 FOR J=1 TO N
- 850 G(J+N)=1/(QT*QT*G(J)) :NEXT J :TT=1
- 860 FOR J=1 TO 10 :TR(J)=1 :NEXT J
- 870 FOR J=2 TO N STEP 2
- 880 TR(J/2)=1+QT*QT*G(J)*G(J-1)
- 890 TT=TT*(TR(J/2)*TR(J/2)) :NEXT J
- 900 NT=TT*G(2*N+1) :ER=TD-NT :RETURN
- 910 IF LV<=0.000999999 THEN PRINT "0 DB OFFSET CASE"
- 920 PRINT :PRINT "SOURCE Q=";INT(GN1*QT*100)/100;
- 930 PRINT TAB(40);"LOAD Q=";INT(G1*QT*100)/100 :GOSUB 580
- 940 O=9.9999E-05*INT(10000*NT) :O=INT(O*100+0.01)/100
- 950 PRINT :PRINT "Q MAX.=";QT; :PRINT TAB(40);"IMPEDANCE TRANSFORM = X";O
- 960 FOR J=2 TO N STEP 2
- 970 H=G(J+N) :G(J+N)=G(J) :G(J)=H :NEXT J :TT=1
- 980 FOR J=2 TO N STEP 2
- 990 V3=V1 :V3=G(J)
- 1000 G(J-1)=G(J-1)+(1-TR(J/2))*V3
- 1010 G(J)=TR(J/2)*V3
- 1020 C(J)=TR(J/2)*(TR(J/2)-1)*V3
- 1030 FOR J1=J TO N STEP 2
- 1040 G(J1+N)=G(J1+N)/(TR(J/2))^2
- 1050 IF J1=J THEN 1090
- 1060 G(J1+N-1)=G(J1+N-1)/(TR(J/2))^2
- 1070 G(J1)=G(J1)*(TR(J/2))^2
- 1080 G(J1-1)=G(J1-1)*(TR(J/2))^2
- 1090 NEXT J1
- 1100 G(2*N+1)=TR(J/2)*TR(J/2)*G(2*N+1) :NEXT J
- 1110 PRINT :PRINT :PRINT TAB(23);"*** BANDPASS MATCHING NETWORK ***" :PRINT
- 1120 BW=2*PI*BW*10^6
- 1130 FOR J=2 TO N STEP 2
- 1140 PD(J-1)=G(J-1)/BW/HZ
- 1150 PD(J)=G(J)/BW/HZ
- 1160 C(J)=C(J)/BW/HZ
- 1170 PD(J+N)=G(J+N)*HZ/BW
- 1180 PD(J+N-1)=G(J+N-1)*HZ/BW :NEXT J
- 1190 PD(0)=G(0)*HZ
- 1200 PD(2*N+1)=HZ/G(2*N+1)
- 1210 GOSUB 1570
- 1220 PRINT RR$;S(0);TAB(12);R$
- 1230 FOR J=2 TO N STEP 2
- 1240 PRINT P1$;INT(S(J+N-1)*100)/100;TAB(12);L$
- 1250 PRINT S1$;INT(S(J-1)*100)/100;TAB(12);C$
- 1260 PRINT P2$;INT(S(J)*100)/100;TAB(12);C$
- 1270 PRINT S2$;INT(S(J+N)*100)/100;TAB(12);L$ :NEXT J
- 1280 PRINT RR$;S(2*N+1);TAB(12);R$
- 1290 PRINT :BEEP :PRINT "HARD COPY REQUIRED? (Y/N)"
- 1300 P$=INKEY$ :IF P$="" THEN 1300
- 1310 IF P$="Y" THEN 1330
- 1320 IF P$<>"N" THEN 1300 ELSE 1500
- 1330 LPRINT TAB(23);"*** BANDPASS MATCHING NETWORK ***" :LPRINT
- 1340 LPRINT TAB(10);"BANDWIDTH(MHz)=";TAB(25);INT(F1*100)/100;"-";
- 1350 LPRINT INT(F2*100)/100 ;TAB(46);RR$;S(0);TAB(58);R$ :FOR J=2 TO N STEP 2
- 1360 LPRINT TAB(10);"MAXIMUM LOSS=";TAB(25);L1;"DB";
- 1370 LPRINT TAB(46);P1$;INT(S(J+N-1)*100)/100;TAB(58);L$
- 1380 LPRINT TAB(10);"MINIMUM LOSS=";TAB(25);L2;"DB";
- 1390 LPRINT TAB(46);S1$;INT(S(J-1)*100)/100;TAB(58);C$
- 1400 LPRINT TAB(10);"MAXIMUM VSWR=";TAB(25);V1;":1";
- 1410 LPRINT TAB(46);P2$;INT(S(J)*100)/100;TAB(58);C$
- 1420 LPRINT TAB(10);"MINIMUM VSWR=";TAB(25);V2;":1";
- 1430 LPRINT TAB(46);S2$;INT(S(J+N)*100)/100;TAB(58);L$; :NEXT J
- 1440 LPRINT TAB(10);"SOURCE Q=";TAB(25);INT(GN1*QT*100)/100;
- 1450 LPRINT TAB(46);RR$;INT(S(2*N+1)*100)/100;TAB(58);R$
- 1460 LPRINT TAB(10);"LOAD Q=";TAB(25);INT(G1*QT*100)/100;
- 1470 LPRINT TAB(46);"Z TRANSFORM= X";O
- 1480 LPRINT TAB(10);"Q MAXIMUM=";TAB(25);INT(QT*100)/100
- 1490 IF LV<=0.000999999 THEN LPRINT TAB(10);"0 DB OFFSET CASE" ELSE CLOSE #1
- 1500 PRINT :BEEP :PRINT "ANOTHER CALCULATION? (Y/N)"
- 1510 B$=INKEY$ :IF B$="" THEN 1510
- 1520 IF B$="Y" THEN RUN
- 1530 IF B$<>"N" THEN 1510 ELSE END
- 1540 FOR H=0 TO N+1 :T(H)=G(N-H+1) :NEXT H
- 1550 FOR H=1 TO N-1 STEP 2 :G(H)=T(H)*T(0) :G(H+1)=T(H+1)/T(0) :NEXT H
- 1560 G(0)=1 :G(N+1)=T(0) :K=K+1 :IF K>50 THEN 810 ELSE RETURN
- 1570 S(0)=PD(0)
- 1580 FOR J=2 TO N STEP 2
- 1590 S(J+N-1)=PD(J+N-1)
- 1600 S(J-1)=PD(J) :S(J)=C(J)
- 1610 S(J+N)=PD(J+N) :NEXT J
- 1620 S(2*N+1)=PD(2*N+1)
- 1630 IF T$="SL" THEN 1740
- 1640 IF T$="PL" THEN 1740
- 1650 WC=1/(2*PI*FO*10^6)^2
- 1660 FOR J=2 TO N STEP 2
- 1670 S(J+N-1)=WC*10^12/S(J+N-1)
- 1680 S(J-1)=WC*10^9/S(J-1)
- 1690 S(J)=WC*10^9/S(J)
- 1700 S(J+N)=WC*10^12/S(J+N) :NEXT J
- 1710 RR$="R =" :P1$="CP=" :S1$="LS=" :P2$="LP=" :S2$="CS="
- 1720 R$=" ohm" :C$=" nh" :L$=" pf"
- 1730 GOTO 1810
- 1740 FOR J=2 TO N STEP 2
- 1750 S(J+N-1)=S(J+N-1)*10^9
- 1760 S(J-1)=S(J-1)*10^12
- 1770 S(J)=S(J)*10^12
- 1780 S(J+N)=S(J+N)*10^9 :NEXT J
- 1790 RR$="R =" :P1$="LP=" :S1$="CS=" :P2$="CP=" :S2$="LS="
- 1800 R$=" ohm" :L$=" nh" :C$=" pf"
- 1810 FOR J=0 TO 2*N+1 :S(J)=INT(S(J)*1000)/1000 :NEXT J
- 1820 RETURN
-