def run_sym(circuit, source, print_tf=False) -> Dict[str, sp.Expr]:
    """
    :param circuit: ahkab circuit
    :param source: name of the source for analysis
    :param print_tf: print transfer function, poles, & zeros?
    :return: results for symbolic analysis
    """
    if not isinstance(source, str):
        raise ValueError('Source name must be a string! e.g. \'V1\'')

    r, tf = ahkab.run(circuit, ahkab.new_symbolic(source=source,
                                                  verbose=0))['symbolic']

    tfs = tf['VOUT/' + str(source)]

    if print_tf:
        print("DC gain: {} dB".format(
            20 * sp.log(tf['VOUT/' + str(source)]['gain0'], 10)))
        print("Transfer function:")
        sp.pprint(tfs['gain'])
        for i, z in enumerate(tfs['zeros']):
            print("Zero #{}:".format(i))
            sp.pprint(z)
        for i, p in enumerate(tfs['poles']):
            print("Pole #{}:".format(i))
            sp.pprint(p)

    return tfs
 def setUp(self):
     ttn = ahkab.Circuit('Twin-T Notch Stopband filter')
     ttn.add_vsource('V1', 'in', ttn.gnd, dc_value=1)
     # first path
     ttn.add_capacitor('C1', 'in', 'n1', 2.2e-12)
     ttn.add_capacitor('C2', 'n1', 'out', 2.2e-12)
     ttn.add_resistor('R1', 'n1', ttn.gnd, 1e3)
     # second path
     ttn.add_resistor('R2', 'in', 'n2', 2e3)
     ttn.add_resistor('R3', 'n2', 'out', 2e3)
     ttn.add_capacitor('C3', 'n2', ttn.gnd, 2*2.2e-12)
     ttn.add_vcvs('E1', 'outb', ttn.gnd, 'out', ttn.gnd, 1.)
     sa = ahkab.new_symbolic(source=None)
     self.r = ahkab.run(ttn, sa)['symbolic'][0]
Example #3
0
 def setUp(self):
     ttn = ahkab.Circuit('Twin-T Notch Stopband filter')
     ttn.add_vsource('V1', 'in', ttn.gnd, dc_value=1)
     # first path
     ttn.add_capacitor('C1', 'in', 'n1', 2.2e-12)
     ttn.add_capacitor('C2', 'n1', 'out', 2.2e-12)
     ttn.add_resistor('R1', 'n1', ttn.gnd, 1e3)
     # second path
     ttn.add_resistor('R2', 'in', 'n2', 2e3)
     ttn.add_resistor('R3', 'n2', 'out', 2e3)
     ttn.add_capacitor('C3', 'n2', ttn.gnd, 2 * 2.2e-12)
     ttn.add_vcvs('E1', 'outb', ttn.gnd, 'out', ttn.gnd, 1.)
     sa = ahkab.new_symbolic(source=None)
     self.r = ahkab.run(ttn, sa)['symbolic'][0]
Example #4
0
def _run_test(ref_run=False):
    MINNODES = 6
    MAXNODES = 14
    STEP = 1
    times = []

    x = list(range(max((2, MINNODES)), MAXNODES, STEP))
    for circuit_nodes in x:
        # build the circuit
        mycir = ahkab.Circuit('R2R symbolic test with %d nodes' %
                              circuit_nodes)
        n1 = '1'
        gnd = mycir.gnd
        mycir.add_vsource('VS', n1, gnd, dc_value=10e3)
        subs = {}
        for n in range(1, circuit_nodes):
            n1 = str(n)
            n2 = str(n + 1)
            mycir.add_resistor("R%dh1" % n, n1, n2, value=2.6e3)
            mycir.add_resistor("R%dh2" % n, n1, n2, value=2.6e3)
            mycir.add_resistor("R%dv" % n, n2, gnd, value=2.6e3)
            subs.update({"R%dh1" % n: 'R', "R%dh2" % n: 'R', "R%dv" % n: 'R'})
        n1 = str(circuit_nodes)
        mycir.add_resistor("R%dve" % circuit_nodes, n1, gnd, value=2.6e3)
        subs.update({"R%dve" % circuit_nodes: 'R'})
        # define analysis
        s = ahkab.new_symbolic(subs=subs)
        start = time.time()
        r = ahkab.run(mycir, s)['symbolic'][0]
        stop = time.time()
        times.append((stop - start))
        print("Solving with %d nodes took %f s" % (circuit_nodes, times[-1]))
        # check the values too
        VS = r.as_symbol('VS')
        out_test = r['V' + str(circuit_nodes)] / VS
        out_th = 1. / (2**(circuit_nodes - 1))
        assert .5 * abs(out_th - out_test) / (out_th + out_test) < 1e-3

    x = numpy.array(x, dtype=numpy.int64)
    times = numpy.array(times, dtype=numpy.float64)
    if ref_run:
        numpy.savetxt(os.path.join(reference_path, 'r2r_symbolic_ref.csv'),
                      numpy.concatenate((x.reshape(
                          (-1, 1)), times.reshape((-1, 1))),
                                        axis=1),
                      delimiter=',')
        save_boxid(os.path.join(reference_path, 'r2r_symbolic_ref.boxid'))
    return x, times
