From 220fa85dfa51bb6de9b9074db7f4b3c44bb95e3c Mon Sep 17 00:00:00 2001 From: Andrej Date: Wed, 10 Mar 2021 16:04:43 +0100 Subject: [PATCH] skripta za mikrotrakasto linijo in pasovno sito --- __pycache__/microstrip.cpython-37.pyc | Bin 0 -> 14486 bytes filter.py | 123 ++++++++++ microstrip.py | 333 ++++++++++++++++++++++++++ 3 files changed, 456 insertions(+) create mode 100644 __pycache__/microstrip.cpython-37.pyc create mode 100644 filter.py create mode 100644 microstrip.py diff --git a/__pycache__/microstrip.cpython-37.pyc b/__pycache__/microstrip.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f8ea34028dafe9cd4b06e73455468df9658f30d8 GIT binary patch literal 14486 zcmeHO3v?XSdES|QX!W#S*29wRvHa57tCh5pCEM7ZHL`?_v5{nhU;{X-y`$0EtKId? zu3woAp+F(0bwfg4kTfySo)priq>q#)DON%f2x%y!;SiRlg}jJLlJb5fB>nz-XLjXh zNFV3)oU%GIbLT$(`4FPlv7Gx zW)+siDqCE*`>718YH&5W@@`g*7^xXy5o)23#A+<$K`nBn%W^lmC@-XVEDt)dAoiT( za#bk!4aJi2Tr!r`6m4osi)RyuG=(L!B!WgFuEf(RGaE}~dET6vNa;#;8hMXo49zqX zNL6$cNhygG&oUfRw#Q~>Gy|oW5=$}V(vWhomNK~ebb_@>>E4%jY?b^eO?MNYGDwahv zVo8MyIUGa#&7(7!w3*1wDBBXcW@dxRM9iE<+q3CZkeA#x6jUzTvo*-Y29-=Er1bX; zcJ=pc2=R25PHa?qdqTavJsY}rP3*aHSBM&b_i%q-PhSPkr0p{_WwWAXOawY}K?M=bL}Cec$G1Vh8PpKrW*1zlU_eVN}{Bt50flm;`INNK$8 zIec!{oQH1xbfd|tKl#XOdw%$*PpNag^mhAg__c;3bF{kjKKlK2IHIfTuKD7QsvoHO zxBroTKU4MhZ+-WVAMN<8sv{qMPpfmZQUh{9PGt)2WLgh+3sSD&M(YbwtRPJmJk*i9 zT}D0fz1i74ou1LUF*OWrfA>`EfZ3fnI+aM`Q+Ah{9?Bdo_{7NiQOe|-L2XcKms;eI zWHch~loeNw2)^PDA%NL0XI=XxS_dt(rmz*zYM^yji510Hf}BO1C0#FL1$phPKMy0)$Or6j6VqjL!}i}jS4$!IK=ifc+V zu867f&Z4px6>UeIDNU!n2TMOYoroVuVV6-bspIKPMl%9p;bG`DE4r4A#+_AHT6F*2 zH3!*Pap(MM=UQL1;~QnT>5p|h^~QVe*%Hyebl-8`^G!ch=Z;Vst-XNHsKlcnXA)Q* z*g|O<7d+-cBWqMqy4R@2!>FNXX~d|bryPy*g(Gea6y@c8Uy7i;E>=kuk|K3TMmyr- zR2BV5BsGbzi+@4Da$91yV&1p8@?Kge%uNc?^3a-Kz6PN)y!@>UGakCe!W+%<7FXWK z%9)49R#-B{lCH^@u}U6S<>VB3EDx*3nyV3Oj_35Ft_60g%xaNZS4xF;Dz|)A8CGq* z<+sYI4b(2y!1Y{3R<^Jbv0f{&9%T!fka?^M(u6H8=(NUM7&{lA2HbVs59uG z87M$Uk4+vGJNT}UvNK_r@#z%lJW^!iP;JmiE!4lb{N-m>h(@0Jx6EhlVzzOIwE@{Nj4(7B}JfWG;gu`4nr&Eczsa&FE zk<$z+htkQAvOcJ!(jjF)D75fkxGOx^ClubUm=Pjn7Y>PCXMSgR?@sA2scJ*d&1k8t z$x~w~C3cGL=Ix?B6B-yzA4YSBa)yBd%7_?H(#ogxcj%P8kc-&i?1$*sRwF*0IHXKH z@MR2TQag|}(8&V|;Fa>gCnq&5l9--L>1I}=uW~@?+&cWgCj+8?y#IZJqUXIm>${+- zxpwap3Vk}8&1~%MKA4M}Av2vb;u;#SYoU~u?IwBMDIk);b)o6(O!5rvKGiu9oDM>X z1*ZbM)f1%14<{Ht->Dly=gf@AF-u?Z-rAq+V&)Ixm7dt))e1pl|=$hqvGPvBy+>`h!2W)O9~{RQ=N`-?a4bWj$-| zZn#CAquomP4m|txZI9lo>g!+sD!b=>%Vzc7FVz0%#0`(D`UhJ7><_Q~^c^Sl6YszG znYoYLsp?bwS3fJj#g#)5{h4EppS$RphKSB#h3t#ycMgByrMJG@9hoCNuUjwPJ9^;u z2UY!rmoL8Z_t(Fn2HbqlG+L0#_sc+4L7FH?)AlYoRgkAreA_I@qrJGoxcYGQN9EBe zK#z>sbH@Hjz+!3u5>4uptI;p{r4>?*)FiFJKH84m)aXR~NSwet{b*mM_VKN>1L(=# zO1%Uju$B6lu-rdmnA4C|yHLh00sy0?x2H{#HS6w9#U#UO+5H#Ipvg zvJpgpHHw-bbs?lS(HrGPO|`7qszRRXMi-YpiW3a>1Cxil7jpVh^=EC=;3lI!{Zv+3aiYjH zM+@Ef$T_TB}j? zn*|}Mi=x`wKeOpzv&`tk+sljYI9kwyuLQebBk;&vf8ZHDS3~}YTM&t zAt72mg9c3gm>pRNmY|4lu-e`QDA_|Ug9*HGQ?f;}gvfIY>RWb&Xfd)_m z7(jzy$@uK{*yBuZqs;XaHC9l1y=`nSVM}O5~KJg({wCYG-MCT$- z+^6cPyQD9B>zOKO&&r&9yT9!hs=hDqt=b2_hya>&=>AXtL>0>aHgqw{F8H@gkH4Vm zzaDz?=g-aFtTA-NVfqY-h9_zOyF8G*j9gkoZS} zdGBz{GVq0#5w3l$Xjx}SROiYC~CDYiQ%q<9r90lJb z(Wis@dk7&PyFr~}$R2PPZJUW&H1UtnI^ z0GMoK90*$;ZexJ$0Bqe&5EzgOa9CK(0LBOebL$xZlrJltkS(78n}B0vU62UYGB0f9 zBVY)NxS!j~krNhxaE~YWyq;uRTk{x0E=$MEd(}ju4D@knPAqDvE!ALE!{Xr=C9MT$i%&pZA_o?1{(#j0;j9fUZYMhlpty93 z#bz;=zQmD^I_ud|KBh8LsFk+GrhzTvIXj%3B9B$ZmSZeelx#BjM%1;^PIa?YNL^h@ zMT-`)PA(~caV2;S;v&clTZ_~ttBFz}H;6O;jY_Qn88T+xD+^wpmDGTX?ODnaW!pp_X9w@j7_v zt(f%{D1D(*I={qf$82q<7P29vZle^@p8QfaY%NB=M%YF46d}~#ZGlbpT7{>U z`ZsiI$&HlK6CUWb)hLZsP@$3Atjxrd`(T{l_9oM|I0<{?|AfiOf{!C>Wv>bhBP4Gk5ZvuK6COsHnyU9?SId*W-OrrcyQ++Ja;hD3I0$qYY?E+ z|Gb@0`LpUAfdd<%KcVVfL_S7pBYF)F{i|vxy>e0~jQ^aKk0rEfet!uZR%>M<7vwPmXcYIE@=?jPz=T%R-BYOSyvk%`f3=ScN z^bv+Xr%W(`P0g4u9?OleXCsd`K`c(4b}a8n9))sOp?;c_4WyQK}`s zEPgCiCydqjxi?gO;M*7Me(ZzrYwr2zvOmfl{E}+hDDgoB6DyDCBYYm9@onATU*Ws% zEft;|vK-E%B;;%<_+myJ-tvMwHfaV{miS3QGUs7Lq9z4N7d&M(e>oJDV_HF;)Cyi& zEj@TmN9DRdrL!ePcL++gJdml*|@83mUa(O~g}0K9?KjDppS z5~~>{Rx?VhW|UaXD6yJRuo`(J4IIhX>0GAF-iJPg3d{>}bJY`>@yiu*P}(lFfWWK* zVOa!P6O_ZY*>nlw!$fQ3c4+{q)|Z+o`6h(J7^DgV8IGmi~}%5Y^4n}VgGDInjezTHJa{ix*LgZ7FTY)h;BUFN=9!npq87f_OOS z_y~E~QoJcnJ$aH|#+I=TQHuab$YBFW4mVnPS_^vA%2smNwFm$N{QxXPX`bpuDgi;S zwMdMIEeU0O3fze29F;bERNC1pjK^wRoq%Xw2kdc(z8Lo4G7eAIQv0cHSbFj0 z`MCOo#TO&Kcz!Mp!j?c@2=clyc8f*d0oJ^%2XVcK3sW3Q7T>58Mqgolyq1292!~dp zCX0_B$`7C>D$n0BBkQcCZG1McLAUgf0PZN%z_l&je_l#}X1{rjkd9j=+5kK*!ck>lO=n8vI%knd)bBn54ZqdXHe zh}mf^!9LId5WXDG6?m?~%n4cxnP!z+L0x$AF^@`829yY^Lc6=H=N%NfW>dcG7 z7Z78E_J%;fdKrBi-Yy(R;~{(GGIlAE=G2F`VtrwD(CWsxc^PaI_zI>7+2ylDTx|lF zLu(FEo_rsAa+s)?)x+n?5!6Ym?5NW&q#uKv;z(h<``LToWujabuLpYwO3gU$R9}9b zwZLk(Drq0G_=w@XpY|QB{66T1Jk3+~UYIPxqW_RPV0BpofCz4qU9P-XLfr^(@PP8~pwa50?4rO}%q)j&d-5HgFlQioD-c;u}f&DmqO0y3?=`bk-IH$Ss zwUb7GIwD5w$4;@jS^a0AJU2e~mXi@9Ca9Y6f&JXt;<>!0Yf;4JLm+(Oga&x6 z$c&>HoJik>4vWCwt8;W1!%qJ@Cmqfv-k{;(h<*aYvBLKihXBu=wB1~wh?fux{qYHV zP~icaBj$8ISJ`s!!{$>NSCFj|>U0wD}c$*HiGyPiQoEC;6wjU770!}S>{9qG6 zPh74O6V6EC8}S&|>*^fm;9_bGMCOPB>f5*jPj=4OVsQS64&;6U6G@D8m9x;$Rxaq# zDb7ywH?yRuyJ4sR`P$8%+_p=d65+wXb=2! zV_>~w@Y9XKPd5fX-55w}RHH}`)iDsp9V2c# zMjpE{^4N{_4$^Hs-KbcYN`z61p+)6`pxhZ;4B;U>qZ%dhY*ZjjMZ+W{Oya^MI80T9 z!^oRHoizJEn&G1V9(rV6gIkd^!->*@BSlSc1hz;UrHyhB>^UMSa0b?cNeA8Sh;76H zq}^c8>){~Wgy$yYZUnQwT)q$-y9KE|Qa@7q@wYLy=FD`HQwQ?kL=X03FCA z{;SJ(Nbkp)p8f8#xeeRk+hU$J7hH$n!pGftujSoOX5O;c)!4GR-WW*$rU<{`1cxkS zNabg89n)&joj%X(%B_mRP57>fpkiJve1-ckMx9YDs6^92WtyLu4=Pjkp?Ro2cnwR| z!gHxJh5U!YeFz1JB1OAld^$Amgmo#~+dhp~JYO$t*G1EH(L>3H5L;DNYrO6LJM_ z%rIg{`MiLt??E!WlTviv(p0Dj+4;D;&j=&b4>3j`0>@f)ElZ#0OwXh+xL$%x1vxnb z*<`(epOMZo8&SG#pxXtw6{I6DjZM(&6?9YRcG})R4S*N&U8g4ToZJgpW;bLNnkM{^ z)ipSmXV97|dd8`48Z>S|`UwJAZbGsT;BnIrfIE2}J>)@T@Xdi1h%me~0P-NCi1+b$ z5$4`SoN*?PWjWIL8E5goHURYWk3*H*+e63lsxAD74iN@U>^)=(;>6#NTnl)vT8C&* z4jjd6K&+cJLb^=!k75N4gxAy07V^|4#~%msQ~~dwA8oF{1@9zzRk1LeW1nyqX377O z&cMK~VVRPPJ{gPCxm|@NPdoAH^z7L&y+h=h3d4}RL z``wrRS^oQpy7V@;0DWwyx%P&~pHgl31^c!DjE~Mk*0sk5KD%WC5L_I&g?*db)Sr0H z#^Q9G=g|Ey!wX~yi13?bZ@rp(8VFgyyuVd-f!BYd>YM&y9F}Y7_(PX2Y1+T*E>(Y- zoEED-@0=idP35P53|hfDoxu56>Q2@6Xnf0oC`)FsCOHP+%bIiuSNeg#fmMOp=Y)+8H~hzm#~fdvI` zDmRlk$~TunjTuj5j)rj3Au*FUrWGJag!qnA@R@W@-VpeO&IE}L&=DGbYJuCF`G&|h t4_?WMy}!=C(ZAbY_n)T4da?ij literal 0 HcmV?d00001 diff --git a/filter.py b/filter.py new file mode 100644 index 0000000..3b4bf86 --- /dev/null +++ b/filter.py @@ -0,0 +1,123 @@ +#!/usr/bin/python3 + +import numpy as np +import scipy.optimize as opt +import microstrip as ms + +def Butterworth(n): + ''' + Return koefficents of Butterworth n-th order filter + g0 and gn+1 are assumed to be 1 + + [g0, g1, ... gn, gn+1] = Buttherworth(n) + ''' + gi = 2*np.sin((2*np.arange(1,n+1)-1)*np.pi/2/n) + return np.hstack([1,gi,1]) + +def Tchebysheff(n, ripple): + ''' + Return coefficents of Tchebysheff n-th order filter + with specified ripple in passband. + + [g0, g1, ... gn, gn+1] = Tchebysheff(n, ripple) + n <- order of filter + ripple <- ripple in passband (dB) + ''' + b = np.log(1/np.tanh(ripple/17.37)) + k = np.sinh(b/2/n) + + g = np.ones(n+2) + g[1] = 2/k*np.sin(np.pi/2/n) + for i in range(2,n+1): + g[i] = 1/g[i-1]*4*np.sin((2*i-1)*np.pi/2/n)*np.sin((2*i-3)*np.pi/2/n)/\ + (k**2+np.sin((i-1)*np.pi/n)**2) + + if n % 2 == 0: + g[-1] = 1/np.tanh(b/4)**2 + + return g + +def mclBPF(h, e_r, fbw, gk, f0): + ''' + Calculate dimensions of microstrip coupled lines bandpass + filter. + + h <- height of substrate (mm) + e_r <- dielectric constant of substrate + fbw <- fractional bandwidth of bpf + gk <- filter coefficents + f0 <- central frequency (GHz) + ''' + + n = len(gk)-2 + J = np.ones(n+1) + J[0] = np.sqrt(np.pi*fbw/2/gk[0]/gk[1]) + J[-1] = np.sqrt(np.pi*fbw/2/gk[-2]/gk[-1]) + for j in range(1,n): + J[j] = np.pi*fbw/2/np.sqrt(gk[j]*gk[j+1]) + + Zo = np.zeros(n+1) + Ze = np.zeros(n+1) + + for j in range(n+1): + Ze[j] = 50*(1+J[j]+J[j]**2) + Zo[j] = 50*(1-J[j]+J[j]**2) + + lambda4 = 3e8/f0/1e9/4 *1e3 + W = np.zeros(n+1) + s = np.zeros(n+1) + l = np.zeros(n+1) + for j in range(n+1): + x = ms.get_mcl(Ze[j],Zo[j],h,e_r,f0) + W[j] = x[0] + s[j] = x[1] + dl = ms.open_end(W[j],h,e_r,f0) + eps = ms.mcl_eps(W[j],h,s[j],e_r,f0) + # popravek z upostevanjem disperzije + l[j] = lambda4/np.sqrt(np.sqrt(eps[0]*eps[1]))-dl + #print(l[j]) + # popravek s staticnim eps + l[j] = lambda4/np.sqrt(np.sqrt(eps[2]*eps[3]))-dl + #print(l[j]) + + return {'W':W, 's':s, 'l':l, 'f':f0, 'fbw':fbw} + +def prtmclBFP(bfp): + ''' + Print filter in readable format + ''' + n = len(bfp['W']) + print("Microstrip coupled line bandpass filter:\nAll dimensions in mm.") + print("\tW\ts\tl") + for i in range(n): + print("{}:\t{:.2f}\t{:.2f}\t{:.2f}".format(i+1,bfp['W'][i],\ + bfp['s'][i],bfp['l'][i])) + + print("Length of filter: {} mm".format(sum(bfp['l']))) + print("Width of filter: {} mm".format(sum(bfp['W'])+sum(bfp['s']))) + + +if __name__ == '__main__': + gk = Tchebysheff(7,0.05) + #bfp = mclBPF(1.54, 3.66, 0.1, gk, 10.2) + bfp = mclBPF(0.76, 3.66, 0.1, gk, 10.2) + #prtmclBFP(bfp) + + print(ms.getWf(50, 0.76, 3.66, 10.2)) + + print("=== interstage filter za bfp840 ===") + gk = Butterworth(7) + bfp = mclBPF(0.8, 3.66, 0.3, gk, 10.5) + prtmclBFP(bfp) + print("=== interstage filter za bfp840 ===") + gk = Butterworth(5) + bfp = mclBPF(0.8, 3.66, 0.3, gk, 10.5) + prtmclBFP(bfp) + print("=== interstage filter za bfp840 ===") + gk = Butterworth(5) + bfp = mclBPF(0.8, 3.66, 0.05, gk, 10.5) + prtmclBFP(bfp) + print("=== interstage filter za bfp840 ===") + gk = Butterworth(3) + bfp = mclBPF(0.8, 3.66, 0.05, gk, 10.5) + prtmclBFP(bfp) diff --git a/microstrip.py b/microstrip.py new file mode 100644 index 0000000..3993a5b --- /dev/null +++ b/microstrip.py @@ -0,0 +1,333 @@ +#!/usr/bin/python3 + +import numpy as np +import scipy.optimize as opt + +np.seterr(under='ignore') +### STATIC approx +def eps_re(u, e_r): + ''' + Calculate effective dielectric constant + using the expressions given in + E. Hammerstad and O. Jensen, "Accurate Models for + Microstrip Computer-Aided Design," 1980 IEEE MTT-S + International Microwave symposium Digest, Washington, + DC, USA, 1980, pp. 407-409. + doi: 10.1109/MWSYM.1980.1124303 + + e_re = eps_re(u, e_r): + u <- ratio W/h + e_r <- substrate relative dielectric constant + e_re -> effective relative dielectric constant + of microstrip line + ''' + a = 1 + np.log((u**4 + (u/52)**2)/(u**4+0.432))/49 +\ + np.log(1+(u/18.1)**3)/18.7 + b = 0.564*( (e_r-0.9)/(e_r+3) )**(0.053) + + e_re = 0.5*(e_r+1)+0.5*(e_r-1)*(1+10/u)**(-a*b) + return e_re + +def getZc(u, e_r): + ''' + Calculate characteristic impedance Zc + using the expressions given in + E. Hammerstad and O. Jensen, "Accurate Models for + Microstrip Computer-Aided Design," 1980 IEEE MTT-S + International Microwave symposium Digest, Washington, + DC, USA, 1980, pp. 407-409. + doi: 10.1109/MWSYM.1980.1124303 + (neglected thickness of copper) + + Zc = getZc(u, e_r) + u <- ratio W/h + e_r <- substrate relative dielectric constant + Zc -> characteristic impedance of microstrip line + ''' + F = 6 + (2*np.pi-6)*np.exp(-(30.666/u)**0.7528) + e_re = eps_re(u, e_r) + Zc = (120*np.pi)/(2*np.pi*np.sqrt(e_re))*np.log(\ + F/u + np.sqrt(1 + (2/u)**2)) + return Zc + +### Dispersion correction +def eps_f(W,h,e_r,f): + ''' + Calculate effective dieletric constant using formulas given by: + M. Kirschning and R. H. Jansen, "Accurate Model for Effective + Dielectric Constant of Microstrip with Validity up to Millimeter-Wave + Frequencies," Electronics Letters, vol. 8, no. 6, pp. 272-273, + Mar. 1982. + R. H. Jansen and M. Kirschning, "Arguments and an accurate Model + for the Power-Current Formulation of Microstrip Characteristic + Impedance," Archiv für Elektronik und Übertragungstechnik (AEÜ), + vol. 37, pp. 108-112, 1983. + http://qucs.sourceforge.net/tech/node75.html + + e_re = eps_f(W,h,e_r,f) + W <- width of microstrip (mm) + h <- height of substrate (mm) + e_r <- substrate relative dielectric cosntatn + f <- frequency (GHz) + e_re -> effective dielectric constant of microstrip line + ''' + fn = f*h + u = W/h + P1 = 0.27488 + (0.6315+0.525/(1+0.0157*fn)**20)*u - 0.065683*np.exp(\ + -8.7513*u) + P2 = 0.33622*(1-np.exp(-0.03442*e_r)) + P3 = 0.0363*np.exp(-4.6*u)*(1-np.exp(-(fn/38.7)**4.97)) + P4 = 1+2.751*(1-np.exp(-(e_r/15.916)**8)) + Pf = P1*P2*((0.1844+P3*P4)*fn)**1.5763 + eps0 = eps_re(u,e_r) + return e_r - (e_r - eps0)/(1+Pf) + +def getZcf(W,h,e_r,f,R=False): + ''' + Calculate characteristic impedance using formulas given by: + M. Kirschning and R. H. Jansen, "Accurate Model for Effective + Dielectric Constant of Microstrip with Validity up to Millimeter-Wave + Frequencies," Electronics Letters, vol. 8, no. 6, pp. 272-273, + Mar. 1982. + R. H. Jansen and M. Kirschning, "Arguments and an accurate Model + for the Power-Current Formulation of Microstrip Characteristic + Impedance," Archiv für Elektronik und Übertragungstechnik (AEÜ), + vol. 37, pp. 108-112, 1983. + http://qucs.sourceforge.net/tech/node75.html + + Zc = Zcf(W,h,e_r,f,R=False) + W <- width of microstrip (mm) + h <- height of substrate (mm) + e_r <- substrate relative dielectric cosntatn + f <- frequency (GHz) + R=False <- flag telling whether to return R17 or not + Zc -> characteristic impedance of microstrip line + R17 -> parameter used to calculate impedance and coupled line + return only if R=True + ''' + fn = f*h + u = W/h + ef = eps_f(W,h,e_r,f) + e0 = eps_re(u,e_r) + + R1 = 0.03891*e_r**1.4 + R2 = 0.267*u**7 + R3 = 4.766*np.exp(-3.228*u**0.641) + R4 = 0.016 + (0.0514*e_r)**4.524 + R5 = (fn/28.843)**12.0 + R6 = 22.20*u**1.92 + + R7 = 1.206-0.3144*np.exp(-R1)*(1-np.exp(-R2)) + R8 = 1+1.275*(1-np.exp(-0.004625*R3*e_r**1.674)*(fn/18.365)**2.745) + R9 = 5.086*R4*R5*np.exp(-R6)*(e_r-1)**6/\ + ((0.3838+0.386*R4)*(1+1.2992*R5)*(1+10*(e_r-1)**6)) + + R10 = 0.00044*e_r**2.136+0.0184 + R11 = (fn/19.47)**6/(1+0.0962*(fn/19.47)**6) + R12 = 1/(1+0.00245*u**2) + R13 = 0.9408*ef**R8-0.9603 + R14 = (0.9408-R9)*e0**R8-0.9603 + R15 = 0.707*R10*(fn/12.3)**1.097 + R16 = 1+0.0503*e_r**2*R11*(1-np.exp(-(u/15)**6)) + R17 = R7*(1-1.1241*R12*np.exp(-0.026*fn**1.15656-R15)/R16) + + Z0 = getZc(u,e_r) + Zc = Z0*(R13/R14)**R17 + if R: + return (Zc, R17) + else: + return Zc + +def getWf(Zk,h,e_r,f): + ''' + Calculate width of microstrip line when also + taking in to account dispersion. + + W = getWf(Zk,h,e_r,f) + Zk <- characteristic impedance (ohms) + h <- substrate height + e_r <- substrate relative di. costant + f <- frequency (GHz) + W -> widht of microstrip line (mm) + ''' + u = opt.root_scalar(lambda X: Zk-getZcf(X,h,e_r,f),x0=h,\ + method='brentq', bracket=[0.01,100]) + return u.root + +### coupled lines +def mcl_eps(W,h,s,e_r,f): + ''' + Calculate effective odd and even permittivity of parallel + coupled microstrip lines. + M. Kirschning, R. H. Jansen, and N. H. L. Koster, + "Coupled microstrip parallel-gap model for improved filter and coupler design," + Electronics Letters, vol. 19, no. 10, pp. 377–379, May 1983, + doi: 10.1049/el:19830261. + + even, odd = mcl_eps(W,h,s,e_r,f): + W <- width of microstrip (mm) + h <- height of substrate (mm) + s <- spacing between lines (mm) + e_r <- substrate relative dielectric cosntatn + f <- frequency (GHz) + even -> even mode dielectric constant + odd -> odd mode dielectric constant + ''' + u = W/h + g = s/h + fn = f*h + + eps0 = eps_re(u,e_r) + + v = u * (20+g**2)/(10+g**2)+ g*np.exp(-g) + ae = 1+np.log((v**4+(v/52)**2)/(v**4+0.432))/49+np.log(1+(v/18.1)**3)/18.7 + be = 0.564*((e_r-0.9)/(e_r+3))**0.053 + even0 = 0.5*(e_r+1)+0.5*(e_r-1)*(1+10/v)**(-ae*be) + + ao = 0.7287*(eps0-0.5*(e_r+1))*(1-np.exp(-0.179*u)) + bo = 0.747*e_r/(0.15+e_r) + co = bo - (bo-0.207)*np.exp(-0.414*u) + do = 0.593+0.694*np.exp(-0.562*u) + odd0 = (0.5*(e_r+1)+ao-eps0)*np.exp(-co*g**do)+eps0 + + P1 = 0.27488+(0.6315+0.525/(1+0.0157*fn)**20)*u-0.065683*np.exp(-8.7513*u) + P2 = 0.33622*(1-np.exp(-0.03442*e_r)) + P3 = 0.0363*np.exp(-4.6*u)*(1-np.exp(-(fn/38.7)**4.97)) + P4 = 1+2.751*(1-np.exp(-(e_r/15.916)**8)) + P5 = 0.334*np.exp(-3.3*(e_r/15)**3)+0.746 + P6 = P5*np.exp(-(fn/18)**0.368) + P7 = 1+4.069*P6*g**0.479*np.exp(-1.347*g**0.595-0.17*g**2.5) + Fe = P1*P2*((P3*P4+0.1844*P7)*fn)**1.5763 + even = e_r - (e_r - even0)/(1+Fe) + + P8 = 0.7168*(1+1.076/(1+0.0576*(e_r-1))) + P9 = P8-0.7913*(1-np.exp(-(fn/20)**1.424))*np.arctan(2.481*(e_r/8)**0.946) + P10 = 0.242*(e_r - 1)**0.55 + P11 = 0.6366*(np.exp(-0.3401*fn)-1)*np.arctan(1.263*(u/3)**1.629) + P12 = P9 + (1-P9)/(1+1.183*u**1.376) + P13 = 1.695 * P10/(0.414+1.605*P10) + P14 = 0.8928+0.1072*(1-np.exp(-0.42*(fn/20)**3.215)) + P15 = np.abs(1-0.8928*(1+P11)*np.exp(-P13*g**1.092)*P12/P14) + Fo = P1*P2*((P3*P4+1.844)*fn*P15)**1.5763 + odd = e_r - (e_r - odd0)/(1+Fo) + + return even,odd,even0,odd0 + +def mclZcf(W,h,s,e_r,f): + ''' + Calculate odd and even characteristic impedance of parallel + coupled microstrip lines. + M. Kirschning, R. H. Jansen, and N. H. L. Koster, + "Coupled microstrip parallel-gap model for improved filter and coupler design," + Electronics Letters, vol. 19, no. 10, pp. 377–379, May 1983, + doi: 10.1049/el:19830261. + + even, odd = mcl_eps(W,h,s,e_r,f): + W <- width of microstrip (mm) + h <- height of substrate (mm) + s <- spacing between lines (mm) + e_r <- substrate relative dielectric cosntatn + f <- frequency (GHz) + Ze -> even mode charachterstic impedance + Zo -> odd mode characteristic impedance + ''' + u = W/h + g = s/h + fn = f*h + + eps0 = eps_re(u,e_r) + epsf = eps_f(W,h,e_r,f) + even,odd,even0,odd0 = mcl_eps(W,h,s,e_r,f) + Z0 = getZc(u,e_r) + Z0f, Q0 = getZcf(W,h,e_r,f,R=True) + + Q1 = 0.8695*u**0.194 + Q2 = 1+0.7519*g+0.189*g**2.31 + Q3 = 0.1975+(16.6 + (8.4/g)**6)**-0.387 +np.log(g**10/(1+(g/3.4)**10))/241 + Q4 = 2*Q1/Q2/(np.exp(-g)*u**Q3+(2-np.exp(-g))*u**-Q3) + + Ze0 = np.sqrt(eps0/even0)*Z0/(1-Z0/377*np.sqrt(eps0)*Q4) + + Q5 = 1.794 + 1.14*np.log(1+0.638/(g+0.517*g**2.43)) + Q6 = 0.2305+np.log(g**10/(1+(g/5.8)**10))/281.3+np.log(1+0.598*g**1.154)/5.1 + Q7 = (10+190*g**2)/(1+82.3*g**3) + #print(-6.5-0.95*np.log(g)-(g/0.15)**5) + Q8 = np.exp(-6.5-0.95*np.log(g)-(g/0.15)**5) + Q9 = np.log(Q7)*(Q8+1/16.5) + Q10 = (Q2*Q4-Q5*np.exp(np.log(u)*Q6*u**-Q9))/Q2 + + Zo0 = np.sqrt(eps0/odd0)*Z0/(1-Z0/377*np.sqrt(eps0)*Q10) + + # dispersion accounted + Q11 = 0.893*(1-0.3/(1+0.7*(e_r-1))) + Q12 = 2.121*(fn/20)**4.91*np.exp(-2.87*g)*g**0.902/(1+Q11*(fn/20)**4.91) + Q13 = 1+0.038*(e_r/8)**5.1 + Q14 = 1+1.203*(e_r/15)**4/(1+(e_r/15)**4) + Q15 = 1.887*np.exp(-1.5*g**0.84)*g**Q14/(1+0.41*(fn/15)**3*u**(2/Q13)/(0.125+u**(1.625/Q13))) + Q16 = Q15 * (1+ 9/(1+0.403*(e_r-1)**2)) + Q17 = 0.394*(1-np.exp(-1.47*(u/7)**0.672))*(1-np.exp(-4.25*(fn/20)**1.87)) + Q18 = 0.61*(1-np.exp(-2.13*(u/8)**1.593))/(1+6.544*g**4.17) + Q19 = 0.21*g**4/(1+0.18*g**4.9)/(1+0.1*u**2)/(1+(fn/24)**3) + Q20 = Q19 * (0.09+1/(1+0.1*(e_r-1)**2.7)) + Q21 = np.abs(1-42.54*g**0.133*np.exp(-0.812*g)*u**2.5/(1+0.033*u**2.5)) + + re = (fn/28.843)**12 + qe = 0.016+(0.0514*e_r*Q21)**4.524 + pe = 4.766*np.exp(-3.228*u**0.641) + de = 5.086*qe*re*np.exp(-22.2*u**1.92)*(e_r-1)**6/(0.3838+0.386*qe)/(1+1.2992*re)/(1+10*(e_r-1)**6) + + Ce = 1+1.275*(1-np.exp(-0.004625*pe*e_r**1.674*(fn/18.365)**2.745))-Q12+Q16-Q17+Q18+Q20 + Ze = Ze0*( (0.9408*epsf**Ce-0.9603)/( (0.9408-de)*eps0**Ce-0.9603))**Q0 + + Q29 = 15.16/(1+0.196*(e_r-1)**2) + Q28 = 0.149*(e_r-1)**3/(94.5+0.038*(e_r-1)**3) + Q27 = 0.4*g**0.84*(1+(2.5*(e_r-1)**1.5)/(5+(e_r-1)**1.5)) + Q26 = 30 - ( 22.2*((e_r-1)/13)**13)/(1+3*((e_r-1)/13)**12) - Q29 + Q25 = (0.3*fn**2)/(10+fn**2)*(1+(2.333*(e_r-1)**2)/(5+(e_r-1)**2)) + Q24 = 2.506*Q28*u**0.894/(3.575+u**0.894)*((1+1.3*u)*fn/99.25)**4.29 + Q23 = 1+0.005*fn*Q27/(1+0.812*(fn/15)**1.9)/(1+0.025*u**2) + Q22 = 0.925*(fn/Q26)**1.536/(1+0.3*(fn/30)**1.536) + + Zo = Z0f+(Zo0*(odd/odd0)**Q22 - Z0f*Q23)/(1+Q24+(0.46*g)**2.2*Q25) + return Ze,Zo + +def get_mcl(Ze, Zo, h, e_r, f): + ''' + Find width W and gap s of parallel coupled microstrip lines + + [W, s] = get_mcl(Ze, Zo, h, e_r, f): + Ze <- even mode characteristic impedance (ohm) + Zo <- odd mode ch. impedance (ohm) + h <- height of substrate (mm) + e_r <- relative permitivity of substrate + f <- frequency (GHz) + W -> strip width (mm) + s -> gap (mm) + ''' + Z = np.array([Ze,Zo]) + u = opt.root(lambda X: Z - np.array(mclZcf(X[0],h,X[1],e_r,f)), [h/2,h/5],method='lm') + return u.x + +def open_end(W, h, e_r, f): + ''' + Calculate open end displacment dl of microstrip open end. + Kirschning, M., R. H. Jansen, and N. H. L. Koster. + "Accurate model for open end effect of microstrip lines." + Electronics Letters 17.3 (1981): 123-125. + + dl = open_end(W,h,e_r,f) + W <- width of microstrip line (mm) + h <- height of substrate (mm) + e_r <- relative dielectric constant of substrate + f <- frequency (GHz) + ''' + epsf = eps_f(W,h,e_r,f) + u = W/h + + x1 = 0.434907*(epsf**0.81+0.26)/(epsf**0.81-0.189)*(u**0.8544+0.236)/(u**0.8544+0.87) + x2 = 1 + u**0.371/(2.358*e_r+1) + x3 = 1 + 0.5274*np.arctan(0.084*u**(1.9413/x2))/epsf**0.9236 + x4 = 1 + 0.0377*np.arctan(0.067*u**1.456)*(6-5*np.exp(0.036*(1-e_r))) + x5 = 1 - 0.218*np.exp(-7.5*u) + + return x1*x3*x5/x4 *h