Creación de scripts para presupuestos de enlaces satelitales con ITU-RPY (ejemplos de Python)
Automatice presupuestos de enlace sin STK: barra frecuencia, disponibilidad frente a lluvia y elevación en Python con ITU-Rpy (P.618/P.676/P.840).
Contenido
- Por qué crear scripts para tus presupuestos de enlaces
- Instalar
- Caso práctico 1: barrido de frecuencia para un enlace descendente en banda Ka
- Caso práctico 2: un barrido de disponibilidad para un estudio comercial a corto plazo
- Caso práctico 3: máscara de elevación: ¿dónde se cierra el enlace a baja altitud?
- Devolviendo la salida al analizador rftools
- Errores comunes
- Sustituir el módulo de comunicación de STK Cloud
- Lecturas adicionales
Por qué crear scripts para tus presupuestos de enlaces
El rftools Satellite Link Budget Analyzer está diseñado para el diseño interactivo de escenarios. Cuando necesita analizar un parámetro en cientos de puntos (para realizar estudios comerciales, optimizar planes de frecuencia o integrar la CI/CD en su repositorio de diseño de misiones), lo que necesita es Python, no un navegador.
ITU-RPY es la implementación de referencia de código abierto de las Recomendaciones del UIT-R para la propagación Tierra-espacio. El código de propagación del analizador es una adaptación de la misma y coincide con él en un 0,001% en doce sitios de prueba, una vez que ambos estén configurados con las mismas versiones de la Recomendación (véase al final de esta entrada). En este artículo se muestran tres casos de uso basados en scripts que puedes trasladar directamente a un cuaderno de Jupyter.Instalar
pip install itur numpy matplotlib
La UIT-Rpy extrae sus propias tablas de datos (mapas de tasas de lluvia, climatologías de índice de refracción) del repositorio de la UIT. La primera importación puede tardar unos 5 segundos.
Caso práctico 1: barrido de frecuencia para un enlace descendente en banda Ka
Estás diseñando un enlace descendente para una transmisión GEO y quieres saber cómo varía la atenuación específica de la lluvia de 20 a 40 GHz con una disponibilidad del 99,99%.
import itur
import itur.models as m
import numpy as np
import matplotlib.pyplot as plt
# Ground station: Atlanta, GA
lat, lon = 33.75, -84.39
elevation_deg = 45.0
availability_pct = 0.01 # 0.01% outage → 99.99% availability
freqs = np.linspace(20, 40, 21) # GHz
attenuations = []
for f in freqs:
a = itur.atmospheric_attenuation_slant_path(
lat=lat, lon=lon,
f=f * itur.u.GHz,
el=elevation_deg,
p=availability_pct,
D=1.2 * itur.u.m, # antenna diameter (used for the scintillation term)
hs=0.3 * itur.u.km,
)
attenuations.append(float(a.value))
plt.plot(freqs, attenuations)
plt.xlabel('Frequency (GHz)')
plt.ylabel('Total atmospheric attenuation (dB)')
plt.title(f'Ka-band slant path, {availability_pct}% outage, Atlanta 45° elevation')
plt.grid(True)
plt.show()
Atlanta es húmeda: el mapa P.837-7 arroja = 51,9 mm/h. Con una disponibilidad del 99,99%, el script devuelve 25,0 dB de atenuación total a 20 GHz (22,9 dB si llueve), 47,8 dB a 30 GHz y 70,6 dB a 40 GHz. Ningún margen de atenuación práctico cubre eso a 40 GHz, razón por la cual los sistemas de banda Ka y Q/V se basan en el control de potencia del enlace ascendente, la codificación adaptativa y la diversidad de sitios en lugar de en el margen estático, y cotizan una disponibilidad de banda Q/V muy por debajo del 99,99%.
Caso práctico 2: un barrido de disponibilidad para un estudio comercial a corto plazo
Debes decidir entre un 99,9% (526 minutos de interrupción al año), un 99,99% (53 minutos) y un 99,999% (5 minutos) para un terminal VSAT. ¿Cuánto margen de atenuación adicional cuesta cada nivel?
availabilities = [1.0, 0.1, 0.01, 0.001] # 99% through 99.999%
freq = 14.5 # Ku-band uplink
lat, lon = 42.0, -3.0 # northern Spain (P.837-7 R0.01 = 26.7 mm/h)
print(f'{"Availability":14s} {"Outage/yr":12s} {"Total Atten":12s}')
print('-' * 40)
for p in availabilities:
a = itur.atmospheric_attenuation_slant_path(
lat=lat, lon=lon,
f=freq * itur.u.GHz,
el=30.0,
p=p,
D=1.0 * itur.u.m, # required: antenna diameter for the scintillation term
)
outage_min = p / 100 * 365.25 * 24 * 60
pct = 100 - p
print(f'{pct:9.3f} % {outage_min:9.1f} min {float(a.value):8.2f} dB')
Salida típica:
Availability Outage/yr Total Atten
----------------------------------------
99.000 % 5259.6 min 0.89 dB
99.900 % 526.0 min 2.22 dB
99.990 % 52.6 min 5.96 dB
99.999 % 5.3 min 12.75 dB
Pasar del 99,99% al 99,999% cuesta otros 6,8 dB a 14,5 GHz, más que todo el paso del 99% al 99,99%. Para la mayoría de los servicios de VSAT, los últimos nueve no valen la pena, y la tabla facilita la conversación con las partes interesadas. (Con los valores predeterminados de ITU-RPY, estos totales incluyen un pequeño término de centelleo; véase más adelante).
Caso práctico 3: máscara de elevación: ¿dónde se cierra el enlace a baja altitud?
En el caso de una constelación LEO con una terminal terrestre fija, los pasos a baja altitud tienen una atenuación atmosférica mucho mayor. Grafique la atenuación total frente a la elevación:
elevations = np.arange(5, 85, 5)
attens = []
for el in elevations:
a = itur.atmospheric_attenuation_slant_path(
lat=51.5, lon=-0.1, # London
f=20.0 * itur.u.GHz,
el=el,
p=0.1,
D=1.0 * itur.u.m,
)
attens.append(float(a.value))
plt.plot(elevations, attens)
plt.xlabel('Elevation angle (deg)')
plt.ylabel('Total attenuation (dB) at 20 GHz, 99.9%')
plt.title('Atmospheric + rain attenuation vs elevation — London')
plt.grid(True)
plt.show()
Con un 99,9%, Londres registra 4,9 dB a 45°, 8,3 dB a 20°, 14,2 dB a 10° y 25,0 dB a 5°, cinco veces la cifra de 45°. Por eso, los terminales LEO en la banda Ka utilizan una máscara de elevación mínima de 15 a 20° y restan prioridad a los contactos de baja elevación.
Devolviendo la salida al analizador rftools
No es necesario copiar los números de atenuación en el Satellite Link Budget Analyzer: indícale la latitud y la longitud del sitio, leerá los mismos mapas del UIT-R y utilizará los mismos métodos, y luego añadirá la curva de disponibilidad y el Montecarlo. Para reproducir sus números exactamente en ITU-RPY, haga coincidir las versiones de la Recomendación y omita el centelleo, que el analizador no modela:
from itur.models import itu618, itu676, itu836, itu837, itu838, itu839, itu840, itu1510, itu1511
itu618.change_version(13); itu676.change_version(12); itu836.change_version(6)
itu837.change_version(7); itu838.change_version(3); itu839.change_version(4)
itu840.change_version(8); itu1510.change_version(1); itu1511.change_version(1)
ag, ac, ar, _, _ = itur.atmospheric_attenuation_slant_path(
lat, lon, f * itur.u.GHz, el, p, 1.0 * itur.u.m,
tau=0, # horizontal; 90 vertical, 45 circular
return_contributions=True, include_scintillation=False,
)
El ITU-RPy 0.4.0 tiene por defecto P.840-7 y la polarización circular (tau=45); el analizador utiliza P.840-8 y la polarización que elija.
Si ya tienes una cifra de atenuación de otro lugar y quieres probar un presupuesto con ella, la calculadora de presupuesto de RF Link toma la atenuación por lluvia y las pérdidas atmosféricas como entradas simples, y nuestro punto final POST /api/py/v1/calculate la acepta con todas las entradas, lo que resulta práctico para las canalizaciones de CI que comprueban el cumplimiento del presupuesto de enlaces en cada compromiso.
Errores comunes
- Las unidades importan.
f=20.0sin* itur.u.GHzasume silenciosamente Hz. ITU-RPY valida dimensionalmente. - La disponibilidad es el% de interrupciones, no el% de tiempo de actividad.
p=0.01significa una disponibilidad del 99,99% (el 0,01% del tiempo en el que la atenuación supera ese valor). - La tasa de lluvia proviene del mapa P.837 a latitud/lon. P.837-7 no tiene zonas de lluvia. Para probar un sitio tropical húmedo, supere uno, por ejemplo,
lat=1.35, lon=103.8(Singapur, ≈ 100 mm/h), o anule el mapa conR001=. - El diámetro de la antena
Dindica el término de centelleo, que disminuye a medida que la apertura promedia sobre una mayor parte de la capa turbulenta. No afecta a la atenuación de las nubes. - El centelleo está incluido de forma predeterminada. El
atmospheric_attenuation_slant_pathlo añade a menos que superes elinclude_scintillation=False. Usareturn_contributions=Truepara ver el gas, las nubes, la lluvia y el centelleo por separado.
Sustituir el módulo de comunicación de STK Cloud
La suite Comm/Radar de STK Cloud incluyó estos cálculos del ITU-R en una interfaz de usuario. Para la creación de scripts, ITU-rpy es la implementación de referencia a la que habrían llamado. Migración:
| STK Cloud Comm | ITU-Rpy equivalent |
|---|---|
| Atenuación por lluvia (trayectoria inclinada) | itur.models.itu618.rain_attenuation() |
| Atenuación específica de la lluvia | itur.models.itu838.rain_specific_attenuation() |
| Absorción gaseosa | itur.models.itu676.gaseous_attenuation_slant_path() |
| Atenuación de nubes | itur.models.itu840.cloud_attenuation() |
| Centelleo | itur.models.itu618.scintillation_attenuation() |
| Atenuación total | itur.atmospheric_attenuation_slant_path() |
Lecturas adicionales
Actualizado el 2026-09-19: las cifras de atenuación anteriores se recalcularon con la versión 0.4.0 de ITU-rpy. Los valores anteriores subestimaron en un orden de magnitud la lluvia en banda Ka en Atlanta, y las notas sobre el diámetro de la antena, el centelleo y los números de alimentación del analizador eran incorrectos.Preguntas Frecuentes
Artículos Relacionados
Building a Ground-Station Pass Schedule with Skyfield
Ansys STK sunset-ready: compute SGP4 pass predictions for your amateur-radio or cubesat ground station using Skyfield.
30 abr 2026
Satellite CommunicationsSizing a 9600-baud UHF Downlink for a 3U CubeSat: Full Walkthrough
End-to-end link budget for an amateur-band 3U cubesat: EIRP, slant range, ground-station G/T, propagation losses and Monte Carlo margin.
29 abr 2026
Satellite CommunicationsMigrating from STK Cloud: Free Alternatives for Link Budget and Orbit Analysis
Ansys is sunsetting STK Cloud in March 2026. Here are free open-source replacements for what it did best: ITU-R link budgets and orbital pass prediction.
29 abr 2026