def _run_test(ref_run=False):
    MINNODES = 6
    MAXNODES = 14
    STEP = 1
    times = []

    x = list(range(max((2, MINNODES)), MAXNODES, STEP))
    for circuit_nodes in x:
        # build the circuit
        mycir = ahkab.Circuit('R2R symbolic test with %d nodes' %
                              circuit_nodes)
        n1 = '1'
        gnd = mycir.gnd
        mycir.add_vsource('VS', n1, gnd, dc_value=10e3)
        subs = {}
        for n in range(1, circuit_nodes):
            n1 = str(n)
            n2 = str(n + 1)
            mycir.add_resistor("R%dh1" % n, n1, n2, value=2.6e3)
            mycir.add_resistor("R%dh2" % n, n1, n2, value=2.6e3)
            mycir.add_resistor("R%dv" % n, n2, gnd, value=2.6e3)
            subs.update({"R%dh1" % n: 'R', "R%dh2" % n: 'R', "R%dv" % n: 'R'})
        n1 = str(circuit_nodes)
        mycir.add_resistor("R%dve" % circuit_nodes, n1, gnd, value=2.6e3)
        subs.update({"R%dve" % circuit_nodes: 'R'})
        # define analysis
        s = ahkab.new_symbolic(subs=subs)
        start = time.time()
        r = ahkab.run(mycir, s)['symbolic'][0]
        stop = time.time()
        times.append((stop - start))
        print("Solving with %d nodes took %f s" % (circuit_nodes, times[-1]))
        # check the values too
        VS = r.as_symbol('VS')
        out_test = r['V' + str(circuit_nodes)] / VS
        out_th = 1./(2**(circuit_nodes - 1))
        assert .5*abs(out_th - out_test)/(out_th + out_test) < 1e-3

    x = numpy.array(x, dtype=numpy.int64)
    times = numpy.array(times, dtype=numpy.float64)
    if ref_run:
        numpy.savetxt(os.path.join(reference_path, 'r2r_symbolic_ref.csv'),
                      numpy.concatenate((x.reshape((-1, 1)),
                                         times.reshape((-1, 1))),
                                        axis=1), delimiter=',')
        save_boxid(os.path.join(reference_path, 'r2r_symbolic_ref.boxid'))
    return x, times
