'Peter Martin 'Tony Battilana (N.R.A.L. Jodrell Bank e-mail: jab@jb.man.ac.uk) 'July 1992 'Shareware. Please send donation to P Martin, 30 Avalon St, Oxley, 4075 Australia if found useful. DECLARE SUB pdim () DECLARE SUB idim () DECLARE SUB Outpt () DECLARE SUB gg (L!, N%) DECLARE SUB iris (D!, A!, W0!, WG!) DECLARE SUB kjj1 (N%, BW!) DECLARE SUB post (D!, A!, W0!, WG!) DECLARE FUNCTION WLG! (F0!, FC!) DECLARE SUB wgok () DECLARE SUB Special () DECLARE SUB wgcat (L!, H!) DECLARE FUNCTION solve! (M%, N%, L!, U!, E!) DECLARE FUNCTION fun! (N%, x!) DECLARE FUNCTION integral! (N%, x1!, X2!, E!) DECLARE FUNCTION choose! (CN%, CX%) DECLARE FUNCTION request! (A$, A!, MIN!, MAX!) CONST PI = 3.14159 CONST true = -1 CONST FALSE = 0 DIM SHARED G(11): DIM SHARED WG$(15): DIM SHARED FC(15): DIM SHARED K(10) DIM SHARED FI(10): DIM SHARED D(10) COMMON SHARED WL0, WLG0, A, F1, F2, WG%, N%, L, Z0, WLG1, WLG2, BW, R%, L%, U, E, H, wn%, wx%, XA, XB, FI0, CONSTANT, solved%, OK%, WG, D, y% ON ERROR GOTO 0: CLS PRINT "WAVEGUIDE FILTER DESIGN PROGRAM ": PRINT 'PRINT "PRESS CTRL C TO STOP PROGRAM": PRINT PRINT "PRESS ANY KEY TO PROGRESS PROGRAM": SLEEP CLS : PRINT PRINT SPC(10); "WAVEGUIDE FILTER DESIGN" N = 5: L = .01: F1 = 10: F2 = 11: RESTORE FOR WG% = 1 TO 15 READ WG$(WG%), FC(WG%) NEXT DATA 3.00x1.50ins 2.6-4.0GHz,2.078,2.42x1.27ins 3.2-4.9GHz,2.578,2.00x1.00ins 3.9-6.0GHz,3.153,1.72x0.92ins 4.6-7.1 GHz,3.713,1.5x.75ins 5.4-8.2 GHz,4.304 DATA 1.25x0.63ins 6.6-10GHz,5.266,1.000x0.50ins 8.2-12.5GHz,6.571,0.85x0.48ins 9.8-15.0GHz,7.890,0.70x0.39ins 11.9-18.0GHz,9.495,0.59x0.34ins 14.5-22.0GHz,11.587 DATA 0.5x0.25ins 17.6-26.7GHz,14.089,0.42x0.25ins 21.7-33.0GHz,17.416,0.36x0.22ins 26.4-40.0GHz,21.185,0.30x0.19ins 32.9-50.1GHz,26.462,0.27x0.17ins 39.2-59.6GHz,31.596 DO: CLS : PRINT "FILTER SPECIFICATIONS": PRINT : SLEEP N = request("No of elements", N, 2, 10) N% = CINT(N) L = request("Passband Ripple", L, 0, 3) PRINT IF L < .01 THEN PRINT "3dB BAND" ELSE PRINT "RIPPLE BAND" F1 = request("Lower frequency(GHz)", F1, 2.6, 60) F2 = request("Upper frequency(GHz)", F2, 2.6, 60) IF F2 < F1 THEN SWAP F2, F1 IF (F2 - F1) < F1 / 5000 THEN PRINT ; 200 * (F2 - F1) / (F2 + F1); " % B.W."; " Too narrow!" PRINT PRINT "Choose Waveguide size Enter Number Only" wgcat F1, F2 PRINT "WAVEGUIDE FILTER SPECIFICATIONS" IF WG% = 0 THEN PRINT "Special Guide, width "; A; " mm" ELSE PRINT "WG"; WG% + 9; " "; WG$(WG%) PRINT ; F1; " GHz to "; F2; " GHz" gg L, N% WLG1 = WLG(F1, FC(WG%)): WLG2 = WLG(F2, FC(WG%)): WLG0 = (WLG1 + WLG2) / 2 BW = (WLG1 - WLG2) / WLG0: BW = BW * PI / 2 A = 150 / FC(WG%) 'Guide Width deduced from cutoff freq WL0 = 1 / SQR(1 / WLG0 / WLG0 + 1 / 4 / A / A) PRINT "Guide Width Inside "; A; "mm" PRINT "Cutoff Frequency"; FC(WG%); "GHz" PRINT "Filter Band in Guide Wavelength (mm)"; WLG2; "to"; WLG1; "mean"; WLG0 PRINT "Frequency at Mean"; 300 / WL0; "GHz with" PRINT "Free Space Wavelength"; WL0; "mm" kjj1 N%, BW PRINT : SLEEP PRINT "Prototype Elements and Impedance Inverters" PRINT "n", "g", "k/z" FOR J% = 0 TO N% PRINT J%; G(J%) PRINT SPC(20); K(J%) NEXT PRINT N% + 1; G(N% + 1): SLEEP 'IRIS CALCULATION idim PRINT : PRINT "Filter Dimensions Using Iris coupling" PRINT "(Central Aperture Dimensions in mm)" PRINT "Iris No Aperture Spacing": PRINT Outpt IF NOT (OK%) THEN PRINT " ??? signifies aperture spacing (d) out of range. 0.1<=d/a<=0.9" SLEEP 'POST CALCULATION pdim PRINT : PRINT "Filter Dimensions Using Post Coupling" PRINT "(Central Post Dimensions in mm)" PRINT "Post No Diameter Spacing": PRINT Outpt IF NOT (OK%) THEN PRINT "??? signifies post diam less than 0.1mm or more than a/2" SLEEP LOOP UNTIL FALSE STOP FUNCTION choose (CN%, CX%) 'CN% is the min value allowed:'CX% is the max STATIC D% IF CN% = CX% THEN D% = CN%: GOTO 1250 1240 INPUT D% IF CN% < 1 THEN CN% = 1 IF D% < CN% THEN PRINT "Must be a number>= "; CN%: GOTO 1240 IF D% > CX% THEN PRINT "Max "; CX%: GOTO 1240 1250 choose = D% END FUNCTION FUNCTION fun (N%, x) 'Defines the functions used by integral(N%,X1,X2,E) & solve(M%,N%,L,U,E) 'If N%=0 fun returns a constant which is placed in CONSTANT STATIC y, FIA IF N% = 0 THEN y = CONSTANT: GOTO 1998 IF N% = 1 THEN iris x, A, WL0, WLG0: y = XB: GOTO 1998 IF N% = 2 THEN post x, A, WL0, WLG0: FIA = ATN(XA): FI0 = -ATN(2 * XB + XA) - FIA: y = ABS(TAN(FI0 / 2 + FIA)) ' see Matthai, Young and Jones p 455 1998 fun = y END FUNCTION SUB gg (L, N%) 'Prototype elements for Tchebyscheff (L dB ripple) or Maximally flat '(if L < 0.01) filters with N% elements and equal resistive terminations. 'Elements stored in G(11) STATIC K%, PTN, TK%, a0, a1, b0, C G(0) = 1 IF N% < 1 THEN N% = 1 IF N% > 10 THEN N% = 10 G(N% + 1) = 1 PTN = PI / 2 / N%: TK% = 0 FOR K% = 1 TO N% TK% = TK% + 2: G(K%) = 2 * SIN((TK% - 1) * PTN) NEXT IF L < .01 THEN 5298 'MAX FLAT otherwise TCHEB B = EXP(L / 17.37): B = LOG((B + 1 / B) / (B - 1 / B)) C = EXP(B / 2 / N%): C = (C - 1 / C) / 2 a0 = G(1) / 2: G(1) = 2 * a0 / C IF N% = 1 THEN 5298 C = C * C: PTN = PI / N%: b0 = SIN(PTN): b0 = C + b0 * b0 FOR K% = 2 TO N% a1 = G(K%) / 2 G(K%) = 4 * a0 * a1 / b0 / G(K% - 1) a0 = a1: b0 = SIN(K% * PTN): b0 = C + b0 * b0 NEXT IF (N% / 2 - N% \ 2) > .1 THEN 5298 a0 = EXP(B / 4): a0 = (a0 + 1 / a0) / (a0 - 1 / a0) G(N% + 1) = a0 * a0 5298 END SUB SUB idim STATIC J%, M%, x M% = N% \ 2 FOR J% = 0 TO M% x = K(J%): x = x / (1 - x * x) FI(J%) = -1 * ATN(2 * x) CONSTANT = x D(J%) = solve(0, 1, 1, .9 * A, .1) IF NOT (solved%) THEN D(J%) = -1: FI(J%) = 0 NEXT FOR J% = M% + 1 TO N% FI(J%) = FI(N% - J%): D(J%) = D(N% - J%) NEXT END SUB FUNCTION integral (N%, x1, X2, E) STATIC SUM, S, x, IOLD, INEW SUM = (fun(x%, x1) + fun(x%, X2)) / 2 S = X2 - x1 IOLD = S * SUM 1460 x = x1 + S2 / 2 DO SUM = SUM + fun(N%, x) x = x + S LOOP UNTIL ABS(x - x1) >= ABS(X2 - X2) S = S2 / 2 INEW = S * SUM IF ABS(INEW - IOLD) > E * ABS(INEW) THEN IOLD = INEW: GOTO 1460 integral = INEW END FUNCTION SUB iris (D, A, W0, WG) 'finds equivalent circuit parameters for a symmetrical waveguide window. 'Marcuvitz p 221 STATIC P, Q, S XA = 0 P = 2 * A / (3 * W0) Q = .75 * (1 / SQR(1 - P * P) - 1) P = PI * D / A S = SIN(P) P = TAN(P / 2) XB = A * P * P * (1 + Q * S * S) / WG END SUB SUB kjj1 (N%, BW) 'Finds K(J%,J%+1)/Z(0) for 0 MAX THEN PRINT "max"; MAX: GOTO 1350 IF A < MIN THEN PRINT "min"; MIN: GOTO 1350 1398 request = A END FUNCTION FUNCTION solve (M%, N%, L, U, E) 'seeks one solution x to the equation fun(M%,X) =fun(N%,X) in the range L U THEN SWAP U, L E = ABS(E): solved% = FALSE: x = 0 IF E = 0 THEN 3298 y = fun(M%, L) - fun(N%, L): S% = SGN(y) IF S% = 0 THEN x = L: solved% = true: GOTO 3298 i = (U - L) / 2: J = i 3120 xt = L + J: yt = fun(M%, xt) - fun(N%, xt) IF SGN(yt) <> S% THEN yd = y: XB = L: solved% = true: GOTO 3230 3150 XB = xt: yb = yt xt = xt + i: yt = fun(M%, xt) - fun(N%, xt) IF SGN(yt) <> S% THEN solved% = true: GOTO 3230 IF xt + i <= U THEN 3150 i = J: J = J / 2 3200 IF i > E THEN 3120 IF NOT (solved%) THEN PRINT "Not Solved": GOTO 3298 3230 IF i <= E THEN 3290 DO i = i / 2: x = XB + i: y = fun(M%, x) - fun(N%, x) IF SGN(y) = S% THEN yb = y: XB = x ELSE yt = y: xt = x LOOP UNTIL i <= E 3290 x = (yt * XB - yb * xt) / (yt - yb) 3298 solve = x END FUNCTION SUB Special PRINT "The BW is too large to fit into standard guide": SLEEP: STOP END SUB SUB wgcat (L, H) '5300 Chooses standard waveguide sizes whoose recommended bands cover the 'filter band. L,H. Recommended band is 1.25 to 1.9 times cutoff freq, 'stored in array FC(15) IF L > H THEN SWAP L, H wn% = 0 FOR WG% = 1 TO 15 IF L > 1.25 * FC(WG%) AND H <= 1.9 * FC(WG%) THEN wgok NEXT IF wn% = 0 THEN Special ELSE WG% = choose(wn% + 9, wx% + 9) - 9 END SUB SUB wgok 'Prints details IF wn% = 0 THEN wn% = WG% wx% = WG% PRINT "WG"; WG% + 9; " "; WG$(WG%) END SUB FUNCTION WLG (F0, FC) 'finds the guide wavelength (mm) at freq F0 (GHz) in guide with cut off freq FC IF F0 <= FC THEN PRINT '"Signal freq (";F0;"GHz"' "should be > "'"Cutoff freq(";FC;" GHz)" WLG = 300 / SQR(F0 * F0 - FC * FC) END FUNCTION