10 REM BANDPASS FILTER DESIGN PROG BY RUSSELL KINCAID, 09722 20 REM WRITTEN 1988, UPDATED AUG 2000 30 DIM Y$(3), D$(1) 40 DIM K$(12), T$(15), F$(3), C$(3) 50 DIM P(9), W(9), S(9), C(9), F(9), B(9) 60 OPEN "PRN" FOR OUTPUT AS #1 70 GOTO 120 80 PRINT "DO YOU WANT TO CHOOSE THE TUNING CAP, OR LET THE PROGRAM DO IT?" 90 INPUT "1=U CHOOSE, 0=PROG CHOOSE"; K8 100 IF K8 < 0 OR K8 > 1 THEN PRINT "JUST '1' OR '0' PLEASE": GOTO 80 110 RETURN 120 CLS 130 PRINT 140 PRINT "****** BANDPASS **************************" 150 PRINT "* WRITTEN BY RUSS KINCAID *" 160 PRINT "* READ THE FILE: BANDPASS.DOC FOR INFO ON THE PROGRAM *" 170 PRINT "* This is shareware, please copy and distribute *" 180 PRINT "***********************************************************" 184 PRINT:PRINT"USE CAPITALS ONLY" 190 PRINT : PRINT : INPUT "PRESS ENTER TO CONTINUE"; Y$ 200 CLS : PRINT : PRINT DATE$, TIME$: PRINT : PRINT 210 PRINT " 1 = QUIT" 220 PRINT " 2 = ENTER PARAMETERS FOR BUTTERWORTH, CHEBYCHEV OR PAPOULIS" 230 PRINT " 3 = LOPASS PROTOTYPE INPUT (ALL POLE ONLY)" 240 PRINT " 4 = APPROXIMATION TO A LINEAR PHASE FILTER" 250 PRINT : INPUT " WHICH ONE "; J 260 ON J GOTO 6790, 450, 2550, 1300 270 CLS 280 PRINT "1 = RESPONSE GRAPH" 290 PRINT "2 = RESPONSE TABLE" 300 PRINT "3 = PRINT STATE VARIABLE CIRCUIT VALUES" 310 PRINT "4 = PRINT BIQUAD CIRCUIT VALUES" 320 PRINT "5 = PRINT LC CIRCUIT VALUES" 330 PRINT "6 = PRINT ONE OPAMP CIRCUIT VALUES" 340 PRINT "7 = PRINT IFAMP CIRCUIT VALUES" 350 PRINT : PRINT "8 = CHANGE TUNING (TWEAK)" 360 PRINT "9 = SHOW TUNING INFO" 370 PRINT "10 = LIST DATA ENTERED" 380 PRINT "11 = SAVE ON DISK" 390 PRINT "12 = QUIT" 400 PRINT : INPUT "WHICH ONE "; J 410 ON J GOTO 2630, 1520, 2080, 1880, 2210, 2400, 3420, 2330, 3040, 3160, 4320, 6790 420 GOTO 280 430 LET K8 = 1 440 PRINT "OK": GOTO 120 450 REM ENTER ROUTINE 460 E1 = 2.71818: K8 = 0: P = 3.14162: Z1 = 0 470 INPUT "HOW MANY POLES "; N 480 Y1 = (N + 1) / 2 490 INPUT "WHAT RESPONSE (BUTT, PAPOULIS, CHEBY)"; T$ 500 IF LEFT$(T$, 1) = "P" THEN T$ = "P": GOTO 720 510 IF LEFT$(T$, 1) = "B" THEN T$ = "B": GOTO 550 520 T$ = "C" 530 INPUT "WHAT RIPPLE, IN DB"; R 540 GOTO 640 550 INPUT "WILL YOU USE 3DB FREQUENCIES "; Y$ 560 IF LEFT$(Y$, 1) = "Y" THEN 580 570 INPUT "WHAT IS THE CUTOFF POINT, IN DB "; R: GOTO 590 580 R = 3 590 D = 10 ^ (R / 20) 600 FOR J = 1 TO N 610 Z(J) = P / 2 * (2 * J - 1) / N: U = -1 / 2 / N 620 B1 = (D ^ 2 - 1) ^ U: P(J) = B1 * SIN(Z(J)): W(J) = B1 * COS(Z(J)) 630 NEXT J: GOTO 940 640 D = 10 ^ (R / 10): B1 = 1 / (SQR(D - 1)): A = LOG(B1 + SQR(B1 ^ 2 + 1)) 650 C(N) = (E1 ^ 2 + E1 ^ (-Z)) / 2 660 Z = A / N: S(N) = (E1 ^ Z - E1 ^ (-Z)) / 2: C(N) = (E1 ^ Z + E1 ^ (-Z)) / 2: Y1 = (N + 1) / 2 670 Y1 = (N + 1) / 2 680 FOR J = 1 TO Y1 690 P(J) = S(N) * SIN(P / 2 * (2 * J - 1) / N) 700 W(J) = C(N) * COS(P / 2 * (2 * J - 1) / N) 710 NEXT J: GOTO 940 720 DATA 1,1 730 DATA 2,7.071067812E-01, 7.071067812E-01 740 DATA 3, 3.451856190E-01, 9.008656355E-01, 6.203318171E-01 750 DATA 4, .2316887227, .9455106639, .5497434238, .3585718162 760 DATA 5, .1535867375, .9681464077, .3881398517, .5886323381, .4680898756 770 DATA 6, .1151926789, .9779222345, .3089608853 780 DATA .6981674628, .4389015496, .2399813521 790 DATA 7, .08620854829, .9843698067, .2374397572, .7783008922 800 DATA .3492317849, .4289961167, .3821033151 810 DATA 8, .06894215788, .9879709679, .1942758815, .8247667242 820 DATA .3002840049, .541042245, .367176310, .1808791994 830 DATA 9, .05509715639, .9906603252, .1572837691 840 DATA .8613428511, .2485528956, .63381962 850 DATA .3093854336, .3365432374, .3256878223 860 READ N1: Y2 = (N1 + 1) / 2 870 FOR J = 1 TO Y2 880 READ P(J) 890 IF J < INT(Y2) THEN 910 900 IF INT(Y2) = Y2 THEN 930 910 READ W(J) 920 NEXT J 930 IF N = N1 THEN 940 ELSE 860 940 INPUT "WILL YOU SPECIFY THE CENTER FREQ. "; C$ 950 IF LEFT$(C$, 1) = "N" THEN 990 960 IF C$ = "S" THEN 1030 970 INPUT "WHAT IS IT (HERTZ) "; W0: W0 = 2 * P * W0 980 GOTO 1010 990 INPUT "WHAT ARE THE BAND EDGES (LOW, HI) "; W1, W2 1000 W0 = SQR(W1 * W2) * 2 * P: B = (W2 - W1) * 2 * P: GOTO 1020 1010 INPUT "WHAT IS THE BANDWIDTH? "; B: B = B * 2 * P 1020 INPUT "WHAT GAIN IN VOLTS/VOLT "; G0: J1 = 0 1030 IF Z1 = 1 THEN 1160 1040 FOR J = 1 TO N STEP 2 1050 J1 = J1 + 1: IF J = N THEN 1150 ELSE Q = W0 / B 1060 U = .5 + (P(J1) ^ 2 + W(J1) ^ 2) / 8 / (Q ^ 2) 1070 V = P(J1) ^ 2 / 4 / (Q ^ 2) 1080 K = SQR(U + SQR(U ^ 2 - V)) 1090 X1 = K + SQR(K ^ 2 - 1) 1100 X2 = SQR(U - SQR(U ^ 2 - V)): IF X2 > 0 THEN 1120 1110 PRINT "THIS PROGRAM CANNOT HANDLE SUCH HIGH Q": GOTO 120 1120 F(J) = X1 * W0: F(J + 1) = W0 / X1 1130 B(J) = 2 * F(J) * X2: B(J + 1) = 2 * F(J + 1) * X2 1140 NEXT J: GOTO 1160 1150 F(N) = W0: B(N) = B * P(Y1) 1160 G2 = 1: G = 0 1170 FOR J = 1 TO N 1180 T1 = F(J) ^ 2 - W0 ^ 2 1190 T2 = T1 ^ 2 + (B(J) * W0) ^ 2 1200 T3 = B(J) * W0 ^ 2 / T2 1210 T4 = W0 * T1 / T2 1220 G1 = SQR(T3 ^ 2 + T4 ^ 2) 1230 G1 = LOG(G1): G = G + G1 1240 NEXT J 1250 G = LOG(G0) - G: H = EXP(G / N) 1260 FOR J = 1 TO N: G2 = (H / B(J)) * G2: NEXT J 1270 G2 = EXP(LOG(G2) / N): INPUT "PRESS 'ENTER' FOR MENU "; Y$: GOTO 270 1280 REM THIS ROUTINE DESIGNS 2,3,4, AND 5 POLE-PAIR LINEAR 1290 REM PHASE FILTERS 1300 T$ = "LINEAR PHASE": P = 3.141592: E1 = 2.71818: K8 = 0: Z1 = 0 1310 INPUT "NUMBER OF POLE-PAIRS "; N: Y1 = (N + 1) / 2 1320 INPUT "CENTER FREQ. (HZ.) "; F0 1330 INPUT "BANDWIDTH (HZ.) "; B: W0 = 2 * P * F0: B = 2 * P * B 1340 INPUT "GAIN IN VOLTS/VOLT "; G0 1350 ON N - 1 GOTO 1360, 1370, 1390, 1410 1360 S(1) = .4054: W(1) = .4659: S(2) = .41892: W(2) = 1.1957: GOTO 1430 1370 S(1) = .373: W(1) = .153: S(2) = .516: W2 = .8328: S(3) = .4364 1380 W(3) = 1.527: GOTO 1430 1390 S(1) = .5: W(1) = .1: S(2) = .5: W(2) = .56: S(3) = .5: W(3) = 1.03: S(4) = .5: W(4) = 1.5 1400 GOTO 1430 1410 S(1) = .3185: W(1) = .09833: S(2) = .7233: W(2) = .4192: S(3) = .6183: W(3) = .7692 1420 S(4) = .6475: W(4) = 1.1075: S(5) = .3833: W(5) = 1.5275: GOTO 1430 1430 PRINT "LINEAR PHASE FILTER TUNING" 1440 PRINT 1450 PRINT "SECTION", "F0", "BW", "Q" 1460 Q = W0 / B 1470 FOR T = 1 TO N 1480 S(T) = S(T) / Q: W(T) = 1.02 + (W(T) - 1.02) / Q: F(T) = W0 * SQR(S(T) ^ 2 + W(T) ^ 2) 1490 B(T) = 2 * S(T) * W0: Q(T) = F(T) / B(T) 1500 PRINT T, F(T) / 2 / P, B(T) / 2 / P, Q(T) 1510 NEXT T: PRINT : GOTO 1160 1520 K$ = "TABLE" 1530 REM RESPONSE TABLE ROUTINE 1540 F1 = 0: K = 0: IF W(1) = 0 THEN 3400 1550 INPUT "WHAT FREQUENCY RANGE, CENTERED ON F0 "; W 1560 IF W >= 2 * W0 THEN W = 2 * W0 - 2 1570 INPUT "HOW MANY HERTZ PER STEP "; W1 1580 IF K$ = "TABLE" THEN 1610 1590 IF K$ = "GRAPH" THEN GOSUB 2660 1600 GOTO 1640 1610 PRINT " ", CHR$(31); "FREQUENCY RESPONSE"; CHR$(30) 1620 PRINT 1630 PRINT "HERTZ", "DB GAIN", "PHASE ANGLE", "GROUP DELAY" 1640 FOR F = W0 - P * W TO W0 + P * W STEP 2 * P * W1 1650 G = 1: P2 = 0 1660 FOR J = 1 TO N 1670 T1 = F(J) ^ 2 - F ^ 2 1680 T2 = T1 ^ 2 + (B(J) * F) ^ 2 1690 T3 = B(J) * F ^ 2 / T2 1700 T4 = F * T1 / T2 1710 G1 = SQR(T3 ^ 2 + T4 ^ 2) * H 1720 G = G * G1 1730 P1 = ATN(T4 / T3): P2 = P2 + P1 1740 NEXT J 1750 IF K$ = "TABLE" THEN 1770 ELSE GOSUB 2720 1760 GOTO 1820 1770 K1 = 20 * LOG(G) / LOG(10): GOSUB 2830 1780 IF F - F1 < 9.999999E-21 THEN F1 = 0 1790 K2 = K1: D2 = (P2 - P3) / (F - F1): P3 = P2: F1 = F 1800 PRINT F / 2 / P, K2, P2 * 180 / P, D2 1810 IF K = 1 THEN 1840 1820 NEXT F 1830 IF K$ = "GRAPH" THEN 2750 ELSE K = 1 1840 INPUT "ANOTHER FREQ. "; Y$ 1850 IF LEFT$(Y$, 1) = "Y" THEN 1870 1860 PRINT : PRINT : IF K9 = 1 THEN 4390 ELSE 270 1870 INPUT "HZ. "; F: F = 2 * P * F: GOTO 1650 1880 REM BIQUAD CIRCUIT VALUES 1890 GOSUB 80 1900 IF W(1) = 0 THEN 3190 1910 FOR J = 1 TO N 1920 PRINT " STAGE "; J: PRINT 1930 Q = F(J) / B(J): IF K8 = 1 THEN 1960 1940 GOSUB 2920 1950 GOTO 1970 1960 GOSUB 3000 1970 K1 = Q * R0 / G2: GOSUB 2830 1980 PRINT "R1= R10= "; K1: K1 = Q * R0: GOSUB 2830 1990 PRINT "R2= R11= R12= "; K1: K1 = 2 * R0 * Q / (Q + 1): GOSUB 2830 2000 PRINT "R3= R4= "; R0 2010 PRINT "R5= "; K1: K1 = 2 * R0: GOSUB 2830 2020 PRINT "R6= "; K1 2030 PRINT "R7= R8= R9= 100K": K1 = Q * R0 / 2: GOSUB 2830 2040 PRINT "R13= "; K1: PRINT "U1= MC3401P": PRINT "C1= "; 100 * C 2050 PRINT "C2= C3= "; C: NEXT J: PRINT : INPUT"HARDCOPY ";Y$ 2060 IF LEFT$(Y$,1)="y" OR LEFT$(Y$,1)="Y" THEN 4680 2070 INPUT "PRESS 'ENTER' FOR MENU "; Y$: GOTO 270 2080 REM STATE VARIABLE CIRCUIT VALUES 2090 GOSUB 80 2100 IF W(1) = 0 THEN 3190 2110 FOR J = 1 TO N: Q = F(J) / B(J): IF K8 = 1 THEN 2130 2120 GOSUB 2920: GOTO 2140 2130 GOSUB 3000 2140 PRINT " STAGE "; J: K1 = R0 * Q / G2: GOSUB 2830 2150 PRINT "R1= "; K1: K1 = R0: GOSUB 2830 2160 PRINT "R2= R3= R6= R7= "; K1: K2 = 1 / (2 * Q + G2): K1 = 2 / B(J) / C: GOSUB 2830 2170 PRINT "R4= 1K", "R5= "; K1: PRINT "C1= C2= "; C: PRINT : NEXT J 2180 INPUT"HARDCOPY ";Y$ 2190 IF LEFT$(Y$,1)="y" OR LEFT$(Y$,1)="Y" THEN 5080 2200 INPUT "PRESS 'ENTER' FOR MENU"; Y$: GOTO 270 2210 REM L-C CIRCUIT VALUES 2220 IF W(1) = 0 THEN 3190 2230 INPUT "WHAT IS THE TUNING CAPACITY "; C 2240 INPUT "WHAT IS THE COIL Q "; Q0 2250 FOR J = 1 TO N 2260 PRINT " STAGE "; J: K1 = 1 / C / F(J) ^ 2 * 1000000!: GOSUB 2830 2270 PRINT "L= "; K1; " MICROHENRIES": K1 = 1 / H / C: GOSUB 2830 2280 PRINT "R1= "; K1: K2 = Q0 / F(J) / C: R2 = 1 / B(J) / C: K1 = R2 * K2 / (K2 - R2) 2290 GOSUB 2830 2300 PRINT "R2= "; K1: NEXT J: PRINT : INPUT"HARDCOPY ";Y$ 2310 IF LEFT$(Y$,1)="y" OR LEFT$(Y$,1)="Y" THEN 5320 2320 INPUT "PRESS 'ENTER' FOR MENU"; Y$: GOTO 270 2330 REM TUNE ROUTINE 2340 Z1 = 1 2350 PRINT "ENTER PEAK FREQ. , BANDWIDTH FOR EACH STAGE": 2360 FOR J = 1 TO N 2370 PRINT "# "; J; : INPUT F(J), B(J) 2380 F(J) = 2 * P * F(J): B(J) = 2 * P * B(J) 2390 NEXT J: GOTO 940 2400 REM SINGLE AMP CIRCUIT 2410 GOSUB 80 2420 IF W(1) = 0 THEN 3400 2430 FOR J = 1 TO N 2440 PRINT " STAGE "; J 2450 Q = F(J) / B(J): IF K8 = 1 THEN 2470 2460 GOSUB 2920: GOTO 2480 2470 GOSUB 3000 2480 K1 = 1 / G2 / B(J) / C: GOSUB 2830 2490 PRINT "R1= "; K1: K1 = 1 / C / (2 * F(J) ^ 2 / B(J) - G2 * B(J)): GOSUB 2830 2500 PRINT "R2= "; K1: K1 = 2 / B(J) / C: GOSUB 2830 2510 PRINT "R3= "; K1: PRINT "C1= C2= "; C: PRINT 2520 NEXT J :INPUT"HARDCOPY ";Y$ 2530 IF LEFT$(Y$,1)="y" OR LEFT$(Y$,1)="Y" THEN 5580 2540 INPUT "PRESS 'ENTER' FOR MENU"; Y$: GOTO 270 2550 REM LOPASS PROTOTYPE INPUT ROUTINE 2560 T$ = "CUSTOM": P = 3.14162: E1 = 2.71818 2570 INPUT "HOW MANY STAGES "; N: Y1 = (N + 1) / 2 2580 PRINT "ENTER THE NORMALIZED LOPASS POLES: (REAL, IMAGINARY)" 2590 FOR J = 1 TO Y1: IF J = Y1 THEN 2620 2600 PRINT "# "; J; : INPUT P(J), W(J) 2610 P(J) = ABS(P(J)): W(J) = ABS(W(J)): NEXT J: GOTO 940 2620 INPUT "REAL POLE = "; P(Y1): P(Y1) = ABS(P(Y1)): GOTO 940 2630 REM GRAPH PLOTTING ROUTINE 2640 K$ = "GRAPH" 2650 GOTO 1540 2660 PRINT "", "RELATIVE GAIN IN DB" 2670 PRINT : PRINT 2680 PRINT "0 -5 -10 -15 -20 -25 -30 -35 -40 -45 -50 -55 -60" 2690 PRINT "+----+----+----+----+----+----+----+----+----+----+----+----+----"; 2700 PRINT "+----+" 2710 RETURN 2720 X = 8.686 * LOG(G / G0): X = ABS(INT(X + .5)) 2730 PRINT TAB(X); "*"; 2740 K1 = F / 2 / P: GOSUB 2880: PRINT K1: RETURN 2750 PRINT "+----+----+----+----+----+----+----+----+----+----+----+----+----"; 2760 PRINT "+--- HZ" 2770 PRINT : IF K9 = 1 THEN 4390 ELSE INPUT "PRESS 'ENTER' FOR MENU"; Y$ 2780 GOTO 270 2790 REM PRINT "SEE THE FILE: NUTRON::DISK:[09722.PUBLIC]BANPASS.TXT" 2800 PRINT : GOTO 210 2810 REM SUBROUTINES ARE DOWN HERE 2820 REM ROUNDOFF ROUTINE 2830 FOR T1 = 0 TO 8 2840 K2 = K1 / 10 ^ T1 2850 IF K2 < 10 THEN 2870 2860 NEXT T1 2870 K1 = 10 ^ T1 * INT(K2 * 100 + .5) / 100: RETURN 2880 FOR T1 = 0 TO 8: K2 = K1 / 10 ^ T1: IF K2 < 10 THEN 2900 2890 NEXT T1 2900 K1 = 10 ^ T1 * INT(K2 * 10000! + .5) / 10000!: RETURN 2910 REM CAP VALUE SUBROUTINE 2920 IF F(J) > 6 THEN 2940 2930 C = .000001: GOTO 2980 2940 C = .0000001 2950 IF F(J) > 600 THEN C = 1E-08 ELSE 2980 2960 IF F(J) > 6000 THEN C = 1E-09 ELSE 2980 2970 IF F(J) > 600000! THEN C = 1E-10 2980 K1 = 1 / F(J) / C: GOSUB 2830: R0 = K1: RETURN 2990 REM PICK C ROUTINE 3000 INPUT "CAP VALUE (FARADS) "; C 3010 PRINT 3020 K1 = 1 / F(J) / C: GOSUB 2830: R0 = K1: RETURN 3030 REM INFO ROUTINE 3040 PRINT 3050 PRINT "GAIN PER STAGE= "; : K1 = 8.686 * LOG(G2): GOSUB 2830 3060 PRINT K1; " DB": PRINT 3070 PRINT "STAGE", "CENTER FREQ.", "BANDWIDTH", " Q " 3080 PRINT 3090 FOR J = 1 TO N 3100 K1 = F(J) / 2 / P: GOSUB 2830: PRINT J, K1, 3110 K1 = B(J) / 2 / P: GOSUB 2830: PRINT K1, 3120 K1 = F(J) / B(J): GOSUB 2830: PRINT K1 3130 PRINT 3140 NEXT J: PRINT : IF K9 = 1 THEN 5920 ELSE INPUT "PRESS 'ENTER' FOR MENU "; Y$ 3150 GOTO 270 3160 REM LIST ROUTINE 3170 IF W(1) = 0 THEN 3400 ELSE 3180 3180 IF Z1 = 0 THEN 3210 3190 PRINT "DATA ENTERED NO LONGER VALID- USE `INFO`" 3200 FOR J = 1 TO 10000!: P = SQR(J): NEXT J: GOTO 120 3210 IF T$ = "B" OR T$ = "BUTTERWORTH" THEN 3280 3220 IF T$ = "P" OR T$ = "PAPOULIS" THEN 3290 3230 IF T$ = "C" OR T$ = "CHEBYCHEV" THEN 3270 3240 IF T$ = "LINEAR PHASE" THEN 3310 3250 IF T$ = "CUSTOM" THEN 3300 3260 GOTO 3190 3270 T$ = "CHEBYCHEV": GOTO 3310 3280 T$ = "BUTTERWORTH": GOTO 3310 3290 T$ = "PAPOULIS" 3300 R = 3 3310 PRINT#1, CHR$(31); T$; " "; N; " POLE FILTER"; CHR$(30) 3320 PRINT#1, 3330 PRINT#1, "BANDWIDTH IS "; B / 2 / P; " HZ."; 3340 K1 = W0 / 2 / P: GOSUB 2830: PRINT#1, "CENTER FREQUENCY IS "; K1; " HZ." 3350 K1 = 8.686 * LOG(G0): GOSUB 2830: PRINT#1, "OVERALL GAIN IS "; K1; " DB"; 3360 IF T$ = "CHEBYCHEV" THEN 3390 3370 PRINT#1, : PRINT#1, : IF K9 = 1 THEN 6050 ELSE 3380 3380 INPUT "PRESS 'ENTER' FOR MENU "; Y$: GOTO 270 3390 PRINT#1, ", RIPPLE IS "; R; " DB": PRINT#1, : IF K9 = 1 THEN 6050 ELSE 3410 3400 PRINT "ENTER FIRST, NO DATA": GOTO 120 3410 INPUT "PRESS ENTER FOR MENU"; Y$ :GOTO 270 3420 REM IFAMP SUBROUTINE DESIGNS LC COUPLING CIRCUIT 3430 PRINT"HI SIDE, LOW SIDE REFERS TO IMPEDANCE MATCHING, NOT INPUT/OUTPUT" 3440 PRINT 3450 FOR J = 1 TO N 3460 PRINT " ", "STAGE "; J: PRINT 3470 INPUT "LOW SIDE RESISTANCE "; L(J) 3480 INPUT "HIGH SIDE RESISTANCE "; H(J) 3490 INPUT "LOW SIDE SHUNT CAP. "; C2(J) 3500 INPUT "HIGH SIDE SHUNT CAP. "; K6(J) 3510 IF K6(J) = 0 THEN PRINT "MUST NOT BE ZERO": GOTO 3500 3520 PRINT : INPUT "COIL Q "; Q(J) 3530 NEXT J 3540 FOR J = 0 TO N - 1 3550 W = 0: T = 1 + 3 * J: U = 1 + J 3560 Q2 = F(U) / B(U): IF Q(U) < Q2 THEN 3640 3570 R1 = H(U) / 2 3580 T1 = Q2 / F(U) / R1 3590 R2 = Q(U) / F(U) / T1 3600 R3 = R1 * R2 / (R1 + R2) 3610 T2 = Q2 / F(U) / R3 3620 IF ABS(T2 - T1) / T2 < .01 THEN 3660 3630 T1 = T2: GOTO 3590 3640 PRINT "UNLOADED Q OF STAGE "; U; " IS TOO LOW" 3650 INPUT "NEW VALUE FOR Q "; Q(U): GOTO 3560 3660 Q1 = L(U) * C2(U) * F(U) 3670 R3 = H(U) * R2 / (H(U) + R2) 3680 R1 = L(U) / (Q1 ^ 2 + 1) 3690 Q3 = SQR(R3 / R1 - 1) 3700 T1 = 1 / Q3 / F(U) / R1 3710 IF Q1 = 0 THEN 3760 3720 C3 = C2(U) * (1 + Q ^ 2) / Q1 ^ 2 3730 C1 = T1 * C3 / (C3 - T1) 3740 IF C1 > 0 THEN 3770 3750 PRINT "TOO MUCH C IN STAGE "; U; " TRY CHANGING RESISTANCE": GOTO 3430 3760 C1 = T1 3770 IF W > 0 THEN 3910 3780 C4 = T1 * Q3 ^ 2 / (Q3 ^ 2 + 1) 3790 C0 = 2 * Q2 / F(U) / R3 - K6(U) - C4 3800 IF C0 > 0 THEN 3910 3810 IF C0 < 0 THEN 3820 ELSE 3910 3820 A1 = (F(U) * K6(U)) ^ 2 3830 A2 = -(4 * Q2 * F(U) * K6(U) + 1 / R1) 3840 A3 = 4 * Q2 ^ 2 + 1 3850 A4 = -A2 / 2 / A1 3860 A5 = SQR(A4 ^ 2 - A3 / A1) 3870 IF A4 + A5 > R3 THEN 3890 3880 A1 = A4 + A5: GOTO 3900 3890 A1 = A4 - A5 3900 C0 = A1 * R3 / (R3 - A1): R3 = A1 3910 C(U) = 2 * Q2 / F(U) / R3 3920 IF C0 > 0 THEN 3940 3930 PRINT "YOU NEED MORE C IN THE HI SIDE OF STAGE "; U 3940 R(T + 2) = 1 / C(U) / F(U) ^ 2: R(T + 1) = C0: R(T) = C1 3950 NEXT J 3960 PRINT 3970 PRINT "CIRCUIT", "C SERIES", "SHUNT C/R", "INDUCTOR", "PEAK FREQ" 3980 PRINT " ", "FARADS", "FARADS/OHMS", "HENRIES", "HERTZ" 3990 PRINT 4000 FOR J = 0 TO 3 * (N - 1) STEP 3 4010 T = 1 + J 4020 PRINT 1 + J / 3, :NUM=R(T):GOSUB 6590:R(T)=NUM 4030 PRINT R(T);" ";UNIT$,:NUM=R(T+1):GOSUB 6590:R(T+1)=NUM 4040 PRINT R(T + 1);" ";UNIT$,:NUM= R(T + 2):GOSUB 6590:R(T+2)=NUM 4050 PRINT R(T+2);" ";UNIT$,:NUM= F(1 + J / 3) / 2 / P:GOSUB 6590 4060 PRINT NUM;" ";UNIT$ 4070 NEXT J 4080 INPUT "MORE? "; Y$ 4090 T0 = 0 4100 FOR J = 1 TO N: T0 = T0 + LOG(H / B(J)): NEXT J 4110 T0 = 20 * T0 / LOG(10) :NUM=T0:GOSUB 6590:T0=NUM 4120 PRINT : PRINT "LOSS FACTOR= "; T0;UNIT$; " DB": PRINT 4130 PRINT "PEAK FREQ.", "LOSS RES", "3DB BW" 4140 FOR J = 0 TO 3 * (N - 1) STEP 3 4150 U = 1 + J / 3 4160 NUM=F(U)/2/P:GOSUB 6590 4170 PRINT NUM;" ";UNIT$,:NUM= Q(U) / C(U) / F(U):GOSUB 6590 4180 PRINT NUM;" ";UNIT$,:NUM= B(U) / 2 / P:GOSUB 6590 4190 PRINT NUM;" ";UNIT$ 4200 NEXT J 4210 INPUT "MORE? "; Y$ 4220 PRINT : PRINT 4230 PRINT " ", "AMPLIFIER DATA" 4240 PRINT "LO Z", "HI Z", "COIL Q", "LO SIDE C", "HIGH SIDE C" 4250 PRINT 4260 FOR J = 1 TO N 4270 PRINT " ", "CIRCUIT #"; J 4280 PRINT L(J), H(J), Q(J), C2(J), K6(J) 4290 PRINT : NEXT J 4300 INPUT"HARDCOPY ";Y$ 4310 IF LEFT$(Y$,1)="Y" OR LEFT$(Y$,1)="y" THEN 6230 4320 REM FILE ROUTINE TO SAVE DATA 4330 INPUT "WHAT FILE NAME? "; F$ 4340 K9 = 1 4350 OPEN F$ FOR OUTPUT AS #1 4360 INPUT "PRESS ENTER FOR MENU"; Y$ 4370 GOTO 270 4380 REM RESPONSE TABLE ROUTINE 4390 F1 = 0: K = 0 4400 IF K$ = "TABLE" THEN 4430 4410 IF K$ = "GRAPH" THEN GOSUB 5780 4420 GOTO 4460 4430 PRINT #1, " ", CHR$(31); "FREQUENCY RESPONSE"; CHR$(30) 4440 PRINT #1, 4450 PRINT #1, "HERTZ", "DB GAIN", "PHASE ANGLE", "GROUP DELAY" 4460 FOR F = W0 - P * W TO W0 + P * W STEP 2 * P * W1 4470 G = 1: P2 = 0 4480 FOR J = 1 TO N 4490 T1 = F(J) ^ 2 - F ^ 2 4500 T2 = T1 ^ 2 + (B(J) * F) ^ 2 4510 T3 = B(J) * F ^ 2 / T2 4520 T4 = F * T1 / T2 4530 G1 = SQR(T3 ^ 2 + T4 ^ 2) * H 4540 G = G * G1 4550 P1 = ATN(T4 / T3): P2 = P2 + P1 4560 NEXT J 4570 IF K$ = "TABLE" THEN 4590 ELSE GOSUB 5850 4580 GOTO 4630 4590 K1 = 20 * LOG(G) / LOG(10): GOSUB 2830 4600 IF F - F1 < 9.999999E-21 THEN F1 = 0 4610 K2 = K1: D2 = (P2 - P3) / (F - F1): P3 = P2: F1 = F 4620 PRINT #1, F / 2 / P, K2, P2 * 180 / P, D2 4630 NEXT F 4640 IF K$ = "GRAPH" THEN 5880 ELSE K = 1 4650 PRINT #1, : PRINT #1, : INPUT "PRESS ENTER FOR MENU"; Y$ 4660 GOTO 270 4670 REM BIQUAD CIRCUIT VALUES 4680 PRINT#1,"THIS IS THE SCHEMATIC":PRINT#1, 4690 PRINT#1," ---------------R3---------------------" 4700 PRINT#1," | |" 4710 PRINT#1," |--R2---- --C3---- ---R8---" 4720 PRINT#1," |--C2---| | | | |" 4730 PRINT#1," | | | | | |" 4740 PRINT#1," E1--C1----R1----|- \ |--R4----|- \ |--R7----|- \ |" 4750 PRINT#1," |AMP>-- |AMP>-- |AMP>--" 4760 PRINT#1," ---|+ / |E2 --|+ / --|+ / " 4770 PRINT#1," | BANDPASS | | 4780 PRINT#1," R5 OUT R6 R9" 4790 PRINT#1," | | |" 4800 PRINT#1," --------------------------------------------+6V" 4810 PRINT#1," |" 4820 PRINT#1," R13" 4830 PRINT#1," |" 4840 PRINT#1," --|+ \" 4850 PRINT#1," |AMP>------E5 NOTCH OUT" 4860 PRINT#1," E3----R10----|- / |" 4870 PRINT#1," E4----R11--| |" 4880 PRINT#1," |---R12---|" 4890 PRINT#1,:PRINT#1,"FOR NOTCH OUT, CONNECT E4-E2 AND E3-E1. OTHERWISE" 4900 PRINT#1,"R10 THRU R13 NOT USED.":PRINT#1, 4910 PRINT#1,"NOTE: THIS CIRCUIT ONLY WORKS WITH MOTOROLA MC3401 BUT YOU CAN" 4920 PRINT#1,"ADAPT IT TO A GENERAL PURPOSE QUAD AMP BY ELIMINATING R5, R6,R9" 4930 PRINT#1,"AND R13, AND GROUND THE POSITIVE INPUTS. 4940 FOR J = 1 TO N 4950 PRINT #1, " STAGE "; J: PRINT #1, 4960 Q = F(J) / B(J) 4970 K1 = Q * R0 / G2: GOSUB 2830 4980 PRINT #1, "R1= R10= "; K1: K1 = Q * R0: GOSUB 2830 4990 PRINT #1, "R2= R11= R12= "; K1: K1 = 2 * R0 * Q / (Q + 1): GOSUB 2830 5000 PRINT #1, "R3= R4= "; R0 5010 PRINT #1, "R5= "; K1: K1 = 2 * R0: GOSUB 2830 5020 PRINT #1, "R6= "; K1 5030 PRINT #1, "R7= R8= R9= 100K": K1 = Q * R0 / 2: GOSUB 2830 5040 PRINT #1, "R13= "; K1: PRINT #1, "U1= MC3401P": PRINT #1, "C1= "; 100 * C 5050 PRINT #1, "C2= C3= "; C: NEXT J: PRINT #1, : INPUT "PRESS ENTER FOR MENU"; Y$ 5060 GOTO 270 5070 REM STATE VARIABLE CIRCUIT VALUES 5080 PRINT#1,"THIS IS THE SCHEMATIC":PRINT#1, 5090 PRINT#1," ---------------R3---------------------" 5100 PRINT#1," | |" 5110 PRINT#1," |--R2---- --C1--- ---C2--" 5120 PRINT#1," | | | | | |" 5130 PRINT#1," IN --R1----|- \ |--R6----|- \ |--R7----|- \ |" 5140 PRINT#1," |AMP>-- |AMP>-- |AMP>--" 5150 PRINT#1," ---|+ / | --|+ / | --|+ / |" 5160 PRINT#1," | HIPASS | | | LOPASS" 5170 PRINT#1," | OUT GND | GND OUT" 5180 PRINT#1," --------------R5--------|" 5190 PRINT#1," | |" 5200 PRINT#1," R4 BANDPASS" 5210 PRINT#1," | OUT" 5220 PRINT#1," GND" 5230 PRINT#1, 5240 FOR J = 1 TO N: Q = F(J) / B(J) 5250 PRINT #1, " STAGE "; J: K1 = R0 * Q / G2: GOSUB 2830 5260 PRINT #1, "R1= "; K1: K1 = R0: GOSUB 2830 5270 PRINT #1, "R2= R3= R6= R7= "; K1: K2 = 1 / (2 * Q + G2): K1 = 2 / B(J) / C: GOSUB 2830 5280 PRINT #1, "R4= 1K", "R5= "; K1: PRINT #1, "C1= C2= "; C: PRINT #1, : NEXT J 5290 INPUT "PRESS ENTER FOR MENU"; Y$ 5300 GOTO 270 5310 REM L-C CIRCUIT VALUES 5320 PRINT#1,"THIS IS THE SCHEMATIC":PRINT#1, 5330 PRINT#1," +V" 5340 PRINT#1," ---|" 5350 PRINT#1," | |" 5360 PRINT#1," C L" 5370 PRINT#1," | |" 5380 PRINT#1," --------Cc-----------NEXT STAGE" 5390 PRINT#1," | | 5400 PRINT#1," |/ R2" 5410 PRINT#1," ------| |" 5420 PRINT#1," |\ GND" 5430 PRINT#1," |" 5440 PRINT#1," |--Cc--" 5450 PRINT#1," | |" 5460 PRINT#1," R bias R1" 5470 PRINT#1," | |" 5480 PRINT#1," -V GND" 5490 PRINT#1,:PRINT#1,"NOTE: R2 INCLUDES ALL STRAY RESISTANCE EXCEPT COIL LOSS" 5500 FOR J = 1 TO N 5510 PRINT #1, " STAGE "; J: K1 = 1 / C / F(J) ^ 2 * 1000000!: GOSUB 2830 5520 PRINT #1, "L= "; K1; " MICROHENRIES": K1 = 1 / H / C: GOSUB 2830 5530 PRINT #1, "R1= "; K1: K2 = Q0 / F(J) / C: R2 = 1 / B(J) / C: K1 = R2 * K2 / (K2 - R2) 5540 GOSUB 2830 5550 PRINT #1, "R2= "; K1: NEXT J: PRINT #1, : INPUT "PRESS ENTER FOR MENU"; Y$ 5560 GOTO 270 5570 REM SINGLE AMP CIRCUIT 5580 PRINT#1,"THIS IS THE SCHEMATIC":PRINT#1, 5590 PRINT#1," -------------------------" 5600 PRINT#1," | | |" 5610 PRINT#1," C R3 |" 5620 PRINT#1," | | |" 5630 PRINT#1,"INPUT--R1---C-----|- \ |" 5640 PRINT#1," | |AMP>----------------BANDPASS OUTPUT" 5650 PRINT#1," R2 --|+ /" 5660 PRINT#1," | |" 5670 PRINT#1," GND GND":PRINT#1, 5680 FOR J = 1 TO N 5690 PRINT #1, " STAGE "; J: PRINT #1, 5700 Q = F(J) / B(J) 5710 PRINT #1, : K1 = 1 / G2 / B(J) / C: GOSUB 2830 5720 PRINT #1, "R1= "; K1: K1 = 1 / C / (2 * F(J) ^ 2 / B(J) - G2 * B(J)): GOSUB 2830 5730 PRINT #1, "R2= "; K1: K1 = 2 / B(J) / C: GOSUB 2830 5740 PRINT #1, "R3= "; K1: PRINT #1, "C1= C2= "; C: PRINT #1, : NEXT J: PRINT #1, 5750 INPUT "PRESS ENTER FOR MENU"; Y$ 5760 GOTO 270 5770 REM GRAPH PLOTTING ROUTINE 5780 PRINT #1, 5790 PRINT #1, "", "RELATIVE GAIN IN DB" 5800 PRINT #1, : PRINT #1, 5810 PRINT #1, "0 -5 -10 -15 -20 -25 -30 -35 -40 -45 -50 -55 -60" 5820 PRINT #1, "+----+----+----+----+----+----+----+----+----+----+----+----+"; 5830 PRINT #1, "----+----+" 5840 RETURN 5850 X = 8.686 * LOG(G / G0): X = ABS(INT(X + .5)) 5860 PRINT #1, TAB(X); "*"; 5870 K1 = F / 2 / P: GOSUB 2880: PRINT #1, K1: RETURN 5880 PRINT #1, "+----+----+----+----+----+----+----+----+----+----+----+----+"; 5890 PRINT #1, "----+----+ HZ" 5900 PRINT #1, : INPUT "PRESS ENTER FOR MENU"; Y$ 5910 GOTO 270 5920 REM INFO ROUTINE 5930 PRINT #1, "GAIN PER STAGE= "; : K1 = 8.686 * LOG(G2): GOSUB 2830 5940 PRINT #1, K1; " DB": PRINT #1, 5950 PRINT #1, "STAGE", "CENTER FREQ.", "BANDWIDTH", " Q " 5960 PRINT #1, 5970 FOR J = 1 TO N 5980 K1 = F(J) / 2 / P: GOSUB 2830: PRINT #1, J, K1, 5990 K1 = B(J) / 2 / P: GOSUB 2830: PRINT #1, K1, 6000 K1 = F(J) / B(J): GOSUB 2830: PRINT #1, K1 6010 PRINT #1, 6020 NEXT J: PRINT #1, : INPUT "PRESS ENTER FOR MENU"; Y$ 6030 GOTO 270 6040 REM LIST ROUTINE 6050 IF T$ = "B" OR T$ = "BUTTERWORTH" THEN 6110 6060 IF T$ = "P" OR T$ = "PAPOULIS" THEN 6120 6070 IF T$ = "LINEAR PHASE" THEN 6140 6080 IF T$ = "CUSTOM" THEN 6130 6090 T$ = "CHEBYCHEV": GOTO 6140 6100 INPUT "PRESS 'ENTER' FOR MENU"; Y$: GOTO 270 6110 T$ = "BUTTERWORTH": GOTO 6140 6120 T$ = "PAPOULIS" 6130 R = 3 6140 PRINT #1, CHR$(31); T$; " "; N; " POLE FILTER"; CHR$(30) 6150 PRINT #1, 6160 PRINT #1, "BANDWIDTH IS "; B / 2 / P; " HZ."; 6170 K1 = W0 / 2 / P: GOSUB 2830: PRINT #1, "CENTER FREQUENCY IS "; K1; " HZ." 6180 K1 = 8.686 * LOG(G0): GOSUB 2830: PRINT #1, "OVERALL GAIN IS "; K1; " DB"; 6190 IF T$ = "CHEBYCHEV" THEN 6210 6200 PRINT #1, : PRINT #1, : INPUT "PRESS ENTER FOR MENU"; Y$: GOTO 270 6210 PRINT #1, ", RIPPLE IS "; R; " DB": PRINT #1, : INPUT "PRESS ENTER FOR MENU"; Y$ 6220 GOTO 270 6230 PRINT #1, : PRINT#1,"THIS IS THE CIRCUIT:":PRINT#1, 6240 PRINT#1," ---------------------C1-------------------" 6250 PRINT#1," | | | | |" 6260 PRINT#1," R LOW C LOW L C HIGH R HIGH" 6270 PRINT#1," | | | | |" 6280 PRINT#1," ------------------------------------------":PRINT#1, 6290 PRINT#1,"NOTE THAT C LOW AND C HIGH MAY BE ANY VALUE. THE LOW/HIGH" 6300 PRINT#1,"MERELY DESIGNATES WHICH SIDE OF THE NETWORK IT IS ON.":PRINT#1, 6310 PRINT #1, "CIRCUIT", "C SERIES", "SHUNT C/R", "INDUCTOR", "PEAK FREQ" 6320 PRINT #1, " ", "FARADS", "FARADS/OHMS", "HENRIES", "HERTZ" 6330 PRINT #1, 6340 FOR J = 0 TO 3 * (N - 1) STEP 3 6350 T = 1 + J 6360 PRINT #1, 1 + J / 3, R(T), R(T + 1), R(T + 2), F(1 + J / 3) / 2 / P 6370 NEXT J 6380 T0 = 0 6390 FOR J = 1 TO N: T0 = T0 + LOG(H / B(J)): NEXT J 6400 T0 = 20 * T0 / LOG(10) 6410 PRINT #1, : PRINT #1, "LOSS FACTOR= "; T0; " DB": PRINT #1, 6420 PRINT #1, "PEAK FREQ.", "LOSS RES", "3DB BW" 6430 FOR J = 0 TO 3 * (N - 1) STEP 3 6440 U = 1 + J / 3 6450 PRINT #1, F(U) / 2 / P, Q(U) / C(U) / F(U), B(U) / 2 / P 6460 NEXT J 6470 PRINT #1, : PRINT #1, 6480 PRINT #1, " ", "AMPLIFIER DATA" 6490 PRINT #1, "LO Z", "HI Z", "COIL Q", "LO SIDE C", "HIGH SIDE C" 6500 PRINT #1, 6510 FOR J = 1 TO N 6520 PRINT #1, " ", "CIRCUIT #"; J 6530 PRINT #1, L(J), H(J), Q(J), C2(J), K6(J) 6540 PRINT #1, : NEXT J 6550 INPUT "PRESS ENTER FOR MENU"; Y$: GOTO 270 6560 REM ROUNDOFF.BAS 6570 REM A ROUTINE TO ROUNDOFF TO 3 DIGITS AND PUT IN KILO, NANO, PICO UNITS 6580 REM INPUT NUMBER IS "NUM" 6590 IF NUM=<1000 AND NUM>1 THEN 6670 6600 IF NUM=<1000000! AND NUM>1 THEN 6680 6610 IF NUM=<1E+09 AND NUM>1 THEN 6690 6620 IF NUM>1E+12 THEN 6700 6630 IF NUM=>.001 AND NUM<1 THEN 6710 6640 IF NUM=>.000001 AND NUM<1 THEN 6720 6650 IF NUM=>1E-09 AND NUM<1 THEN 6730 6660 IF NUM=>1E-12 AND NUM<1 THEN 6740 6670 UNIT$="" : GOTO 6750 6680 UNIT$="KILO": NUM=NUM/1000 : GOTO 6750 6690 UNIT$="MEG" : NUM=NUM/1000000! : GOTO 6750 6700 UNIT$="GIG" : NUM=NUM/1E+12 : GOTO 6750 6710 UNIT$="MILLI" : NUM=NUM*1000 :GOTO 6750 6720 UNIT$="MICRO" : NUM=NUM*1000000! : GOTO 6750 6730 UNIT$="NANO" : NUM=NUM*1E+09 : GOTO 6750 6740 UNIT$="PICO" : NUM=NUM*1E+12 : GOTO 6750 6750 IF NUM>0 AND NUM<10 THEN NUM=INT(NUM*100+.5)/100 6760 IF NUM>=10 AND NUM<100 THEN NUM=INT(NUM*10+.5)/10 6770 IF NUM>=100 AND NUM <1000 THEN NUM=INT(NUM+.5) 6780 RETURN 6790 PRINT#1, CHR$(12) : CLOSE #1 6800 CHAIN "FILTMENU" 6810 END