Example #6
0
def test():
    """Test CCCS API"""
    # The circuit is:
    #test for transresitances
    #va 1 2 type=vdc vdc=.1 vac=1
    #r1 1 0 .5k
    #r2 2 0 .5k
    #h1 3 4 va 5000
    #r3 3 0 1k
    #r4 4 5 1k
    #l1 5 0 10u
    #c1 5 0 10u
    #.op
    #.ac start=50k stop=5e5 nsteps=1000
    #.symbolic
    #.plot ac |v(5)|

    mycircuit = circuit.Circuit(title="Test CCVS API", filename=None)
    gnd = mycircuit.get_ground_node()

    mycircuit.add_resistor(part_id="R1", n1="1", n2=gnd, value=500)
    mycircuit.add_resistor(part_id="R2", n1="2", n2=gnd, value=500)
    mycircuit.add_vsource("VA", n1="1", n2='2', dc_value=0.1, ac_value=1.)
    mycircuit.add_ccvs('H1', n1='3', n2='4', source_id='VA', value=5000)
    mycircuit.add_resistor(part_id="R3", n1="3", n2=gnd, value=1e3)
    mycircuit.add_resistor(part_id="R4", n1="4", n2="5", value=1e3)
    mycircuit.add_inductor(part_id="L1", n1="5", n2=gnd, value=10e-6)
    mycircuit.add_capacitor(part_id="C1", n1="5", n2=gnd, value=10e-6)

    print(mycircuit)

    op_analysis = ahkab.new_op(outfile='hvsource_api', verbose=6)
    symb_analysis = ahkab.new_symbolic(outfile='hvsource_api', verbose=6)
    ac_analysis = ahkab.new_ac(outfile='hvsource_api', start=7957.747,
                               stop=79577.471, points=1000, verbose=6)

    testbench = testing.APITest('hvsource', mycircuit, 
                                [op_analysis, symb_analysis, ac_analysis],
                                skip_on_travis=False, er=1e-3, ea=1e-5)
    testbench.setUp()
    testbench.test()

    if not cli:
        testbench.tearDown()
Example #7
0
def test():
    """Test CCCS API"""
    # The circuit is:
    #test for transresitances
    #va 1 2 type=vdc vdc=.1 vac=1
    #r1 1 0 .5k
    #r2 2 0 .5k
    #h1 3 4 va 5000
    #r3 3 0 1k
    #r4 4 5 1k
    #l1 5 0 10u
    #c1 5 0 10u
    #.op
    #.ac start=50k stop=5e5 nsteps=1000
    #.symbolic
    #.plot ac |v(5)|

    mycircuit = circuit.Circuit(title="Test CCVS API", filename=None)
    gnd = mycircuit.get_ground_node()

    mycircuit.add_resistor(part_id="R1", n1="1", n2=gnd, value=500)
    mycircuit.add_resistor(part_id="R2", n1="2", n2=gnd, value=500)
    mycircuit.add_vsource("VA", n1="1", n2='2', dc_value=0.1, ac_value=1.)
    mycircuit.add_ccvs('H1', n1='3', n2='4', source_id='VA', value=5000)
    mycircuit.add_resistor(part_id="R3", n1="3", n2=gnd, value=1e3)
    mycircuit.add_resistor(part_id="R4", n1="4", n2="5", value=1e3)
    mycircuit.add_inductor(part_id="L1", n1="5", n2=gnd, value=10e-6)
    mycircuit.add_capacitor(part_id="C1", n1="5", n2=gnd, value=10e-6)

    print(mycircuit)

    op_analysis = ahkab.new_op(outfile='hvsource_api', verbose=6)
    symb_analysis = ahkab.new_symbolic(outfile='hvsource_api', verbose=6)
    ac_analysis = ahkab.new_ac(outfile='hvsource_api', start=50e3, stop=500e3,
                               points=1000, verbose=6)

    testbench = testing.APITest('hvsource', mycircuit, 
                                [op_analysis, symb_analysis, ac_analysis],
                                skip_on_travis=False, er=1e-3, ea=1e-5)
    testbench.setUp()
    testbench.test()

    if not cli:
        testbench.tearDown()
