Criando scripts de orçamentos de links de satélite com ITU-RPy (exemplos em Python)
Automação de orçamento de links sem STK: frequência de varredura, disponibilidade de chuva e elevação em Python puro usando a implementação de referência ITU-Rpy de P.618/P.676/P.840. Companheiro do rftools Satellite Link Budget Analyzer.
Conteúdo
- Por que criar um script para seus orçamentos de links
- Instalar```bash
- Caso de uso 1: varredura de frequência para um downlink de banda Ka
- Caso de uso 2: varredura de disponibilidade para um estudo comercial ininterrupto
- Caso de uso 3: máscara de elevação — onde o link se fecha em baixa elevação?
- Alimentando a saída de volta para o rftools Analyzer
- Pegadinhas comuns
- Substituindo o módulo Comm da STK Cloud
- Leitura adicional
Por que criar um script para seus orçamentos de links
O rftools Satellite Link Budget Analyzer foi criado para design de cenários interativos. Quando você precisa varrer um parâmetro em centenas de pontos — para estudos comerciais, otimização do plano de frequência ou integração de CI/CD em seu repositório de design de missão — você quer Python, não um navegador.
ITU-Rpy é a implementação de referência de código aberto das Recomendações do ITU-R para propagação no espaço terrestre. Nosso back-end se alinha a ele. Esta postagem mostra três casos de uso com script que você pode transferir diretamente para um notebook Jupyter.Instalarpip install itur numpy matplotlib
O ITU-RPy extrai suas próprias tabelas de dados (mapas de taxa de chuva, climatologias de índice de refração) do repositório da UIT. A primeira importação pode levar cerca de 5 segundos.
pip install itur numpy matplotlibCaso de uso 1: varredura de frequência para um downlink de banda Ka
Você está projetando um downlink de transmissão GEO e quer saber como a atenuação específica da chuva varia de 20 a 40 GHz com disponibilidade 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 (affects cloud attenuation)
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()Na banda Ka sobre a zona climática de Atlanta (zona de chuva K da ITU-R), 20 GHz vê cerca de 2-3 dB de atenuação atmosférica total em 99,99%. Em 40 GHz, isso sobe para 15-20 dB — e é por isso que as emissoras de banda Ka normalmente alocam 5-6 dB de margem de controle de potência de uplink além da nominal.
Caso de uso 2: varredura de disponibilidade para um estudo comercial ininterrupto
Você precisa decidir entre 99,9% (interrupção de 80 minutos/ano), 99,99% (52 minutos de interrupção/ano) e 99,999% (interrupção de 5 minutos/ano) para um VSAT marítimo. Quanto custa cada nível de margem extra de redução?
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 # Bay of Biscay, typical rain zone M
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,
)
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')Saída típica:Availability Outage/yr Total Atten
----------------------------------------
99.000 % 5259.6 min 1.48 dB
99.900 % 525.9 min 3.21 dB
99.990 % 52.6 min 6.58 dB
99.999 % 5.3 min 11.42 dBPassar de 99,99% para 99,999% custa cerca de 5 dB na banda Ku — o que, para a maioria dos casos de uso marítimo, não vale o orçamento de hardware. A tabela de estudos comerciais facilita a conversa com as partes interessadas.
Caso de uso 3: máscara de elevação — onde o link se fecha em baixa elevação?
Para uma constelação LEO com um terminal terrestre fixo, passagens de baixa elevação têm uma atenuação atmosférica muito maior. Traçar atenuação total versus elevação:
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,
)
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()Em uma elevação de 5°, você vê de 8 a 10 dB a mais do que em 45° — e é por isso que os terminais LEO de banda Ka usam uma máscara de elevação mínima de 15 a 20° e despriorizam contatos de baixa elevação.
Alimentando a saída de volta para o rftools Analyzer
Depois de ter um número de atenuação em script, conecte-o ao Satellite Link Budget Analyzer comorainFadeouatmosphericLoss, execute o Monte Carlo e copie a URL do cenário para compartilhamento. Nosso backend usa os mesmos modelos ITU-R para que os resultados correspondam com precisão de ponto flutuante.
Para testes de regressão automatizados, nosso endpoint POST /api/py/v1/calculate aceita a calculadorarf-link-budgetcom todas as entradas — perfeita para pipelines de CI que verificam a conformidade do orçamento de links em cada confirmação.
Pegadinhas comuns
- As unidades importam.
f=20.0sem* itur.u.GHzassume silenciosamente Hz. O ITU-RPy valida dimensionalmente. - A disponibilidade é% de interrupção, não tempo de atividade %.
p=0.01significa disponibilidade de 99,99% (0,01% do tempo em que a atenuação excede esse valor). - A zona de chuva é derivada de lat/lon. Você não pode substituí-la — se estiver testando para a Zona P (na pior das hipóteses tropicais), você deve passar um lat/lon nessa zona, por exemplo,
lat=1.3, lon=103.8(Cingapura). - A atenuação da nuvem precisa do diâmetro da antena. Antenas maiores têm feixes mais estreitos e apresentam menos atenuação da nuvem em dB.
- A cintilação é uma função separada. Use
itur.models.itu618.scintillation_attenuation()— ela não está incluída na chamada padrão doatmospheric_attenuation_slant_path.
Substituindo o módulo Comm da STK Cloud
O pacote Comm/Radar da STK Cloud envolveu esses cálculos do ITU-R em uma interface de usuário. Para scripts, o ITU-RPy é a implementação de referência que eles teriam chamado. Migração:
| STK Cloud Comm | Equivalente ao ITU-RPy |
|---|---|
| Modelo de atenuação da chuva | itur.models.itu838.specific_attenuation() |
| Absorção gasosa | itur.models.itu676.gaseous_attenuation_slant_path() |
| Atenuação da nuvem | itur.models.itu840.columnar_content_reduced_liquid() |
| Cintilação | itur.models.itu618.scintillation_attenuation() |
| Atenuação total | itur.atmospheric_attenuation_slant_path() |
Leitura adicional
Artigos 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. Full Python walkthrough with TLE fetch, elevation masks, Doppler, and iCalendar export.
30 de abr. de 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, ground-station G/T, ITU-R propagation losses, and Monte Carlo availability. Uses the Amateur CubeSat preset.
29 de abr. de 2026
Satellite CommunicationsMigrating from STK Cloud: Free Alternatives for Link Budget and Orbit Analysis
Ansys is sunsetting STK Cloud in March 2026. Here are the free open-source replacements for the two things it did best — ITU-R link budgets and orbital pass prediction.
29 de abr. de 2026