Skip to content
RFrftools.io
Satellite Communications30 avril 20266 min de lecture

Création de scripts pour les budgets de liaisons satellites avec ITU-RPy (exemples Python)

Budget de liaison sans STK : balayage de fréquence, disponibilité pluie et élévation en Python pur avec l'implémentation ITU-Rpy de P.618/P.676/P.840.

Sommaire

Pourquoi créer des scripts pour vos budgets de liens

Le rftools Satellite Link Budget Analyzer est conçu pour la conception de scénarios interactifs. Lorsque vous devez faire passer un paramètre sur des centaines de points, pour des études commerciales, l'optimisation d'un plan de fréquence ou l'intégration CI/CD dans votre référentiel de conception de mission, vous avez besoin de Python, pas d'un navigateur.

ITU-RPy est l'implémentation de référence open source des Recommandations UIT-R pour la propagation de la Terre dans l'espace. Le code de propagation de l'analyseur en est un port et correspond à celui-ci à 0,001 % près sur douze sites de test, une fois que les deux sont définis sur les mêmes versions de recommandation (voir la fin de cet article). Cet article présente trois cas d'utilisation scénarisés que vous pouvez intégrer directement dans un bloc-notes Jupyter.

Installer

pip install itur numpy matplotlib

L'UIT-RPy extrait ses propres tableaux de données (cartes des taux de pluie, climatologies à indice de réfraction) du référentiel de l'UIT. La première importation peut prendre environ 5 secondes.

Cas d'utilisation 1 : balayage de fréquence pour une liaison descendante en bande Ka

Vous concevez une liaison descendante de diffusion GEO et souhaitez savoir dans quelle mesure l'atténuation spécifique de la pluie varie de 20 à 40 GHz avec une disponibilité de 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 est humide : la carte P.837-7 donne R0.01R_{0.01} = 51,9 mm/h. À 99,99 % de disponibilité, le script renvoie 25,0 dB d'atténuation totale à 20 GHz — 22,9 dB de pluie — 47,8 dB à 30 GHz et 70,6 dB à 40 GHz. Aucune marge d'atténuation pratique ne couvre celle à 40 GHz. C'est pourquoi les systèmes en bande Ka et en bande Q/V s'appuient sur le contrôle de la puissance des liaisons montantes, le codage adaptatif et la diversité des sites plutôt que sur une marge statique, et situent les disponibilités en bande Q/V bien en dessous de 99,99 %.

Cas d'utilisation 2 : analyse de la disponibilité pour une étude commerciale en cas de pluie

Vous devez choisir entre 99,9 % (526 minutes de panne par an), 99,99 % (53 minutes) et 99,999 % (5 minutes) pour un terminal VSAT. Quel est le coût de la marge de décoloration supplémentaire pour chaque niveau ?

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')

Sortie typique :

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

Passer de 99,99 % à 99,999 % coûte 6,8 dB supplémentaires à 14,5 GHz, soit plus que le passage complet de 99 % à 99,99 %. Pour la plupart des services VSAT, ces neuf derniers ne valent pas le prix du matériel, et le tableau facilite la conversation avec les parties prenantes. (Avec les valeurs par défaut de l'ITU-RPy, ces totaux incluent un petit terme de scintillation ; voir ci-dessous.)

Cas d'utilisation 3 : masque d'altitude — où se ferme le lien à basse altitude ?

Pour une constellation LEO dotée d'une borne terrestre fixe, les passes à basse altitude présentent une atténuation atmosphérique beaucoup plus élevée. Tracez l'atténuation totale en fonction de l'altitude :

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()

À 99,9 %, Londres enregistre 4,9 dB à 45°, 8,3 dB à 20°, 14,2 dB à 10° et 25,0 dB à 5°, soit cinq fois le chiffre de 45°. C'est pourquoi les terminaux en bande Ka LEO utilisent un masque d'élévation minimum de 15 à 20° et dépriorisent les contacts à basse altitude.

Réintroduire la sortie dans l'analyseur rftools

Vous n'avez pas besoin de copier les numéros d'atténuation dans le Satellite Link Budget Analyzer : donnez-lui la latitude et la longitude du site et il lit les mêmes cartes UIT-R et exécute les mêmes méthodes, puis ajoute la courbe de disponibilité et le Monte Carlo. Pour reproduire ses chiffres exactement dans ITU-RPy, faites correspondre les versions recommandées et omettez la scintillation, que l'analyseur ne modélise pas :

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,
)

La valeur par défaut de l'ITU-RPy 0.4.0 est P.840-7 et la polarisation circulaire (tau=45) ; l'analyseur utilise P.840-8 et la polarisation que vous choisissez.

Si vous avez déjà un chiffre d'atténuation obtenu ailleurs et que vous souhaitez tester un budget avec celui-ci, le calculateur de budget RF Link prend la baisse de la pluie et la perte atmosphérique comme entrées simples, et notre point de terminaison POST /api/py/v1/calculate l'accepte avec toutes les entrées, ce qui est pratique pour les pipelines CI qui vérifient la conformité du budget des liens à chaque commit.