Example #8
0
def test():
    """Test CCCS API"""
    # The circuit is:
    # test for transconductors
    # va 1 2 type=vdc vdc=.1
    # r1 1 0 .5k
    # r2 2 0 .5k
    # f1 3 4 va 5
    # r3 3 0 1k
    # r4 4 0 1k
    # .op
    # .symbolic

    mycircuit = circuit.Circuit(title="Test CCCS API", filename=None)
    gnd = mycircuit.get_ground_node()

    mycircuit.add_resistor(part_id="R1", n1="1", n2=gnd, value=500)
    mycircuit.add_resistor(part_id="R2", n1="2", n2=gnd, value=500)
    mycircuit.add_cccs('F1', n1='3', n2='4', source_id='VA', value=5)
    mycircuit.add_resistor(part_id="R3", n1="3", n2=gnd, value=1e3)
    mycircuit.add_resistor(part_id="R4", n1="4", n2=gnd, value=1e3)
    mycircuit.add_vsource("VA", n1="1", n2='2', dc_value=0.1)

    print(mycircuit)

    op_analysis = ahkab.new_op(outfile='fisource_api', verbose=6)
    symb_analysis = ahkab.new_symbolic(outfile='fisource_api', verbose=6)

    testbench = testing.APITest('fisource',
                                mycircuit, [op_analysis, symb_analysis],
                                skip_on_travis=False,
                                er=1e-3,
                                ea=1e-5)
    testbench.setUp()
    testbench.test()

    if not cli:
        testbench.tearDown()
def test():
    """Test CCCS API"""
    # The circuit is:
    # test for transconductors
    # va 1 2 type=vdc vdc=.1
    # r1 1 0 .5k
    # r2 2 0 .5k
    # f1 3 4 va 5
    # r3 3 0 1k
    # r4 4 0 1k
    # .op
    # .symbolic

    mycircuit = circuit.Circuit(title="Test CCCS API", filename=None)
    gnd = mycircuit.get_ground_node()

    mycircuit.add_resistor(part_id="R1", n1="1", n2=gnd, value=500)
    mycircuit.add_resistor(part_id="R2", n1="2", n2=gnd, value=500)
    mycircuit.add_cccs("F1", n1="3", n2="4", source_id="VA", value=5)
    mycircuit.add_resistor(part_id="R3", n1="3", n2=gnd, value=1e3)
    mycircuit.add_resistor(part_id="R4", n1="4", n2=gnd, value=1e3)
    mycircuit.add_vsource("VA", n1="1", n2="2", dc_value=0.1)

    print(mycircuit)

    op_analysis = ahkab.new_op(outfile="fisource_api", verbose=6)
    symb_analysis = ahkab.new_symbolic(outfile="fisource_api", verbose=6)

    testbench = testing.APITest(
        "fisource", mycircuit, [op_analysis, symb_analysis], skip_on_travis=False, er=1e-3, ea=1e-5
    )
    testbench.setUp()
    testbench.test()

    if not cli:
        testbench.tearDown()
Example #10
0
def test():
    """Test VCCS (API)"""
    # The circuit is:
    # test for transconductors
    # va 1 2 type=idc idc=1m
    # r1 1 0 .5k
    # r2 2 0 .5k
    # g1 3 4 2 1 1e-3
    # r3 3 0 1k
    # r4 4 0 1k
    # .op
    # .symbolic

    mycircuit = circuit.Circuit(title="Test CCCS API", filename=None)
    gnd = mycircuit.get_ground_node()

    mycircuit.add_resistor(part_id="R1", n1="1", n2=gnd, value=500)
    mycircuit.add_resistor(part_id="R2", n1="2", n2=gnd, value=500)
    mycircuit.add_vccs('G1', n1='3', n2='4', sn1='2', sn2='1', value=1e-3)
    mycircuit.add_resistor(part_id="R3", n1="3", n2=gnd, value=1e3)
    mycircuit.add_resistor(part_id="R4", n1="4", n2=gnd, value=1e3)
    mycircuit.add_isource("IA", n1="1", n2='2', dc_value=1e-3)

    print(mycircuit)

    op_analysis = ahkab.new_op(outfile='gisource_api', verbose=6)
    symb_analysis = ahkab.new_symbolic(outfile='gisource_api', verbose=6)

    testbench = testing.APITest('gisource', mycircuit, 
                                [op_analysis, symb_analysis],
                                skip_on_travis=False, er=1e-3, ea=1e-5)
    testbench.setUp()
    testbench.test()

    if not cli:
        testbench.tearDown()
