def solve_abcd(self, freqs, refnode = gnd, complexfreq = False): (inp, inn), (outp, outn) = self.ports toolkit = self.toolkit ## Add voltage source at input port and create ## copies with output open and shorted respectively circuit_vs_open = copy(self.cir) circuit_vs_open['VS_TwoPort'] = VS(inp, inn, vac=1) circuit_vs_shorted = copy(circuit_vs_open) circuit_vs_shorted['VL_TwoPort'] = VS(outp, outn, vac=0) ## Run AC-analysis on the two circuits ac_open = AC(circuit_vs_open, toolkit=toolkit) ac_shorted = AC(circuit_vs_shorted, toolkit=toolkit) res_open = ac_open.solve(freqs, refnode = refnode, complexfreq=complexfreq) res_shorted = ac_shorted.solve(freqs, refnode = refnode, complexfreq=complexfreq) A = res_open.v(inp, inn) / res_open.v(outp, outn) B = res_shorted.v(inp, inn) / res_shorted.i('VL_TwoPort.plus') C = res_open.i('VS_TwoPort.minus') / res_open.v(outp, outn) D = res_shorted.i('VS_TwoPort.minus') / res_shorted.i('VL_TwoPort.plus') return np.array([[A,B],[C,D]], dtype=object)
def test_loopanalysis_numeric(): cir = SubCircuit() cir['A1'] = VCVS(gnd, 'int', 'out', gnd, g = 10) cir['R1'] = R('in', 'int') cir['probe'] = LoopProbe('out', gnd, 'out_R2', gnd) cir['C2'] = C('int', 'out_R2') cir['VS'] = VS('in', gnd) ana = FeedbackLoopAnalysis(cir) res = ana.solve(np.logspace(4,6), complexfreq=True) print abs(res['loopgain'])
def test_loopanalysis_viiv(): sympy.var('R1 R2 CL A s') cir = SubCircuit(toolkit=symbolic) cir['A1'] = VCVS(gnd, 'int', 'out', gnd, g = A, toolkit=symbolic) cir['R1'] = R('in', 'int', r=R1) cir['probe'] = LoopProbe('out', gnd, 'out_R2', gnd, toolkit=symbolic) cir['R2'] = R('int', 'out_R2', r=R2) cir['VS'] = VS('in', gnd) ana = FeedbackLoopAnalysis(cir, toolkit=symbolic) res = ana.solve(s, complexfreq=True) assert sympy.simplify(res['loopgain'] - (- A * R1 / (R1 + R2))) == 0
def test_deviceanalysis_viiv(): """Loopgain of a resistor V-I and a I-V amplifier with a vcvs as gain element""" sympy.var('R1 R2 CL A s') cir = SubCircuit(toolkit=symbolic) cir['A1'] = VCVS(gnd, 'int', 'out', gnd, g = A,toolkit=symbolic) cir['R1'] = R('in', 'int', r=R1) cir['R2'] = R('int', 'out', r=R2) cir['VS'] = VS('in', gnd) ana = FeedbackDeviceAnalysis(cir, 'A1', toolkit=symbolic) res = ana.solve(s, complexfreq=True) assert simplify(res['loopgain'] - (- A * R1 / (R1 + R2))) == 0
def test_deviceanalysis_sourcefollower(): """Loopgain of a source follower""" gm,RL,CL,s = sympy.symbols('gm RL CL s') cir = SubCircuit(toolkit=symbolic) cir['M1'] = VCCS('g', 's', gnd, 's', gm = gm,toolkit=symbolic) cir['RL'] = R('s', gnd, r=RL) cir['CL'] = C('s', gnd, c=CL) cir['VS'] = VS('g', gnd) ana = FeedbackDeviceAnalysis(cir, 'M1', toolkit=symbolic) res = ana.solve(s, complexfreq=True) assert_equal(simplify(res['loopgain']), simplify(- gm / (1/RL + s*CL)))
def solve(self, freqs, complexfreq = False, refnode = gnd): toolkit = self.toolkit result = InternalResultDict() if self.method == 'sparam': result['twoport'] = self.solve_s(freqs, complexfreq=complexfreq) abcd = result['twoport'].A else: abcd = self.solve_abcd(freqs, refnode=refnode, complexfreq=complexfreq) result['twoport'] = NPortA(abcd) result['mu'] = 1 / abcd[0,0] result['gamma'] = 1 / abcd[0,1] result['zeta'] = 1 / abcd[1,0] result['beta'] = 1 / abcd[1,1] if self.noise: (inp, inn), (outp, outn) = self.ports circuit_vs = copy(self.cir) circuit_vs['VS_TwoPort'] = VS(inp, inn, vac = 1) circuit_cs = copy(self.cir) circuit_cs['IS_TwoPort'] = IS(inp, inn, iac = 1) if self.noise_outquantity == 'i': for src in circuit_vs, circuit_cs: src['VL'] = VS(outp, outn, vac = 0) if self.noise_outquantity == 'v': na = Noise(circuit_vs, inputsrc='VS_TwoPort', outputnodes=(outp, outn), toolkit=toolkit, epar=self.epar) res_v = na.solve(freqs, complexfreq=complexfreq, refnode=refnode) na = Noise(circuit_cs, inputsrc='IS_TwoPort', outputnodes=(outp, outn), toolkit=toolkit, epar=self.epar) res_i = na.solve(freqs, complexfreq=complexfreq, refnode=refnode) else: na = Noise(circuit_vs, inputsrc='VS_TwoPort', outputsrc='VL', toolkit=toolkit, epar=self.epar) res_v = na.solve(freqs, complexfreq=complexfreq, refnode=refnode) na = Noise(circuit_cs, inputsrc='IS_TwoPort', outputsrc='VL', toolkit=toolkit, epar=self.epar) res_i = na.solve(freqs, complexfreq=complexfreq, refnode=refnode) result['Svn'] = res_v['Svninp'] result['Sin'] = res_i['Sininp'] self.result = result return result