Skip to content
RFrftools.io
Satellite Communications30 de abril de 20266 min de leitura

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

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.

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 R0.01R_{0.01} = 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.)

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

  1. As unidades importam.f=20.0 sem * itur.u.GHz assume Hz silenciosamente. O ITU-RPy valida dimensionalmente.
  2. A disponibilidade é% de interrupção, não tempo de atividade %.p=0.01 significa disponibilidade de 99,99% (0,01% do tempo em que a atenuação excede esse valor).
  3. 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, R0.01R_{0.01} ≈ 100 mm/h) — ou substitua o mapa por R001=.
  4. O diâmetro da antena D alimenta 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.
  5. A cintilação é incluída por padrão.atmospheric_attenuation_slant_path a adiciona, a menos que você passe noinclude_scintillation=False . Use return_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 CloudITU-Rpy equivalent
Atenuação da chuva (caminho inclinado)itur.models.itu618.rain_attenuation()
Atenuação específica da chuvaitur.models.itu838.rain_specific_attenuation()
Absorção gasosaitur.models.itu676.gaseous_attenuation_slant_path()
Atenuação da nuvemitur.models.itu840.cloud_attenuation()
Cintilaçãoitur.models.itu618.scintillation_attenuation()
Atenuação totalitur.atmospheric_attenuation_slant_path()
Para qualquer coisa que não seja uma simulação de constelação completa, isso é o que você deseja. Consulte também Migrando do STK Cloud para ver o mapa completo de substituição de ferramentas.

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

Sim O ITU-RPy é a implementação de referência de código aberto das Recomendações P.618, P.676, P.840, P.838, P.837, P.839, P.836 e P.530 da ITU, validadas com base nos próprios vetores de teste da UIT. O rftools Satellite Link Budget Analyzer é uma versão dele e concorda com ele em 0,001% quando ambos usam as mesmas versões de recomendação.
A atenuação da chuva (ITU-R P.618) é apenas o componente da chuva. A atenuação atmosférica total combina chuva, absorção gasosa (P.676), água líquida em nuvem (P.840) e, na chamada padrão do ITU-RPy, cintilação (P.618), conforme especifica a seção 2.5 da P.618. O gás e a nuvem dominam em metas de baixa disponibilidade, como 99%, onde a chuva é pequena; a chuva domina cada vez mais à medida que a meta sobe para 99,99% e além.
outage_minutes_per_year = (outage_pct / 100) * 525.960 minutos. Portanto, disponibilidade de 99,99% = interrupção de 0,01% = 52,6 min/ano. 99,999% = 0,001% de interrupção = 5,3 min/ano. O parâmetro ITU-R p é sempre a porcentagem de interrupção, não a porcentagem de disponibilidade — fonte comum de erros.
O modelo de absorção gasosa ITU-R P.676 é válido de 1 GHz a 1000 GHz. A atenuação da chuva P.618 é especificada para 4-55 GHz. Para banda W (75-110 GHz) e acima, use atenuação de nuvem P.840 + P.676 gasosa; a atenuação de chuva extrapola razoavelmente para missões científicas, mas carece de validação regulatória acima de 55 GHz.
Em uma disponibilidade fixa, a atenuação cresce rapidamente à medida que a elevação diminui — mais rápido do que 1/sin (elevação) em ângulos baixos, porque o caminho passa mais tempo na chuva e no gás. Em Londres, a 20 GHz, a atenuação total excedida em 0,01% do ano é de 11,9 dB a 45° e 28,7 dB a 10°. É por isso que terminais de banda Ka e terminais superiores usam uma máscara de elevação mínima, normalmente de 15—20°.

Artigos Relacionados