Source code for radarx.fundamentals.principles
"""
Radar Principles
================
Core physical and theoretical principles in radar meteorology.
.. autosummary::
:nosignatures:
:toctree: generated/
radar_range
compute_nyquist_velocity
compute_range_resolution
compute_doppler_shift
compute_snr
References
----------
- Rinehart, R. E. (2004). Radar for Meteorologists. 4th ed. Rinehart Publications.
- Doviak, R. J., & Zrnić, D. S. (1993). Doppler Radar and Weather Observations. Academic Press.
"""
__all__ = [
"compute_doppler_shift",
"compute_nyquist_velocity",
"compute_range_resolution",
"compute_snr",
"doppler_frequency_shift",
"radar_range",
"range_resolution",
"round_trip_time",
"snr",
]
import numpy as np
from .constants import C, K_BOLTZMANN
def _compute_numerator(transmit_power, gain, wavelength, rcs):
return transmit_power * gain**2 * wavelength**2 * rcs
def _compute_denominator(system_loss, min_detectable_power):
return (4 * np.pi) ** 3 * system_loss * min_detectable_power
[docs]
def radar_range(
transmit_power, gain, wavelength, rcs, system_loss, min_detectable_power
):
"""
Compute maximum radar detection range using the radar range equation.
Parameters
----------
transmit_power : float
Transmitted power [W]
gain : float
Antenna gain (linear, not dB)
wavelength : float
Radar wavelength [m]
rcs : float
Radar cross-section [m^2]
system_loss : float
System loss factor (linear, not dB)
min_detectable_power : float
Minimum detectable signal power [W]
Returns
-------
float
Maximum radar range [m]
References
----------
- Rinehart (2004), Eq. 2.1
- Doviak and Zrnić (1993), Section 3.2
"""
numerator = _compute_numerator(transmit_power, gain, wavelength, rcs)
denominator = _compute_denominator(system_loss, min_detectable_power)
return (numerator / denominator) ** 0.25
[docs]
def compute_nyquist_velocity(prf, wavelength):
"""
Compute the Nyquist velocity for Doppler radar.
Parameters
----------
prf : float
Pulse repetition frequency [Hz]
wavelength : float
Radar wavelength [m]
Returns
-------
float
Nyquist velocity [m/s]
References
----------
- Doviak and Zrnić (1993), Section 6.3.1
"""
return wavelength * prf / 4
[docs]
def compute_range_resolution(pulse_width):
"""
Compute the radar range resolution.
Parameters
----------
pulse_width : float
Pulse width [s]
Returns
-------
float
Range resolution [m]
References
----------
- Rinehart (2004), Eq. 2.6
"""
return C * pulse_width / 2
[docs]
def compute_doppler_shift(velocity, wavelength):
"""
Compute Doppler frequency shift.
Parameters
----------
velocity : float
Target radial velocity [m/s]
wavelength : float
Radar wavelength [m]
Returns
-------
float
Doppler shift [Hz]
References
----------
- Doviak and Zrnić (1993), Eq. 6.2.1
"""
return 2 * velocity / wavelength
[docs]
def compute_snr(power_received, noise_bandwidth, system_temp):
"""
Compute signal-to-noise ratio (SNR).
Parameters
----------
power_received : float
Received signal power [W]
noise_bandwidth : float
Noise bandwidth [Hz]
system_temp : float
System temperature [K]
Returns
-------
float
Signal-to-noise ratio (linear)
References
----------
- Doviak and Zrnić (1993), Eq. 3.1.12
"""
noise_power = K_BOLTZMANN * system_temp * noise_bandwidth
return power_received / noise_power
def range_resolution(pulse_width):
"""
Alias for compute_range_resolution for compatibility.
Parameters
----------
pulse_width : float
Pulse width [s]
Returns
-------
float
Range resolution [m]
"""
return compute_range_resolution(pulse_width)
def snr(signal, noise):
"""
Compute signal-to-noise ratio in linear scale.
Parameters
----------
signal : float
Signal power [W]
noise : float
Noise power [W]
Returns
-------
float
SNR (linear)
"""
return signal / noise
def doppler_frequency_shift(v_radial, wavelength):
"""
Compute Doppler frequency shift given radial velocity and wavelength.
Parameters
----------
v_radial : float
Radial velocity [m/s]
wavelength : float
Radar wavelength [m]
Returns
-------
float
Doppler frequency shift [Hz]
"""
return 2 * v_radial / wavelength
def round_trip_time(distance):
"""
Compute round trip time for a given distance.
Parameters
----------
distance : float
Distance to the target [m]
Returns
-------
float
Time for signal to travel to the target and back [s]
"""
return 2 * distance / C