EW Systems Calculator — Based on "Electronic Warfare Systems Vol. I" by G.M. Thomas
Radar & Counter-Radar
Radar range equation, J/S ratio, spot/barrage jamming, DRFM, Friis transmission
Electronic Attack
Required jammer EIRP, escort jammer J/S, power budget, jamming effectiveness
ESM / SIGINT
PDW clustering, TDOA geolocation, Cramér-Rao bound, detection probability
Navigation Warfare
GPS jamming range, required J/S for NAVWAR, CRPA antenna pattern, spoofing
IR / Electro-Optical
Planck's law, LWIR detection SNR, matched filter, sensor fusion, quantum SNR
EW Receivers
Noise figure, receiver sensitivity, IQ imbalance, superheterodyne design
How to Use
- Term definitions — what each variable means in EW context
- Formula — the governing equation
- Interactive inputs — enter your parameters
- Computed result — with operational interpretation
- Python snippet — the equivalent code from the book
Radar Systems & Counter-Radar Techniques — Ch. 7
📡 Radar Range Equation
Ch. 7.1- P_t
- Transmit power (W)
- G_t
- Transmit antenna gain
- G_r
- Receive antenna gain
- σ
- Radar cross-section of target (m²)
- λ
- Wavelength (m)
- S_min
- Minimum detectable signal (W)
▶ Python snippet
import numpy as np def radar_range(Pt, Gt, Gr, sigma, freq_GHz, S_min): """Radar range equation — returns max range in km""" lam = 3e8 / (freq_GHz * 1e9) # wavelength numerator = Pt * Gt * Gr * sigma * lam**2 denominator = (4 * np.pi)**3 * S_min R_max = (numerator / denominator)**(1/4) # metres return R_max / 1e3 # km
🔇 Radar Jamming J/S Ratio
Ch. 7.4- P_j
- Jammer transmit power (W)
- G_j
- Jammer antenna gain toward radar
- G_t
- Radar transmit antenna gain
- R_j
- Jammer-to-radar range (km)
- R_t
- Target-to-radar range (km)
- σ
- Target RCS (m²)
▶ Python snippet
import numpy as np def compute_js_ratio(Pj, Gj, Pt, Gt, sigma, Rt_km, Rj_km): """Jamming-to-Signal ratio for self-protection or escort jamming. Returns J/S in dB. Positive means jamming dominates.""" Rt = Rt_km * 1e3 Rj = Rj_km * 1e3 # Power ratio (linear) js_linear = (Pj * Gj * 4 * np.pi * Rt**2) / (Pt * Gt * sigma * Rj**2) js_dB = 10 * np.log10(js_linear) return js_dB # Operational note: J/S > 0 dB masks target; typical ERP requirement: 6–20 dB
📶 Friis Transmission Equation
Ch. 3–4- P_r
- Received power (W)
- P_t
- Transmit power (W)
- G_t, G_r
- Tx/Rx antenna gains (linear)
- λ
- Wavelength = c/f
- R
- Range (m)
▶ Python snippet
import numpy as np def friis(Pt_W, Gt, Gr, freq_GHz, R_km): """Friis transmission — returns received power in dBm""" lam = 3e8 / (freq_GHz * 1e9) R = R_km * 1e3 Pr = Pt_W * Gt * Gr * (lam / (4 * np.pi * R))**2 return 10 * np.log10(Pr * 1e3) # dBm
Electronic Attack (EA) / ECM — Ch. 5–6
📡 Required Jammer EIRP
Ch. 5.3- EIRP_jam
- Required jammer EIRP = P_j × G_j (W)
- J/S_req
- Required J/S ratio (linear)
- P_t · G_t
- Radar EIRP (W)
- σ
- Target RCS (m²)
- R_j
- Jammer-to-radar range (m)
- R_t
- Target-to-radar range (m)
▶ Python snippet
import numpy as np def required_jammer_eirp(js_req_dB, Pt, Gt, sigma, Rt_km, Rj_km): """Compute required jammer EIRP (dBW) to achieve specified J/S. Follows Listing 5.9 from the book.""" js_req = 10**(js_req_dB / 10) # dB → linear Rt = Rt_km * 1e3 Rj = Rj_km * 1e3 # Required EIRP = J/S * (Pt*Gt*sigma) / (4*pi) * (Rj/Rt)^2 eirp_linear = js_req * Pt * Gt * sigma * (Rj / Rt)**2 / (4 * np.pi) eirp_dBW = 10 * np.log10(eirp_linear) return eirp_dBW, eirp_linear eirp_dBW, eirp_W = required_jammer_eirp(6, 50e3, 3162, 1, 100, 110) print(f"Required EIRP: {eirp_dBW:.1f} dBW ({eirp_W/1e3:.2f} kW)")
✈️ Escort Jammer J/S
Ch. 5.3.2- P_j
- Jammer transmit power (W)
- G_j
- Jammer antenna gain toward radar
- G_r
- Radar receive antenna gain
- R_j
- Escort-to-radar range
- R_t
- Target-to-radar range
▶ Python snippet
import numpy as np def escort_js(Pj, Gj, Pt, Gt, sigma, Rj_km, Rt_km, freq_GHz): """Escort Jammer J/S ratio. Uses full bistatic radar equation vs one-way jammer path.""" lam = 3e8 / (freq_GHz * 1e9) Rj, Rt = Rj_km*1e3, Rt_km*1e3 # Jammer signal at radar receiver (one-way) Sj = (Pj * Gj * lam**2) / (4 * np.pi * Rj)**2 # Target echo at radar receiver (two-way) Se = (Pt * Gt * sigma * lam**2) / ((4*np.pi)**3 * Rt**4) js = 10 * np.log10(Sj / Se) return js # G_r cancels (same receive antenna sees both jammer and target)
Electronic Support Measures / SIGINT — Ch. 4
👁 ES Intercept Range
Ch. 4.1- EIRP
- Emitter EIRP = P_t × G_t (W)
- G_es
- ES receive antenna gain
- S_es
- ES receiver sensitivity (W)
- λ
- Wavelength
▶ Python snippet
import numpy as np def es_intercept_range(Pt, Gt, Ges, S_es_dBm, freq_GHz): """ES receiver intercept range — returns km""" lam = 3e8 / (freq_GHz * 1e9) S_es = 10**(S_es_dBm/10) * 1e-3 # dBm → W EIRP = Pt * Gt R = (lam / (4 * np.pi)) * np.sqrt(EIRP * Ges / S_es) return R / 1e3 # ES typically intercepts 2–5× radar's own detection range
📍 TDOA Geolocation Accuracy (CRLB)
Ch. 4.1- σ_t
- Timing measurement noise (seconds)
- c
- Speed of light (3×10⁸ m/s)
- N_obs
- Number of independent TDOA observations
- SNR
- Signal-to-noise ratio at each sensor (linear)
▶ Python snippet
import numpy as np def tdoa_crlb(BW_MHz, snr_dB, N_obs): """Cramér-Rao Lower Bound for TDOA position accuracy.""" B = BW_MHz * 1e6 snr = 10**(snr_dB / 10) c = 3e8 # Timing noise standard deviation (CRLB) sigma_t = 1 / (2 * np.pi * B * np.sqrt(2 * snr)) # Position error sigma_pos = c * sigma_t / np.sqrt(N_obs) return sigma_pos # metres (1σ) # Example: 10 MHz BW, 20 dB SNR, 3 pairs → sub-10m accuracy
Infrared & Electro-Optical Countermeasures — Ch. 10
🌡 Planck's Law — Blackbody Spectral Radiance
Ch. 10.1 Eq.10.1- B(λ,T)
- Spectral radiance (W/m²/sr/m)
- h
- Planck constant = 6.626×10⁻³⁴ J·s
- c
- Speed of light = 3×10⁸ m/s
- k
- Boltzmann constant = 1.381×10⁻²³ J/K
- λ
- Wavelength (μm)
- T
- Temperature (K)
▶ Python snippet
import numpy as np h = 6.626e-34; c = 3e8; k = 1.381e-23 def planck_radiance(lam_um, T): """Spectral radiance of blackbody (W/m²/sr/m). lam_um: wavelength in micrometres, T: temperature in Kelvin""" lam = lam_um * 1e-6 # μm → m B = (2*h*c**2 / lam**5) / (np.exp(h*c/(lam*k*T)) - 1) return B * 1e-6 # → W/m²/sr/μm # Wien's Law peak wavelength wien_peak = 2898 / T # μm
🎯 IR Sensor Detection SNR
Ch. 10.2 Eq.10.41- SNR
- Signal-to-noise ratio (linear)
- η
- Detector quantum efficiency (0–1)
- Φ_s
- Signal photon flux (photons/s)
- Φ_b
- Background photon flux (photons/s)
- N
- Number of detector samples integrated
▶ Python snippet
import numpy as np def ir_detection_snr(phi_s, phi_b, eta, N): """IR detector SNR — background-limited detection model. Returns SNR in dB and detection regime label.""" signal = eta * phi_s * np.sqrt(N) noise = np.sqrt(eta * (phi_s + phi_b)) snr = signal / noise blip = phi_b / phi_s # background-to-signal ratio regime = "BLIP" if blip > 10 else "Shot-noise limited" return 10*np.log10(snr), regime # Detection threshold: SNR > 5–15 dB depending on P_fa requirement
📊 Wien's Displacement Law — Peak Wavelength
Ch. 10.1EW Receivers & Signal Processing — Ch. 11
📻 Receiver Noise Figure & Sensitivity
Ch. 11.1 Eq.11.3- NF
- Noise Figure (dB)
- F
- Noise factor (linear) = SNR_in/SNR_out
- T₀
- Reference temperature = 290 K
- kT₀B
- Thermal noise floor = −174 dBm/Hz at 290 K
▶ Python snippet
import numpy as np def receiver_sensitivity(NF_dB, B_MHz, SNR_min_dB): """Minimum detectable signal power (dBm). kT0 = −174 dBm/Hz at 290 K standard temperature.""" kT0_dBm_Hz = -174.0 S_min = kT0_dBm_Hz + NF_dB + 10*np.log10(B_MHz*1e6) + SNR_min_dB return S_min # Typical superheterodyne EW receiver: NF=6dB, B=10MHz → −108dBm sensitivity # Wide-open receiver: NF=12dB, B=1GHz → −72dBm (much lower sensitivity)
🔧 IQ Imbalance — Image Rejection Ratio
Ch. 11.1 Eq.11.4- α
- Amplitude imbalance (linear ratio, ideal = 1.0)
- φ
- Phase imbalance (degrees, ideal = 0°)
- IRR
- Image Rejection Ratio (dB) — higher is better
▶ Python snippet
import numpy as np def iq_image_rejection(alpha, phi_deg): """Image Rejection Ratio for IQ imbalance. alpha: amplitude imbalance (linear), phi: phase imbalance (degrees).""" phi = np.radians(phi_deg) num = (1 + alpha*np.cos(phi))**2 + (alpha*np.sin(phi))**2 den = (1 - alpha*np.cos(phi))**2 + (alpha*np.sin(phi))**2 irr = 10 * np.log10(num / den) return irr def correct_iq(y, alpha, phi_deg): """Estimate IQ correction using least-squares .""" phi = np.radians(phi_deg) # Correction matrix A = np.array([[1, 0], [-np.sin(phi)/alpha, np.cos(phi)/alpha]]) iq = np.vstack([y.real, y.imag]) corrected = A @ iq return corrected[0] + 1j*corrected[1]
🎖 EW Mission Planner — Operational & Tactical Planning Tool
⚠ Threat System
✈ Own EW Assets
📋 EW Mission Assessment
Configure threat and own-force parameters, then click RUN ASSESSMENT.
📄 EW Mission Brief (OPORD Format)
📡 Integrated Air Defence System (IADS) Threat Reference
EW Terms Glossary