10 CLS:PRINT"Chebyshev/Butterworth Filter Design":PRINT:PRINT"by Carol F. Milazzo, KP4MD":PRINT"P.O. Box 7147, Omaha, NE 68107-0147":PRINT"E-mail: cfmilazzo@pol.net" 20 IF INKEY$="" THEN 20 30 DIM A(2),B(2),C(2),F(2),D(256,2),N(2),D$(2),F$(3),T$(4):D$(1)="Butterworth":D$(2)="Chebyshev":F$(1)="Hz":F$(2)="kHz":F$(3)="MHz":T$(1)="Lowpass":T$(2)="Highpass":T$(3)="Bandpass":T$(4)="Bandstop":PI=3.1415926# 40 CLS:PRINT"Chebyshev/Butterworth Filter Design":PRINT:PRINT"Frequency Units":PRINT:PRINT" 0 . Exit":FOR K=1 TO 3:PRINT K;". ";F$(K):NEXT K:PRINT 50 INPUT"Select: ",FX:IF FX<1 OR FX>3 THEN END 60 F$=F$(FX):FP=1000^(FX-1) 70 PRINT:PRINT" 1. ";T$(1);"/";T$(2):PRINT" 2. ";T$(3);"/";T$(4):PRINT 80 INPUT"Select: ",TY:IF TY<0 OR TY>2 THEN 40 90 CLS:PRINT"Filter Specifications":PRINT:Q=0:B$="":IF TY=2 THEN Q=1:B$="Bandwidth ":PRINT"Center Freq.(";F$;:INPUT"): ",G0:F0=G0*FP:PRINT 100 FOR K=1 TO 2:PRINT K;". ";B$;"Freq.(";F$;:INPUT") ",G(K):IF G(K)<=0 THEN RUN 30 110 INPUT" Attn.(dB) ",A(K):IF A(K)<=0 THEN RUN 30 120 F(K)=G(K)*FP:PRINT:NEXT K 130 N=LOG((10^(.1*A(1))-1)/(10^(.1*A(2))-1))/(2*LOG(F(1)/F(2))):S=SGN(N):T=Q+Q+1.5-.5*S:N(1)=-INT(-(ABS(N))):NX=0:IF N(1)/2>INT(N(1)/2) THEN NX=1 140 NY=0:IF N(1)<4 THEN NY=1 150 N(2)=N(1)-1-NX+2*NY:AX=0:IF A(1)>A(2) THEN AX=1 160 FOR K=1 TO 2:C(K)=F(1+AX)*(10^(.1*A(1+AX))-1)^(-.5/S/N(K)):NEXT K 170 CLS:PRINT T$(T);" Filter Design":PRINT:IF T>2 THEN PRINT"Center Frequency ";G0;" ";F$:PRINT:PRINT B$ 180 PRINT"Freq ";F$;" Attenuation (dB)":FOR K=1 TO 2:PRINT G(K),A(K):NEXT K:PRINT:PRINT"Design Type Branches":PRINT D$(1),N(1):PRINT D$(2),N(2):PRINT:PRINT"0. New Filter":PRINT"1. Components Values":PRINT"2. Response Curve":PRINT 190 INPUT"Select: ",D:IF D<0 OR D>2 THEN 190 200 IF D=0 THEN 90 210 PRINT:INPUT"Chebyshev Ripple (dB): ",RDB:IF RDB<=0 OR RDB>3 THEN 170 220 Y=RDB/17.37:Y=LOG((EXP(Y)+EXP(-Y))/(EXP(Y)-EXP(-Y)))/2/N(2):Y=(EXP(Y)-EXP(-Y))/2:E=SQR(10^(.1*RDB)-1):C=LOG(1/E+SQR(1/E/E-1))/N(2):C=(EXP(C)+EXP(-C))/2:IF D=2 THEN 540 230 PRINT:INPUT"Resistance (ohms): ",R:IF R<=0 THEN 210 240 PRINT:PRINT"First Element:":PRINT"1. Shunt":PRINT"2. Series":PRINT 250 INPUT"Select: ",V:IF V<1 OR V>2 THEN 230 260 V=V+V-3:U=S*V:PRINT:PRINT"Design Type:":PRINT"1. ";D$(1):PRINT"2. ";D$(2):PRINT 270 INPUT"Select: ",D:IF D<1 OR D>2 THEN 240 280 CLS:PRINT D$(D);" ";T$(T);" Filter Components":PRINT:IF D=2 THEN 320 290 FOR K=1 TO N(1):G=2*SIN((K+K-1)*PI/2/N(1)):GOSUB 360:PRINT:NEXT K 300 IF INKEY$="" THEN 300 310 GOTO 170 320 FOR K=1 TO N(2):A=SIN((K+K-1)*PI/2/N(2)):B=Y*Y+(SIN(K*PI/N(2)))^2 330 IF K=1 THEN G=2*A*C/Y 340 IF K>1 THEN G=4*A*C*C*A1/B1/G1 350 GOSUB 360:A1=A:B1=B:G1=G:PRINT:NEXT K:GOTO 300 360 IF V>0 THEN PRINT"Branch ";K;" Series" 370 IF V<0 THEN PRINT"Branch ";K;" Shunt " 380 X=G^S/2/PI/C(D)*R^U:GOSUB 420:V=-V:U=-U:IF Q=0 THEN PRINT:RETURN 390 IF U<0 THEN PRINT " in Series with" 400 IF U>0 THEN PRINT " in Parallel with" 410 X=1/(4*PI*PI*F0*F0*X):GOSUB 420:PRINT:RETURN 420 IF U>0 THEN PRINT " L";K;" = "; 430 IF U<0 THEN PRINT " C";K;" = "; 440 P=INT(LOG(X)/LOG(10)):X1=10^(P-2)*INT(X*10^(2-P)+.5):IF P<0 THEN 460 450 PRINT X1;" ";:GOTO 510 460 IF P<-3 OR U<0 THEN 480 470 PRINT 1000*X1;" m";:GOTO 510 480 IF P<-9 AND U<0 THEN 500 490 PRINT 1000000!*X1;" u";:GOTO 510 500 PRINT 1E+12*X1;" p"; 510 IF U>0 THEN PRINT "H"; 520 IF U<0 THEN PRINT "F"; 530 RETURN 540 CLS:PRINT"Frequency Response Curve":PRINT:PRINT"Frequency Range (";F$;")":INPUT"Lower Limit: ",FL:INPUT"Upper Limit: ",FU:INPUT"In steps of ",FS:I=FL*FP:J=FU*FP:K=FS*FP 550 CLS:PRINT" ";F$;TAB(14);D$(1);:IF N(2)<23 THEN PRINT TAB(28);D$(2); 560 PRINT" Attenuation (db)":FOR F=I TO J STEP K:X=(F-I)/K+1:F1=F:IF Q>0 THEN F1=ABS(F-F0*F0/F) 570 D(X,1)=.01*INT(1000*LOG(1+(F1/C(1))^(2*S*N(1)))/LOG(10)+.5):IF N(2)>21 THEN 720 580 O=C*(F1/C(2))^S:ON N(2) GOTO 600,0,610,0,620,0,630,0,640,0,650,0,660,0,670,0,680,0,690,0,700,0 590 REM Chebyshev polynomials 600 CN=O:GOTO 710 610 CN=4*O^3-3*O:GOTO 710 620 CN=16*O^5-20*O^3+5*O:GOTO 710 630 CN=64*O^7-112*O^5+56*O^3-7*O:GOTO 710 640 CN=256*O^9-576*O^7+432*O^5-120*O^3+9*O:GOTO 710 650 CN=1024*O^11-2816*O^9+2816*O^7-1232*O^5+220*O^3-11*O:GOTO 710 660 CN=4096*O^13-13312*O^11+16640*O^9-9984*O^7+2912*O^5-364*O^3+13*O:GOTO 710 670 CN=16384*O^15-61440!*O^13+92160!*O^11-70400!*O^9+28800*O^7-6048*O^5+560*O^3-15*O:GOTO 710 680 CN=65536!*O^17-278528!*O^15+487424!*O^13-452608!*O^11+239360!*O^9-71808!*O^7+11424*O^5-816*O^3+17*O:GOTO 710 690 CN=262144!*O^19-1245184!*O^17+2490368!*O^15-2723840!*O^13+1770496!*O^11-695552!*O^9+160512!*O^7-20064*O^5+1140*O^3-19*O:GOTO 710 700 CN=1048576!*O^21-5505024!*O^19+1.238631E+07*O^17-1.559757E+07*O^15+1.204224E+07*O^13-5870593!*O^11+1793792!*O^9-329472!*O^7+33264!*O^5-1540*O^3+21*O 710 D(X,2)=.01*INT(1000*LOG(1+E*E*CN*CN)/LOG(10)+.5) 720 PRINT F/FP;TAB(15);D(X,1);:IF N(2)<23 THEN PRINT TAB(30);D(X,2); 730 PRINT:NEXT F:GOTO 300 1000 SCREEN 2:CLS 1010 LINE (64,16)-(64,176) 1020 LINE (64,16)-(608,16) 1030 LINE (608,16)-(608,176) 1040 LINE (64,176)-(608,176) 1050 LOCATE 1,20:PRINT D$(D);" ";T$(T);" Filter Frequency Response Curve" 1060 LOCATE 1,1:PRINT"Attenuation" 1070 LOCATE 22,74:PRINT"Freq."