A MATLAB toolkit for computing the plane-wave shielding effectiveness (SE) of metallic shields, validated against published textbook benchmarks and extended to arbitrary multilayer stacks (e.g. copper + air gap + steel) via a transfer-matrix solver.
This started as a coursework simulator and was rebuilt to fix a physics error, match the EMC literature, and add capabilities that the original lacked.
The original simulator reported shielding effectiveness of ~5000 dB. That is not a tuning problem, it points to a modeling error. The fix is the core of this project.
Diagnosis. The original formula SE = 8.686 * t / delta is mathematically
correct, but it is only the absorption-loss term A, not the total SE. It
(1) omitted the reflection loss R, which is usually the dominant term for
good conductors, and (2) used a 1 mm slab hundreds of skin depths thick, so
the absorption arithmetic ran into the thousands of dB. Values above ~120 dB are
physically meaningless anyway: that is the ceiling of real EMC test equipment,
above which a material is simply "impenetrable."
Fix. This repo implements the full Schelkunoff decomposition
SE = R + A + B and validates it against a published worked example
(copper 2-mil foil at 100 MHz → R = 88 dB, A = 66 dB, SE = 154 dB;
Hubing / Ott), reproduced here to within 0.3 dB.
| Original | This repo | |
|---|---|---|
| Model | Absorption only (A) |
Full Schelkunoff R + A + B |
| Typical output | ~5000 dB (unphysical) | Matches literature (e.g. 154 dB) |
| Reflection loss | Missing | Included (often dominant) |
| Multilayer shields | Not supported | Transfer-matrix solver |
| Materials | 3 (Cu, Al, steel) | 6, with sourced σ and μr |
| Validation | None | vs published benchmark + cross-method |
shielding_effectiveness.m: single-slab SE via SchelkunoffR + A + B, vectorized over frequency.multilayer_se.m: transfer-matrix (ABCD) solver for arbitrary stacks of metals and air gaps. Captures every interface reflection and inter-layer bounce, so it correctly handles cases where simple dB-addition fails.materials.m— six materials with literature-sourced conductivity and permeability (silver, copper, aluminum, nickel, steel, mu-metal).validation.m— reproduces the published benchmark and the analytical-vs-numerical agreement table.- Plot scripts for SE-vs-frequency, the multilayer stack, field decay, and an animated wave-through-material demo.
Reproducing the LearnEMC / Ott worked example (Cu 2-mil @ 100 MHz):
| Quantity | Literature | This repo |
|---|---|---|
| Reflection loss R | 88 dB | 88.1 dB |
| Absorption loss A | 66 dB | 66.2 dB |
| Total SE | 154 dB | 154.3 dB |
The analytical model and the independent transfer-matrix solver agree to
< 0.02 dB across 1 kHz–1 GHz for every material (full table in
docs/validation.md).
Stack: Copper (35 µm) + 5 mm air gap + Steel (35 µm).
| f | Cu only | Steel only | Naive sum | TMM stack |
|---|---|---|---|---|
| 100 kHz | 111.7 | 96.8 | 208.4 | 120.6 |
| 1 MHz | 111.7 | 108.8 | 220.5 | 149.3 |
| 10 MHz | 113.0 | 170.4 | 283.3 | 230.5 |
At low frequency the naive dB-sum overstates the true stack SE by ~88 dB. The foils are electrically thin there, so interface mismatches and re-reflections — not bulk absorption — dominate. Practical takeaway: you cannot design a multilayer shield by adding decibels.
| Material | σ (S/m) | μr | Notes |
|---|---|---|---|
| Silver | 6.3×10⁷ | 1 | best bulk conductor |
| Copper | 5.8×10⁷ | 1 | reference conductor |
| Aluminum | 3.5×10⁷ | 1 | lightweight, ~61% IACS |
| Nickel | 1.43×10⁷ | 100 | magnetic, μr grade-dependent |
| Steel (low-carbon) | 1.0×10⁷ | 300 | magnetic, μr 100–1000 |
| Mu-metal (Ni-Fe) | 1.6×10⁶ | 20000 | low-frequency magnetic shielding |
Sources in docs/validation.md. Note that the μr of the
magnetic materials falls with frequency, so their high-frequency SE is an upper
bound (see docs/theory.md).
em-shielding-simulator/
├── README.md
├── LICENSE
├── matlab/
│ ├── shielding_effectiveness.m % Schelkunoff R+A+B (single slab)
│ ├── multilayer_se.m % transfer-matrix solver (stacks)
│ ├── materials.m % sourced material database
│ ├── validation.m % reproduces the validation tables
│ ├── run_se_vs_frequency.m % corrected SE-vs-frequency figure
│ ├── run_multilayer_demo.m % Cu + air + steel vs naive sum
│ ├── run_field_decay.m % skin-effect field decay
│ └── wave_attenuation_demo.m % animated wave-through-material
└── docs/
├── theory.md % derivations + the formula-error writeup
└── validation.md % methodology, full tables, sources
Requires MATLAB (no toolboxes needed). From the matlab/ folder:
% Reproduce the validation tables
validation
% Single material
[SE, R, A, B] = shielding_effectiveness(1e9, 5.8e7, 35e-6, 1); % copper @ 1 GHz
% Multilayer: copper + 5 mm air + steel
L = [5.8e7 1 1 35e-6;
0 1 1 5e-3 ;
1.0e7 300 1 35e-6];
SE = multilayer_se(1e6, L);
% Figures
run_se_vs_frequency
run_multilayer_demo
run_field_decayFor a good conductor the far-field plane-wave SE is R + A + B, where
reflection loss R = 20·log10(η₀/4η_s) comes from the impedance mismatch
between free space (η₀ ≈ 377 Ω) and the metal (η_s = √(jωμ/σ)); absorption loss
A = 8.686·t/δ comes from attenuation over the thickness in skin depths
δ = 1/√(πfμσ); and B is a multiple-reflection correction that matters only
for electrically thin shields. For stacks, each layer becomes a transmission-line
section and the layers are cascaded as ABCD matrices, giving SE = −20·log10|S₂₁|.
Full derivation in docs/theory.md.
- T. Hubing, "Introduction to Plane-Wave Shielding Theory," LearnEMC.
- H. W. Ott, Electromagnetic Compatibility Engineering, Wiley, 2009.
- C. R. Paul, Introduction to Electromagnetic Compatibility, 2nd ed., Wiley, 2006.
- S. A. Schelkunoff, Electromagnetic Waves, Van Nostrand, 1943.
- F. T. Ulaby, Fundamentals of Applied Electromagnetics.
MIT — see LICENSE.