Skip to content
RFrftools.io
Signal IntegrityMarch 1, 20268 min read

S-Parameter De-embedding: Remove VNA Fixture Effects

A practical walkthrough of the S-parameter analysis pipeline: viewing raw VNA data, identifying connector response, applying time gating to isolate a PCB trace.

Contents

The Problem: Your VNA Measures the Fixture Too

You just finished measuring a 10 cm microstrip trace on Rogers 4003C, swept it from DC to 10 GHz, and now you're staring at a weird notch in S21 around 7 GHz. Your first instinct might be to blame the fab house. But hold on — where exactly did you calibrate? At the SMA connector reference plane, or right at the edge of the trace itself?

Nine times out of ten, you calibrated at the connectors. Which means those two SMA launches — complete with their via transitions, barrel discontinuities, and whatever impedance mismatch exists at the pad — are still in your measurement. Everything you're seeing in that .s2p file includes the fixture response stacked on top of the actual trace you care about. De-embedding is how you peel that fixture layer off and get down to just the DUT.

The S-Parameter Analysis Pipeline tool chains together four operations you can run on any .s2p file: View, Passivity Check, Time Gate, and De-embed. Let's walk through them in sequence, because skipping ahead usually means backtracking later.

Step 1: View — Know What You Are Looking At

Start by loading your 2-port file from the VNA. Set the pipeline to View mode with these parameters:

ParameterValue
Reference Impedance50 Ω
Freq Start0 (use file range)
Freq Stop0 (use file range)
OperationsView
This gives you a straightforward plot of S11 (return loss) and S21 (insertion loss) across the entire frequency range your VNA captured. For a decent microstrip trace, you'd expect S11 sitting below −15 dB through most of the band, maybe creeping up near connector resonances. S21 should roll off smoothly as frequency climbs — following the usual conductor loss and dielectric loss curves.

So what tells you the connectors are dominating the measurement? A few red flags:

  • Sharp S11 peak below 2 GHz. Classic sign of an SMA launch pad that's too wide to maintain 50 Ω.
  • Ripple in S21 with a period matching twice the electrical length of the connector body. That's usually a 50–100 ps round trip.
  • Any notch that lines up perfectly with a quarter-wave resonance of the connector pin. Do the math on pin length and you'll often find it sitting right where that dip appears.
If your S21 looks suspiciously flat up to 6 GHz and then drops like a rock, you might be hitting the connector's own bandwidth limit rather than seeing real DUT behavior. That's worth knowing before you start blaming the trace.

Step 2: Passivity Check — Catch Calibration Errors Early

Before you sink time into gating and de-embedding, run a quick Passivity Check. Any passive, lossless 2-port has to satisfy this at every frequency point:

S112+S2121|S_{11}|^2 + |S_{21}|^2 \leq 1

If that sum goes above 1.0 anywhere — even by a tiny amount like 0.01 — your file is non-passive. Something went wrong. The usual suspects:

  • VNA calibration drifted. If the board temperature shifted more than 5 °C since you ran the cal, redo it.
  • Port impedance mismatch. Maybe you saved the file as 50 Ω but the VNA was actually set to 75 Ω during the sweep.
  • Connector moved between sweeps. If you're using a 1-port VNA and physically swapping cables, any movement between port-1 and port-2 measurements can introduce this.
The Passivity Check will tell you exactly where the worst violation happens and how bad it is. A 0.5 dB violation at 9 GHz means everything above 8 GHz is suspect. Go fix the calibration. Time gating can't repair a passivity violation — it'll just smear the error around in ways that are harder to spot later.

Step 3: Time Gate — Isolate the DUT

Time gating takes your S-parameter data, converts it to the time domain using an inverse FFT, applies a windowed gate around just the DUT response, then converts back to frequency with a forward FFT. What you get is an S-parameter set where the connector responses have been mostly suppressed.