Example #11
0
def test():
    """Test SVF Biquad"""
    mycircuit = Circuit(title="state variable filter")
    gnd = mycircuit.get_ground_node()
    buildsvf(mycircuit)
    mycircuit.add_vsource(part_id="V1", n1="in", n2=gnd, dc_value=5, ac_value=1)

    if cli:
        printing.print_circuit(mycircuit)

    subs = symbolic.parse_substitutions(('E2=E1', 'E3=E1', 'R01=R00', 'R02=R00',
                                         'R11=R00', 'R10=R00', 'C11=C10', 'Rf2=Rf1',
                                         'Rin=R00'))

    symbolic_sim = ahkab.new_symbolic(ac_enable=True, subs=subs, outfile='svf_biquad')
    ac_sim = ahkab.new_ac(start=0.1, stop=100e6, points=1000, x0=None, outfile='svf_biquad')

    testbench = testing.APITest('svf_biquad', mycircuit, [symbolic_sim, ac_sim],
                                skip_on_travis=True, er=1e-3, ea=1e-5)
    testbench.setUp()
    testbench.test()

    if cli:
        r = ahkab.run(mycircuit, [symbolic_sim, ac_sim])
        E = r['symbolic'][0].as_symbol('E1')
        out_hp = sympy.limit(r['symbolic'][0]['VU1o'], E, sympy.oo, '+')
        out_bp = sympy.limit(r['symbolic'][0]['VU2o'], E, sympy.oo, '+')
        out_lp = sympy.limit(r['symbolic'][0]['VU3o'], E, sympy.oo, '+')
        out_hp = out_hp.simplify()
        out_bp = out_bp.simplify()
        out_lp = out_lp.simplify()
        print("VU1o =", out_hp)
        print("VU2o =", out_bp)
        print("VU3o =", out_lp)

        w = sympy.Symbol('w')
        out_hp = out_hp.subs({r['symbolic'][0].as_symbol('RF1'):10e3,
                              r['symbolic'][0].as_symbol('C10'):15e-9,
                              r['symbolic'][0].as_symbol('V1'):1,
                              r['symbolic'][0].as_symbol('s'):1j*w,
                              })
        out_bp = out_bp.subs({r['symbolic'][0].as_symbol('RF1'):10e3,
                              r['symbolic'][0].as_symbol('C10'):15e-9,
                              r['symbolic'][0].as_symbol('V1'):1,
                              r['symbolic'][0].as_symbol('s'):1j*w,
                              })
        out_lp = out_lp.subs({r['symbolic'][0].as_symbol('RF1'):10e3,
                              r['symbolic'][0].as_symbol('C10'):15e-9,
                              r['symbolic'][0].as_symbol('V1'):1,
                              r['symbolic'][0].as_symbol('s'):1j*w,
                              })
        out_lp = sympy.lambdify((w,), out_lp, modules='numpy')
        out_bp = sympy.lambdify((w,), out_bp, modules='numpy')
        out_hp = sympy.lambdify((w,), out_hp, modules='numpy')
        ws = r['ac']['w'][::30]
        fig = plt.figure()
        plt.title(mycircuit.title)
        plt.subplot(211)
        plt.hold(True)
        plt.semilogx(r['ac']['w']/2./np.pi, 20*np.log10(np.abs(r['ac']['VU1o'])), label="HP output (AC)")
        plt.semilogx(r['ac']['w']/2./np.pi, 20*np.log10(np.abs(r['ac']['VU2o'])), label="BP output (AC)")
        plt.semilogx(r['ac']['w']/2./np.pi, 20*np.log10(np.abs(r['ac']['VU3o'])), label="LP output (AC)")
        plt.semilogx(ws/2./np.pi, 20*np.log10(np.abs(out_hp(ws))), 'v', label="HP output (SYMB)")
        plt.semilogx(ws/2./np.pi, 20*np.log10(np.abs(out_bp(ws))), 'v', label="BP output (SYMB)")
        plt.semilogx(ws/2./np.pi, 20*np.log10(np.abs(out_lp(ws))), 'v', label="LP output (SYMB)")
        plt.hold(False)
        plt.grid(True)
        plt.legend()
        plt.ylabel('Magnitude [dB]')
        plt.xlabel('Frequency [Hz]')
        plt.subplot(212)
        plt.hold(True)
        plt.semilogx(r['ac']['w']/2./np.pi, np.angle(r['ac']['VU1o']), label="HP output (AC)")
        plt.semilogx(r['ac']['w']/2./np.pi, np.angle(r['ac']['VU2o']), label="BP output (AC)")
        plt.semilogx(r['ac']['w']/2./np.pi, np.angle(r['ac']['VU3o']), label="LP output (AC)")
        plt.semilogx(ws/2./np.pi, np.angle(out_hp(ws)), 'v', label="HP output (SYMB)")
        plt.semilogx(ws/2./np.pi, np.angle(out_bp(ws)), 'v', label="BP output (SYMB)")
        plt.semilogx(ws/2./np.pi, np.angle(out_lp(ws)), 'v', label="LP output (SYMB)")
        plt.legend()
        plt.hold(False)
        plt.grid(True)
        #plt.ylim([0,1.2])
        plt.ylabel('Phase [rad]')
        plt.xlabel('Frequency [Hz]')
        fig.savefig('ac_plot.png')
    else:
        testbench.tearDown()
