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
               (
geocities.com/russlk)