Let's say you're measuring that 10 cm trace with SMA connectors on both ends. Typical gating parameters would be:

  • Gate center: set it to the midpoint of the trace's electrical delay. For 10 cm on FR4, that's around 500 ps.
  • Gate span: the trace's electrical length plus roughly 100 ps of margin on each side to avoid cutting into the response.
  • Window function: Kaiser-Bessel is a solid choice. It reduces time-domain sidelobes at the expense of some frequency resolution, but that's usually a good trade.
After you apply the gate, plot S11 and S21 again. You should see some clear changes:
  • S11 ripple drops significantly. Those reflections from the connectors are now gated out.
  • S21 actually rises a bit at high frequency compared to the ungated version. That's because the connectors were adding insertion loss that's now removed.
  • That 7 GHz notch you were worried about? It's either gone or much shallower. Turns out it was a connector resonance, not a trace problem.
One catch: time gating needs adequate frequency span to get the time-domain resolution you need. The resolution is roughly Δt=1/BW\Delta t = 1/\text{BW}, so a 10 GHz sweep gives you about 100 ps resolution. If you're trying to separate a connector with 50 ps delay from a trace with 500 ps delay using only a 3 GHz sweep (333 ps resolution), you're out of luck. The responses overlap in time and you can't cleanly separate them.

This is why I always sweep wider than I think I need to. Storage is cheap, and having extra bandwidth in the file gives you options later.

Step 4: De-embed — Apply the Fixture Model

Time gating is useful and fast, but it's fundamentally a broadband approximation. For the highest accuracy, you want a dedicated fixture de-embedding file — a separately measured .s2p of just the SMA connector on a short thru substrate. The pipeline inverts that fixture's S-matrix and cascades it with your DUT measurement:

[SDUT]=[Sfixture,port1]1[Smeasured][Sfixture,port2]1[S_{DUT}] = [S_{fixture,port1}]^{-1} \cdot [S_{measured}] \cdot [S_{fixture,port2}]^{-1}

To create the fixture file, measure a matched thru board. Same substrate, same launch geometry, but with zero trace length between the connectors. Save that as a separate .s2p file. Then load it into the De-embed operation:

De-embed InputValue
Port 1 fixture filesma_launch_port1.s2p
Port 2 fixture filesma_launch_port2.s2p
Reference impedance50 Ω
Once you've de-embedded, the output S21 should represent only the trace insertion loss. For that 10 cm Rogers 4003C trace, you'd expect something like −0.5 dB at 5 GHz and −1.2 dB at 10 GHz. If you're seeing numbers significantly worse than that, now you know it's a real issue — board defect, contamination during assembly, or maybe a layout discontinuity you didn't catch in review.

Most engineers skip making proper fixture files because it feels like extra work. Then they spend three times as long later trying to figure out whether a measurement artifact is real or not. The fixture file takes maybe twenty minutes to measure and will save you hours of confusion down the road.

Reading the Final Output

With your de-embedded S-parameters finally in hand, there are three numbers that actually matter for most designs:

Insertion loss at your signal bandwidth edge. If you're running 10 Gbps NRZ, check S21 at 5 GHz — that's your Nyquist frequency. Keep it above −3 dB if you want a clean eye diagram. Below that and you'll start fighting ISI in the time domain. Return loss across the band. Below −15 dB (VSWR < 1.4:1) is acceptable for typical PCB traces. Below −20 dB is good. If you're seeing worse than −15 dB in the middle of your signal band, you've got an impedance discontinuity somewhere that's going to cause reflections. Group delay flatness. A group delay that varies steeply with frequency will cause intersymbol interference. The De-embed output includes a group delay plot — look for variations staying below ±20 ps across your signal band. More than that and your eye diagram will start to close, especially if you're running a multi-level signaling scheme like PAM4.

Use the S-Parameter Pipeline Tool to run all four operations on your own .s2p files without leaving the browser. It handles the FFTs, matrix inversions, and plotting so you can focus on interpreting the results instead of wrestling with MATLAB scripts.

Related Articles