{"id":20548557,"url":"https://github.com/kenkundert/rlc_chart","last_synced_at":"2025-10-09T13:35:27.493Z","repository":{"id":146202640,"uuid":"350898262","full_name":"KenKundert/rlc_chart","owner":"KenKundert","description":"A library that renders impedance charts that include capacitance and inductance grids.","archived":false,"fork":false,"pushed_at":"2025-03-01T01:56:48.000Z","size":724,"stargazers_count":13,"open_issues_count":0,"forks_count":3,"subscribers_count":4,"default_branch":"main","last_synced_at":"2025-03-28T00:07:12.527Z","etag":null,"topics":["admittance","electrical-engineering-graphs","immittance","impedance","reactance"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/KenKundert.png","metadata":{"files":{"readme":"README.rst","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2021-03-24T00:33:14.000Z","updated_at":"2025-03-01T01:56:52.000Z","dependencies_parsed_at":"2023-10-11T06:58:44.630Z","dependency_job_id":null,"html_url":"https://github.com/KenKundert/rlc_chart","commit_stats":{"total_commits":43,"total_committers":2,"mean_commits":21.5,"dds":"0.023255813953488413","last_synced_commit":"3770b7ddde179dea25fc9899262b583bab6a32b5"},"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KenKundert%2Frlc_chart","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KenKundert%2Frlc_chart/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KenKundert%2Frlc_chart/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KenKundert%2Frlc_chart/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/KenKundert","download_url":"https://codeload.github.com/KenKundert/rlc_chart/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248570990,"owners_count":21126512,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["admittance","electrical-engineering-graphs","immittance","impedance","reactance"],"created_at":"2024-11-16T02:13:51.825Z","updated_at":"2025-10-09T13:35:22.465Z","avatar_url":"https://github.com/KenKundert.png","language":"Python","readme":"RLC Chart\n=========\n\n.. image:: https://pepy.tech/badge/rlc_chart/month\n    :target: https://pepy.tech/project/rlc_chart\n\n.. image:: https://img.shields.io/pypi/v/rlc_chart.svg\n    :target: https://pypi.python.org/pypi/rlc_chart\n\n.. image:: https://img.shields.io/pypi/pyversions/rlc_chart.svg\n    :target: https://pypi.python.org/pypi/rlc_chart/\n\n:Author: Ken Kundert\n:Version: 1.0.0\n:Released: 2022-01-25\n\n\n.. _what:\n\nWhat?\n-----\n\n*rlc_chart* is library that renders impedance charts in SVG with the normal\nimpedance versus frequency log-log grids, but they also include capacitance and\ninductance grids.  They can be used to directly read component values from\na plot of impedance.  This is explained in `Introduction to Phasors\n\u003chttps://designers-guide.org/theory/phasors.pdf\u003e`_.\n\nConsider the impedance of a leaky capacitor that has series resistance and \ninductance parasitics along with a shunt resistor as represented by the \nfollowing circuit:\n\n.. image:: figures/leaky-cap-schematic.svg\n    :width: 25%\n    :align: center\n\n.. image:: figures/leaky-cap-chart.svg\n    :width: 100%\n    :align: center\n\nYou can use the various grids on this graph to determine the values of the\nvarious components: C = 1 nF, L = 10 μH, Rs = 2 Ω, Rp = 500 kΩ, and f₀ = 1.6\nMHz.  You can do this in other ways, but they involve manual calculation.  In\naddition, an RLC chart is a convenient way of sharing or publishing your\nfindings.\n\nUsing an RLC chart is often enough to allow you to build a linear model for\ncommon two terminal components.\n\n\n.. _how:\n\nHow?\n----\n\nHere is an example of how to use *rlc_chart*::\n\n    from rlc_chart import RLC_Chart\n    from math import log10 as log, pi as π\n\n    Rs = 2\n    Rp = 500_000\n    C = 1e-9\n    L = 10e-6\n    fmin = 1\n    fmax = 1e8\n    zmin = 1\n    zmax = 1e6\n    mult = 10**((log(fmax) - log(fmin))/400)\n    f = fmin\n    freq = []\n    impedance = []\n    j2π = 2j*π\n\n    # Compute impedance of component\n    # z1 = (Rs + 1/(jωC + jωL)     Rs=2Ω, C=1nF, L=10μH\n    # z2 = Rp                      Rp=500kΩ\n    # z = z1 ‖ z2\n    while(f \u003c= 1.01*fmax):\n        jω = j2π*f\n        z1 = Rs + 1/(jω*C) + jω*L\n        z2 = Rp\n        z = z1 * z2 / (z1 + z2)\n        freq += [f]\n        impedance += [abs(z)]\n        f *= mult\n\n    with RLC_Chart('lcr-chart.svg', fmin, fmax, zmin, zmax) as chart:\n        chart.add_trace(freq, impedance)\n\nMost of the code builds the two arrays that represent the trace.  The impedance\narray is expected to contain positive real values.  In this case it is the\nmagnitude that is being plotted, though it is also common to call *add_trace*\ntwice to show both the real and imaginary parts of the impedance.\n\n\n.. _rlc_chart:\n\nRLC_Chart\n---------\n\nThe *RLC_Chart* class constructor takes the following required arguments:\n\nfilename:\n    Path to the output SVG file.\n\n*fmin*:\n    The minimum frequency value (left-most value on the chart). This value is\n    always rounded down the next lower multiple of 10.  So for example, if you\n    give 25 Hz as *fmin*, then 10 Hz is used.\n\n*fmax*:\n    The maximum frequency value (right-most value on the chart). This value is\n    always rounded up the next higher multiple of 10.  So for example, if you\n    give 75 MHz as *fmax*, then 100 MHz is used.\n\n*zmin*:\n    The minimum impedance value (bottom-most value on the chart). This value is\n     always rounded down the next lower multiple of 10.  So for example, if you\n     give 150 mΩ *zmin*, then 100 mΩ is used.\n\n*zmax*:\n    The maximum impedance value (top-most value on the chart). This value is\n    always rounded up the next higher multiple of 10.  So for example, if you\n    give 800 kΩ as *zmax*, then 1 MΩ is used.\n\nIn addition, the following keyword arguments are optional.\n\n*axes*:\n    Specifies which axes are desired, where the choices are *f* for frequency,\n    *z* for impedance, *c* for capacitance, and *l* for inductance.  *axes* is\n    a string that contains any or all of the four characters, or none at all.\n    If the characters are lower case, then only the major grid lines are drawn,\n    and if given as upper case letters, both the major and minor grid lines are\n    drawn.  The default is \"FZRC\".\n\n    The visual clutter in the chart can be reduced by eliminating unneeded grid\n    lines.\n\n*trace_width*:\n    The width of a trace. The default is 0.025 inches.\n\n*trace_color*:\n    The default color of the trace.  You can use one of the named SVG colors, or\n    you can use 'rgb(R,G,B)' where *R*, *G*, and *B* are integers between 0 and\n    255 that specify the intensity of red, blue, and green components of the\n    color.\n\n*major_line_width*:\n    The width of a major division line. The default is 0.01 inches.\n\n*minor_line_width*:\n    The width of a minor division line. The default is 0.005 inches.\n\n*outline_line_width*:\n    The width of grid outline. The default is 0.015 inches.\n\n*outline_line_color*:\n    The color of the grid outline.  The default is 'black'.\n\n*fz_grid_color*:\n    The color of the frequency and impedance grid lines.  The default is 'grey'.\n\n*cl_grid_color*:\n    The color of the capacitance and inductance grid lines.  The default is\n    'grey'.\n\n*background*:\n    The background color of the grid.  The default is 'white'.\n\n*minor_divs*:\n    The minor divisions to include.  The default is '123456789'.  Other common\n    values are '1', '13', '125', and '12468'.\n\n*decade*:\n    The size of one decade square.  The default is 1 inch. With this value,\n    a grid that is 6 decades wide and 4 decades high is 6\" by 4\".\n\n*left_margin*:\n    The size of the left margin.  The default is 1 inch.\n\n*right_margin*:\n    The size of the right margin.  The default is 1 inch.\n\n*top_margin*:\n    The size of the top margin.  The default is 1 inch.\n\n*bottom_margin*:\n    The size of the bottom margin.  The default is 1 inch.\n\n*font_family*:\n    The text font family.  The default is \"sans-serif\".\n\n*font_size*:\n    The text font size.  The default is 12.\n\n*text_color*:\n    The text color size.  The default is \"black\".\n\n*text_offset*:\n    The separation between the axis labels and the grid. The default is 0.15\n    inches.\n\n*pixels_per_unit*:\n    This is a scaling factor that allows you specify your dimensions in what\n    ever units you wish.  A value of 96, the default, means that you are\n    specifying your units in inches.  A value of 37.8 allows you specify values\n    in centimeters.\n\nIn addition, many SVG parameters can be passed into *RLC_Chart*, in which case\nthey are simply passed on to `svgwrite \u003chttp://readthedocs.org/docs/svgwrite\u003e`_.\n\nGenerally, *RLC_Chart* is the argument of a *with* statement. If you choose not\nto do this, then you must explicitly call the *close* method yourself.  Other\nthan *close*, *RLC_Chart* provides several other methods, described next.\n\nMethods\n\"\"\"\"\"\"\"\nadd_trace()\n'''''''''''\n\nThis method adds a trace to the graph. It may be called multiple times to add\nadditional traces. There are two required arguments:\n\n*frequency*:\n    An array of positive real values representing the frequency values of the \n    points that when connected make up the trace.\n\n*impedance*:\n    An array of positive real values representing the impedance values of the \n    points that when connected make up the trace.\n\nEach of these arrays can be in the form of a *Python* list or a *numpy* array,\nand they must be the same length.\n\nIt is also possible to specify additional keyword arguments, which are passed on\nto *svgwrite* and attached to the trace. This can be used to specify trace color\nand style. For example, specify *stroke* to specify the trace color.\n\nto_x()\n''''''\n\nGiven a frequency, *to_x* returns the corresponding canvas *X* coordinate.  This\ncan be used to add SVG features to your chart like labels.\n\nto_y()\n''''''\n\nGiven an impedance, *to_y* returns the corresponding canvas *Y* coordinate.  \nThis can be used to add SVG features to your chart like labels.\n\nadd_line()\n''''''''''\n\nGiven a start and end value and a component value (*r*, *l*, *c*, or *f*),\n*add_line* draws a line on the chart.  If you specify *r*, the start and end\nvalues are frequencies and the line is horizontal with the impedance being *r*.\nIf you specify *f*, the start and end values are impedances and the line is\nvertical and the frequency is *f*.  If you specify either *c* or *l* the start\nand end values are frequencies and the lines are diagonal and the impedance\nvalues are either 2π *f* *l* or 1/(2π *f* *c*).\n\nIt is also possible to specify additional keyword arguments, which are passed on\nto *svgwrite* and attached to the line. This can be used to specify line color\nand style. For example, specify *stroke* to specify the line color.\n\nAttributes\n\"\"\"\"\"\"\"\"\"\"\n\nHEIGHT\n''''''\n\nThe height of the canvas, which includes the height of the grid plus the top and \nbottom margins.  Realize that in SVG drawings, the 0 *Y* value is at the top of \nthe drawing. Thus *HEIGHT* when used as a *Y* coordinate represents the bottom \nof the canvas.\n\nWIDTH\n'''''\n\nThe width of the canvas, which includes the width of the grid plus the left and \nright margins.  The 0 *X* value is at the left of the drawing and *WIDTH* when \nused as an *X* coordinate represents the right of the canvas.\n\n\n.. _labeling:\n\nLabeling\n--------\n\nThe chart object returned by *RLC_Chart* is a *svgwrite* *Drawing* object, and\nso you can call its methods to add SVG features to your chart.  This can be used\nto add labels to your charts.  Here is an example that demonstrates how to add\nlabels and lines. It also demonstrates how to read impedance data from a CSV \nfile::\n\n    from rlc_chart import RLC_Chart\n    from inform import fatal, os_error\n    from pathlib import Path\n    from math import pi as π\n    import csv\n\n    fmin = 100\n    fmax = 10e9\n    zmin = 0.01\n    zmax = 1e6\n    cmod = 1e-9\n    lmod = 700e-12\n    rmod = 20e-3\n    j2π = 2j*π\n\n    def model(f):\n        jω = j2π*f\n        return 1/(jω*cmod) + rmod + jω*lmod\n\n    frequency = []\n    z_data = []\n    r_data = []\n    z_model = []\n    r_model = []\n    try:\n        contents = Path('C0603C102K3GACTU_imp_esr.csv').read_text()\n        data = csv.DictReader(contents.splitlines(), delimiter=',')\n        for row in data:\n            f = float(row['Frequency'])\n            z = model(f)\n            frequency.append(f)\n            z_data.append(float(row['Impedance']))\n            r_data.append(float(row['ESR']))\n            z_model.append(abs(z))\n            r_model.append(z.real)\n\n        with RLC_Chart('C0603C102K3GACTU.svg', fmin, fmax, zmin, zmax) as chart:\n\n            # add annotations\n            svg_text_args = dict(font_size=22, fill='black')\n\n            # capacitance annotations\n            chart.add(chart.text(\n                \"C = 1 nF\",\n                insert = (chart.to_x(150e3), chart.to_y(1.5e3)),\n                **svg_text_args\n            ))\n            chart.add_line(1e3, 190.23e6, c=1e-9)\n\n            # inductance annotations\n            chart.add(chart.text(\n                \"L = 700 pH\",\n                insert = (chart.to_x(6e9), chart.to_y(30)),\n                text_anchor = 'end',\n                **svg_text_args\n            ))\n            chart.add_line(190.232e6, 10e9, l=700e-12)\n\n            # resistance annotations\n            chart.add(chart.text(\n                \"ESR = 20 mΩ\",\n                insert = (chart.to_x(100e3), chart.to_y(25e-3)),\n                text_anchor = 'start',\n                **svg_text_args\n            ))\n            chart.add_line(100e3, 1e9, r=20e-3)\n\n            # resonant frequency annotations\n            chart.add(chart.text(\n                \"f₀ = 190 MHz\",\n                insert = (chart.to_x(190.23e6), chart.to_y(400)),\n                text_anchor = 'middle',\n                **svg_text_args\n            ))\n            chart.add_line(1e-2, 300, f=190.23e6)\n\n            # Q annotations\n            chart.add(chart.text(\n                \"Q = 42\",\n                insert = (chart.to_x(10e6), chart.to_y(100e-3)),\n                text_anchor = 'start',\n                **svg_text_args\n            ))\n            chart.add_line(10e6, 190.23e6, r=836.66e-3)\n\n            # title\n            chart.add(chart.text(\n                \"C0603C102K3GACTU 1nF Ceramic Capacitor\",\n                insert = (chart.WIDTH/2, 36),\n                font_size = 24,\n                fill = 'black',\n                text_anchor = 'middle',\n            ))\n\n            # add traces last, so they are on top\n            chart.add_trace(frequency, z_data, stroke='red')\n            chart.add_trace(frequency, r_data, stroke='blue')\n            chart.add_trace(frequency, z_model, stroke='red', stroke_dasharray=(10,5))\n            chart.add_trace(frequency, r_model, stroke='blue', stroke_dasharray=(10,5))\n\n    except OSError as e:\n        fatal(os_error(e))\n\nThis example demonstrates two different ways to specify the location of the\nlabel.  The *chart* object provides the *to_x* and *to_y* methods that convert\ndata values into coordinates within the grid.  This is used to add labels on the\ntraces.  The *chart* object also provides the *HEIGHT* and *WIDTH* attributes.\nThese can be used to compute coordinates within the entire canvas. This is used\nto add a title that is near the top.\n\nThe example also illustrates the use of *add_line* to add dimension lines to the\nchart.\n\n.. image:: figures/C0603C102K3GACTU.svg\n    :width: 100%\n    :align: center\n\nIn this figure the solid traces are the data and the dashed traces are the\nmodel.  The red traces are the magnitude of the impedance, and the blue traces\nare the real part of the impedance, or the ESR.\n\nNotice that in this chart the resistance at low frequencies drops with 1/*f*,\njust like the reactance.  In this regard the data differs significantly from the\nmodel.  This effect is referred to as dielectric absorption and it is both\ncommon and remarkable.  You can read more about it, and how to model it, in\n`Modeling Dielectric Absorption in Capacitors\n\u003chttps://designers-guide.org/modeling/da.pdf\u003e`_.\n\n\n.. _examples:\n\nExamples\n--------\n\nNumPy Arrays\n\"\"\"\"\"\"\"\"\"\"\"\"\n\nThe first example, given above in how_, demonstrates how to generate an RLC \nchart by evaluating formulas in Python.  Here the example is repeated \nreformulated to use NumPy arrays::\n\n    from rlc_chart import RLC_Chart\n    from inform import fatal, os_error\n    from numpy import logspace, log10 as log, pi as π\n\n    Rs = 2\n    Rp = 500e3\n    C = 1e-9\n    L = 10e-6\n    fmin = 1\n    fmax = 100e6\n    zmin = 1\n    zmax = 1e6\n    filename = \"leaky-cap-chart.svg\"\n    j2π = 2j*π\n\n    f = logspace(log(fmin), log(fmax), 2000, endpoint=True)\n    jω = j2π*f\n    z1 = Rs + 1/(jω*C) + jω*L\n    z2 = Rp\n    z = z1 * z2 / (z1 + z2)\n\n    try:\n        with RLC_Chart(filename, fmin, fmax, zmin, zmax) as chart:\n            chart.add_trace(f, abs(z.real), stroke='blue')\n            chart.add_trace(f, abs(z.imag), stroke='red')\n            chart.add_trace(f, abs(z))\n    except OSError as e:\n        fatal(os_error(e))\n\n\nCSV Data\n\"\"\"\"\"\"\"\"\n\nThe example given in labeling_ demonstrates how to read impedance data from \na CSV (comma separated values) file and use it to create an RLC chart.\nIt is rather long, and so is not repeated here.\n\n\nPlotting Spectre Data\n\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\n\nIf you use the *Spectre* circuit simulator, you can use *psf_utils* with\n*rlc_chart* to extract models from simulation results. For example, here is the\nmodel of an inductor given by its manufacturer::\n\n    subckt MCFE1412TR47_JB (1 2)\n        R1 (1 7) resistor  r=0.036\n        L5 (2 8) inductor  l=20u\n        C2 (7 8) capacitor c=10.6p\n        R2 (8 2) resistor  r=528\n        C1 (7 9) capacitor c=28.5p\n        R5 (9 2) resistor  r=3.7\n        L0 (7 3) inductor  l=0.27u\n        L1 (3 4) inductor  l=0.07u\n        L2 (4 2) inductor  l=0.11u\n        L3 (3 5) inductor  l=0.39u\n        L4 (4 6) inductor  l=0.35u\n        R3 (5 4) resistor  r=3.02158381422266\n        R4 (6 2) resistor  r=43.4532529473926\n    ends MCFE1412TR47_JB\n\nThis model is overly complicated and so expensive to simulate.  It requires 13\nextra unknowns that the simulator must compute (7 internal nodes and 6 inductor\ncurrents).  The impedance of this subcircuit is extracted by grounding one end\nand driving the other with a 1 A magnitude AC source.  Spectre is then run on \nthe circuit to generate a ASCII PSF file. Then, the RLC chart for this \nsubcircuit can be generated with::\n\n    from psf_utils import PSF\n    from inform import Error, os_error, fatal\n    from rlc_chart import RLC_Chart\n\n    try:\n        psf = PSF('MCFE1412TR47_JB.ac')\n        sweep = psf.get_sweep()\n        z_ckt = psf.get_signal('1')\n        z_mod = psf.get_signal('2')\n\n        with RLC_Chart('MCFE1412TR47_JB.svg', 100, 1e9, 0.01, 1000) as chart:\n            chart.add_trace(sweep.abscissa, abs(z_ckt.ordinate), stroke='red')\n            chart.add_trace(sweep.abscissa, abs(z_mod.ordinate), stroke='blue')\n\n        with RLC_Chart('MCFE1412TR47_JB.rxz.svg', 100, 1e9, 0.01, 1000) as chart:\n            chart.add_trace(sweep.abscissa, abs(z_ckt.ordinate.real), stroke='green')\n            chart.add_trace(sweep.abscissa, abs(z_ckt.ordinate.imag), stroke='orange')\n            chart.add_trace(sweep.abscissa, abs(z_mod.ordinate.real), stroke='blue')\n            chart.add_trace(sweep.abscissa, abs(z_mod.ordinate.imag), stroke='red')\n\n    except Error as e:\n        e.terminate()\n    except OSError as e:\n        fatal(os_error(e))\n\nThe RLC chart shows that the above subcircuit can be replaced with::\n\n    subckt MCFE1412TR47_JB (1 2)\n        L   (1 2) inductor l=442.24nH r=36mOhm\n        C   (1 2) capacitor c=27.522pF\n        R   (1 2) resistor r=537.46_Ohm\n    ends MCFE1412TR47_JB\n\nThis version only requires one additional unknown, the inductor current, and so\nis considerably more efficient.\n\nHere is the RLC chart of both showing the difference, which are inconsequential.\n\n.. image:: figures/MCFE1412TR47_JB.svg\n    :width: 100%\n    :align: center\n\nThe differences are a bit more apparent if the real and imaginary components of\nthe impedance are plotted separately.\n\n.. image:: figures/MCFE1412TR47_JB.rxz.svg\n    :width: 100%\n    :align: center\n\nThe differences are significant only in the loss exhibited above resonance,\nwhich is usually not of concern.\n\n\nPlotting S-Parameter Data\n\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\n\nYou may find that the data on a two-terminal component is given as a two-port \nS-parameter data file.  The following example shows how to read a TouchStone \ntwo-port S-parameter data file, convert the S-parameters into Z-parameters, and \nthen plot Z12 on an RLC chart::\n\n    #!/usr/bin/env python3\n    # Convert S-parameters of inductor, measured as a two port, to impedance\n\n    from inform import fatal, os_error\n    from rlc_chart import RLC_Chart\n    from cmath import rect, pi as π\n    from pathlib import Path\n\n    y11 = []\n    y12 = []\n    y21 = []\n    y22 = []\n    Zind = []\n    freq = []\n    z0 = 50\n\n    try:\n        data = Path('tfm201610alm_r47mtaa.s2p').read_text()\n        lines = data.splitlines()\n        for line in lines:\n            line = line.strip()\n            if line[0] in '!#':\n                continue\n            f, s11m, s11p, s12m, s12p, s21m, s21p, s22m, s22p = line.split()\n            s11 = rect(float(s11m), π*float(s11p)/180)\n            s12 = rect(float(s12m), π*float(s12p)/180)\n            s21 = rect(float(s21m), π*float(s21p)/180)\n            s22 = rect(float(s22m), π*float(s22p)/180)\n            Δ = (1 + s11)*(1 + s22) - s12*s21\n            y11 = ((1 - s11)*(1 + s22) + s12*s21) / Δ / z0\n            y12 = -2*s12 / Δ / z0\n            y21 = -2*s21 / Δ / z0\n            y22 = ((1 + s11)*(1 - s22) + s12*s21) / Δ / z0\n            f = float(f)\n            if f:\n                freq.append(f)\n                Zind.append(abs(1/y12))\n\n        with RLC_Chart('tfm201610alm.svg', 100e3, 1e9, 0.1, 1000) as chart:\n            chart.add_trace(freq, Zind)\n\n    except OSError as e:\n        fatal(os_error(e))\n\nHere is the resulting RLC chart for a 470 nH inductor where the S-parameters \nwere downloaded from the TDK website.\n\n.. image:: figures/tfm201610alm.svg\n    :width: 100%\n    :align: center\n\n\n.. _installing:\n\nInstalling\n----------\n\nTo install use::\n\n    pip install --user rlc_chart\n\n\n.. _releases:\n\nReleases\n--------\n\nLatest development release\n\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\n\n| Version: 1.0.0\n| Released: 2022-01-25\n\n1.0 (2022-01-25)\n\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\n\n- Promote to full release.\n- Cosmetic changes to README.\n- Added test script (figures/run_tests).\n\n\n0.1 (2021-03-25)\n\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\n\n- Initial release.\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkenkundert%2Frlc_chart","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkenkundert%2Frlc_chart","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkenkundert%2Frlc_chart/lists"}