Example #12
0
    av = svf.add_vsource
    ao = lambda name, p, n: svf.add_vcvs("E" + name[1:], name + "o", gnd, p, n,
                                         1e6)
    ao("u1", "u1p", "u1o")
    ar("R1", "in", "nR2", 10e3)
    ar("R2", "nR2", "u1p", 10e3)
    ac("C1", "u1o", "nR2", 1e-9)
    ac("C2", "u1p", gnd, 1e-9)
    av("V1", "in", gnd, 2.5, 1.0)


buildsk(mycircuit)

print(mycircuit)

symbolic_sim = ahkab.new_symbolic(ac_enable=True, source='V1')

ac_sim = ahkab.new_ac(start=10, stop=100e6, points=1000, x0=None)

try:
    r = pickle.load(open("results-sallenkey.pk"))
except:
    ahkab.queue(ac_sim, symbolic_sim)
    r = ahkab.run(mycircuit)
    pickle.dump(r, open("results-sallenkey.pk", "wb"))

print r['symbolic'][0]
print "Symbolic transfer functions:"
printing.print_symbolic_transfer_functions(r['symbolic'][1])

# substitute the actual values to the symbols and plot
Example #13
0
	av = circuit.add_vsource
#	circuit.add_model("diode", "aDiodeModel", {"name": "aDiodeElement"})
#	circuit.add_diode("D1", "da", "dc", "aDiodeModel")
	av("Vin", "in", gnd, 2.5, 1.0)
	ac("Cin", "in", gnd, 100e-3)
	al("L1", "in", "s1", 47e-6)
	ac("C1", "s1", "da", 10e-6)
	al("L2", "da", gnd, 47e-6)
	ac("C2", "dc", gnd, 100e-3)
	#circuit.add_inductor_coupling("K1", "L1", "L2", 0.99)

buildsepic(mycircuit)

print(mycircuit)

symbolic_sim = ahkab.new_symbolic()

try:
	r = pickle.load(open("results-sepic.pk"))
except:
	r = ahkab.run(mycircuit, (symbolic_sim,))
	pickle.dump(r, open("results-sepic.pk", "wb"))

print mycircuit
print r['symbolic'][0]

tf = r['symbolic'][0]['I[L1]']/r['symbolic'][0]['Vin']

tf = ahkabHelpers.reduceTF(tf, mycircuit)

