Criando scripts de orçamentos de links de satélite com ITU-RPy (exemplos em Python)
Orçamentos de enlace sem STK: varra frequência, disponibilidade sob chuva e elevação em Python puro com o ITU-Rpy (P.618/P.676/P.840).
Conteúdo
- Por que criar um script para seus orçamentos de links
- Instalar
- 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. O código de propagação do analisador é uma versão dele e concorda com ele em 0,001% em doze locais de teste, uma vez que ambos estão configurados para as mesmas versões de recomendação (veja o final desta postagem). Esta postagem mostra três casos de uso com script que você pode transferir diretamente para um notebook Jupyter.Instalar
pip 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.
Caso 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 (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á úmida: the P.837-7 map fornece = 51,9 mm/h. Com disponibilidade de 99,99%, o script retorna 25,0 dB de atenuação total a 20 GHz — 22,9 dB de chuva — 47,8 dB a 30 GHz e 70,6 dB a 40 GHz. Nenhuma margem de redução prática cobre a de 40 GHz, e é por isso que os sistemas de banda Ka e Q/V dependem de controle de potência de uplink, codificação adaptativa e diversidade de sites, em vez de margem estática, e cotam disponibilidades de banda Q/V bem abaixo de 99,99%.
Caso de uso 2: varredura de disponibilidade para um estudo comercial ininterrupto
Você precisa decidir entre 99,9% (526 minutos de interrupção por ano), 99,99% (53 minutos) e 99,999% (5 minutos) para um terminal VSAT. 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 # 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')
Saída 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
Passar de 99,99% para 99,999% custa outros 6,8 dB a 14,5 GHz — mais do que toda a etapa de 99% para 99,99%. Para a maioria dos serviços VSAT, os nove últimos não valem o hardware, e a tabela facilita a conversa com as partes interessadas. (Com os padrões do ITU-RPy, esses totais incluem um pequeno termo de cintilação; veja abaixo.)
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,
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()
Com 99,9%, Londres vê 4,9 dB a 45°, 8,3 dB a 20°, 14,2 dB a 10° e 25,0 dB a 5° — cinco vezes o valor de 45°. É por isso que os terminais LEO de banda Ka usam uma máscara de elevação mínima de 15—20° e despriorizam os contatos de baixa elevação.
Alimentando a saída de volta para o rftools Analyzer
Você não precisa copiar os números de atenuação para o Satellite Link Budget Analyzer: forneça a latitude e a longitude do site e ele lê os mesmos mapas ITU-R e executa os mesmos métodos, depois adiciona a curva de disponibilidade e o Monte Carlo. Para reproduzir seus números exatamente no ITU-RPy, combine as versões da Recomendação e omita a cintilação, que o analisador não 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,
)
O padrão do ITU-RPy 0.4.0 é P.840-7 e a polarização circular (tau=45); o analisador usa P.840-8 e a polarização que você escolher.
Se você já tem um valor de atenuação de outro lugar e deseja testar um orçamento com ele, a calculadora de orçamento RF Link considera o desbotamento da chuva e a perda atmosférica como entradas simples, e nosso endpoint POST /api/py/v1/calculate o aceita com todas as entradas — útil para pipelines de CI que verificam o orçamento de links conformidade em cada compromisso.
Pegadinhas comuns
- As unidades importam.
f=20.0sem* itur.u.GHzassume Hz silenciosamente. 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 taxa de chuva vem do mapa P.837 em lat/lon. P.837-7 não tem zonas de chuva. Para testar um local tropical úmido, passe por um, por exemplo,
lat=1.35, lon=103.8(Cingapura, ≈ 100 mm/h) — ou substitua o mapa porR001=. - O diâmetro da antena
Dalimenta o termo cintilação, que cai à medida que a média da abertura atinge uma maior parte da camada turbulenta. Isso não afeta a atenuação da nuvem. - A cintilação é incluída por padrão.
atmospheric_attenuation_slant_patha adiciona, a menos que você passe noinclude_scintillation=False. Usereturn_contributions=Truepara ver gás, nuvem, chuva e cintilação separadamente.
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:
| Comunicação STK Cloud | ITU-Rpy equivalent |
|---|---|
| Atenuação da chuva (caminho inclinado) | itur.models.itu618.rain_attenuation() |
| Atenuação específica da chuva | itur.models.itu838.rain_specific_attenuation() |
| Absorção gasosa | itur.models.itu676.gaseous_attenuation_slant_path() |
| Atenuação da nuvem | itur.models.itu840.cloud_attenuation() |
| Cintilação | itur.models.itu618.scintillation_attenuation() |
| Atenuação total | itur.atmospheric_attenuation_slant_path() |
Leitura adicional
Atualizado 2026-09-19: os valores de atenuação acima foram recalculados com o ITU-RPy 0.4.0. Valores anteriores subestimaram a chuva da banda Ka em Atlanta em uma ordem de magnitude, e as notas sobre diâmetro da antena, cintilação e números de alimentação no analisador estavam erradas.Perguntas Frequentes
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.
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, slant range, ground-station G/T, propagation losses and Monte Carlo margin.
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 free open-source replacements for what it did best: ITU-R link budgets and orbital pass prediction.
29 de abr. de 2026