#### 124 lines 3.3 KiB Python Raw Permalink Blame History

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