antenna-pnf
A Python utility module for planar near-field (PNF) antenna measurement calculations. It provides helper methods to determine key measurement parameters such as separation distance, sampling spacing, scan length, and angle of view, based on IEEE standards.
Requirements
- Python 3.8+
- No third-party dependencies (uses the standard library
mathmodule only)
Installation
pip install antenna-pnf
Usage
import antenna_pnf as pnf
API Reference
All methods are static and accessible directly on the antenna-pnf class without instantiation.
seperation_distance(frequency, coeff)
Computes an arbitrary separation distance as a multiple of the wavelength.
| Parameter | Type | Unit | Description |
|---|---|---|---|
frequency |
float |
Hz | Frequency of interest |
coeff |
float |
— | Wavelength multiplier coefficient |
Returns: float — separation distance in meters [m]
Formula:
$$R_{nf} = k \times \lambda = k \times c_0 / f$$
d = pnf.seperation_distance(10e9, 10) # 10 wavelengths at 10 GHz
min_seperation_distance(frequency, three_lambda=False)
Returns the minimum recommended separation distance between the antenna under test (AUT) and the probe, per IEEE 1720-2012 Section 5.3.1.4.
| Parameter | Type | Unit | Description |
|---|---|---|---|
frequency |
float |
Hz | Frequency of interest |
three_lambda |
bool |
— | Use 3λ criterion instead of the default 5λ |
Returns: float — minimum separation distance in meters [m]
Formula:
$$R_{nf} = 5 \times \lambda = 5 \times c_0 / f$$
Note: The standard recommends choosing between 3λ and 5λ. The default (5λ) is used to ensure sufficient decoupling between the AUT and the probe. Set
three_lambda=Trueto use the relaxed 3λ criterion.
d_min = pnf.min_seperation_distance(10e9) # 5λ (default)
d_min = pnf.min_seperation_distance(10e9, three_lambda=True) # 3λ
angle_of_view(a, d, L)
Computes the reliable far-field angle-of-view achievable from a planar near-field scan, per IEEE 149-2021 Eq. 99 and IEEE 1720-2012 Eq. 27.
| Parameter | Type | Unit | Description |
|---|---|---|---|
a |
float |
m | Antenna cross-section length |
d |
float |
m | Separation distance between AUT and probe |
L |
float |
m | Scan region length |
Returns: float — angle of view in degrees [deg]
Raises: ValueError — if L <= a (scan length must exceed antenna size)
Formula:
$$\theta = \arctan\left(\frac{L - a}{2d}\right)$$
Note: The scan region is assumed to be centered on the AUT.
theta = pnf.angle_of_view(a=0.3, d=0.15, L=1.2)
sampling_spacing(frequency)
Returns the maximum allowable sampling interval (grid spacing) for a near-field scan, per IEEE 149-2021 and IEEE 1720-2012 Eq. 25.
| Parameter | Type | Unit | Description |
|---|---|---|---|
frequency |
float |
Hz | Frequency of interest |
Returns: float — maximum sampling spacing in meters [m]
Formula:
$$\Delta = \lambda / 2 = 0.5 \times c_0 / f$$
delta = pnf.sampling_spacing(10e9)
scan_length(a, d, theta)
Computes the required scan length to achieve a desired angle-of-view, per IEEE 149-2021 Eq. 99 and IEEE 1720-2012 Eq. 27.
| Parameter | Type | Unit | Description |
|---|---|---|---|
a |
float |
m | Antenna cross-section length |
d |
float |
m | Separation distance between AUT and probe |
theta |
float |
deg | Desired pattern view angle (one side) |
Returns: float — required scan length in the same unit as inputs [m]
Formula:
$$L = 2d \cdot \tan\theta + a$$
Note: The scan region is assumed to be centered on the AUT.
L = pnf.scan_length(a=0.3, d=0.15, theta=45.0)
sampling_parameters_for_length(frequency, L)
Computes the sampling parameters (start position, stop position, count, and spacing) for a planar near-field scan based on the desired minimum scan length.
| Parameter | Type | Unit | Description |
|---|---|---|---|
frequency |
float |
Hz | Frequency of interest |
L |
float |
m | Desired minimum scan length |
Returns: tuple — (Lm, Lp, N, Delta) where Lm is sampling start position in meters [m], Lp is sampling stop position in meters [m], N is sampling count, Delta is spatial sampling length in millimeters [mm]
Note: The scan region is assumed to be centered on the AUT. The sampling spacing is floored to the nearest millimeter, and the scan length is adjusted to ensure proper sampling.
Lm, Lp, N, Delta = pnf.sampling_parameters_for_length(10e9, 1.2)
sampling_parameters_for_angle(frequency, a, d, theta)
Computes the sampling parameters (start position, stop position, count, and spacing) for a planar near-field scan to achieve a desired angle-of-view.
| Parameter | Type | Unit | Description |
|---|---|---|---|
frequency |
float |
Hz | Frequency of interest |
a |
float |
m | Antenna cross-section length |
d |
float |
m | Separation distance between AUT and probe |
theta |
float |
deg | Desired pattern view angle (one side) |
Returns: tuple — (Lm, Lp, N, Delta) where Lm is sampling start position in meters [m], Lp is sampling stop position in meters [m], N is sampling count, Delta is spatial sampling length in millimeters [mm]
Note: The scan region is assumed to be centered on the AUT. This function first computes the required scan length using
scan_length, then determines the sampling parameters.
Lm, Lp, N, Delta = pnf.sampling_parameters_for_angle(10e9, 0.3, 0.15, 45.0)
Usage Example
from antenna-pnf import antenna-pnf
frequency = 10e9 # 10 GHz
# Minimum separation distance (5 wavelengths)
d = pnf.min_seperation_distance(frequency)
print(f"Min separation distance : {d*100:.2f} cm")
# Maximum sampling spacing
delta = pnf.sampling_spacing(frequency)
print(f"Max sampling spacing : {delta*1000:.2f} mm")
# Required scan length for ±45° angle-of-view with a 30 cm antenna
antenna_size = 0.30 # m
L = pnf.scan_length(a=antenna_size, d=d, theta=45.0)
print(f"Required scan length : {L:.4f} m")
# Achieved angle-of-view
theta = pnf.angle_of_view(a=antenna_size, d=d, L=L)
print(f"Angle of view : {theta:.2f} deg")
# Sampling parameters for a desired scan length
Lm, Lp, N, Delta = pnf.sampling_parameters_for_length(9.5e9, 8.730)
print(f"Sampling start position : {Lm:.3f} m")
print(f"Sampling stop position : {Lp:.3f} m")
print(f"Sampling count : {N}")
print(f"Sampling spacing : {Delta} mm")
# Sampling parameters for a desired angle-of-view
Lm, Lp, N, Delta = pnf.sampling_parameters_for_angle(9.5e9, 0.5, 0.15, 60.0)
print(f"Sampling start position : {Lm:.3f} m")
print(f"Sampling stop position : {Lp:.3f} m")
print(f"Sampling count : {N}")
print(f"Sampling spacing : {Delta} mm")
Standards References
| Standard | Title |
|---|---|
| IEEE 149-2021 | Recommended Practice for Antenna Measurements |
| IEEE 1720-2012 | Recommended Practice for Near-Field Antenna Measurements |
Constants
| Symbol | Value | Description |
|---|---|---|
C0 |
299 792 458 m/s | Speed of light in vacuum |
Release files for antenna-pnf 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| antenna_pnf-0.2.0.tar.gz | 5.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| antenna_pnf-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 10.6 kB
Release files / antenna_pnf-0.2.0.tar.gz
| Download URL | antenna_pnf-0.2.0.tar.gz |
|---|---|
| Size | 5.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
74c836a2372717cbbe40d0dbe643ca95f9c42642a532c19f19a907858a858edd
|
|
BLAKE2b-256 checksum How to use checksums |
6cd8b02c3440f8c5ff9295ceca038b8667b99f3e2dbd6eb58f2b0703eaf783d5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
pdm/2.26.7 CPython/3.14.3 Linux/6.17.0-1008-azure
|
Release files / antenna_pnf-0.2.0-py3-none-any.whl
| Download URL | antenna_pnf-0.2.0-py3-none-any.whl |
|---|---|
| Size | 5.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
f4880eca52f095b6452057c371616243150babf57118260fd3e5815d82c542ef
|
|
BLAKE2b-256 checksum How to use checksums |
381fc841ff4ce35aa8a6d4cf3242d7a971f5fa325b9823d520923b8ff4179e0b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
pdm/2.26.7 CPython/3.14.3 Linux/6.17.0-1008-azure
|