import compensators
Example #14
0
def test():
    """Test SVF Biquad"""
    mycircuit = Circuit(title="state variable filter")
    gnd = mycircuit.get_ground_node()
    buildsvf(mycircuit)
    mycircuit.add_vsource(part_id="V1", n1="in", n2=gnd, dc_value=5, ac_value=1)

    if cli:
        print(mycircuit)

    subs = {'E2':'E1', 'E3':'E1', 'R01':'R00', 'R02':'R00', 'R11':'R00',
            'R10':'R00', 'C11':'C10', 'Rf2':'Rf1', 'Rin':'R00'}

    symbolic_sim = ahkab.new_symbolic(ac_enable=True, subs=subs, outfile='svf_biquad')
    ac_sim = ahkab.new_ac(start=0.1, stop=100e6, points=1000, x0=None, outfile='svf_biquad')

    testbench = testing.APITest('svf_biquad', mycircuit, [symbolic_sim, ac_sim],
                                skip_on_travis=True, er=1e-3, ea=1e-5)
    testbench.setUp()
    testbench.test()

    if cli:
        r = ahkab.run(mycircuit, [symbolic_sim, ac_sim])
        E = r['symbolic'][0].as_symbol('E1')
        out_hp = sympy.limit(r['symbolic'][0]['VU1o'], E, sympy.oo, '+')
        out_bp = sympy.limit(r['symbolic'][0]['VU2o'], E, sympy.oo, '+')
        out_lp = sympy.limit(r['symbolic'][0]['VU3o'], E, sympy.oo, '+')
        out_hp = out_hp.simplify()
        out_bp = out_bp.simplify()
        out_lp = out_lp.simplify()
        print("VU1o =", out_hp)
        print("VU2o =", out_bp)
        print("VU3o =", out_lp)

        w = sympy.Symbol('w')
        out_hp = out_hp.subs({r['symbolic'][0].as_symbol('RF1'):10e3,
                              r['symbolic'][0].as_symbol('C10'):15e-9,
                              r['symbolic'][0].as_symbol('V1'):1,
                              r['symbolic'][0].as_symbol('s'):1j*w,
                              })
        out_bp = out_bp.subs({r['symbolic'][0].as_symbol('RF1'):10e3,
                              r['symbolic'][0].as_symbol('C10'):15e-9,
                              r['symbolic'][0].as_symbol('V1'):1,
                              r['symbolic'][0].as_symbol('s'):1j*w,
                              })
        out_lp = out_lp.subs({r['symbolic'][0].as_symbol('RF1'):10e3,
                              r['symbolic'][0].as_symbol('C10'):15e-9,
                              r['symbolic'][0].as_symbol('V1'):1,
                              r['symbolic'][0].as_symbol('s'):1j*w,
                              })
        out_lp = sympy.lambdify((w,), out_lp)
        out_bp = sympy.lambdify((w,), out_bp)
        out_hp = sympy.lambdify((w,), out_hp)
        ws = r['ac']['w'][::30]
        fig = plt.figure()
        plt.title(mycircuit.title)
        plt.subplot(211)
        plt.hold(True)
        plt.semilogx(r['ac']['w']/2./np.pi, 20*np.log10(np.abs(r['ac']['VU1o'])), label="HP output (AC)")
        plt.semilogx(r['ac']['w']/2./np.pi, 20*np.log10(np.abs(r['ac']['VU2o'])), label="BP output (AC)")
        plt.semilogx(r['ac']['w']/2./np.pi, 20*np.log10(np.abs(r['ac']['VU3o'])), label="LP output (AC)")
        plt.semilogx(ws/2./np.pi, 20*np.log10(np.abs(out_hp(ws))), 'v', label="HP output (SYMB)")
        plt.semilogx(ws/2./np.pi, 20*np.log10(np.abs(out_bp(ws))), 'v', label="BP output (SYMB)")
        plt.semilogx(ws/2./np.pi, 20*np.log10(np.abs(out_lp(ws))), 'v', label="LP output (SYMB)")
        plt.hold(False)
        plt.grid(True)
        plt.legend()
        plt.ylabel('Magnitude [dB]')
        plt.xlabel('Frequency [Hz]')
        plt.subplot(212)
        plt.hold(True)
        plt.semilogx(r['ac']['w']/2./np.pi, np.angle(r['ac']['VU1o']), label="HP output (AC)")
        plt.semilogx(r['ac']['w']/2./np.pi, np.angle(r['ac']['VU2o']), label="BP output (AC)")
        plt.semilogx(r['ac']['w']/2./np.pi, np.angle(r['ac']['VU3o']), label="LP output (AC)")
        plt.semilogx(ws/2./np.pi, np.angle(out_hp(ws)), 'v', label="HP output (SYMB)")
        plt.semilogx(ws/2./np.pi, np.angle(out_bp(ws)), 'v', label="BP output (SYMB)")
        plt.semilogx(ws/2./np.pi, np.angle(out_lp(ws)), 'v', label="LP output (SYMB)")
        plt.legend()
        plt.hold(False)
        plt.grid(True)
        #plt.ylim([0,1.2])
        plt.ylabel('Phase [rad]')
        plt.xlabel('Frequency [Hz]')
        fig.savefig('ac_plot.png')
    else:
        testbench.tearDown()
