예제 #1
0
    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)
예제 #2
0
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'])
예제 #3
0
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
예제 #4
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
예제 #5
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)))
예제 #6
0
    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