home *** CD-ROM | disk | FTP | other *** search
/ HAM Radio 1 / HamRadio.cdr / tech / ee6 / filplt.bas < prev    next >
BASIC Source File  |  1989-01-22  |  10KB  |  269 lines

  1. 10 REM FILPLT.BAS FILTER GAIN AND PHASE RESPONSE 
  2. 20 REM EMMY DENTON 7/28/84
  3. 30 DIM AP(3,200):DIM B(40):DIM FO(40):DIM JMPV(40):DIM Q(40):DIM FIL$(8)
  4. 40 DIM FZ(40):DIM DF(40):DIM QZ(40):DIM DQ(40)
  5. 50 HZ$=" Hz":KHZ=0
  6. 60 FIL$(1)="HIGHPASS":FIL$(2)="LOWPASS":FIL$(3)="HIGHPASS":FIL$(4)="LOWPASS":FIL$(5)="BANDPASS":FIL$(6)="ALLPASS":FIL$(7)="NOTCH"
  7. 70 INPUT "Is filter design on file (ENTER Y OR N)";FDES$
  8. 80 IF FDES$="Y" OR FDES$="y" THEN 120
  9. 90 IF FDES$="N" OR FDES$="n"THEN 100 ELSE GOTO 70
  10. 100 N1=0:NU2=0:NZ=0:GOSUB 2040
  11. 110 GOTO 130
  12. 120 N1=0:NU2=0:NZ=0:GOSUB 1410
  13. 130 PRINT"Enter the starting frequency of the response in "HZ$; :INPUT FS
  14. 140 PRINT"Enter the ending frequency of the response in "HZ$;:INPUT FE
  15. 150 PRINT"Would you like linear or logarithmic steps (Enter lin or log)";:INPUT A$
  16. 160 IF A$="LIN" OR A$="LOG" OR A$="lin" OR A$="log" THEN GOTO 180
  17. 170 GOTO 150
  18. 180 PRINT"How many steps would you like in the response";:INPUT ST
  19. 190 IF ST<=0 THEN GOTO 180
  20. 200 ST=ST+1
  21. 210 PRINT"Would you like the gain response normalized to 1 at a particular frequency?"
  22. 220 PRINT "If YES then enter the frequency, in " HZ$ ", if not enter N";:INPUT NORM$
  23. 230 NORM=VAL(NORM$)
  24. 240 IF NORM$="N" OR NORM$="n" THEN NORM=-1:GOTO 270
  25. 250 IF ASC(NORM$)=48 OR NORM>0 THEN 270
  26. 260 GOTO 210
  27. 270 GOSUB 2530
  28. 280 GOSUB 810
  29. 290 GOSUB 1350
  30. 300 REM
  31. 310 FOR N=1 TO N1+NU2
  32. 320 W=6.28318*FS:WO=6.28318*FO(N):Q=Q(N)
  33. 330 IF N>N1 THEN WZ=6.28318*FZ(N-N1)
  34. 340 ON JMPV(N) GOSUB 910,930,950,970,990,1010,1030
  35. 350 NEXT N
  36. 360 NORML=NORML+1
  37. 370 IF NORM>=0 AND NORML=1 THEN FSN=FS:FS=NORM:GOTO 310
  38. 380 IF NORML=2 AND NORM>=0 THEN FS=FSN
  39. 390 NORML=0
  40. 400 I=0:I2=0:ST2=0
  41. 410 IF ST=ST2 THEN 530
  42. 420 I2=1+I2
  43. 430 IF ST>I2*20 THEN ST2=I2*20:I=(ST2-19):GOTO 450
  44. 440  ST2=ST:I=((I2-1)*20)+1
  45. 450 FOR N=I TO ST2
  46. 460 PRINT"FREQ="AP(3,N) HZ$ TAB( 25)"GAIN="AP(1,N)"DB"TAB( 50)"PHASE="AP(2,N)"DEG"
  47. 470 NEXT N
  48. 480 IF ST=ST2 AND ST2-I<17 THEN 530
  49. 490 IF NORM>=0 THEN PRINT "FILTER RESPONSE NORMALIZED AT "NORM HZ$ "   "AMPN"dB."
  50. 500 PRINT"PRESS RETURN TO CONTINUE WITH OUTPUT OR E TO END OUTPUT";:INPUT V$
  51. 510 IF V$="E" OR V$="e" THEN 530
  52. 520 GOTO 410
  53. 530 REM 
  54. 540 IF NORM>=0 THEN PRINT "FILTER RESPONSE NORMALIZED AT "NORM HZ$ "  "AMPN"dB."
  55. 550 PRINT"FILTER RESPONSE COMPLETE ....."
  56. 560 PRINT"     PRESS  P - PRINT RESPONSE ON LINE PRINTER"
  57. 570 PRINT"            V - VIEW RESPONSE AGAIN"
  58. 580 PRINT"            D - DESIGN ANOTHER FILTER"
  59. 590 PRINT"            E - END(EXIT TO OPERATING SYSTEM)"
  60. 600 PRINT"            R - RERUN FILTER RESPONSE"
  61. 610 INPUT V$
  62. 620 IF V$="E" OR V$="e" THEN SYSTEM
  63. 630 IF V$="D" OR V$="d" THEN RUN "FILDES.EXE"
  64. 640 IF V$="P" OR V$="p" THEN I=0:I2=0:ST2=0:GOTO 680
  65. 650 IF V$="V" OR V$="v" THEN ST2=0:I=0:I2=0:GOTO 410
  66. 660 IF V$="r" OR V$="R" THEN  ST=ST-1:GOTO 1720
  67. 670 GOTO 530
  68. 680 REM PRINT ROUTINE
  69. 690 LPRINT
  70. 700 LPRINT:LPRINT:LPRINT
  71. 710 IF ST=ST2 THEN 530
  72. 720 I2=I2+1
  73. 730 IF ST>I2*60 THEN ST2=I2*60:I=(ST2-59):GOTO 760
  74. 740 ST2=ST:I=(I2*60)-59
  75. 750 IF NORM>=0 THEN LPRINT "FILPTER RESPONSE NORMALIZED AT "NORM HZ$ "    "AMPN"dB"
  76. 760 FOR N=I TO ST2
  77. 770 LPRINT "FREQ="AP(3,N) HZ$ TAB( 25)"GAIN="AP(1,N)"DB"TAB( 50)"PHASE="AP(2,N)"DEG"
  78. 780 NEXT N
  79. 790 IF N=I2*60 THEN LPRINT CHR$(12)
  80. 800 GOTO 700
  81. 810 REM lin/log
  82. 820 IF A$="log" OR A$="LOG" THEN GOTO 870
  83. 830 IF A$="lin" OR A$="LIN" THEN GOTO 850
  84. 840 GOTO 150
  85. 850 SS=6.28318*(FE-FS)/(ST-1):B=1
  86. 860 GOTO 900
  87. 870 B=0
  88. 880 IF FS=0 THEN FS=.1 
  89. 890 SS=(FE/FS)^(1/(ST-1))
  90. 900 RETURN
  91. 910 A1=0:A2=1:A3=0:B1=0:B2=1:B3=WO
  92. 920 GOTO 1040
  93. 930 A1=0:A2=0:A3=WO:B1=0:B2=1:B3=WO
  94. 940 GOTO 1040
  95. 950 A1=1:A2=0:A3=0:B1=1:B2=WO/Q:B3=WO^2
  96. 960 GOTO 1040
  97. 970 A1=0:A2=0:A3=WO^2:B1=1:B2=WO/Q:B3=A3
  98. 980 GOTO 1040
  99. 990 A1=0:A2=WO/Q:A3=0:B1=1:B2=A2:B3=WO^2
  100. 1000 GOTO 1040
  101. 1010 A1=1:A2=-WZ/QZ:A3=WZ^2:B1=1:B2=WO/Q:B3=WO^2
  102. 1020 GOTO 1040
  103. 1030 A1=1:A2=0:A3=WZ^2:B1=1:B2=WO/Q:B3=WO^2
  104. 1040 IF NORML=1 THEN 1060
  105. 1050 FOR NO=1 TO ST
  106. 1060 W2=W^2:A4=A3-A1*W2:B4=B3-B1*W2
  107. 1070 R=A4*B4+A2*B2*W2
  108. 1080 IF R=0 THEN R=1E-09
  109. 1090 I=(A2*B4-B2*A4)*W
  110. 1100 IF I=0 THEN I=1E-09
  111. 1110 D=B4^2+(B2^2)*W2
  112. 1120 AMP=((R^2+I^2)^.5)/D
  113. 1130 IF REGY=3 THEN 1150
  114. 1140 IF WZ>WO AND JMPV(N)=7 THEN AMP=B3/A3*AMP
  115. 1150 AMPD=20*.43429*LOG(AMP)
  116. 1160 IF NORML=1 THEN 2010
  117. 1170 IF R=0 AND I>0 THEN PH=1.5708:GOTO 1210
  118. 1180 IF R=0 AND I<0 THEN PH=-1.5708:GOTO 1210
  119. 1190 RAD=I/R
  120. 1200 PH=ATN(RAD)
  121. 1210 PHA=PH
  122. 1220 IF R<0 AND I>0 THEN PHA=3.1415+PH
  123. 1230 IF R<0 AND I<0 THEN PHA=-3.1415-PH
  124. 1240 IF PHA>3.14159 THEN PHA=PHA-3.14159
  125. 1250 IF PHA<-3.14159 THEN PHA=PHA+3.14159
  126. 1260 PHA=PHA*180/3.14159
  127. 1270 AP(1,NO)=AP(1,NO)+AMPD:REM PRINT AP(1,NO)
  128. 1280 AP(2,NO)=AP(2,NO)+PHA:REM PRINT AP(2,NO)
  129. 1290 AP(3,NO)=W/6.28318:REM PRINT AP(3,NO)
  130. 1300 IF B=0 THEN W=W*SS:GOTO 1330
  131. 1310 IF B=1 THEN W=W+SS:GOTO 1330
  132. 1320 PRINT"ERROR IN B"
  133. 1330 NEXT NO
  134. 1340 RETURN
  135. 1350 FOR X=1 TO ST
  136. 1360 FOR Y=1 TO 3
  137. 1370 AP(Y,X)=0
  138. 1380 NEXT Y
  139. 1390 NEXT X
  140. 1400 RETURN
  141. 1410 OPEN "I",1,"PLTDATA"
  142. 1420 INPUT #1,REGY,T,NUMB
  143. 1430 FOR I=1 TO NUMB
  144. 1440 INPUT #1,DF(I),DQ(I)
  145. 1450 NEXT I
  146. 1460 CLOSE 1
  147. 1470 N1=0:NU2=0:NZ=0
  148. 1480 FOR I=1 TO NUMB
  149. 1490 IF DQ(I)=O THEN N1=N1+1:FO(N1)=DF(I):GOTO 1520
  150. 1500 IF DQ(I)<0 THEN NZ=NZ+1:FZ(NZ)=DF(I):GOTO 1520
  151. 1510 NU2=NU2+1
  152. 1520 NEXT I
  153. 1530 FOR I=1 TO NUMB
  154. 1540 IF DQ(I)<=0 THEN 1570
  155. 1550 Q(I+N1)=DQ(I):FO(N1+I)=DF(I)
  156. 1560 NEXT I
  157. 1570 FOR  I=1 TO N1+NU2
  158. 1580 IF N1=0 OR N1<I THEN 1620
  159. 1590 IF REGY=1 THEN JMPV(I)=2:GOTO 1640
  160. 1600 IF REGY=2 THEN JMPV(I)=1:GOTO 1640
  161. 1610 PRINT"ERROR IN PLTDATA":END
  162. 1620 IF NU2=0 THEN 1640
  163. 1630 GOSUB 1660
  164. 1640 NEXT I
  165. 1650 RETURN
  166. 1660 IF REGY=1 THEN JMPV(I)=4
  167. 1670 IF REGY=2 THEN JMPV(I)=3
  168. 1680 IF REGY=3 THEN JMPV(I)=5
  169. 1690 IF REGY=4 THEN JMPV(I)=7
  170. 1700 IF T=3 AND I<=NZ THEN JMPV(I)=7
  171. 1710 RETURN
  172. 1720 X=0:NORM2=NORM
  173. 1730 PRINT "ENTER                                ","CURRENT VALUE"
  174. 1740 PRINT "   FS - STARTING FREQUENCY OF RESPONSE",FS, HZ$
  175. 1750 PRINT "   FE - ENDING FREQUENCY OF RESPONSE",FE, HZ$
  176. 1760 PRINT "   ST - LINear OR LOGarithmic RESPONSE",A$
  177. 1770 PRINT "   NU - NUMBER OF STEPS IN RESPONSE",ST
  178. 1780 PRINT "   FN - FREQUENCY OF NORMALIZATION",;
  179. 1790 IF NORM2>=0 THEN PRINT NORM2 HZ$ ELSE PRINT
  180. 1800 PRINT "   A  - CHANGE ALL PARAMETERS"
  181. 1810 PRINT "   E  - END OF CHANGES"
  182. 1820 INPUT V$
  183. 1830 IF V$="A" OR V$="a" THEN 60
  184. 1840 IF V$="FN" OR V$="fn" THEN 1850 ELSE GOTO 1870
  185. 1850 PRINT "ENTER VALUE IN "HZ$;:INPUT NORM2:X=X^X
  186. 1860 IF NORM2<0 GOTO 1850
  187. 1870 IF V$="FE" OR V$="fe" THEN PRINT"ENTER VALUE OF ENDING FREQUENCY IN "HZ$;:INPUT FE:X=2
  188. 1880 IF V$="FS" OR V$="fs" THEN PRINT"ENTER VALUE OF STARTING FREQUENCY IN "HZ$;:INPUT FS:X=2
  189. 1890 IF V$="NU" OR V$="nu" THEN INPUT "ENTER NUMBER OF STEPS IN RESPONSE";ST:X=2
  190. 1900 IF V$="ST" OR V$="st" THEN INPUT "ENTER LIN OR LOG";A$:X=2
  191. 1910 IF V$="E" OR V$="e" THEN ST=ST+1:GOTO 1930
  192. 1920 GOTO 1730
  193. 1930 IF X>=2 THEN 1980
  194. 1940 IF X=1 AND NORM2><NORM THEN AMPD=-AMPN ELSE GOTO 560
  195. 1950 GOSUB 2010
  196. 1960 NORML=0:AMPD=0:AMPN=0:NORM=NORM2:X=0:GOTO 360
  197. 1970 REM
  198. 1980 REM
  199. 1990 NORML=0:AMPD=0:AMPN=0:X=0:NORM=NORM2
  200. 2000 GOTO 270
  201. 2010 FOR N0=1 TO ST:AP(1,N0)=AP(1,N0)-AMPD:NEXT N0
  202. 2020 AMPN=AMPN+AMPD
  203. 2030 RETURN
  204. 2040 PRINT "ENTER:"
  205. 2050 PRINT "      1 - SINGLE ORDER LOWPASS"
  206. 2060 PRINT "      2 - SINGLE ORDER HIGHPASS"
  207. 2070 PRINT "      3 - 2ND ORDER LOWPASS"
  208. 2080 PRINT "      4 - 2ND ORDER HIGHPASS"
  209. 2090 PRINT "      5 - 2ND ORDER BANDPASS"
  210. 2100 PRINT "      6 - 2ND ORDER ALLPASS"
  211. 2110 PRINT "      7 - 2ND ORDER NOTCH OR ELLIPTIC LOWPASS,HIGHPASS,BANDPASS"
  212. 2120 PRINT "      8 - END OF DATA ENTRY"
  213. 2130 INPUT REGY
  214. 2140 IF REGY=8 THEN 2300
  215. 2150 IF REGY=1 THEN N1=N1+1:JMPV(N1+NU2)=2:Q(N1+NU2)=0:GOTO 2230
  216. 2160 IF REGY=2 THEN N1=N1+1:JMPV(N1+NU2)=1:Q(N1+NU2)=0:GOTO 2230
  217. 2170 IF REGY=3 THEN NU2=NU2+1:JMPV(N1+NU2)=4:REGY=2:T=4:GOTO 2240
  218. 2180 IF REGY=4 THEN NU2=NU2+1:JMPV(N1+NU2)=3:REGY=1:T=4:GOTO 2240
  219. 2190 IF REGY=5 THEN NU2=NU2+1:JMPV(N1+NU2)=5:REGY=3:T=4:GOTO 2240
  220. 2200 IF REGY=6 THEN NU2=NU2+1:NZ=NZ+1:JMPV(N1+NU2)=6:GOTO 2250
  221. 2210 IF REGY=7 THEN NU2=NU2+1:NZ=NZ+1:JMPV(N1+NU2)=7:GOTO 2270
  222. 2220 GOTO 2040
  223. 2230 PRINT"ENTER THE CUTOFF FREQUENCY IN "HZ$;:INPUT FO(N1+NU2):GOTO 2040
  224. 2240 PRINT"ENTER THE CUTOFF FREQUENCY IN "HZ$", AND Q";:INPUT FO(N1+NU2),Q(N1+NU2):GOTO 2040
  225. 2250 PRINT"ENTER THE REAL POLE PAIR FREQUENCY(FO) IN "HZ$",Q, ZERO FREQUENCY(FZ) IN "HZ$" AND ZERO Q(QZ):"
  226. 2260 INPUT FO(N1+NU2),Q(N1+NU2),FZ(NU2),QZ(NU2):GOTO 2040
  227. 2270 PRINT"ENTER THE REAL POLE PAIR FREQUENCY(FO) IN "HZ$",Q AND ZERO FREQUENCY(FZ) IN "HZ$":"
  228. 2280 INPUT FO(N1+NU2),Q(N1+NU2),FZ(NU2)
  229. 2290 GOTO 2040
  230. 2300 FOR N=1 TO N1+NU2
  231. 2310 IF JMPV(N)=7 THEN 2340 
  232. 2320 NEXT N
  233. 2330 GOTO 2400
  234. 2340 INPUT "What is the overall response type of this elliptic (Enter N-otch, L-owpass, H-ighpass, B-andpass" ;REGY$
  235. 2350 IF REGY$="N" OR REGY$="n" THEN REGY=4:GOTO 2400
  236. 2360 IF REGY$="L" OR REGY$="l" THEN REGY=2:GOTO 2400
  237. 2370 IF REGY$="H" OR REGY$="h" THEN REGY=1:GOTO 2400
  238. 2380 IF REGY$="B" OR REGY$="n" THEN REGY=3:GOTO 2400
  239. 2390 GOTO 2340
  240. 2400 T=3
  241. 2410 PRINT "SECTION"TAB( 10)"ORDER"TAB( 20)"TYPE"TAB( 30)"Fo"TAB( 40)"Q"TAB( 50)"Fz"TAB( 60)"Qz"
  242. 2420 IF N1>0 THEN 2430 ELSE GOTO 2460
  243. 2430 FOR I=1 TO N1
  244. 2440 PRINT TAB( 4) I TAB( 11) "1" TAB( 15) FIL$(JMPV(I)) TAB( 29) FO(I) HZ$
  245. 2450 NEXT I
  246. 2460 IF NU2>0 THEN 2470 ELSE GOTO 2520
  247. 2470 FOR I=N1+1 TO N1+NU2
  248. 2480 IF JMPV(I)=7 THEN FIL$(8)="ELLIPTIC":N=8:GOTO 2500
  249. 2490 N=JMPV(I)
  250. 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)
  251. 2510 NEXT I
  252. 2520 RETURN
  253. 2530 IF FS>1000 OR FE>1000 THEN GOTO 2630
  254. 2540 FOR N=1 TO NU2+N1
  255. 2550 IF FO(N)>1000 OR FZ(N)>1000 GOTO 2630
  256. 2560 NEXT N
  257. 2570 IF KHZ=0 THEN HZ$=" Hz":GOTO 2620
  258. 2580 IF KHZ=1 THEN HZ$="KHz":GOTO 2620
  259. 2590 IF KHZ=2 THEN HZ$="MHz":GOTO 2620
  260. 2600 IF KHZ=3 THEN HZ$="GHz":GOTO 2620
  261. 2610 IF KHZ>=4 THEN PRINT "INPUT FREQUENCY(S) ARE TO GREAT!!!":GOTO 560
  262. 2620 RETURN
  263. 2630 KHZ=KHZ+1
  264. 2640 FS=FS/1000:FE=FE/1000:NORM=NORM/1000
  265. 2650 FOR N=1 TO NU2+N1
  266. 2660 FO(N)=FO(N)/1000:FZ(N)=FZ(N)/1000
  267. 2670 NEXT N
  268. 2680 GOTO 2530
  269.