home *** CD-ROM | disk | FTP | other *** search
/ HAM Radio 1 / HamRadio.cdr / tech / design4 / smploop.bas < prev    next >
BASIC Source File  |  1979-12-31  |  15KB  |  625 lines

  1. 10 CLS
  2. 20 DEFSNG A-H: DEFINT I-N: DEFDBL O-Z: PI=3.141592653589794#
  3. 30 DIM D%(20),PR(20),PJ(20),ZR(20),ZJ(20),TPR(20),TPJ(20),TZR(20),TZJ(20)
  4. 40 DIM C#(2048),P(20),CXPLOT(1026),CYPLOT(1026)
  5. 50 CLS
  6. 60 INPUT"SAMPLING FREQUENCY (IN HZ)";SAMPLEF
  7. 70 PRINT
  8. 80 INPUT"SAMPLING EFFICIENCY (0>ETA<1)";SAMPLEN
  9. 90 SSAMPLE=SAMPLEF*(LOG(1-SAMPLEN))
  10. 100 WSAMPLE=2*PI*SAMPLEF
  11. 110 CLS
  12. 120 PRINT"MENU"
  13. 130 PRINT
  14. 140 PRINT"MAKE PROGRAM CHOICE BELOW"
  15. 150 PRINT
  16. 160 PRINT"TYPE A TO LOAD FREQUENCY VARIABLES FROM FILE"
  17. 170 PRINT
  18. 180 PRINT"TYPE B TO LOAD FREQUENCY VARIABLES FROM KEYBOARD"
  19. 190 PRINT
  20. 200 PRINT"TYPE C TO EDIT FREQUENCY VARIABLE LIST"
  21. 210 PRINT
  22. 220 PRINT"TYPE D TO RUN POLYNOMIAL FILTER SYNTHESIS"
  23. 230 PRINT
  24. 240 PRINT"TYPE E TO RUN OPEN & CLOSED LOOP FREQUENCY RESPONSE"
  25. 250 PRINT
  26. 260 PRINT"TYPE F TO DETERMINE CLOSED LOOP NOISE BANDWIDTH"
  27. 270 PRINT
  28. 280 PRINT"TYPE G TO RUN CLOSED LOOP TRANSIENT RESPONSE"
  29. 290 PRINT
  30. 300 PRINT"TYPE Q TO QUIT"
  31. 310 PRINT
  32. 320 INPUT"PROGRAM CHOICE";A$
  33. 330 PRINT
  34. 340 IF A$="A" THEN 430
  35. 350 IF A$="B" THEN 450
  36. 360 IF A$="C" THEN 470
  37. 370 IF A$="D" THEN 490
  38. 380 IF A$="E" THEN 510
  39. 390 IF A$="F" THEN 530
  40. 400 IF A$="G" THEN 550
  41. 410 IF A$="Q" THEN 570
  42. 420 GOTO 110
  43. 430 GOSUB 1000
  44. 440 GOTO 110
  45. 450 GOSUB 5000
  46. 460 GOTO 110
  47. 470 GOSUB 10000
  48. 480 GOTO 110
  49. 490 GOSUB 15000
  50. 500 GOTO 570
  51. 510 GOSUB 20000
  52. 520 GOTO 570
  53. 530 GOSUB 25000
  54. 540 GOTO 570
  55. 550 GOSUB 30000
  56. 570 PRINT
  57. 580 INPUT"QUIT (Y/N)";B$
  58. 590 IF B$="Y" THEN 610
  59. 600 GOTO 50
  60. 610 PRINT
  61. 620 INPUT"DO YOU WANT TO SAVE THE FREQUENCY VARIABLES IN A FILE (Y/N)";C$
  62. 630 IF C$="N" THEN 780
  63. 640 PRINT
  64. 650 INPUT"DECLARE FILENAME";D$
  65. 660 OPEN D$ FOR OUTPUT AS #1
  66. 670 WRITE #1,NZ%
  67. 680 IF NZ%=0 THEN 730
  68. 690 FOR I=1 TO NZ%
  69. 700 WRITE #1,ZR(I)
  70. 710 WRITE #1,ZJ(I)
  71. 720 NEXT I
  72. 730 WRITE #1,NP%
  73. 740 FOR I=1 TO NP%
  74. 750 WRITE #1,PR(I)
  75. 760 WRITE #1,PJ(I)
  76. 770 NEXT I
  77. 780 END
  78. 1000 CLS
  79. 1010 INPUT"DECLARE FILENAME";F$
  80. 1020 OPEN F$ FOR INPUT AS #1
  81. 1030 INPUT #1,NZ%
  82. 1040 IF NZ%=0 THEN 1090
  83. 1050 FOR I=1 TO NZ%
  84. 1060 INPUT #1,ZR(I)
  85. 1070 INPUT #1,ZJ(I)
  86. 1080 NEXT I
  87. 1090 INPUT #1,NP%
  88. 1100 FOR I=1 TO NP%
  89. 1110 INPUT #1,PR(I)
  90. 1120 INPUT #1,PJ(I)
  91. 1130 NEXT I
  92. 1135 CLOSE #1
  93. 1270 RETURN
  94. 5000 CLS
  95. 5010 PRINT"INPUT # OF ZEROS";
  96. 5020 INPUT NZ%
  97. 5030 PRINT"INPUT # OF POLES";
  98. 5040 INPUT NP%
  99. 5050 PRINT
  100. 5060 IF NZ%=0 THEN 5150
  101. 5070 FOR I=1 TO NZ%
  102. 5080 PRINT"ZERO #";I;"REAL PART";
  103. 5090 INPUT ZR(I)
  104. 5100 PRINT"ZERO #";I;"IMAGINARY PART";
  105. 5110 INPUT ZJ(I)
  106. 5130 NEXT I
  107. 5140 PRINT
  108. 5150 FOR I=1 TO NP%
  109. 5160 PRINT"POLE #";I;"REAL PART";
  110. 5170 INPUT PR(I)
  111. 5180 PRINT"POLE #";I;"IMAGINARY PART";
  112. 5190 INPUT PJ(I)
  113. 5200 NEXT I
  114. 5210 RETURN
  115. 10000 CLS
  116. 10010 PRINT"THERE ARE";NZ%;"ZEROES AND";NP%;"POLES"
  117. 10020 PRINT
  118. 10030 IF NZ%=0 THEN 10090
  119. 10040 FOR I=1 TO NZ%
  120. 10050 PRINT"ZERO #";I;"REAL PART IS";ZR(I)
  121. 10060 PRINT"ZERO #";I;"IMAGINARY PART IS";ZJ(I)
  122. 10070 NEXT I
  123. 10080 PRINT
  124. 10090 FOR I=1 TO NP%
  125. 10100 PRINT"POLE #";I;"REAL PART IS";PR(I)
  126. 10110 PRINT"POLE #";I;"IMAGINARY PART IS";PJ(I)
  127. 10120 NEXT I
  128. 10130 PRINT
  129. 10140 PRINT"EDIT ZEROES (Y/N)";
  130. 10150 INPUT B$
  131. 10160 PRINT
  132. 10170 IF B$="N" THEN 10750
  133. 10180 PRINT"ADD,DELETE,OR SUBSTITUTE (A,D,S)";
  134. 10190 INPUT C$
  135. 10200 PRINT
  136. 10210 IF C$="S" THEN 10630
  137. 10220 IF C$="D" THEN 10380
  138. 10230 IF C$="A" THEN 10240 ELSE 10180
  139. 10240 PRINT"HOW MANY";
  140. 10250 INPUT NC%
  141. 10260 ND%=NZ%+NC%
  142. 10270 PRINT
  143. 10280 FOR I=1 TO ND%
  144. 10290 IF I>NZ% THEN 10310
  145. 10300 GOTO 10350
  146. 10310 PRINT"ZER0 #";I;"REAL PART";
  147. 10320 INPUT ZR(I)
  148. 10330 PRINT"ZERO #";I;"IMAGINARY PART";
  149. 10340 INPUT ZJ(I)
  150. 10350 NEXT I
  151. 10360 NZ%=NZ%+NC%
  152. 10370 GOTO 10750
  153. 10380 PRINT"HOW MANY";
  154. 10390 INPUT NC%
  155. 10400 PRINT
  156. 10410 FOR J=1 TO NC%
  157. 10420 INPUT"DELETE ZERO #";D%(J)
  158. 10430 NEXT J
  159. 10440 M=0
  160. 10450 FOR J=1 TO NC%
  161. 10460 FOR I=1 TO NZ%
  162. 10470 IF I=D%(J) THEN 10510
  163. 10480 M=M+1
  164. 10490 TZR(M)=ZR(I)
  165. 10500 TZJ(M)=ZJ(I)
  166. 10510 NEXT I
  167. 10520 NEXT J
  168. 10530 NZ%=NZ%-NC%
  169. 10560 FOR I=1 TO NZ%
  170. 10570 ZR(I)=TZR(I)
  171. 10580 ZJ(I)=TZJ(I)
  172. 10590 NEXT I
  173. 10620 GOTO 10750
  174. 10630 FOR I=1 TO NZ%
  175. 10640 PRINT"ZERO #";I;"IS";ZR(I);"AND J";ZJ(I)
  176. 10650 PRINT
  177. 10660 PRINT"CHANGE (Y/N)";
  178. 10670 INPUT D$
  179. 10675 PRINT
  180. 10680 IF D$="N" THEN 10740
  181. 10700 PRINT"ZERO #";I;"REAL PART";
  182. 10710 INPUT ZR(I)
  183. 10720 PRINT"ZERO #";I;"IMAGINARY PART";
  184. 10730 INPUT ZJ(I)
  185. 10740 NEXT I
  186. 10750 PRINT
  187. 10760 PRINT"EDIT POLES (Y/N)";
  188. 10770 INPUT A$
  189. 10780 IF A$="N" THEN 11380
  190. 10790 PRINT
  191. 10800 REM START POLE EDIT
  192. 10810 PRINT"ADD,DELETE,OR SUBSTITUTE POLES (A,D,S)";
  193. 10820 INPUT A$
  194. 10830 PRINT
  195. 10840 IF A$="S" THEN 11260
  196. 10850 IF A$="D" THEN 11010
  197. 10860 IF A$="A" THEN 10870 ELSE 10810
  198. 10870 PRINT"HOW MANY";
  199. 10880 INPUT NC%
  200. 10890 ND%=NP%+NC%
  201. 10900 PRINT
  202. 10910 FOR I=1 TO ND%
  203. 10920 IF I>NP% THEN 10940
  204. 10930 GOTO 10980
  205. 10940 PRINT"POLE #";I;"REAL PART";
  206. 10950 INPUT PR(I)
  207. 10960 PRINT"POLE #";I;"IMAGINARY PART";
  208. 10970 INPUT PJ(I)
  209. 10980 NEXT I
  210. 10990 NP%=NP%+NC%
  211. 11000 GOTO 11380
  212. 11010 PRINT"HOW MANY";
  213. 11020 INPUT NC%
  214. 11030 PRINT
  215. 11040 FOR J=1 TO NC%
  216. 11050 INPUT"DELETE POLE #";D%(J)
  217. 11060 NEXT J
  218. 11070 M=O
  219. 11080 FOR J=1 TO NC%
  220. 11090 FOR I=1 TO NP%
  221. 11100 IF I=D%(J) THEN 11140
  222. 11110 M=M+1
  223. 11120 TPR(M)=PR(I)
  224. 11130 TPJ(M)=PJ(I)
  225. 11140 NEXT I
  226. 11150 NEXT J
  227. 11160 NP%=NP%-NC%
  228. 11190 FOR I=1 TO NP%
  229. 11200 PR(I)=TPR(I)
  230. 11210 PJ(I)=TPJ(I)
  231. 11220 NEXT I
  232. 11250 GOTO 11380
  233. 11260 FOR I=1 TO NP%
  234. 11270 PRINT"POLE #";I;"IS";PR(I);"AND J";PJ(I)
  235. 11280 PRINT
  236. 11290 PRINT"CHANGE (Y/N)";
  237. 11300 INPUT C$
  238. 11305 PRINT
  239. 11310 IF C$="N" THEN 11370
  240. 11330 PRINT"POLE #";I;"REAL PART";
  241. 11340 INPUT PR(I)
  242. 11350 PRINT"POLE #";I;"IMAGINARY PART";
  243. 11360 INPUT PJ(I)
  244. 11370 NEXT I
  245. 11380 RETURN
  246. 15000 CLS
  247. 15010 PRINT"REQUIRED ATTENUATION IN dB";
  248. 15020 INPUT Z21
  249. 15040 PRINT
  250. 15050 PRINT"INPUT CUTTOFF FREQUENCY RATIO OF REQUIRED ATTENUATION";
  251. 15060 INPUT W
  252. 15070 IF W<=1# THEN 15050
  253. 15080 PRINT
  254. 15090 PRINT"PERMISSABLE PASSBAND RIPPLE IN dB , 0dB FOR BUTTERWORTH";
  255. 15100 INPUT R
  256. 15120 K#=10#^(Z21/10#)
  257. 15125 IF R=0 THEN 15440
  258. 15130 RES=(10#^(R/10#))-1#
  259. 15140 RE=SQR(RES)
  260. 15150 TW=SQR((K#-1#)/RES)
  261. 15160 FOR I=1 TO 20
  262. 15170 KA#=((W+SQR(W^2#-1#))^I+(W+SQR(W^2#-1#))^(1#/I))/2#
  263. 15180 IF KA#=>TW THEN 15200
  264. 15190 NEXT I
  265. 15200 PRINT
  266. 15210 PRINT"N=";I
  267. 15230 PRINT
  268. 15240 PRINT"RESULTS SATISFACTORY (Y/N)";
  269. 15250 INPUT A$
  270. 15260 IF A$="Y" THEN 15270 ELSE 15000
  271. 15270 X=(SQR((1#/RES)+1#)+1#/RE)^(1#/I)
  272. 15280 Y=1#/X
  273. 15290 SINH=(X-Y)/2#
  274. 15300 COSH#=(X+Y)/2#
  275. 15310 N%=I-1
  276. 15320 PRINT
  277. 15330 PRINT"FREQUENCY SCALE FACTOR";
  278. 15340 INPUT KF#
  279. 15350 PRINT
  280. 15370 PRINT
  281. 15380 FOR J=0 TO N%
  282. 15390 PR(J+1+NP%)=KF#*(-SINH*(SIN(((2#*J+1#)*PI)/(2#*I))))
  283. 15400 PJ(J+1+NP%)=KF#*(COSH#*(COS(((2#*J+1#)*PI)/(2#*I))))
  284. 15420 NEXT J
  285. 15430 GOTO 15610
  286. 15440 FOR I=1 TO 20
  287. 15450 KA#=1+W^(2#*I)
  288. 15460 IF KA#=>K# THEN 15480
  289. 15470 NEXT I
  290. 15480 PRINT
  291. 15490 PRINT"N=";I
  292. 15500 PRINT
  293. 15510 INPUT"RESULTS SATISFACTORY";A$
  294. 15520 IF A$="Y" THEN 15530 ELSE 15000
  295. 15530 PRINT
  296. 15540 INPUT"FREQUENCY SCALE FACTOR";KF#
  297. 15550 N%=I
  298. 15560 FOR J=1 TO N%
  299. 15570 P(J)=PI/2#+(PI/(2#*N%))*(2#*J-1#)
  300. 15580 PR(J+NP%)=KF#*(COS(P(J)))
  301. 15590 PJ(J+NP%)=KF#*(SIN(P(J)))
  302. 15600 NEXT J
  303. 15610 N=I
  304. 15620 J=0
  305. 15622 FOR L=1 TO N
  306. 15624 TPR(L)=PR(NP%+L)
  307. 15626 TPJ(L)=PJ(NP%+L)
  308. 15628 NEXT L
  309. 15630 FOR L=1 TO N
  310. 15640 J=J+1
  311. 15670 IF ABS(TPJ(L))=>ABS((10^-6)*TPR(L)) THEN 15680 ELSE 15750
  312. 15680 IF TPJ(L)<0 THEN 15770
  313. 15690 PR(NP%+J)=TPR(L)
  314. 15700 PJ(NP%+J)=TPJ(L)
  315. 15710 PR(NP%+J+1)=TPR(L)
  316. 15720 PJ(NP%+J+1)=-TPJ(L)
  317. 15730 J=J+1
  318. 15740 GOTO 15770
  319. 15750 PR(NP%+J)=TPR(L)
  320. 15760 PJ(NP%+J)=0#
  321. 15770 NEXT L
  322. 15780 NP%=NP%+I
  323. 15790 RETURN
  324. 20000 CLS
  325. 20010 KN#=1#
  326. 20020 IF NZ%=0 THEN 20080
  327. 20030 FOR I=1 TO NZ%
  328. 20040 ZT=ABS(ZR(I))+ABS(ZJ(I))
  329. 20050 IF ZT=0 THEN 20070
  330. 20060 KN#=KN#*SQR(ZR(I)^2+ZJ(I)^2)
  331. 20070 NEXT I
  332. 20080 KD#=ABS(SSAMPLE)
  333. 20090 FOR I=1 TO NP%
  334. 20100 PT=ABS(PR(I))+ABS(PJ(I))
  335. 20110 IF PT=0 THEN 20130
  336. 20120 KD#=KD#*SQR(PR(I)^2+PJ(I)^2)
  337. 20130 NEXT I
  338. 20140 PRINT
  339. 20150 PRINT"INPUT LOOP GAIN";
  340. 20160 INPUT U
  341. 20170 K#=(KD#/KN#)*U
  342. 20172 PRINT
  343. 20174 INPUT"PLOT (Y/N)";P$
  344. 20180 PRINT
  345. 20190 PRINT "START FREQ.";
  346. 20200 INPUT WS
  347. 20210 PRINT"NUMBER OF DECADES";
  348. 20220 INPUT WF
  349. 20222 IF P$="Y" THEN 20252
  350. 20230 PRINT"DECADE INCREMENT";
  351. 20240 INPUT WD
  352. 20250 N%=WF/WD
  353. 20251 GOTO 20260
  354. 20252 N%=500:WD=WF/500
  355. 20260 PRINT
  356. 20270 PRINT
  357. 20272 IF P$="Y" THEN 20290
  358. 20280 PRINT USING"\            \";"W","H(W)-dB","THETA(W)","H(W)'-dB","THETA(W)'"
  359. 20290 FOR I=0 TO N%
  360. 20300 W=WS*(10^(I*WD))
  361. 20310 PM=(1/(SQR(W^2+SSAMPLE^2)))*ABS((SIN(PI*(W/WSAMPLE)))/((PI*W)/WSAMPLE))
  362. 20320 PT=-PI*(W/WSAMPLE)+ATN(W/SSAMPLE)
  363. 20330 TD=0
  364. 20340 FOR J=1 TO NP%
  365. 20350 PM=PM/(SQR(PR(J)^2+(W-PJ(J))^2))
  366. 20360 IF PR(J)=0 THEN 20390
  367. 20370 PT=PT+ATN((W-PJ(J))/PR(J))
  368. 20380 GOTO 20400
  369. 20390 PT=PT-PI/2
  370. 20400 NEXT J
  371. 20410 IF NZ%=0 THEN 20490
  372. 20420 FOR H=1 TO NZ%
  373. 20430 PM=PM*SQR(ZR(H)^2+(W-ZJ(H))^2)
  374. 20440 IF ZR(H)=0 THEN 20470
  375. 20450 PT=PT-ATN((W-ZJ(H))/ZR(H))
  376. 20460 GOTO 20480
  377. 20470 PT=PT+PI/2
  378. 20480 NEXT H
  379. 20490 PM=PM*K#
  380. 20500 R=PM*COS(PT)
  381. 20510 S=PM*SIN(PT)
  382. 20520 R=R+1
  383. 20530 MC#=PM/(SQR(R*R+S*S))
  384. 20540 X=R/(SQR(R*R+S*S))
  385. 20550 IF 1-X*X=0 THEN 20570
  386. 20560 PC=PT-SGN(S)*(PI/2-ATN(X/SQR(1-X*X)))
  387. 20570 XM=8.68589*LOG(PM)
  388. 20580 XC=8.68589*LOG(MC#)
  389. 20582 IF P$="Y" THEN 20592
  390. 20590 PRINT USING"##.###^^^^    ";W,XM,PT,XC,PC
  391. 20591 GOTO 20600
  392. 20592 CXPLOT(I)=W:CYPLOT(I)=XC
  393. 20600 NEXT I
  394. 20601 IF P$="Y" THEN 20602 ELSE 20610
  395. 20602 CLS
  396. 20603 NCURVES!=1
  397. 20604 NPOINTS!=500
  398. 20605 CALL PLOT((NCURVES!),(NPOINTS!),CXPLOT(),CYPLOT())
  399. 20610 PRINT
  400. 20620 PRINT"NEW GAIN VALUE (Y/N)";
  401. 20630 INPUT A$
  402. 20640 PRINT
  403. 20650 IF A$="Y" THEN 20150
  404. 20660 RETURN
  405. 25000 CLS
  406. 25010 KN#=1#
  407. 25020 IF NZ%=0 THEN 25080
  408. 25030 FOR I=1 TO NZ%
  409. 25040 ZT=ABS(ZR(I))+ABS(ZJ(I))
  410. 25050 IF ZT=0 THEN 25070
  411. 25060 KN#=KN#*SQR(ZR(I)^2+ZJ(I)^2)
  412. 25070 NEXT I
  413. 25080 KD#=ABS(SSAMPLE)
  414. 25090 FOR I=1 TO NP%
  415. 25100 PT=ABS(PR(I))+ABS(PJ(I))
  416. 25110 IF PT=0 THEN 25130
  417. 25120 KD#=KD#*SQR(PR(I)^2+PJ(I)^2)
  418. 25130 NEXT I
  419. 25140 PRINT
  420. 25150 PRINT"INPUT LOOP GAIN";
  421. 25160 INPUT U
  422. 25170 K#=(KD#/KN#)*U
  423. 25180 PRINT
  424. 25190 PRINT"INPUT APPROXIMATE -3dB RADIAN FREQUENCY";
  425. 25200 INPUT WC
  426. 25210 PRINT
  427. 25220 XN=0
  428. 25230 FOR A%=1 TO 3
  429. 25240 IF A%=1 THEN 25270
  430. 25250 WD=WC*(10^(A%-3))
  431. 25260 GOTO 25540
  432. 25270 FOR B%=1 TO 100
  433. 25280 WD=WC/100#
  434. 25290 W=WD*B%
  435. 25300 PM=(1/(SQR(W^2+SSAMPLE^2)))*ABS((SIN(PI*(W/WSAMPLE)))/((PI*W)/WSAMPLE))
  436. 25310 PT=ATN(W/SSAMPLE)-PI*(W/WSAMPLE)
  437. 25320 FOR J=1 TO NP%
  438. 25330 PM=PM/(SQR(PR(J)^2+(W-PJ(J))^2))
  439. 25340 IF PR(J)=0 THEN 25370
  440. 25350 PT=PT+ATN((W-PJ(J))/PR(J))
  441. 25360 GOTO 25380
  442. 25370 PT=PT-PI/2
  443. 25380 NEXT J
  444. 25390 IF NZ%=0 THEN 25470
  445. 25400 FOR H=1 TO NZ%
  446. 25410 PM=PM*SQR(ZR(H)^2+(W-ZJ(H))^2)
  447. 25420 IF ZR(H)=0 THEN 25450
  448. 25430 PT=PT-ATN((W-ZJ(H))/ZR(H))
  449. 25440 GOTO 25460
  450. 25450 PT=PT+PI/2
  451. 25460 NEXT H
  452. 25470 PM=PM*K#
  453. 25472 IF PM=>1# AND ABS(PT)>PI THEN 25474 ELSE 25480
  454. 25474 PRINT
  455. 25476 PRINT"THE SYSTEM IS UNSTABLE"
  456. 25478 GOTO 25810
  457. 25480 R=PM*COS(PT)
  458. 25490 S=PM*SIN(PT)
  459. 25500 R=R+1
  460. 25510 XN=XN+((PM*PM)/(R*R+S*S))*WD
  461. 25520 NEXT B%
  462. 25530 IF A%=1 THEN 25790
  463. 25540 FOR C%=1 TO 90
  464. 25550 W=WD*(10+C%)
  465. 25560 PM=(1/(SQR(W^2+SSAMPLE^2)))*ABS((SIN(PI*(W/WSAMPLE)))/((PI*W)/WSAMPLE))
  466. 25570 PT=ATN(W/SSAMPLE)-PI*(W/WSAMPLE)
  467. 25580 FOR J=1 TO NP%
  468. 25590 PM=PM/(SQR(PR(J)^2+(W-PJ(J))^2))
  469. 25600 IF PR(J)=0 THEN 25630
  470. 25610 PT=PT+ATN((W-PJ(J))/PR(J))
  471. 25620 GOTO 25640
  472. 25630 PT=PT-PI/2
  473. 25640 NEXT J
  474. 25650 IF NZ%=0 THEN 25730
  475. 25660 FOR H=1 TO NZ%
  476. 25670 PM=PM*SQR(ZR(H)^2+(W-ZJ(H))^2)
  477. 25680 IF ZR(H)=0 THEN 25710
  478. 25690 PT=PT-ATN((W-ZJ(H))/ZR(H))
  479. 25700 GOTO 25720
  480. 25710 PT=PT+PI/2
  481. 25720 NEXT H
  482. 25730 PM=PM*K#
  483. 25740 R=PM*COS(PT)
  484. 25750 S=PM*SIN(PT)
  485. 25760 R=R+1
  486. 25770 XN=XN+((PM*PM)/(R*R+S*S))*WD
  487. 25780 NEXT C%
  488. 25790 NEXT A%
  489. 25800 PRINT "THE LOOP NOISE BANDWIDTH IS";XN;"RAD/SEC"
  490. 25810 PRINT
  491. 25820 PRINT"NEW LOOP GAIN (Y/N)";
  492. 25830 INPUT A$
  493. 25840 PRINT
  494. 25850 IF A$="N" THEN 25860 ELSE 25150
  495. 25860 RETURN
  496. 30000 CLS
  497. 30010 KN#=1
  498. 30020 IF NZ%=0 THEN 30080
  499. 30030 FOR I=1 TO NZ%
  500. 30040 ZT=ABS(ZR(I))+ABS(ZJ(I))
  501. 30050 IF ZT=0 THEN 30070
  502. 30060 KN#=KN#*SQR(ZR(I)^2+ZJ(I)^2)
  503. 30070 NEXT I
  504. 30080 KD#=ABS(SSAMPLE)
  505. 30090 FOR I=1 TO NP%
  506. 30100 PT=ABS(PR(I))+ABS(PJ(I))
  507. 30110 IF PT=0 THEN 30130
  508. 30120 KD#=KD#*SQR(PR(I)^2+PJ(I)^2)
  509. 30130 NEXT I
  510. 30140 PRINT
  511. 30150 PRINT"INPUT LOOP GAIN";
  512. 30160 INPUT U
  513. 30170 K#=(KD#/KN#)*U
  514. 30180 PRINT
  515. 30190 INPUT"AUTOSCALE TIME BASE (Y/N)";Q$
  516. 30200 IF Q$="N" THEN 30590
  517. 30210 NO%=0
  518. 30220 FOR I=1 TO NP%
  519. 30230 IF PR(I)=0 AND PJ(I)=0 THEN 30240 ELSE 30250
  520. 30240 NO%=NO%+1
  521. 30250 NEXT I
  522. 30260 IF NO%=0 THEN 30570
  523. 30270 WS=U^(1/NO%)
  524. 30280 WL=WS/1024
  525. 30290 WU=0
  526. 30300 FOR I=20 TO 0 STEP -1
  527. 30310 W=WL*(2#^I)+WU
  528. 30320 PM=(1/(SQR(W^2+SSAMPLE^2)))*ABS((SIN(PI*(W/WSAMPLE)))/((PI*W)/WSAMPLE))
  529. 30330 PT=ATN(W/SSAMPLE)-PI*(W/WSAMPLE)
  530. 30340 TD=0
  531. 30350 FOR J=1 TO NP%
  532. 30360 PM=PM/(SQR(PR(J)^2+(W-PJ(J))^2))
  533. 30370 IF PR(J)=0 THEN 30400
  534. 30380 PT=PT+ATN((W-PJ(J))/PR(J))
  535. 30390 GOTO 30410
  536. 30400 PT=PT-PI/2
  537. 30410 NEXT J
  538. 30420 IF NZ%=0 THEN 30500
  539. 30430 FOR H=1 TO NZ%
  540. 30440 PM=PM*SQR(ZR(H)^2+(W-ZJ(H))^2)
  541. 30450 IF ZR(H)=0 THEN 30480
  542. 30460 PT=PT-ATN((W-ZJ(H))/ZR(H))
  543. 30470 GOTO 30490
  544. 30480 PT=PT+PI/2
  545. 30490 NEXT H
  546. 30500 PM=PM*K#
  547. 30510 IF PM<1# THEN 30530
  548. 30520 WU=WU+W
  549. 30530 NEXT I
  550. 30540 WS=.025#*PI*WU
  551. 30550 T=(2#*PI)/WS
  552. 30560 GOTO 30620
  553. 30570 PRINT
  554. 30580 PRINT"CANNOT AUTOSCALE TIME BASE"
  555. 30590 PRINT
  556. 30600 INPUT"FULL SCALE TIME BASE (IN SECONDS)";T
  557. 30610 WS=(2#*PI)/T
  558. 30620 PRINT
  559. 30630 INPUT"STEP OR IMPULSE RESPONSE (S/I)";A$
  560. 30640 PRINT
  561. 30650 C#(0)=1#
  562. 30660 C#(1)=0#
  563. 30670 FOR I=1 TO 1023
  564. 30680 W=WS*I
  565. 30690 PM=(1/(SQR(W^2+SSAMPLE^2)))*ABS((SIN(PI*(W/WSAMPLE)))/((PI*W)/WSAMPLE))
  566. 30700 PT=ATN(W/SSAMPLE)-PI*(W/WSAMPLE)
  567. 30710 TD=0
  568. 30720 FOR J=1 TO NP%
  569. 30730 PM=PM/(SQR(PR(J)^2+(W-PJ(J))^2))
  570. 30740 IF PR(J)=0 THEN 30770
  571. 30750 PT=PT+ATN((W-PJ(J))/PR(J))
  572. 30760 GOTO 30780
  573. 30770 PT=PT-PI/2
  574. 30780 NEXT J
  575. 30790 IF NZ%=0 THEN 30870
  576. 30800 FOR H=1 TO NZ%
  577. 30810 PM=PM*SQR(ZR(H)^2+(W-ZJ(H))^2)
  578. 30820 IF ZR(H)=0 THEN 30850
  579. 30830 PT=PT-ATN((W-ZJ(H))/ZR(H))
  580. 30840 GOTO 30860
  581. 30850 PT=PT+PI/2
  582. 30860 NEXT H
  583. 30870 PM=PM*K#
  584. 30880 IF PM =>1# AND ABS(PT)>PI THEN 30890 ELSE 30920
  585. 30890 PRINT
  586. 30900 PRINT"THE SYSTEM IS UNSTABLE"
  587. 30910 GOTO 31230
  588. 30920 R=PM*COS(PT)
  589. 30930 S=PM*SIN(PT)
  590. 30940 R=R+1
  591. 30950 MC#=PM/(SQR(R*R+S*S))
  592. 30955 MC#=MC#*(1/(1+(W/(WS*316))^6))
  593. 30960 X=R/(SQR(R*R+S*S))
  594. 30970 IF 1-X*X=0 THEN 30990
  595. 30980 PC=PT-SGN(S)*(PI/2-ATN(X/SQR(1-X*X)))
  596. 30990 PC=PC-(80*PI*I)/1023
  597. 31000 C#(2*I)=MC#*COS(PC)
  598. 31010 C#(2*I+1)=MC#*SIN(PC)
  599. 31020 NEXT I
  600. 31030 PRINT
  601. 31040 N%=10
  602. 31050 NORM%=2
  603. 31060 SCALE=1#
  604. 31070 CALL RIFT(C#(0),N%,NORM%,SCALE)
  605. 31080 PRINT
  606. 31090 PRINT
  607. 31100 IF A$="I" THEN 31140
  608. 31110 FOR I=1 TO 1023
  609. 31120 C#(I)=C#(I)+C#(I-1)-C#(0)
  610. 31130 NEXT I
  611. 31132 FOR I=1 TO 1023
  612. 31134 C#(I)=C#(I)/C#(1023)
  613. 31136 NEXT I
  614. 31140 FOR I=1 TO 1024
  615. 31150 CYPLOT(I)=C#(I-1):CXPLOT(I)=(I-1)*(T/1023)
  616. 31160 NEXT I
  617. 31162 CLS
  618. 31170 NCURVES!=1
  619. 31180 NPOINTS!=1024
  620. 31190 CALL PLOT((NCURVES!),(NPOINTS!),CXPLOT(),CYPLOT())
  621. 31200 INPUT"NEW LOOP GAIN";A$
  622. 31210 IF A$="N" THEN 31230
  623. 31220 GOTO 30000
  624. 31230 RETURN
  625.