home *** CD-ROM | disk | FTP | other *** search
/ HAM Radio 1 / HamRadio.cdr / misc / hamutil2 / brmatch.bas (.txt) < prev    next >
Encoding:
GW-BASIC  |  1979-12-31  |  5.5 KB  |  174 lines

  1. 100  CLS :REM "BRMATCH"
  2. 110  REM T.R. APEL -1983
  3. 120  PRINT TAB(26);"**** BROADBAND MATCHING ****" :PRINT :PRINT :PRINT
  4. 130  PRINT "THIS PROGRAM COMPUTES MINIMUM-ELEMENT MATCHING NETWORKS AND PROVIDES"
  5. 140  PRINT "INSERTION LOSS & VSWR DATA." :PRINT :PRINT :PRINT
  6. 150  DIM G(25),C(25),PD(25),S(25),T(25),TR(25) :PI=4*ATN(1)
  7. 160  FOR I=1 TO 100 :NEXT I :JJ=0 :K=0
  8. 170  PRINT :BEEP :INPUT "ENTER LOAD TYPE ,i.e., [SL,SC,PL,PC]";T$
  9. 180  PRINT :BEEP :INPUT "ENTER BANDWIDTH IN MHz       [F1,F2]";F1,F2
  10. 190  BW=ABS(F2-F1) :FO=SQR(F1*F2) :QT=FO/BW :WO=FO*0.000999999
  11. 200  PRINT :BEEP :PRINT "IS REACTIVE LOAD FIXED? (Y/N)" :PRINT
  12. 210  A$=INKEY$ :IF A$="" THEN 210
  13. 220  IF A$="N" THEN LV=0 :GOTO 280
  14. 230  IF A$<>"Y" THEN 210
  15. 240  IF T$="SL" OR T$="PL" THEN 250 ELSE 260
  16. 250  PRINT :BEEP :INPUT "ENTER VALUE OF THE LOAD L (nh)";LV
  17. 260  IF T$="SC" OR T$="PC" THEN 270 ELSE 280
  18. 270  PRINT :BEEP :INPUT "ENTER VALUE OF THE LOAD C (pf)";LV
  19. 280  PRINT :BEEP :INPUT "ENTER HIGHER IMPEDANCE PORT Z (ohms)";HZ
  20. 290  PRINT :BEEP :INPUT "ENTER LOWER IMPEDANCE PORT Z  (ohms)";LZ :TD=HZ/LZ
  21. 300  IF LV<0.000999999 THEN QL=0.5 :GOTO 360
  22. 310  IF T$="SL" THEN QL=LV*2*PI*WO/LZ :GOTO 360
  23. 320  IF T$="SC" THEN QL=1/(LV*2*PI*WO*0.000999999*LZ) :GOTO 360
  24. 330  IF T$="PL" THEN QL=HZ/(LV*2*PI*WO) :GOTO 360
  25. 340  IF T$="PC" THEN QL=LV*2*PI*WO*0.000999999*HZ :GOTO 360
  26. 350  GOTO 160
  27. 360  IF QL/QT<0.25 THEN LV=0
  28. 370  PRINT :BEEP :INPUT "ENTER NETWORK ORDER  [MULTIPLE OF 4]";N
  29. 380  N=N/2 :G1=QL/QT
  30. 390  QT=INT(QT*100)/100 :GOTO 710
  31. 400  X=(1/GN1+1/G1)*SIN(PI/(2*N))
  32. 410  Y=(1/GN1-1/G1)*SIN(PI/(2*N))
  33. 420  IF LV<=0.000999999 THEN X=(2/GN1)*SIN(PI/(2*N)) :Y=0 :G1=GN1
  34. 430  FOR J=2 TO N
  35. 440  I=J-1
  36. 450  P1=4*SIN((2*I-1)*PI/(2*N))*SIN((2*I+1)*PI/(2*N))
  37. 460  Q1=X*X+Y*Y+SIN(I*PI/N)^2-2*X*Y*COS(I*PI/N)
  38. 470  G(J)=P1/Q1 :NEXT J
  39. 480  G(0)=1 :G(1)=G1
  40. 490  FOR H=2 TO N :IF H>2 THEN 510
  41. 500  GH1=G1
  42. 510  G(H)=G(H)/GH1
  43. 520  GH1=G(H) :NEXT H
  44. 530  G(N+1)=GN1/GH1
  45. 540  FOR I=0 TO N+1 :IF G(I)<0.000999999 THEN JJ=1
  46. 550  NEXT I
  47. 560  IF T$>"S" THEN GOSUB 1540
  48. 570  RETURN
  49. 580  DEF FNI(Z)=LOG(Z+SQR(Z*Z+1))
  50. 590  DEF FNS(Z)=(EXP(Z)-EXP(-Z))/2
  51. 600  DEF FNC(Z)=(EXP(Z)+EXP(-Z))/2
  52. 610  A=FNI(X) :B=FNI(Y) :NA=N*A :NB=N*B
  53. 620  R1=ABS(FNC(NB)/FNC(NA))
  54. 630  R2=ABS(FNS(NB)/FNS(NA))
  55. 640  L1=-0.000999999*INT(10000*LOG(1-R1*R1)/LOG(10))
  56. 650  L2=-0.000999999*INT(10000*LOG(1-R2*R2)/LOG(10))
  57. 660  V1=(1+R1)/(1-R1) :V1=INT(V1*100)/100
  58. 670  V2=(1+R2)/(1-R2) :V2=INT(V2*100)/100
  59. 680  PRINT :PRINT "MAXIMUM LOSS=";L1;"DB";TAB(40);"MAXIMUM VSWR=";V1;":1"
  60. 690  PRINT :PRINT "MINIMUM LOSS=";L2;"DB";TAB(40);"MINIMUM VSWR=";V2;":1"
  61. 700  RETURN
  62. 710  X1=2*QL/QT :K=0 :GN1=X1
  63. 720  GOSUB 820
  64. 730  D1=NT :X2=ABS(X1*1.0001) :GN1=X2
  65. 740  GOSUB 820
  66. 750  D2=NT :K=K+1
  67. 760  IF ABS(ER/TD)<9.99E-07 THEN 910
  68. 770  IF D1=D2 THEN 790 :IF K>50 THEN 790 :IF JJ=1 THEN 790
  69. 780  GN1=X1+ER*X1*9.9999E-05/(D2-D1) :X1=GN1 :GOTO 720
  70. 790  PRINT :PRINT "RL/RS RATIO OR RIPPLE IS TOO SMALL FOR AVAILABLE PRECISION."
  71. 800  PRINT :PRINT "INCREASE BANDWIDTH OR TRANSFORM RATIO." :PRINT :GOTO 160
  72. 810  PRINT :PRINT TAB(28);"NO MATCH!! REENTER DATA" :PRINT :GOTO 160
  73. 820  GOSUB 400
  74. 830  G(2*N+1)=G(N+1)
  75. 840  FOR J=1 TO N
  76. 850  G(J+N)=1/(QT*QT*G(J)) :NEXT J :TT=1
  77. 860  FOR J=1 TO 10 :TR(J)=1 :NEXT J
  78. 870  FOR J=2 TO N STEP 2
  79. 880  TR(J/2)=1+QT*QT*G(J)*G(J-1)
  80. 890  TT=TT*(TR(J/2)*TR(J/2)) :NEXT J
  81. 900  NT=TT*G(2*N+1) :ER=TD-NT :RETURN
  82. 910  IF LV<=0.000999999 THEN PRINT "0 DB OFFSET CASE"
  83. 920  PRINT :PRINT "SOURCE Q=";INT(GN1*QT*100)/100;
  84. 930  PRINT TAB(40);"LOAD Q=";INT(G1*QT*100)/100 :GOSUB 580
  85. 940  O=9.9999E-05*INT(10000*NT) :O=INT(O*100+0.01)/100
  86. 950  PRINT :PRINT "Q MAX.=";QT; :PRINT TAB(40);"IMPEDANCE TRANSFORM = X";O
  87. 960  FOR J=2 TO N STEP 2
  88. 970  H=G(J+N) :G(J+N)=G(J) :G(J)=H :NEXT J :TT=1
  89. 980  FOR J=2 TO N STEP 2
  90. 990  V3=V1 :V3=G(J)
  91. 1000  G(J-1)=G(J-1)+(1-TR(J/2))*V3
  92. 1010  G(J)=TR(J/2)*V3
  93. 1020  C(J)=TR(J/2)*(TR(J/2)-1)*V3
  94. 1030  FOR J1=J TO N STEP 2
  95. 1040  G(J1+N)=G(J1+N)/(TR(J/2))^2
  96. 1050  IF J1=J THEN 1090
  97. 1060  G(J1+N-1)=G(J1+N-1)/(TR(J/2))^2
  98. 1070  G(J1)=G(J1)*(TR(J/2))^2
  99. 1080  G(J1-1)=G(J1-1)*(TR(J/2))^2
  100. 1090  NEXT J1
  101. 1100  G(2*N+1)=TR(J/2)*TR(J/2)*G(2*N+1) :NEXT J
  102. 1110  PRINT :PRINT :PRINT TAB(23);"*** BANDPASS MATCHING NETWORK ***" :PRINT
  103. 1120  BW=2*PI*BW*10^6
  104. 1130  FOR J=2 TO N STEP 2
  105. 1140  PD(J-1)=G(J-1)/BW/HZ
  106. 1150  PD(J)=G(J)/BW/HZ
  107. 1160  C(J)=C(J)/BW/HZ
  108. 1170  PD(J+N)=G(J+N)*HZ/BW
  109. 1180  PD(J+N-1)=G(J+N-1)*HZ/BW :NEXT J
  110. 1190  PD(0)=G(0)*HZ
  111. 1200  PD(2*N+1)=HZ/G(2*N+1)
  112. 1210  GOSUB 1570
  113. 1220  PRINT RR$;S(0);TAB(12);R$
  114. 1230  FOR J=2 TO N STEP 2
  115. 1240  PRINT P1$;INT(S(J+N-1)*100)/100;TAB(12);L$
  116. 1250  PRINT S1$;INT(S(J-1)*100)/100;TAB(12);C$
  117. 1260  PRINT P2$;INT(S(J)*100)/100;TAB(12);C$
  118. 1270  PRINT S2$;INT(S(J+N)*100)/100;TAB(12);L$ :NEXT J
  119. 1280  PRINT RR$;S(2*N+1);TAB(12);R$
  120. 1290  PRINT :BEEP :PRINT "HARD COPY REQUIRED? (Y/N)"
  121. 1300  P$=INKEY$ :IF P$="" THEN 1300
  122. 1310  IF P$="Y" THEN 1330
  123. 1320  IF P$<>"N" THEN 1300 ELSE 1500
  124. 1330  LPRINT TAB(23);"*** BANDPASS MATCHING NETWORK ***" :LPRINT
  125. 1340  LPRINT TAB(10);"BANDWIDTH(MHz)=";TAB(25);INT(F1*100)/100;"-";
  126. 1350  LPRINT INT(F2*100)/100 ;TAB(46);RR$;S(0);TAB(58);R$ :FOR J=2 TO N STEP 2
  127. 1360  LPRINT TAB(10);"MAXIMUM LOSS=";TAB(25);L1;"DB";
  128. 1370  LPRINT TAB(46);P1$;INT(S(J+N-1)*100)/100;TAB(58);L$
  129. 1380  LPRINT TAB(10);"MINIMUM LOSS=";TAB(25);L2;"DB";
  130. 1390  LPRINT TAB(46);S1$;INT(S(J-1)*100)/100;TAB(58);C$
  131. 1400  LPRINT TAB(10);"MAXIMUM VSWR=";TAB(25);V1;":1";
  132. 1410  LPRINT TAB(46);P2$;INT(S(J)*100)/100;TAB(58);C$
  133. 1420  LPRINT TAB(10);"MINIMUM VSWR=";TAB(25);V2;":1";
  134. 1430  LPRINT TAB(46);S2$;INT(S(J+N)*100)/100;TAB(58);L$; :NEXT J
  135. 1440  LPRINT TAB(10);"SOURCE  Q=";TAB(25);INT(GN1*QT*100)/100;
  136. 1450  LPRINT TAB(46);RR$;INT(S(2*N+1)*100)/100;TAB(58);R$
  137. 1460  LPRINT TAB(10);"LOAD    Q=";TAB(25);INT(G1*QT*100)/100;
  138. 1470  LPRINT TAB(46);"Z TRANSFORM= X";O
  139. 1480  LPRINT TAB(10);"Q MAXIMUM=";TAB(25);INT(QT*100)/100
  140. 1490  IF LV<=0.000999999 THEN LPRINT TAB(10);"0 DB OFFSET CASE" ELSE CLOSE #1
  141. 1500  PRINT :BEEP :PRINT "ANOTHER CALCULATION? (Y/N)"
  142. 1510  B$=INKEY$ :IF B$="" THEN 1510
  143. 1520  IF B$="Y" THEN RUN
  144. 1530  IF B$<>"N" THEN 1510 ELSE END
  145. 1540  FOR H=0 TO N+1 :T(H)=G(N-H+1) :NEXT H
  146. 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
  147. 1560  G(0)=1 :G(N+1)=T(0) :K=K+1 :IF K>50 THEN 810 ELSE RETURN
  148. 1570  S(0)=PD(0)
  149. 1580  FOR J=2 TO N STEP 2
  150. 1590  S(J+N-1)=PD(J+N-1)
  151. 1600  S(J-1)=PD(J) :S(J)=C(J)
  152. 1610  S(J+N)=PD(J+N) :NEXT J
  153. 1620  S(2*N+1)=PD(2*N+1)
  154. 1630  IF T$="SL" THEN 1740
  155. 1640  IF T$="PL" THEN 1740
  156. 1650  WC=1/(2*PI*FO*10^6)^2
  157. 1660  FOR J=2 TO N STEP 2
  158. 1670  S(J+N-1)=WC*10^12/S(J+N-1)
  159. 1680  S(J-1)=WC*10^9/S(J-1)
  160. 1690  S(J)=WC*10^9/S(J)
  161. 1700  S(J+N)=WC*10^12/S(J+N) :NEXT J
  162. 1710  RR$="R =" :P1$="CP=" :S1$="LS=" :P2$="LP=" :S2$="CS="
  163. 1720  R$=" ohm" :C$=" nh" :L$=" pf"
  164. 1730  GOTO 1810
  165. 1740  FOR J=2 TO N STEP 2
  166. 1750  S(J+N-1)=S(J+N-1)*10^9
  167. 1760  S(J-1)=S(J-1)*10^12
  168. 1770  S(J)=S(J)*10^12
  169. 1780  S(J+N)=S(J+N)*10^9 :NEXT J
  170. 1790  RR$="R =" :P1$="LP=" :S1$="CS=" :P2$="CP=" :S2$="LS="
  171. 1800  R$=" ohm" :L$=" nh" :C$=" pf"
  172. 1810  FOR J=0 TO 2*N+1 :S(J)=INT(S(J)*1000)/1000 :NEXT J
  173. 1820  RETURN
  174.