Pièges courants

  1. Les unités comptent. f=20.0 sans * itur.u.GHz suppose silencieusement Hz. L'ITU-RPy valide dimensionnellement.
  2. La disponibilité est le % de panne, et non le % de disponibilité. p=0.01 signifie une disponibilité de 99,99 % (0,01 % du temps, l'atténuation dépasse cette valeur).
  3. Le taux de pluie provient de la carte du P.837 lat/lon. P.837-7 ne comporte aucune zone de pluie. Pour tester un site tropical humide, réussissez-en un, par exemple lat=1.35, lon=103.8(Singapour, R0.01R_{0.01} ≈ 100 mm/h) — ou remplacez la carte par R001=.
  4. Le diamètre de l'antenne D alimente le terme de scintillation, qui diminue à mesure que l'ouverture augmente en moyenne sur une plus grande partie de la couche turbulente. Cela n'affecte pas l'atténuation des nuages.
  5. La scintillation est incluse par défaut.atmospheric_attenuation_slant_path l'ajoute sauf si vous passez leinclude_scintillation=False . Utilisez return_contributions=Truepour voir séparément le gaz, les nuages, la pluie et les scintillations.

Remplacement du module de communication de STK Cloud

La suite Comm/Radar de STK Cloud a intégré ces calculs UIT-R dans une interface utilisateur. Pour les scripts, ITU-RPy est l'implémentation de référence qu'ils auraient appelée. Migration :

Communication dans le cloud STKITU-Rpy equivalent
Atténuation de la pluie (trajectoire inclinée)itur.models.itu618.rain_attenuation()
Atténuation spécifique de la pluieitur.models.itu838.rain_specific_attenuation()
Absorption de gazitur.models.itu676.gaseous_attenuation_slant_path()
Atténuation des nuagesitur.models.itu840.cloud_attenuation()
Scintillationitur.models.itu618.scintillation_attenuation()
Atténuation totaleitur.atmospheric_attenuation_slant_path()
Pour tout ce qui n'est pas une simulation complète de constellation, c'est ce qu'il vous faut. Consultez également Migration depuis STK Cloud pour obtenir la carte complète des remplacements d'outils.

Lectures complémentaires

Mise à jour 2026-09-19: les chiffres d'atténuation ci-dessus ont été recalculés avec ITU-RPy 0.4.0. Les valeurs précédentes sous-estimaient d'un ordre de grandeur la pluie dans la bande Ka à Atlanta, et les notes sur le diamètre de l'antenne, la scintillation et les chiffres d'alimentation de l'analyseur étaient erronées.

Foire Aux Questions

Oui L'UIT-RPy est l'implémentation de référence open source des Recommandations UIT-R P.618, P.676, P.840, P.838, P.837, P.839, P.836 et P.530, validées par rapport aux vecteurs de test propres à l'UIT. L'analyseur de budget de liaison satellite rftools en est un port et est d'accord avec celui-ci à 0,001 % près lorsque les deux utilisent les mêmes versions de recommandation.
L'atténuation de la pluie (UIT-R P.618) n'est que la composante de la pluie. L'atténuation atmosphérique totale combine la pluie, l'absorption de gaz (P.676), l'eau liquide des nuages (P.840) et, selon l'appel par défaut de l'ITU-RPy, la scintillation (P.618), comme le précise la section 2.5 de la section P.618. Le gaz et les nuages dominent aux objectifs de faible disponibilité tels que 99 %, lorsque la pluie est faible ; la pluie domine de plus en plus à mesure que la cible s'élève vers 99,99 % et au-delà.
outage_minutes_per_year = (outage_pct / 100) * 525 960 minutes. Donc 99,99 % de disponibilité = 0,01 % de panne = 52,6 min/an. 99,999 % = 0,001 % de panne = 5,3 min/an. Le paramètre ITU-R p est toujours le pourcentage de panne, et non le pourcentage de disponibilité, source fréquente d'erreurs.
Le modèle d'absorption gazeuse ITU-R P.676 est valide de 1 GHz à 1000 GHz. L'atténuation de la pluie P.618 est spécifiée pour 4 à 55 GHz. Pour la bande W (75-110 GHz) et plus, utilisez l'atténuation nuageuse P.840 + P.676 gazeux ; l'atténuation de la pluie extrapole raisonnablement pour les missions scientifiques mais ne dispose pas de validation réglementaire au-delà de 55 GHz.
À disponibilité fixe, l'atténuation augmente rapidement à mesure que l'altitude baisse, plus rapidement que 1/sin (altitude) à faible angle, car la trajectoire passe plus de temps sous la pluie et le gaz. À Londres à 20 GHz, l'atténuation totale supérieure à 0,01 % de l'année est de 11,9 dB à 45° et de 28,7 dB à 10°. C'est pourquoi les terminaux en bande Ka et supérieurs utilisent un masque d'élévation minimum, généralement de 15 à 20°.

Articles connexes