#!/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)