直连链路速率 (Mbps),由链路预算引擎驱动(含大气衰减)。 替代原 base_rate × exp(-d/k) 经验公式, 使用 FSPL/EIRP/G-T/C-N0 推导物理上准确的可达速率; 通过仰角与地面站降雨率叠加 ITU-R P.838/P.618 大气衰减。
(sat_pos, gs, data_type=None)
| 307 | |
| 308 | |
| 309 | def calculate_direct_rate(sat_pos, gs, data_type=None): |
| 310 | """直连链路速率 (Mbps),由链路预算引擎驱动(含大气衰减)。 |
| 311 | |
| 312 | 替代原 base_rate × exp(-d/k) 经验公式, |
| 313 | 使用 FSPL/EIRP/G-T/C-N0 推导物理上准确的可达速率; |
| 314 | 通过仰角与地面站降雨率叠加 ITU-R P.838/P.618 大气衰减。 |
| 315 | """ |
| 316 | gs_lat = gs["lat"] |
| 317 | gs_lon = gs["lon"] |
| 318 | gs_alt_m = gs.get("alt", 0.0) |
| 319 | sat_alt_m = sat_pos.get("alt", 500e3) |
| 320 | |
| 321 | # 精确计算仰角(用于大气衰减路径折算) |
| 322 | look = compute_look_angles( |
| 323 | sat_lat=sat_pos["lat"], |
| 324 | sat_lon=sat_pos["lon"], |
| 325 | sat_alt_m=sat_alt_m, |
| 326 | gs_lat=gs_lat, |
| 327 | gs_lon=gs_lon, |
| 328 | gs_alt_m=gs_alt_m, |
| 329 | ) |
| 330 | elevation_deg = look["elevation_deg"] |
| 331 | dist_km = look["slant_range_km"] if look["slant_range_km"] > 0 else _slant_range_km( |
| 332 | sat_pos, {"lat": gs_lat, "lon": gs_lon, "alt": gs_alt_m} |
| 333 | ) |
| 334 | |
| 335 | antenna_type = gs.get("antenna_type", "Ka") |
| 336 | # 地面站可配置降雨率场景(默认晴天) |
| 337 | rainfall_rate_mm_h = gs.get("rainfall_rate_mm_h", 0.0) |
| 338 | gs_altitude_km = gs_alt_m / 1000.0 |
| 339 | |
| 340 | result = link_budget_direct( |
| 341 | distance_km=dist_km, |
| 342 | antenna_type=antenna_type, |
| 343 | data_type=data_type, |
| 344 | elevation_deg=elevation_deg, |
| 345 | rainfall_rate_mm_h=rainfall_rate_mm_h, |
| 346 | gs_altitude_km=gs_altitude_km, |
| 347 | ) |
| 348 | return max(result.achievable_rate_mbps, 5.0) |
| 349 | |
| 350 | |
| 351 | def calculate_relay_rate(sat_pos, geo_pos, gs, data_type=None): |