rftools

ephemeral RF/MRI coil calculators · rfcoil v0.0.1
Shared frequency — f = γ(nucleus) × B(field), or type MHz directly
T → f = MHz
Data entry

Rigorous, ephemeral RF-coil calculators for the bench

Three calculators, each calling the real rfcoil library (no reimplemented physics):

  • Loop L/R — self-inductance, skin-effect resistance, unloaded Q, distributed-cap sizing and critical array overlap from rfcoil.geometry, with the closed-form ~1% validation shown alongside the numeric result.
  • Resonance & Tuning — tuning C for your target frequency (default 127.74 MHz / 3T), verified via a real rfcoil.network.Network sweep, plus DESIGN.md's analytic tolerance-quadrature model and a Monte Carlo yield against your loaded bandwidth.
  • Z↔S — impedance/S conversion at arbitrary complex per-port reference impedance via rfcoil.renorm, with power reflection and preamp noise-mismatch penalty reported side by side, never a single S11.
Zero storage. This app has no database and writes no files. Every number you enter is used to compute a response and then discarded — nothing you submit is logged, cached, or persisted anywhere. Access logging is disabled at the server.

Loop inductance & resistance

Shared across every tab (see the frequency bar above) — editing it here updates it everywhere.
Coil target / match impedance Ztarget
This coil's own target impedance (default 50Ω, always editable — never assumed). Single source of truth: sizes C_match/L_match on the Coil Network tab and the match report on Resonance & Tuning — entered once, here, as a coil design parameter.
+ j
Ω ∠ °
Advanced
Derived (read-only): resulting minimum cap junction count N.
N = --
Copper/skin loss is computed; capacitor ESR is not -- rfcoil has no dielectric-loss model, so this is a user-entered per-cap figure at the shared frequency (default 0.3Ω, a documented planning estimate for a high-Q RF chip/porcelain cap plus its solder joints -- see calc_loop.py's CAP_ESR_OHM_DEFAULT docstring). Summed over every physical series cap in the ring: each junction's own split N (Coil Network tab's per-junction voltage-split control -- the single source of truth, no global split figure here), plus one more for the match cap.
ATC (Kyocera-AVX) 100B Series porcelain Superchip multilayer capacitors, Document TDS-RFM-0006 Rev 2 -- ESR digitized from the vendor's own "ESR vs. Capacitance" chart (150/500/1000 MHz curves, 1.0–51 pF and 56–1000 pF panels). REFUSE-EXTRAPOLATE outside that digitized range (including the 51–56 pF gap between the two chart panels, and frequencies outside 150–1000 MHz -- rftools' own 127.74 MHz 3T default is below it and will be refused).
Passive Plus (PPI) 0603N EIA Low-ESR High-Q multilayer capacitors, Document PPI0603NDATA010324RevA -- ESR digitized from the vendor's own "ESR vs. Frequency" chart for the catalog values 3/5.6/10/15/27/100 pF. Your value is snapped to the nearest catalog value (flagged if not exact). REFUSE-EXTRAPOLATE outside that value's own plotted frequency window (rftools' own 127.74 MHz 3T default is below every 0603N catalog value's plotted start and will be refused -- use 1111C/P instead at 127.74 MHz).
Passive Plus (PPI) 1111C/P Traditional High-Q (≥10,000) Low ESR multilayer capacitors, Document PPI1111CPDATA060123RevA -- ESR digitized from the vendor's own two "ESR vs. Frequency" charts for the catalog values 3.3/6.8/10/33/68/100/150/180/330/470/680/1000 pF. Your value is snapped to the nearest catalog value (flagged if not exact). Unlike 0603N, this DOES cover rftools' own 127.74 MHz 3T default for 11 of the 12 catalog values -- each curve's own plotted data starts between ~130-280 MHz (not the chart's 100 MHz axis start), so a request within 2x of that start is served by a flagged, bounded log-log extrapolation from the curve's own two nearest real points (see "extrapolated" in the result); REFUSE-EXTRAPOLATE beyond that 2x window (including 3.3 pF at 127.74 MHz -- its data starts at 279.8 MHz, a 2.19x gap) or outside the chart's own 100-2000 MHz axis.
Two related Q inputs. Unloaded Q sets the coil's INTRINSIC (unloaded) reference R directly from a user-supplied UNLOADED Q via R = ωL / Q (L = loop inductance at f0) -- a peer alternative to ESR/ATC/Passive Plus/Rs for the coil's intrinsic R (same closed form, just user-supplied instead of computed from conductor+cap-ESR). A real assembled coil's unloaded Q is dominated by solder-joint/board/connector/proximity losses this tool cannot model, so the conductor+cap-ESR model can honestly compute several hundred for a good chip-cap build while a real bench coil measures lower -- typically ~140-150, HIGHER for a genuinely high-Q build (not clamped/capped to that range; only rejected if ≤0). Loaded Q (guidance ~40-60, sample/patient in place) gives R_loaded = ωL / Q_loaded -- the coil's real loaded operating resistance and the DEFAULT source that sizes the match (C_match/L_match). Which source actually feeds the match is your choice below (Match resistance source); loaded is the default. rfcoil has no sample/tissue-loss model, so Loaded Q is a user-supplied planning figure, not clamped to any range.
Sets the coil's INTRINSIC (unloaded) reference R directly, in ohms -- a peer alternative to ESR/ATC/Passive Plus/Q (skip the model entirely and enter a bench-measured or known series resistance). Rejected if ≤0. This Rs value is also selectable as the match resistance source below.
Which source's R sizes the match (C_match/L_match): pick it with the "use for match" radio inside each source's tab above (one group, exactly one selected across all tabs; default Loaded Q). Compute the Loop tab to populate each source's R. Sources that can't be computed for the current inputs (e.g. a vendor cap value/frequency outside its digitized datasheet range, or a Q/Rs value not yet entered) are shown disabled with the reason.
Enter loop geometry and compute.

Resonance & tuning

Shared across every tab (see the frequency bar above) — editing it here updates it everywhere.
Q loaded = 50 (default -- run the Loop calc's independent Loaded Q input to carry its value here instead; single source of truth, not re-entered here).
Monte Carlo
Match report (vs shared target impedance)
At verified resonance the loop's reactance is ~0, so its terminal Z is just the loop resistance above. Reported against the shared target/match impedance (Loop L/R tab, Ztarget) — never a hardcoded 50 Ω.
Enter loop L/R and compute.

Z↔S converter

Coil-side impedance matrix Z & reference z0
Preamp noise parameters (optional)
Preamp actual Zin (optional, informational only)
Enter an impedance and compute.
System model — live from the shared workspace above

Coil network

Interactive schematic of the loop element: exactly N junctions (from the Loop calc), each with its own split tuning/decouple cap(s) and optional PIN-diode blocking network. Exactly one junction, chosen below, is also the match -- it carries one additional match cap (target Z from the Loop L/R tab) in series with its own caps.

Compute the Loop tab (for the cap junction count N) and the Resonance & Tuning tab (for the tuning C) first, then return here.