Example #15
0
    #	circuit.add_model("diode", "aDiodeModel", {"name": "aDiodeElement"})
    #	circuit.add_diode("D1", "da", "dc", "aDiodeModel")
    av("Vin", "in", gnd, 2.5, 1.0)
    ac("Cin", "in", gnd, 100e-3)
    al("L1", "in", "s1", 47e-6)
    ac("C1", "s1", "da", 10e-6)
    al("L2", "da", gnd, 47e-6)
    ac("C2", "dc", gnd, 100e-3)
    #circuit.add_inductor_coupling("K1", "L1", "L2", 0.99)


buildsepic(mycircuit)

print(mycircuit)

symbolic_sim = ahkab.new_symbolic()

try:
    r = pickle.load(open("results-sepic.pk"))
except:
    r = ahkab.run(mycircuit, (symbolic_sim, ))
    pickle.dump(r, open("results-sepic.pk", "wb"))

print mycircuit
print r['symbolic'][0]

tf = r['symbolic'][0]['I[L1]'] / r['symbolic'][0]['Vin']

tf = ahkabHelpers.reduceTF(tf, mycircuit)

import compensators
Example #16
0
	ac = svf.add_capacitor
	al = svf.add_inductor
	av = svf.add_vsource
	ao = lambda name, p, n: svf.add_vcvs("E"+name[1:], name+"o", gnd, p, n, 1e6)
	ao("u1", "u1p", "u1o")
	ar("R1", "in", "nR2", 10e3)
	ar("R2", "nR2", "u1p", 10e3)
	ac("C1", "u1o", "nR2", 1e-9)
	ac("C2", "u1p", gnd, 1e-9)
	av("V1", "in", gnd, 2.5, 1.0)

buildsk(mycircuit)

print(mycircuit)

symbolic_sim = ahkab.new_symbolic(ac_enable=True, source='V1')

ac_sim = ahkab.new_ac(start=10, stop=100e6, points=1000, x0=None)

try:
	r = pickle.load(open("results-sallenkey.pk"))
except:
	ahkab.queue(ac_sim, symbolic_sim)
	r = ahkab.run(mycircuit)
	pickle.dump(r, open("results-sallenkey.pk", "wb"))

print r['symbolic'][0]
print "Symbolic transfer functions:"
printing.print_symbolic_transfer_functions(r['symbolic'][1])

# substitute the actual values to the symbols and plot
Example #17
0
	ao("E3", gnd, "U3n")

buildsvf(mycircuit)
mycircuit.add_vsource("V1", n1="in", n2=gnd, dc_value=5, ac_value=1)

print(mycircuit)

ac_sim = new_ac(start=0.1, stop=100e6, points=1000, x0=None)

try:
	r = pickle.load(open("results-ttb.pk"))
except:
	subs = symbolic.parse_substitutions(('R2=R1', 'R3=R1', 'C2=C1',
                                             'E2=E1', 'E3=E1', "R4=R1",
                                             "R5=R1", "R6=R1"))
	symbolic_sim = ahkab.new_symbolic(ac_enable=True, source=None,
                                          subs=subs)
	ahkab.queue(symbolic_sim)
	r = ahkab.run(mycircuit)
	pickle.dump(r, open("results-ttb.pk", "wb"))

ahkab.queue(ac_sim)
r.update(ahkab.run(mycircuit))

# TU1o is bandpass output
tf = r['symbolic'][0]['VU1o']/r['symbolic'][0].as_symbol('V1')
locals().update(ahkabHelpers.getMapping(tf))

tf = sympy.limit(tf, E1, sympy.oo, '+')

tf = ahkabHelpers.reduceTF(tf, mycircuit)