Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Ok-landscape
GitHub Repository: Ok-landscape/computational-pipeline
Path: blob/main/latex-templates/templates/electromagnetics/emc.tex
51 views
unlisted
1
\documentclass[11pt,a4paper]{article}
2
\usepackage[utf8]{inputenc}
3
\usepackage[T1]{fontenc}
4
\usepackage{amsmath,amssymb}
5
\usepackage{graphicx}
6
\usepackage{booktabs}
7
\usepackage{siunitx}
8
\usepackage{geometry}
9
\geometry{margin=1in}
10
\usepackage{pythontex}
11
\usepackage{hyperref}
12
\usepackage{float}
13
14
\title{Electromagnetic Compatibility Engineering\\Shielding, Filtering, and Compliance Analysis}
15
\author{EMC Research Group}
16
\date{\today}
17
18
\begin{document}
19
\maketitle
20
21
\begin{abstract}
22
Electromagnetic compatibility (EMC) ensures that electronic systems operate without causing or suffering from electromagnetic interference (EMI). This report presents comprehensive computational analysis of EMC engineering principles including shielding effectiveness, filter design, grounding strategies, and regulatory compliance. We analyze conducted and radiated emissions, calculate shielding performance across frequency ranges, design common-mode and differential-mode filters, and evaluate compliance with FCC Part 15 and CISPR 22 standards. The analysis demonstrates that proper shielding can achieve 60-100 dB attenuation above 1 MHz, LC filters provide 40+ dB insertion loss at switching frequencies, and multi-point grounding reduces ground loop coupling by 20-30 dB compared to single-point configurations.
23
\end{abstract}
24
25
\section{Introduction}
26
27
Electromagnetic compatibility (EMC) is the ability of electronic equipment to function satisfactorily in its electromagnetic environment without introducing intolerable electromagnetic disturbances to other systems. EMC encompasses two complementary aspects: electromagnetic interference (EMI) emission control and electromagnetic susceptibility (EMS) immunity. Modern electronic systems face increasingly challenging EMC requirements due to higher clock speeds, lower supply voltages, increased circuit density, and stricter regulatory limits.
28
29
The primary EMI coupling mechanisms include conducted emissions through power and signal cables, radiated emissions from circuit traces and enclosures, capacitive coupling through electric fields, and inductive coupling through magnetic fields. Effective EMC design requires systematic application of shielding, filtering, grounding, and layout techniques to control these coupling paths. This analysis quantifies the performance of key EMC mitigation strategies using electromagnetic field theory and circuit analysis.
30
31
\begin{pycode}
32
33
import numpy as np
34
import matplotlib.pyplot as plt
35
from scipy import stats, optimize, integrate
36
plt.rcParams['text.usetex'] = True
37
plt.rcParams['font.family'] = 'serif'
38
39
\end{pycode}
40
41
\section{Shielding Effectiveness Analysis}
42
43
Shielding effectiveness (SE) quantifies the attenuation provided by a conductive enclosure and is defined as the ratio of electromagnetic field strength without the shield to field strength with the shield, expressed in decibels. The total shielding effectiveness consists of three components: reflection loss $R$, absorption loss $A$, and multiple reflection correction $B$.
44
45
The absorption loss in a conducting shield depends on the skin depth $\delta = \sqrt{\frac{2}{\omega \mu \sigma}}$, where $\omega$ is angular frequency, $\mu$ is permeability, and $\sigma$ is conductivity. For a shield thickness $t$, absorption loss is $A = 20 \log_{10}(e^{t/\delta}) = 8.686 \frac{t}{\delta}$ dB. Reflection loss depends on the wave impedance mismatch between free space and the shield material. For plane waves in the far field, $R = 20 \log_{10}\left|\frac{Z_w + Z_s}{4Z_s}\right|$, where $Z_w = 377$ ohms is the free space impedance and $Z_s = \sqrt{\omega \mu / \sigma}$ is the shield surface impedance.
46
47
\begin{pycode}
48
# Shielding effectiveness calculation for copper enclosure
49
frequency_hz = np.logspace(3, 9, 200) # 1 kHz to 1 GHz
50
omega = 2 * np.pi * frequency_hz
51
52
# Material properties
53
mu_0 = 4 * np.pi * 1e-7 # Permeability of free space (H/m)
54
mu_r_copper = 1.0 # Relative permeability of copper
55
mu_copper = mu_0 * mu_r_copper
56
sigma_copper = 5.96e7 # Conductivity of copper (S/m)
57
thickness_mm = 0.5 # Shield thickness in mm
58
thickness_m = thickness_mm * 1e-3
59
60
# Skin depth
61
skin_depth = np.sqrt(2 / (omega * mu_copper * sigma_copper))
62
63
# Absorption loss (dB)
64
absorption_loss = 8.686 * (thickness_m / skin_depth)
65
66
# Shield surface impedance
67
Z_shield = np.sqrt(1j * omega * mu_copper / sigma_copper)
68
Z_wave = 377 # Free space impedance (ohms)
69
70
# Reflection loss for plane wave (far field)
71
reflection_loss = 20 * np.log10(np.abs((Z_wave + Z_shield) / (4 * Z_shield)))
72
73
# Total shielding effectiveness (neglecting multiple reflections for thick shields)
74
shielding_effectiveness = reflection_loss + absorption_loss
75
76
# Plot shielding effectiveness components
77
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 10))
78
79
ax1.semilogx(frequency_hz / 1e6, reflection_loss, 'b-', linewidth=2, label='Reflection Loss')
80
ax1.semilogx(frequency_hz / 1e6, absorption_loss, 'r-', linewidth=2, label='Absorption Loss')
81
ax1.semilogx(frequency_hz / 1e6, shielding_effectiveness, 'k-', linewidth=2.5, label='Total SE')
82
ax1.set_xlabel(r'Frequency (MHz)', fontsize=12)
83
ax1.set_ylabel(r'Shielding Effectiveness (dB)', fontsize=12)
84
ax1.set_title(r'Shielding Effectiveness Components: 0.5 mm Copper Shield', fontsize=13)
85
ax1.legend(fontsize=11)
86
ax1.grid(True, which='both', alpha=0.3)
87
ax1.set_xlim([1e-3, 1e3])
88
ax1.set_ylim([0, 200])
89
90
# Skin depth variation with frequency
91
ax2.loglog(frequency_hz / 1e6, skin_depth * 1e6, 'g-', linewidth=2)
92
ax2.axhline(y=thickness_mm * 1e3, color='r', linestyle='--', linewidth=2, label=f'Shield Thickness ({thickness_mm} mm)')
93
ax2.set_xlabel(r'Frequency (MHz)', fontsize=12)
94
ax2.set_ylabel(r'Skin Depth ($\mu$m)', fontsize=12)
95
ax2.set_title(r'Skin Depth in Copper vs. Frequency', fontsize=13)
96
ax2.legend(fontsize=11)
97
ax2.grid(True, which='both', alpha=0.3)
98
ax2.set_xlim([1e-3, 1e3])
99
100
plt.tight_layout()
101
plt.savefig('emc_plot1.pdf', dpi=150, bbox_inches='tight')
102
plt.close()
103
104
# Calculate specific values for reporting
105
f_1mhz = np.argmin(np.abs(frequency_hz - 1e6))
106
f_100mhz = np.argmin(np.abs(frequency_hz - 100e6))
107
f_1ghz = np.argmin(np.abs(frequency_hz - 1e9))
108
109
se_1mhz = shielding_effectiveness[f_1mhz]
110
se_100mhz = shielding_effectiveness[f_100mhz]
111
se_1ghz = shielding_effectiveness[f_1ghz]
112
\end{pycode}
113
114
\begin{figure}[H]
115
\centering
116
\includegraphics[width=0.95\textwidth]{emc_plot1.pdf}
117
\caption{Shielding effectiveness analysis for a 0.5 mm copper enclosure showing reflection loss, absorption loss, and total shielding effectiveness across the frequency range from 1 kHz to 1 GHz. At low frequencies, reflection loss dominates due to impedance mismatch between free space and the highly conductive shield. At higher frequencies, absorption loss increases as the skin depth decreases, with the electromagnetic field being attenuated exponentially within the shield material. The total shielding effectiveness exceeds \py{se_1mhz:.1f} dB at 1 MHz, \py{se_100mhz:.1f} dB at 100 MHz, and \py{se_1ghz:.1f} dB at 1 GHz, demonstrating excellent EMI suppression across the entire spectrum.}
118
\end{figure}
119
120
\section{Filter Design and Insertion Loss}
121
122
EMI filters suppress conducted emissions and improve immunity by attenuating high-frequency noise on power and signal lines. The two fundamental noise modes are differential-mode (DM) noise, which appears as voltage differences between conductors, and common-mode (CM) noise, which appears as voltage between conductors and ground. Effective filter design requires addressing both modes with appropriate components.
123
124
A typical power line filter consists of common-mode chokes (coupled inductors), X-capacitors (line-to-line), and Y-capacitors (line-to-ground). The insertion loss IL quantifies filter performance as $\text{IL} = 20 \log_{10}\left|\frac{V_{\text{load,unfiltered}}}{V_{\text{load,filtered}}}\right|$ dB. For a simple LC low-pass filter, the insertion loss above the cutoff frequency increases at 40 dB/decade.
125
126
\begin{pycode}
127
# EMI filter insertion loss analysis
128
freq_filter = np.logspace(3, 8, 300) # 1 kHz to 100 MHz
129
omega_f = 2 * np.pi * freq_filter
130
131
# Filter component values
132
L_dm = 1e-3 # Differential-mode inductance (1 mH)
133
C_x = 100e-9 # X-capacitor (100 nF line-to-line)
134
L_cm = 10e-3 # Common-mode inductance (10 mH per line)
135
C_y = 4.7e-9 # Y-capacitor (4.7 nF line-to-ground)
136
137
# Source and load impedances
138
Z_source = 50 # Source impedance (ohms)
139
Z_load = 50 # Load impedance (ohms)
140
141
# Differential-mode filter transfer function (L-C low-pass)
142
# Cutoff frequency: f_c = 1 / (2*pi*sqrt(L*C))
143
f_cutoff_dm = 1 / (2 * np.pi * np.sqrt(L_dm * C_x))
144
omega_c_dm = 2 * np.pi * f_cutoff_dm
145
146
# Transfer function magnitude
147
H_dm = 1 / np.sqrt(1 + (omega_f / omega_c_dm)**4)
148
insertion_loss_dm = -20 * np.log10(H_dm + 1e-12) # Add small value to avoid log(0)
149
150
# Common-mode filter transfer function
151
f_cutoff_cm = 1 / (2 * np.pi * np.sqrt(L_cm * C_y))
152
omega_c_cm = 2 * np.pi * f_cutoff_cm
153
H_cm = 1 / np.sqrt(1 + (omega_f / omega_c_cm)**4)
154
insertion_loss_cm = -20 * np.log10(H_cm + 1e-12)
155
156
# Combined filter (both DM and CM)
157
H_combined = H_dm * H_cm
158
insertion_loss_combined = -20 * np.log10(H_combined + 1e-12)
159
160
# Plot insertion loss
161
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 10))
162
163
ax1.semilogx(freq_filter / 1e6, insertion_loss_dm, 'b-', linewidth=2.5, label=f'DM Filter (L={L_dm*1e3:.1f} mH, C={C_x*1e9:.0f} nF)')
164
ax1.semilogx(freq_filter / 1e6, insertion_loss_cm, 'r-', linewidth=2.5, label=f'CM Filter (L={L_cm*1e3:.1f} mH, C={C_y*1e9:.1f} nF)')
165
ax1.semilogx(freq_filter / 1e6, insertion_loss_combined, 'k-', linewidth=2.5, label='Combined Filter')
166
ax1.axvline(x=f_cutoff_dm / 1e6, color='b', linestyle='--', alpha=0.6, label=f'DM Cutoff ({f_cutoff_dm/1e3:.1f} kHz)')
167
ax1.axvline(x=f_cutoff_cm / 1e6, color='r', linestyle='--', alpha=0.6, label=f'CM Cutoff ({f_cutoff_cm/1e3:.1f} kHz)')
168
ax1.set_xlabel(r'Frequency (MHz)', fontsize=12)
169
ax1.set_ylabel(r'Insertion Loss (dB)', fontsize=12)
170
ax1.set_title(r'EMI Filter Insertion Loss: Differential-Mode and Common-Mode', fontsize=13)
171
ax1.legend(fontsize=9, loc='upper left')
172
ax1.grid(True, which='both', alpha=0.3)
173
ax1.set_xlim([1e-3, 100])
174
ax1.set_ylim([0, 120])
175
176
# Impedance magnitude of filter components
177
Z_L_dm = omega_f * L_dm
178
Z_C_x = 1 / (omega_f * C_x)
179
Z_L_cm = omega_f * L_cm
180
Z_C_y = 1 / (omega_f * C_y)
181
182
ax2.loglog(freq_filter / 1e6, Z_L_dm, 'b-', linewidth=2, label=f'DM Inductor ({L_dm*1e3:.1f} mH)')
183
ax2.loglog(freq_filter / 1e6, Z_C_x, 'b--', linewidth=2, label=f'X-Capacitor ({C_x*1e9:.0f} nF)')
184
ax2.loglog(freq_filter / 1e6, Z_L_cm, 'r-', linewidth=2, label=f'CM Inductor ({L_cm*1e3:.1f} mH)')
185
ax2.loglog(freq_filter / 1e6, Z_C_y, 'r--', linewidth=2, label=f'Y-Capacitor ({C_y*1e9:.1f} nF)')
186
ax2.axhline(y=Z_source, color='k', linestyle=':', linewidth=2, label=f'Source/Load Z ({Z_source} $\\Omega$)')
187
ax2.set_xlabel(r'Frequency (MHz)', fontsize=12)
188
ax2.set_ylabel(r'Impedance Magnitude ($\Omega$)', fontsize=12)
189
ax2.set_title(r'Filter Component Impedances vs. Frequency', fontsize=13)
190
ax2.legend(fontsize=9)
191
ax2.grid(True, which='both', alpha=0.3)
192
ax2.set_xlim([1e-3, 100])
193
194
plt.tight_layout()
195
plt.savefig('emc_plot2.pdf', dpi=150, bbox_inches='tight')
196
plt.close()
197
198
# Calculate insertion loss at key frequencies
199
f_150khz = np.argmin(np.abs(freq_filter - 150e3))
200
f_30mhz = np.argmin(np.abs(freq_filter - 30e6))
201
il_dm_150k = insertion_loss_dm[f_150khz]
202
il_dm_30m = insertion_loss_dm[f_30mhz]
203
il_cm_150k = insertion_loss_cm[f_150khz]
204
il_cm_30m = insertion_loss_cm[f_30mhz]
205
\end{pycode}
206
207
\begin{figure}[H]
208
\centering
209
\includegraphics[width=0.95\textwidth]{emc_plot2.pdf}
210
\caption{EMI filter insertion loss analysis showing differential-mode and common-mode attenuation characteristics across the conducted emissions frequency range (150 kHz to 30 MHz). The differential-mode filter using a 1 mH inductor and 100 nF X-capacitor achieves \py{il_dm_150k:.1f} dB insertion loss at 150 kHz and \py{il_dm_30m:.1f} dB at 30 MHz. The common-mode filter with 10 mH choke and 4.7 nF Y-capacitors provides \py{il_cm_150k:.1f} dB at 150 kHz and \py{il_cm_30m:.1f} dB at 30 MHz. The lower impedance plot demonstrates the frequency-dependent behavior of inductive and capacitive components, with inductors providing increasing impedance and capacitors providing decreasing impedance as frequency increases, enabling effective high-frequency noise suppression.}
211
\end{figure}
212
213
\section{Grounding Strategies and Ground Loop Coupling}
214
215
Grounding is critical for EMC but also a common source of problems. The fundamental challenge is that ground conductors have non-zero impedance, leading to voltage differences between nominally equipotential points. Ground loops occur when two circuits share a common return path, allowing noise currents from one circuit to modulate the reference voltage of another circuit.
216
217
Single-point grounding connects all subsystems to a common reference at one location, preventing ground loops but potentially causing high-frequency noise coupling through increased ground impedance. Multi-point grounding connects each subsystem to ground at the nearest point, reducing high-frequency impedance but creating potential ground loops. Hybrid grounding uses single-point grounding at low frequencies (via inductors) and multi-point grounding at high frequencies (via capacitors).
218
219
The voltage induced in a ground loop can be estimated using $V_{\text{loop}} = j \omega M I_{\text{noise}}$, where $M$ is the mutual inductance between the noise source loop and the victim loop, and $I_{\text{noise}}$ is the noise current. Reducing loop area and increasing separation between circuits reduces mutual inductance and hence ground loop coupling.
220
221
\begin{pycode}
222
# Ground loop coupling analysis
223
freq_ground = np.logspace(1, 8, 300) # 10 Hz to 100 MHz
224
omega_g = 2 * np.pi * freq_ground
225
226
# Ground impedance parameters
227
L_ground_single = 10e-9 # Ground inductance for single-point (10 nH - longer path)
228
R_ground = 10e-3 # Ground resistance (10 milliohms)
229
L_ground_multi = 1e-9 # Ground inductance for multi-point (1 nH - shorter path)
230
231
# Ground impedance magnitude
232
Z_ground_single = np.sqrt(R_ground**2 + (omega_g * L_ground_single)**2)
233
Z_ground_multi = np.sqrt(R_ground**2 + (omega_g * L_ground_multi)**2)
234
235
# Ground loop coupling
236
loop_area_cm2 = 10 # Loop area in cm^2
237
loop_area_m2 = loop_area_cm2 * 1e-4
238
separation_cm = 5 # Separation between loops in cm
239
separation_m = separation_cm * 1e-2
240
241
# Mutual inductance (approximate formula for two parallel loops)
242
mu_0 = 4 * np.pi * 1e-7
243
loop_radius = np.sqrt(loop_area_m2 / np.pi)
244
mutual_inductance = mu_0 * loop_area_m2 / (2 * separation_m)
245
246
# Noise current (example switching circuit)
247
I_noise_peak = 1.0 # 1 A peak switching current
248
249
# Induced voltage in victim loop
250
V_loop_induced = omega_g * mutual_inductance * I_noise_peak
251
252
# With ground loop vs. without (differential signaling)
253
coupling_with_loop_db = 20 * np.log10(V_loop_induced + 1e-12)
254
coupling_without_loop_db = coupling_with_loop_db - 30 # 30 dB improvement with differential
255
256
# Plot ground impedance and coupling
257
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 10))
258
259
ax1.loglog(freq_ground / 1e6, Z_ground_single * 1e3, 'r-', linewidth=2.5, label=f'Single-Point (L={L_ground_single*1e9:.0f} nH)')
260
ax1.loglog(freq_ground / 1e6, Z_ground_multi * 1e3, 'b-', linewidth=2.5, label=f'Multi-Point (L={L_ground_multi*1e9:.0f} nH)')
261
ax1.axhline(y=R_ground * 1e3, color='k', linestyle='--', linewidth=2, alpha=0.5, label=f'DC Resistance ({R_ground*1e3:.0f} m$\\Omega$)')
262
ax1.set_xlabel(r'Frequency (MHz)', fontsize=12)
263
ax1.set_ylabel(r'Ground Impedance (m$\Omega$)', fontsize=12)
264
ax1.set_title(r'Ground Impedance: Single-Point vs. Multi-Point Grounding', fontsize=13)
265
ax1.legend(fontsize=10)
266
ax1.grid(True, which='both', alpha=0.3)
267
ax1.set_xlim([1e-5, 100])
268
269
ax2.semilogx(freq_ground / 1e6, coupling_with_loop_db, 'r-', linewidth=2.5, label='With Ground Loop')
270
ax2.semilogx(freq_ground / 1e6, coupling_without_loop_db, 'b-', linewidth=2.5, label='Differential Signaling (No Ground Loop)')
271
ax2.set_xlabel(r'Frequency (MHz)', fontsize=12)
272
ax2.set_ylabel(r'Induced Voltage (dBV)', fontsize=12)
273
ax2.set_title(r'Ground Loop Coupling: Area={loop_area_cm2} cm$^2$, Separation={separation_cm} cm, I$_{{noise}}$={I_noise_peak} A', fontsize=12)
274
ax2.legend(fontsize=10)
275
ax2.grid(True, which='both', alpha=0.3)
276
ax2.set_xlim([1e-5, 100])
277
ax2.set_ylim([-80, 20])
278
279
plt.tight_layout()
280
plt.savefig('emc_plot3.pdf', dpi=150, bbox_inches='tight')
281
plt.close()
282
283
# Calculate impedance ratio at 10 MHz
284
f_10mhz_idx = np.argmin(np.abs(freq_ground - 10e6))
285
impedance_ratio_10mhz = Z_ground_single[f_10mhz_idx] / Z_ground_multi[f_10mhz_idx]
286
impedance_reduction_db = 20 * np.log10(impedance_ratio_10mhz)
287
\end{pycode}
288
289
\begin{figure}[H]
290
\centering
291
\includegraphics[width=0.95\textwidth]{emc_plot3.pdf}
292
\caption{Ground impedance comparison between single-point and multi-point grounding strategies, and ground loop coupling analysis. The upper plot shows that multi-point grounding provides significantly lower impedance at high frequencies due to reduced inductance in the ground path. At 10 MHz, multi-point grounding reduces ground impedance by \py{impedance_reduction_db:.1f} dB compared to single-point grounding. The lower plot demonstrates magnetic coupling between a noise source loop and victim circuit, showing that ground loops can induce substantial voltages at high frequencies. Differential signaling eliminates ground loop coupling by providing a dedicated return path, reducing induced noise by approximately 30 dB. Minimizing loop areas and maximizing separation between circuits are essential EMC design practices.}
293
\end{figure}
294
295
\section{Radiated Emissions and Near-Field to Far-Field Transition}
296
297
Radiated emissions result from time-varying currents flowing in conductors that act as unintentional antennas. The electromagnetic field characteristics depend strongly on distance from the source. In the near field (reactive region), the electric and magnetic fields are decoupled and energy oscillates between the source and the surrounding space. In the far field (radiation region), the E and H fields are coupled with the characteristic impedance of free space ($Z_0 = 377$ ohms), and energy propagates away from the source.
298
299
The transition between near field and far field occurs at a distance $r \approx \lambda / 2\pi$, where $\lambda$ is the wavelength. For electrically small sources (dimensions much less than wavelength), the near field is dominated by either electric field (high-impedance sources like open-ended traces) or magnetic field (low-impedance sources like current loops). The power density in the far field is $S = \frac{E^2}{377}$ W/m$^2$, and the total radiated power can be calculated by integrating over a closed surface.
300
301
\begin{pycode}
302
# Radiated emissions: near-field and far-field analysis
303
distance_m = np.logspace(-2, 2, 300) # 1 cm to 100 m
304
305
# Source parameters (differential-mode current loop)
306
current_amplitude = 0.1 # 100 mA
307
loop_area_emission = 1e-4 # 1 cm^2 loop area
308
frequency_emission = 100e6 # 100 MHz
309
wavelength = 3e8 / frequency_emission # Speed of light / frequency
310
k = 2 * np.pi / wavelength # Wave number
311
312
# Near-field to far-field transition distance
313
r_transition = wavelength / (2 * np.pi)
314
315
# Magnetic dipole moment
316
magnetic_dipole_moment = current_amplitude * loop_area_emission
317
318
# Electric field magnitude (far-field approximation)
319
# E = (eta * k^2 * m * sin(theta)) / (4 * pi * r) for theta = 90 degrees (maximum)
320
eta = 377 # Free space impedance
321
E_far_field = (eta * k**2 * magnetic_dipole_moment) / (4 * np.pi * distance_m)
322
323
# Near-field correction (approximation)
324
E_near_field = E_far_field * (1 + (r_transition / distance_m)**2)
325
326
# Magnetic field magnitude
327
H_far_field = E_far_field / eta
328
H_near_field = E_near_field / eta
329
330
# Power density in far field
331
power_density_far = E_far_field**2 / eta # W/m^2
332
power_density_far_dbm = 10 * np.log10(power_density_far * 1e3 + 1e-20) # dBm/m^2
333
334
# Plot near-field and far-field regions
335
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 10))
336
337
ax1.loglog(distance_m, E_near_field, 'b-', linewidth=2.5, label='Electric Field (with near-field correction)')
338
ax1.loglog(distance_m, E_far_field, 'b--', linewidth=2, alpha=0.6, label='Electric Field (far-field only)')
339
ax1.axvline(x=r_transition, color='r', linestyle='--', linewidth=2, label=f'Near/Far Transition ({r_transition*100:.1f} cm)')
340
ax1.set_xlabel(r'Distance (m)', fontsize=12)
341
ax1.set_ylabel(r'Electric Field Magnitude (V/m)', fontsize=12)
342
ax1.set_title(r'Radiated Electric Field: 100 mA, 1 cm$^2$ Loop at 100 MHz', fontsize=13)
343
ax1.legend(fontsize=10)
344
ax1.grid(True, which='both', alpha=0.3)
345
ax1.set_xlim([1e-2, 100])
346
ax1.fill_between([1e-2, r_transition], [1e-10, 1e-10], [1e2, 1e2], alpha=0.2, color='yellow', label='Near Field')
347
ax1.fill_between([r_transition, 100], [1e-10, 1e-10], [1e2, 1e2], alpha=0.2, color='cyan', label='Far Field')
348
349
ax2.semilogx(distance_m, power_density_far_dbm, 'g-', linewidth=2.5)
350
ax2.axvline(x=r_transition, color='r', linestyle='--', linewidth=2, label=f'Near/Far Transition ({r_transition*100:.1f} cm)')
351
ax2.set_xlabel(r'Distance (m)', fontsize=12)
352
ax2.set_ylabel(r'Power Density (dBm/m$^2$)', fontsize=12)
353
ax2.set_title(r'Radiated Power Density in Far Field', fontsize=13)
354
ax2.legend(fontsize=10)
355
ax2.grid(True, which='both', alpha=0.3)
356
ax2.set_xlim([1e-2, 100])
357
358
plt.tight_layout()
359
plt.savefig('emc_plot4.pdf', dpi=150, bbox_inches='tight')
360
plt.close()
361
362
# Calculate field strength at standard test distances
363
d_3m = np.argmin(np.abs(distance_m - 3))
364
d_10m = np.argmin(np.abs(distance_m - 10))
365
E_at_3m = E_near_field[d_3m]
366
E_at_10m = E_near_field[d_10m]
367
\end{pycode}
368
369
\begin{figure}[H]
370
\centering
371
\includegraphics[width=0.95\textwidth]{emc_plot4.pdf}
372
\caption{Radiated emissions from a 100 mA current loop with 1 cm$^2$ area operating at 100 MHz, showing the transition between near-field and far-field regions. The near-field to far-field transition occurs at approximately \py{r_transition*100:.1f} cm (wavelength/(2$\pi$)). In the near field, the electric field decays faster than $1/r$ due to reactive energy storage. In the far field, the field decays as $1/r$ and power density decays as $1/r^2$. At standard EMC test distances of 3 meters and 10 meters, the electric field strengths are \py{E_at_3m*1e6:.2f} $\mu$V/m and \py{E_at_10m*1e6:.2f} $\mu$V/m respectively. This analysis is essential for predicting compliance with radiated emission limits and determining required shielding or filtering effectiveness.}
373
\end{figure}
374
375
\section{EMC Regulatory Compliance: FCC Part 15 and CISPR 22}
376
377
Electromagnetic compatibility regulations establish emission limits to prevent interference between electronic devices. In the United States, FCC Part 15 governs unintentional radiators, while internationally, CISPR 22 (now CISPR 32) defines limits for information technology equipment. These standards specify both conducted emissions (measured on power lines from 150 kHz to 30 MHz) and radiated emissions (measured in free space from 30 MHz to 1 GHz).
378
379
For conducted emissions, Class B (residential) limits are more stringent than Class A (industrial). FCC Part 15 Class B limits range from approximately 48-56 dB$\mu$V quasi-peak from 150 kHz to 30 MHz. For radiated emissions, Class B limits are 100 $\mu$V/m at 3 meters from 30-88 MHz, 150 $\mu$V/m from 88-216 MHz, and 200 $\mu$V/m from 216-960 MHz. Margins of 6-10 dB below limits are typically targeted during design to account for unit-to-unit variation and measurement uncertainty.
380
381
\begin{pycode}
382
# EMC compliance limits: FCC Part 15 Class B
383
freq_conducted = np.array([0.15, 0.5, 5, 30]) # MHz
384
fcc_conducted_qp = np.array([66, 56, 56, 56]) # dBuV quasi-peak
385
fcc_conducted_avg = np.array([56, 46, 46, 46]) # dBuV average
386
387
freq_radiated = np.array([30, 88, 216, 960, 1000]) # MHz
388
fcc_radiated = np.array([100, 100, 150, 200, 200]) # uV/m at 3 meters
389
fcc_radiated_db = 20 * np.log10(fcc_radiated) # Convert to dBuV/m
390
391
# Example device emissions (before mitigation)
392
np.random.seed(42)
393
freq_test_conducted = np.logspace(np.log10(0.15), np.log10(30), 100)
394
emissions_conducted_before = 70 - 5 * np.log10(freq_test_conducted) + 3 * np.random.randn(len(freq_test_conducted))
395
396
# After EMI filter (40 dB insertion loss above 1 MHz)
397
filter_attenuation = np.minimum(40 * (freq_test_conducted / 1.0)**0.5, 60)
398
emissions_conducted_after = emissions_conducted_before - filter_attenuation
399
400
freq_test_radiated = np.logspace(np.log10(30), np.log10(1000), 100)
401
emissions_radiated_before = 55 - 3 * np.log10(freq_test_radiated) + 2 * np.random.randn(len(freq_test_radiated))
402
403
# After shielding (60 dB SE)
404
emissions_radiated_after = emissions_radiated_before - 60
405
406
# Plot compliance margins
407
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 10))
408
409
# Conducted emissions
410
ax1.semilogx(freq_conducted, fcc_conducted_qp, 'ko-', linewidth=2.5, markersize=8, label='FCC Part 15 Class B (QP)')
411
ax1.semilogx(freq_conducted, fcc_conducted_avg, 'ks--', linewidth=2, markersize=6, label='FCC Part 15 Class B (Avg)')
412
ax1.semilogx(freq_test_conducted, emissions_conducted_before, 'r-', linewidth=2, alpha=0.7, label='Before EMI Filter (FAIL)')
413
ax1.semilogx(freq_test_conducted, emissions_conducted_after, 'g-', linewidth=2.5, label='After EMI Filter (PASS)')
414
ax1.fill_between(freq_test_conducted, 0, fcc_conducted_qp[1], alpha=0.2, color='green', label='Compliance Region')
415
ax1.set_xlabel(r'Frequency (MHz)', fontsize=12)
416
ax1.set_ylabel(r'Emission Level (dB$\mu$V)', fontsize=12)
417
ax1.set_title(r'Conducted Emissions Compliance: FCC Part 15 Class B', fontsize=13)
418
ax1.legend(fontsize=9, loc='upper right')
419
ax1.grid(True, which='both', alpha=0.3)
420
ax1.set_xlim([0.15, 30])
421
ax1.set_ylim([20, 90])
422
423
# Radiated emissions
424
ax2.semilogx(freq_radiated, fcc_radiated_db, 'ko-', linewidth=2.5, markersize=8, label='FCC Part 15 Class B Limit')
425
ax2.semilogx(freq_test_radiated, emissions_radiated_before, 'r-', linewidth=2, alpha=0.7, label='Before Shielding (FAIL)')
426
ax2.semilogx(freq_test_radiated, emissions_radiated_after, 'g-', linewidth=2.5, label='After Shielding (PASS)')
427
ax2.fill_between(freq_test_radiated, 0, np.interp(freq_test_radiated, freq_radiated, fcc_radiated_db),
428
alpha=0.2, color='green', label='Compliance Region')
429
ax2.set_xlabel(r'Frequency (MHz)', fontsize=12)
430
ax2.set_ylabel(r'Electric Field (dB$\mu$V/m at 3m)', fontsize=12)
431
ax2.set_title(r'Radiated Emissions Compliance: FCC Part 15 Class B', fontsize=13)
432
ax2.legend(fontsize=9, loc='upper right')
433
ax2.grid(True, which='both', alpha=0.3)
434
ax2.set_xlim([30, 1000])
435
ax2.set_ylim([0, 80])
436
437
plt.tight_layout()
438
plt.savefig('emc_plot5.pdf', dpi=150, bbox_inches='tight')
439
plt.close()
440
441
# Calculate compliance margins
442
margin_conducted_avg = np.mean(fcc_conducted_qp[1] - emissions_conducted_after[freq_test_conducted > 0.5])
443
margin_radiated_avg = np.mean(np.interp(freq_test_radiated, freq_radiated, fcc_radiated_db) - emissions_radiated_after)
444
\end{pycode}
445
446
\begin{figure}[H]
447
\centering
448
\includegraphics[width=0.95\textwidth]{emc_plot5.pdf}
449
\caption{EMC regulatory compliance analysis showing conducted and radiated emissions before and after EMC mitigation techniques. The upper plot demonstrates conducted emissions compliance with FCC Part 15 Class B limits (150 kHz to 30 MHz), showing that the unmitigated device fails compliance by exceeding quasi-peak limits. After implementing a multi-stage EMI filter with 40+ dB insertion loss, the device achieves compliance with an average margin of \py{margin_conducted_avg:.1f} dB. The lower plot shows radiated emissions compliance (30 MHz to 1 GHz), where the unmitigated device exceeds radiated emission limits. After implementing shielding with 60 dB effectiveness, the device achieves compliance with an average margin of \py{margin_radiated_avg:.1f} dB. These results demonstrate the effectiveness of systematic EMC design incorporating filtering, shielding, and grounding best practices.}
450
\end{figure}
451
452
\section{Switching Noise Spectrum and Harmonic Content}
453
454
Switching power supplies and digital circuits generate broadband electromagnetic interference through rapid current and voltage transitions. The frequency spectrum of a trapezoidal switching waveform contains harmonics at multiples of the fundamental switching frequency, with the harmonic amplitude envelope declining at 20 dB/decade until the transition time corner frequency, then declining at 40 dB/decade beyond that frequency.
455
456
For a switching waveform with rise time $t_r$ and fundamental frequency $f_0$, the first spectral knee occurs at $f_1 = \frac{1}{\pi t_r}$. The harmonic amplitudes follow $|H_n| = \frac{V_0}{n}$ for $f < f_1$ and $|H_n| = \frac{V_0 f_1}{f^2}$ for $f > f_1$, where $V_0$ is the switching amplitude. Reducing the rise time decreases EMI at low frequencies but increases high-frequency content. The optimal design balances switching speed (for efficiency) against EMI generation.
457
458
\begin{pycode}
459
# Switching waveform spectrum analysis
460
time_ns = np.linspace(0, 200, 2000) # 200 ns time window
461
time_s = time_ns * 1e-9
462
463
# Switching waveform parameters
464
V_switching = 5.0 # 5V switching amplitude
465
f_switching = 1e6 # 1 MHz switching frequency
466
T_switching = 1 / f_switching
467
duty_cycle = 0.5
468
rise_time_ns = 1.0 # 1 ns rise time (fast)
469
rise_time_s = rise_time_ns * 1e-9
470
471
# Generate trapezoidal switching waveform
472
def trapezoidal_wave(t, V, f, duty, t_rise):
473
T = 1/f
474
phase = (t % T) / T
475
476
rise_frac = t_rise * f
477
fall_frac = t_rise * f
478
479
output = np.zeros_like(t)
480
481
# Rising edge
482
rising = (phase < rise_frac)
483
output[rising] = V * phase[rising] / rise_frac
484
485
# High state
486
high = (phase >= rise_frac) & (phase < duty)
487
output[high] = V
488
489
# Falling edge
490
falling = (phase >= duty) & (phase < duty + fall_frac)
491
output[falling] = V * (1 - (phase[falling] - duty) / fall_frac)
492
493
# Low state (already zero)
494
495
return output
496
497
voltage_waveform = trapezoidal_wave(time_s, V_switching, f_switching, duty_cycle, rise_time_s)
498
499
# Add noise
500
np.random.seed(123)
501
voltage_waveform_noisy = voltage_waveform + 0.05 * np.random.randn(len(voltage_waveform))
502
503
# Compute FFT
504
fft_result = np.fft.fft(voltage_waveform)
505
fft_freq = np.fft.fftfreq(len(time_s), time_s[1] - time_s[0])
506
fft_magnitude = np.abs(fft_result) / len(time_s) * 2 # Normalize and convert to single-sided
507
508
# Keep only positive frequencies
509
positive_freq_mask = fft_freq > 0
510
fft_freq_positive = fft_freq[positive_freq_mask]
511
fft_magnitude_positive = fft_magnitude[positive_freq_mask]
512
fft_magnitude_db = 20 * np.log10(fft_magnitude_positive + 1e-10)
513
514
# Theoretical envelope
515
f_envelope = np.logspace(5, 10, 300) # 100 kHz to 10 GHz
516
f_knee = 1 / (np.pi * rise_time_s)
517
envelope_20db = V_switching / (f_envelope / f_switching) # 20 dB/decade slope
518
envelope_40db = V_switching * f_knee / f_envelope**2 * f_switching # 40 dB/decade slope
519
envelope = np.minimum(envelope_20db, envelope_40db)
520
envelope_db = 20 * np.log10(envelope + 1e-10)
521
522
# Plot time domain and frequency domain
523
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12, 10))
524
525
# Time domain
526
ax1.plot(time_ns[:400], voltage_waveform[:400], 'b-', linewidth=2, label='Ideal Trapezoidal Wave')
527
ax1.plot(time_ns[:400], voltage_waveform_noisy[:400], 'r-', linewidth=1, alpha=0.5, label='With Noise')
528
ax1.set_xlabel(r'Time (ns)', fontsize=12)
529
ax1.set_ylabel(r'Voltage (V)', fontsize=12)
530
ax1.set_title(r'Switching Waveform: {V_switching} V, {f_switching/1e6:.0f} MHz, {rise_time_ns:.1f} ns Rise Time', fontsize=13)
531
ax1.legend(fontsize=10)
532
ax1.grid(True, alpha=0.3)
533
ax1.set_xlim([0, 2000/f_switching*1e9])
534
535
# Frequency domain
536
ax2.loglog(fft_freq_positive / 1e6, fft_magnitude_positive, 'b.', markersize=4, alpha=0.5, label='FFT Harmonics')
537
ax2.loglog(f_envelope / 1e6, envelope, 'r-', linewidth=2.5, label='Theoretical Envelope')
538
ax2.axvline(x=f_switching / 1e6, color='g', linestyle='--', linewidth=2, label=f'Fundamental ({f_switching/1e6:.0f} MHz)')
539
ax2.axvline(x=f_knee / 1e6, color='orange', linestyle='--', linewidth=2, label=f'Knee Frequency ({f_knee/1e6:.0f} MHz)')
540
ax2.set_xlabel(r'Frequency (MHz)', fontsize=12)
541
ax2.set_ylabel(r'Voltage Amplitude (V)', fontsize=12)
542
ax2.set_title(r'Harmonic Spectrum with Envelope (20 dB/dec then 40 dB/dec)', fontsize=13)
543
ax2.legend(fontsize=10)
544
ax2.grid(True, which='both', alpha=0.3)
545
ax2.set_xlim([0.1, 10000])
546
ax2.set_ylim([1e-6, 10])
547
548
plt.tight_layout()
549
plt.savefig('emc_plot6.pdf', dpi=150, bbox_inches='tight')
550
plt.close()
551
552
# Calculate specific harmonic amplitudes
553
harmonics_of_interest = [1, 3, 5, 10, 20]
554
harmonic_amplitudes = []
555
for n in harmonics_of_interest:
556
f_harmonic = n * f_switching
557
idx = np.argmin(np.abs(fft_freq_positive - f_harmonic))
558
harmonic_amplitudes.append(fft_magnitude_positive[idx])
559
\end{pycode}
560
561
\begin{figure}[H]
562
\centering
563
\includegraphics[width=0.95\textwidth]{emc_plot6.pdf}
564
\caption{Switching waveform time-domain and frequency-domain analysis for a 5V, 1 MHz trapezoidal wave with 1 ns rise time. The upper plot shows two cycles of the switching waveform with sharp rise and fall transitions that generate broadband electromagnetic interference. The lower plot displays the harmonic spectrum obtained via FFT, showing discrete harmonics at integer multiples of the switching frequency (1 MHz, 2 MHz, 3 MHz, etc.). The theoretical spectral envelope follows a 20 dB/decade slope below the knee frequency (\py{f_knee/1e6:.0f} MHz, determined by the rise time) and a 40 dB/decade slope above the knee frequency. This analysis is essential for understanding EMI source characteristics and determining required filter corner frequencies. Slowing the rise time would reduce high-frequency harmonic content at the expense of increased switching losses.}
565
\end{figure}
566
567
\section{Summary of EMC Performance Metrics}
568
569
\begin{pycode}
570
# Compile key EMC performance metrics
571
emc_results = [
572
['Shielding Effectiveness (1 MHz)', f'{se_1mhz:.1f} dB'],
573
['Shielding Effectiveness (100 MHz)', f'{se_100mhz:.1f} dB'],
574
['Shielding Effectiveness (1 GHz)', f'{se_1ghz:.1f} dB'],
575
['DM Filter Insertion Loss (150 kHz)', f'{il_dm_150k:.1f} dB'],
576
['DM Filter Insertion Loss (30 MHz)', f'{il_dm_30m:.1f} dB'],
577
['CM Filter Insertion Loss (150 kHz)', f'{il_cm_150k:.1f} dB'],
578
['CM Filter Insertion Loss (30 MHz)', f'{il_cm_30m:.1f} dB'],
579
['Ground Impedance Reduction (10 MHz)', f'{impedance_reduction_db:.1f} dB'],
580
['Radiated Field at 3 m', f'{E_at_3m*1e6:.2f} $\\mu$V/m'],
581
['Radiated Field at 10 m', f'{E_at_10m*1e6:.2f} $\\mu$V/m'],
582
['Conducted Emissions Margin', f'{margin_conducted_avg:.1f} dB'],
583
['Radiated Emissions Margin', f'{margin_radiated_avg:.1f} dB'],
584
['Switching Knee Frequency', f'{f_knee/1e6:.0f} MHz'],
585
]
586
587
print(r'\\begin{table}[H]')
588
print(r'\\centering')
589
print(r'\\caption{Summary of EMC Performance Metrics}')
590
print(r'\\begin{tabular}{@{}lc@{}}')
591
print(r'\\toprule')
592
print(r'Metric & Value \\\\')
593
print(r'\\midrule')
594
for row in emc_results:
595
print(f"{row[0]} & {row[1]} \\\\\\\\")
596
print(r'\\bottomrule')
597
print(r'\\end{tabular}')
598
print(r'\\end{table}')
599
\end{pycode}
600
601
\section{Conclusions}
602
603
This comprehensive electromagnetic compatibility analysis demonstrates the effectiveness of systematic EMC engineering principles applied to modern electronic systems. Through detailed computational modeling, we have quantified the performance of key EMC mitigation strategies including shielding, filtering, and grounding.
604
605
The shielding effectiveness analysis reveals that a 0.5 mm copper enclosure provides \py{se_1mhz:.1f} dB attenuation at 1 MHz, increasing to \py{se_1ghz:.1f} dB at 1 GHz, demonstrating excellent broadband EMI suppression across both conducted and radiated emission frequency ranges. The frequency-dependent behavior is governed by reflection loss at low frequencies (dominated by impedance mismatch) and absorption loss at high frequencies (dominated by skin depth effects).
606
607
EMI filter design analysis shows that proper selection of differential-mode and common-mode filter components achieves \py{il_dm_30m:.1f} dB and \py{il_cm_30m:.1f} dB insertion loss respectively at 30 MHz, effectively suppressing conducted emissions. The complementary nature of DM and CM filtering addresses both noise coupling mechanisms, with X-capacitors handling line-to-line noise and Y-capacitors with common-mode chokes suppressing line-to-ground noise.
608
609
Grounding strategy analysis demonstrates that multi-point grounding reduces high-frequency ground impedance by \py{impedance_reduction_db:.1f} dB compared to single-point grounding at 10 MHz, while differential signaling eliminates ground loop coupling by providing dedicated signal return paths. The \py{loop_area_cm2:.0f} cm$^2$ ground loop coupling model shows that minimizing loop areas and maximizing circuit separation are critical EMC design practices.
610
611
Regulatory compliance analysis confirms that the combination of 60 dB shielding effectiveness and 40+ dB filter insertion loss enables FCC Part 15 Class B compliance with margins of \py{margin_conducted_avg:.1f} dB for conducted emissions and \py{margin_radiated_avg:.1f} dB for radiated emissions. These margins provide robustness against unit-to-unit variation and measurement uncertainty.
612
613
The switching waveform spectral analysis identifies the knee frequency at \py{f_knee/1e6:.0f} MHz (determined by the 1 ns rise time), beyond which harmonic amplitudes decline at 40 dB/decade instead of 20 dB/decade. This analysis enables informed design tradeoffs between switching efficiency (favoring fast transitions) and EMI generation (favoring slower transitions).
614
615
In conclusion, this analysis provides quantitative design guidance for achieving electromagnetic compatibility through physics-based modeling of shielding effectiveness, filter insertion loss, grounding impedance, radiated emission field strength, and regulatory compliance margins. The computational approach enables rapid evaluation of design alternatives and optimization of EMC mitigation strategies prior to hardware prototyping and compliance testing.
616
617
\bibliographystyle{plain}
618
\begin{thebibliography}{99}
619
620
\bibitem{ott2009} H. W. Ott, \textit{Electromagnetic Compatibility Engineering}, John Wiley \& Sons, 2009.
621
622
\bibitem{paul2006} C. R. Paul, \textit{Introduction to Electromagnetic Compatibility}, 2nd ed., John Wiley \& Sons, 2006.
623
624
\bibitem{williams2017} T. Williams, \textit{EMC for Product Designers}, 5th ed., Newnes, 2017.
625
626
\bibitem{montrose2000} M. I. Montrose, \textit{EMC and the Printed Circuit Board: Design, Theory, and Layout Made Simple}, IEEE Press, 2000.
627
628
\bibitem{johnson1993} H. W. Johnson and M. Graham, \textit{High-Speed Digital Design: A Handbook of Black Magic}, Prentice Hall, 1993.
629
630
\bibitem{schelkunoff1943} S. A. Schelkunoff, \textit{Electromagnetic Waves}, D. Van Nostrand Company, 1943.
631
632
\bibitem{fcc_part15} Federal Communications Commission, \textit{Code of Federal Regulations Title 47 Part 15: Radio Frequency Devices}, 2023.
633
634
\bibitem{cispr22} International Electrotechnical Commission, \textit{CISPR 22: Information Technology Equipment - Radio Disturbance Characteristics - Limits and Methods of Measurement}, 2008.
635
636
\bibitem{armstrong1994} K. Armstrong, \textit{EMC Design Techniques for Electronic Engineers}, Cherry Clough Consultants, 1994.
637
638
\bibitem{kodali2001} V. P. Kodali, \textit{Engineering Electromagnetic Compatibility}, 2nd ed., IEEE Press, 2001.
639
640
\bibitem{mardiguian2009} M. Mardiguian, \textit{Controlling Radiated Emissions by Design}, 3rd ed., Springer, 2009.
641
642
\bibitem{tesche1997} F. M. Tesche, M. V. Ianoz, and T. Karlsson, \textit{EMC Analysis Methods and Computational Models}, John Wiley \& Sons, 1997.
643
644
\bibitem{white1973} D. R. J. White, \textit{A Handbook on Electromagnetic Shielding Materials and Performance}, Don White Consultants, 1973.
645
646
\bibitem{bogdan2007} B. Adamczyk, \textit{Foundations of Electromagnetic Compatibility with Practical Applications}, John Wiley \& Sons, 2017.
647
648
\bibitem{chatterton1992} P. A. Chatterton and M. A. Houlden, \textit{EMC: Electromagnetic Theory to Practical Design}, John Wiley \& Sons, 1992.
649
650
\bibitem{goedbloed1992} J. Goedbloed, \textit{Electromagnetic Compatibility}, Prentice Hall, 1992.
651
652
\bibitem{archambeault2001} B. Archambeault, C. Brench, and S. Connor, \textit{Review of Printed-Circuit-Board Level EMI/EMC Issues and Tools}, IEEE Press, 2001.
653
654
\bibitem{freeman1996} E. R. Freeman and J. Sackett, \textit{Electromagnetic Compatibility Design Guide}, Artech House, 1996.
655
656
\bibitem{white1980} D. R. J. White and M. Mardiguian, \textit{EMI Control Methodology and Procedures}, 4th ed., Interference Control Technologies, 1980.
657
658
\bibitem{perez1995} R. Perez, \textit{Handbook of Electromagnetic Compatibility}, Academic Press, 1995.
659
660
\end{thebibliography}
661
662
\end{document}
663
664