惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

L
LINUX DO - 最新话题
MyScale Blog
MyScale Blog
月光博客
月光博客
S
SegmentFault 最新的问题
C
CERT Recently Published Vulnerability Notes
P
Proofpoint News Feed
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
人人都是产品经理
人人都是产品经理
K
Kaspersky official blog
Forbes - Security
Forbes - Security
宝玉的分享
宝玉的分享
爱范儿
爱范儿
V
Visual Studio Blog
博客园 - 聂微东
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
N
News and Events Feed by Topic
阮一峰的网络日志
阮一峰的网络日志
V
V2EX
The Cloudflare Blog
Attack and Defense Labs
Attack and Defense Labs
美团技术团队
L
LangChain Blog
NISL@THU
NISL@THU
IT之家
IT之家
T
Tor Project blog
云风的 BLOG
云风的 BLOG
Security Latest
Security Latest
Apple Machine Learning Research
Apple Machine Learning Research
Cisco Talos Blog
Cisco Talos Blog
I
InfoQ
Help Net Security
Help Net Security
Engineering at Meta
Engineering at Meta
Know Your Adversary
Know Your Adversary
I
Intezer
Recent Commits to openclaw:main
Recent Commits to openclaw:main
TaoSecurity Blog
TaoSecurity Blog
P
Palo Alto Networks Blog
GbyAI
GbyAI
Last Week in AI
Last Week in AI
T
Threat Research - Cisco Blogs
T
The Exploit Database - CXSecurity.com
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
博客园 - Franky
L
Lohrmann on Cybersecurity
The Register - Security
The Register - Security
W
WeLiveSecurity
Recorded Future
Recorded Future
大猫的无限游戏
大猫的无限游戏
AWS News Blog
AWS News Blog
G
GRAHAM CLULEY

Все публикации подряд на Хабре

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Шесть основ бизнес-анализа: начинаем с вопроса «Кто в игре?» Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче OSWE в 2025 Почему комната управления реактором покрашена в цвет морской пены 4 YAML-файла вместо PySpark: как аналитикам строить пайплайны без разработчиков LLM-агент для поиска свободных доменов: автоматизируем подбор Когда, зачем и как правильно начинать новую сессию в Claude Code? Как я заставил нейросеть писать макросы для FreeCAD Анатомия ИИ‑агента для подбора персонала. От тысячи резюме к топ‑10 за минуты Опыт разработчика как экономика внимания Автономность как точка невозврата: кто будет субъектом в цифровом будущем Обучение ИИ в «диких» условиях: как рутинные действия превращаются в датасеты Как измерить LLM для задач кибербеза: обзор открытых бенчмарков Где хранить код? Сравнение GitHub, GitLab и Bitbucket Математика объясняет, почему нормальное распределение встречается повсюду Почему ваш FinOps не работает: 12 тезисов от практиков Как подписать проектную документацию УКЭП с использованием бесплатных лицензий Pilot Адаптивное администрирование Sigla Vision Я грузил уран в бочки, а потом 20 лет строил ИТ в атомной отрасли Чем позвонить с Эвереста? История и обзор спутниковой связи. Часть 2 Как языковая модель помогает контролировать качество инструктажей по охране труда в металлургии Как не передать на desktop свой IP в РКН Анатомия SAP Privileges: как устроено управление правами в macOS MoneyDev: Сказка про три главных слова Обновлённый токенизатор видео K-VAE 2.0 от Сбера Как сделать диспетчеризацию дома на 1284 квартиры почти бесплатно Как мы разогнали железную дорогу Мы дали агентам рутину. Теперь надо решить — что делать с освободившимся временем Токсичный контент, промпт-хакинг и защита ИИ — всё о Guardrails для LLM Умный город начинается с точного взгляда: как «Фалькон Тех» меняет пространство к лучшему Навайбкодил приложение для анализа графов Почему Дюну так интересно читать? Упрощаем работу с рутиной или как стать Гендальфом Белым Деконструкция Go: CPU, RAM и что там происходит. Go Assembler база. Часть 1.1 Какие профессии исчезнут из-за ИИ, а какие появятся? И что с этим делать Как мы построили IT-отдел, где хочется расти: архитектурные встречи, прозрачные метрики и книжные подарки Rufler: Делаем из Claude Code автономный рой через один YAML-конфиг Sing-box и белый список приложений Как построить надёжный обмен сообщениями в микросервисах: лучшие практики для enterprise OpenAI строит MLM-пирамиду, а McKinsey и Accenture помогают ей в этом Дом, который не построил Фишер (Часть 2) «Сверхзвуковой математик» против «Вдумчивого логиста»: битва алгоритмов 3D-упаковки Мультимодальные модели – грубый и дорогой инструмент Разговоры ничего не стоят. Код тоже Проверки физических лиц: с кого начнет ФНС Топ-10 бесплатных нейросетей для создания видео в 2026 году Первые слои кода: как наши решения сегодня определяют архитектуру ИИ на десятилетия Разработка нового статического анализатора: PVS-Studio JavaScript Поиск уязвимостей ПО: базовый минимум или роскошный максимум Почему оценка персонала не работает как инструмент управления Как мы разработали ИИ-ассистента и сократили рутину продуктовой команды на 50% Как я ушел из найма, нажарил косточек и продал на маркетплейсах на 168 млн в год Когда 1С:ERP уже внедрена, а нормального производственного плана всё ещё нет Как я сделал Claude мультимодальным, подключив к нему Qwen Omni Как приглашение на вакансию мечты превращается в атаку Infrastructure as Code: философия и лучшие практики IaC Тестируем Yandex Code Assistant на задаче, в которой нужно хранить секреты nxs-universal-chart v3.0: новое поколение универсального Helm-чарта Callback Injection: Техника, которая отправила Microsoft Defender в глухой нокаут «Все идеи на стол»: митап как способ вывести проект из тупика Сегодня я узнал нечто новое о GPU благодаря багу в своей игре Как заставить LLM ̶ ̶г̶а̶л̶л̶ю̶ ̶ эволюционировать Карта событий как фундамент аналитики: практический кейс для E-commerce Что выбрать для AI: x86, ARM или RISC-V? Дайджест железа за март Роль соматических мутаций в развитии аутоиммунных заболеваний: путь к избирательной терапии Mythos от Anthropic — тревожный сигнал для всех, а не только для банков Guardrails для LLM на Java: как приручить промпт‑инъекции и токсичные ответы Green-VLA: как мы собрали VLA-модель для реального антропоморфного робота и не потеряли обобщение Финансовая гонка вооружений: почему умные люди добровольно в ней участвуют Эра ИИ-агентов наступила: выбираем лучшего цифрового сотрудника # Практический опыт внедрения WinCC Redundancy на производственном предприятии Сделал MVP за 3 дня, а потом неделю прикручивал оплату. Оно того стоило? Физика против Маска: почему Starship V3 может оказаться ещё одной катастрофой Нефть Венесуэлы: крупнейшие запасы в мире, но не крупнейшая нефтяная держава JPA 4. Переосмысление Hibernate Почему зеркальная фотокамера Nikon D5 десятилетней давности идеально подошла для миссии «Артемида-2» Проект «Уровень-Спутник» или как мы сделали платформу для гидрологов «Замедлиться, чтобы ускориться»: почему ИИ повышает цену ошибок в требованиях и архитектуре Как с нуля поднять трафик IT-компании на 1657% при бюджете 55 тыс. и выжить Pixel-perfect Downsampling — идеальная отрисовка 50 миллионов точек без потерь
Анализ условий совместимости спутниковых приемников и базовых станций сетей пятого поколения
kopwe · 2026-06-23 · via Все публикации подряд на Хабре

Введение

Каждое новое поколение сотовой связи предъявляет все большие требования к скорости передачи информации и их объемам. Мобильные сети третьего поколения (3G) обеспечивали передачу данных со скоростью порядка 10 Мбит/c. 4G без агрегации несущих позволяет достичь скорость приема данных порядка 100 Мбит/c. К сетям пятого поколения требования предъявляются еще большие. Сейчас пользователь имеет желание смотреть потоковое высококачественное видео в реальном времени. Это требует все больших скоростей передачи. Скорость передачи неразрывно связана с частотой сигнала, вернее с полосой (диапазоном частот), который этот сигнал занимает Эта связь выражается уравнением Шеннона

C= b \times log_2 (1+S/N)

где - С – скорость передачи в канале связи (бит/c) - b – полоса частот;
- S – уровень сигнала;
- N – уровень шума.

Как видно из формулы, при увеличении полосы частот скорость передачи вырастает. При этом, сразу большую частоту использовать нецелесообразно в связи с тем, что затухание сигнала значительно увеличивается от расстояния.

Почему С-диапазон представляет интерес

Наиболее распространённые сети 3G использовали диапазоны около 900 и 2100 МГц. Рассмотрим полосы мобильной передачи, которые используются между 2.1 ГГц и 3.4 ГГц. В таблицах UL (uplink) обозначает связь от телефона (UE) до базовой станции. DL (downlink), в свою очередь, обозначает обратное направление - от БС к телефону.

Таблица 1 – Полосы частот LTE

Полоса

Частотный диапазон, МГц

B1

1920-1980 UL / 2110-2170 DL

B30

2305-2315 UL / 2350-2360 DL

B40

2300-2400

B7

2500-2570 UL / 2620-2690 DL

B38

2570-2620

B41

2496-2690

B42

3400-3600

Таблица 2 – Полосы частот 5G

Полоса

Частоты, МГц

n1

1920-1980 UL / 2110-2170 DL

n40

2300-2400

n41

2500-2690

n77

3300-4200

n78

3300-3800

Как видно из таблиц 1 и 2, наиболее широкой доступной полосой обладает диапазон 3,3 - 3,8 ГГц (в случае LTE 3400-3600). Рассмотрим, какие еще устройства работают в данном диапазоне

Частота

Служба

3,1 – 3,3 ГГц

RADIOLOCATIONEarth exploration–satellite (active)Space research (active)

3,3 – 3,4 ГГц

RADIOLOCATION

3,4 – 3,6 ГГц

FIXEDFIXED–SATELLITE (space–to–Earth)MOBILE except aeronautical mobile RADIOLOCATION

3,6 – 4,2 ГГц

AERONAUTICAL MOBILE AERONAUTICAL RADIONAVIGATION FIXED–SATELLITE (space–to–Earth)

Согласно Регламенту радиосвязи ITU, диапазон 3,4-4,2 ГГц используется несколькими службами одновременно. В частности, в полосе 3,3-3,8 ГГц располагаются системы мобильной связи, а в диапазоне 3,6-4,2 ГГц продолжают работать спутниковые системы фиксированной спутниковой службы.

Спутниковые приемники ожидают на входе крайне слабый сигнал. Они работают со спутниками, находящимися на геостационарной орбите, на высоте 36000 км. Преимуществом геостационарной орбиты является то, что спутник остается неподвижен относительно поверхности планеты. Недостатком является большое затухание при передаче сигнала между спутником и земной станцией. На спутнике затруднительно установить мощный передатчик, что вызывает очень слабый сигнал на входе приемного устройства. Рядом находящаяся БС 5G может легко заглушить сигнал от спутника и привести к ухудшению качества приёма либо к перегрузке входных каскадов спутникового оборудования. Пункт распределения частот RADIOLOCATION - это радары. Радары имеют достаточно большую мощность излучения. Из-за высоких мощностей излучения с ними применяют частотное разделение, 5g не использует ту полосу частот, где в конкретной стране может работать радар. Определим, как решается вопрос совместимости БС 5G и спутниковых приемников.

Описание задачи совместимости

Чтобы определить возможность сосуществования между двумя радиоустройствами, нужно определить критерий, по которому его измерять. Для спутниковых приемников одним из критериев является отношение помеха / шум на входе приемника. Из методики ITU-R S.1432-1 получим, что допустимый порог INR на входе приемника определяется следующим образом

I/N=-10 дБ

или, выразив I в Дб

I_{dB} = N_{dB}-10

Затем, оценив данные из документации на систему 5G в соответствии с методикой TR 138 901 определим наихудший случай как макро сельский (macro rural) с EIRP антенны в 61 дБмВт. Принятая помеха на приемнике описывается выражением

I = EIRP-L_{loss}+G_r

В данном уравнении, L_{loss} - требуемое затухание сигнала между базовой станцией и приемником спутникового наземного трансивера I - максимальный уровень допустимой помехи на входе приемника G_r - коэффициент усиления антенны приемника

Мощность теплового шума приемника можно рассчитать по формуле Найквиста для теплового шума

N = 10log_{10}(k\times T \times B)+30

где N - коэффициент шума в дБмВт. k - постоянная Больцмана. k=1,38\times 10^{-23}
T - шумовая температура приемника. Для моделирования была выбрана температура 520К B - полоса пропускания приемника. Для моделирования примем полосу в 600 кГц

Исходя из условий моделирования, коэффициент шума на приемной стороне земной станции равен N = -113,6 дБмВт Теперь, можно рассчитать требуемую мощность сигнала помехи из условий ограничения

I_{dB}= -113,6\;дБмВт - 10 = -124\;дБмВт

После этого, можно уже рассчитывать требуемое расстояние,

Модель распространения сигнала и расчёт помех

При оценке электромагнитной совместимости необходимо определить уровень сигнала базовой станции 5G, который может достигать входа спутникового приёмника. В первом приближении для этого используется модель распространения в свободном пространстве.

Потери в свободном пространстве (Free Space Path Loss, FSPL) определяются выражением:

FSPL = 32.44 + 20\log_{10}(f) + 20\log_{10} (d) \, [дБ]

где:

  • f частота сигнала, МГц;

  • d — расстояние между передатчиком и приёмником, км.

Выразим из этого уравнения d:

d = 10^{\frac{L_{fspl}-32,44-20log_{10}(f)}{20}}

Определим требуемое затухание между базовой станцией и приемником.

L_{fspl} = EIRP - I + Gr = 61 - 124 - 3 = 182\, дБ

Подставив требуемое затухание в d и рассчитав требуемое расстояние для исходных данных, получим требования к разделению порядка 8 с половиной тысяч километров. Такое разделение физически невозможно, так как из-за сферической поверхности Земли дальность прямой видимости будет гораздо меньше. Нужно в расчете учитывать дифракцию на поверхности и другие причины дополнительного затухания сигнала.

Реальная радиотрасса между базовой станцией и спутниковым терминалом включает дополнительные механизмы ослабления сигнала:

  • дифракцию на кривизне Земли;

  • экранирование рельефом;

  • потери в лесных массивах;

  • атмосферное поглощение;

  • снижение усиления антенны при отклонении от главного лепестка диаграммы направленности.

Методики расчета указаны в следующих рекомендациях ITU

  • ITU-R P.452 для расчёта потерь распространения радиоволн на наземных трассах;

  • ITU-R P.526 для оценки дифракционных потерь;

  • ITU-R P.2108 для учёта дополнительного затухания в лесных массивах;

  • ITU-R S.465 для определения диаграммы направленности спутниковых антенн.

Основываясь на перечисленных выше рекомендациях была разработана MATLAB-модель, позволяющая учитывать перечисленные эффекты в едином расчете.

Рекомендация ITU-R P.452 включает несколько нелинейных механизмов распространения, таких как дифракция на сферической Земле, тропосферное рассеяние, атмосферное поглощение и влияние рельефа местности. Вследствие этого суммарные потери на трассе не могут быть представлены простой функцией расстояния, допускающей явное обращение. Поэтому определение минимального расстояния пространственного разнесения выполняется численными методами. В разработанной модели расстояние между базовой станцией и спутниковым приёмником последовательно изменяется, после чего для каждого значения рассчитывается уровень помех и проверяется выполнение критерия совместимости I/N.

После определения уровня помехового сигнала вычисляется критерий совместимости I/N (Interference-to-Noise Ratio), представляющий собой отношение мощности помехи к собственной шумовой мощности приёмника. Если расчетное значение превышает допустимый порог, расстояние между системами увеличивается до выполнения требований по электромагнитной совместимости.

Результаты моделирования

Наиболее неблагоприятным сценарием является использование общих частотных каналов базовыми станциями 5G и спутниковыми системами. В этом случае требуемые расстояния пространственного разнесения достигают десятков километров (не тысяч, как получилось в предварительном расчете).

Применение защитных полос между мобильной и спутниковой службами существенно улучшает условия совместимости. Согласно результатам моделирования, увеличение защитного интервала между верхней границей диапазона 5G и нижней границей полосы приёма спутниковой системы приводит к последовательному уменьшению требуемого расстояния разнесения: при защитном интервале 50 МГц оно составляет около 35 км, при 100 МГц уменьшается до 20 км, при 150 МГц снижается до 11 км, а при 200 МГц составляет менее 1 км.

Особый интерес представляет влияние дополнительных фильтров на входе спутникового приёмника. Поскольку большая часть энергии сигнала 5G находится вне рабочей полосы спутниковой системы, применение полосовых фильтров позволяет существенно снизить уровень принимаемых помех.

На рисунках представлены результаты моделирования для двух случаев:

  1. Использование только входного фильтра спутниковой станции.

  2. Использование входного фильтра совместно с защитным частотным интервалом (guard band).

Рисунок. Результат моделирования с использованием только входного фильтра спутниковой станции

Рисунок. Результат моделирования с использованием только входного фильтра спутниковой станции

Рисунок. Результат моделирования с использованием входного фильтра совместно с защитным частотным интервалом (guard band)|633

Рисунок. Результат моделирования с использованием входного фильтра совместно с защитным частотным интервалом (guard band)|633

Результаты показывают, что комбинация этих методов обеспечивает значительно более высокий эффект по сравнению с применением каждого из них по отдельности. Это объясняется тем, что фильтр ослабляет внеполосные составляющие сигнала, а защитный интервал дополнительно снижает уровень энергии, попадающей в полосу пропускания приёмника.

С инженерной точки зрения именно данный подход представляется наиболее реалистичным для обеспечения совместимости мобильных и спутниковых систем без необходимости полного перераспределения спектра.

Что это означает для практического использования диапазона 3,4-3,8 ГГц

Полученные результаты показывают, что проблема использования диапазона 3,4-3,8 ГГц не сводится исключительно к вопросу распределения спектра.

Даже при наличии свободных частот необходимо обеспечить электромагнитную совместимость с уже существующими системами связи и радиолокации.

Код

clear;
close all;
clc;

%% Input parameters

Hrx = 1.5;                  % Receiver antenna height, m
Htx = 35;                   % Transmitter antenna height, m
CImax = 10;                % Required I/N, dB
BlockingDb = -20;           % Receiver blocking threshold, dBm
EIRPmax = 61;               % Base station EIRP, dBm
latSatSt = 53.7;            % Receiver latitude, deg
lonSatSt = 27.9;            % Receiver longitude, deg
satelliteAzimuth = 49;      % Satellite azimuth, deg
startFrequency = 2.8;       % GHz
stopFrequency = 4.6;        % GHz
dishDia = 1.5;              % m
bandwidthSat = 600*10^3;       % Hz
guardInterval = 0;          % MHz
recvNoise = 520;            % K
disableLNAFilter = false;

%%INTERNAL%%
EarthRadius = 6371;         % km
forestPercent = 50;         % Forest coverage, %
attenuation = 60;           % dB
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
calc_distance(126.82,3.8);
disp("Loss " + solve_distance_from_loss(181.2,4,35,1.5,20))

[azi, elevation] = satellite_angles(latSatSt, lonSatSt, 0, satelliteAzimuth, 35786);
f_vec = linspace(startFrequency, stopFrequency, 1000);

filterGain = zeros(size(f_vec));
for k = 1:length(f_vec)
    filterGain(k) = fss_filter_gain(f_vec(k)*1000,guardInterval,60,disableLNAFilter);
end

figure
plot(f_vec, filterGain, 'k', 'LineWidth', 2)
grid on
xlabel('Частота, ГГц')
ylabel('Усиление, дБ')
Imax = recvNoiseCalc(recvNoise, bandwidthSat) - CImax;

graph = totalDistance(f_vec,dishDia,elevation, ...
    guardInterval,disableLNAFilter, ...
    EIRPmax,BlockingDb,attenuation,Htx,Hrx,Imax);

[maxDistance, idx] = max(graph);
maxFrequency = f_vec(idx);

figure
semilogy(f_vec, graph, 'k', 'LineWidth', 2)

text(maxFrequency, maxDistance, ...
    sprintf('  Макс: %.2f ГГц, %.2f Км', ...
    maxFrequency, maxDistance), ...
    'VerticalAlignment','bottom', ...
    'FontSize',12,'FontWeight', 'bold')

grid on
xlabel('Частота, ГГц')
ylabel('Допустимое расстояние, км')
hold off;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function L_total = totalDistance( ...
    f_vec,dishDia,elevation,guardInterval,   ...
    disableLNAFilter,EIRPmax,BlockingDb,attenuation, ...
    Htx,Hrx,Imax ...
    )
    distanceINR = zeros(size(f_vec));
    distanceBlocking = zeros(size(f_vec));
    EarthRadius = 6371;
    for k = 1:length(f_vec)
        f = f_vec(k);
        lambda = 300/(f*1000);
        antennaGain = S465_gain(dishDia/lambda, elevation);
        filterAtt = fss_filter_gain(f*1000,guardInterval,attenuation,disableLNAFilter);
        L_target_BL = EIRPmax + antennaGain + filterAtt - BlockingDb;
        L_target_OOB = apply_spectral_mask(EIRPmax, f*1000) + antennaGain + filterAtt - Imax;
        F_BL = @(d) total_loss(d, f, Htx, Hrx, EarthRadius, 50) - L_target_BL;
        F_OOB = @(d) total_loss( d, f, Htx, Hrx, EarthRadius, 50) - L_target_OOB;

        try
            distanceBlocking(k) = fzero(F_BL,[1e-6 5000]);
        catch
            distanceBlocking(k) = 0;
        end

        try
            distanceINR(k) = fzero(F_OOB,[1e-6 5000]);
        catch
            distanceINR(k) = 0;
        end
    end
    L_total = max(distanceINR, distanceBlocking);
end

function d_fs = calc_distance(L, f)
    d_fs = 10^((L - 92.4 - 20*log10(f))/20);
end

function eirp_o = apply_spectral_mask(EIRP_dB, f_target_MHz)
    
    if f_target_MHz <= 3400 + 15
        f_offset_MHz = 3400 + 15 - f_target_MHz; 
    elseif f_target_MHz >= 3800 - 15
        f_offset_MHz =  f_target_MHz - 3800 + 15;
    else 
        eirp_o = EIRP_dB;
        return;
    end

    if f_offset_MHz < 0
        M_orig = EIRP_dB;
    elseif f_offset_MHz < 0.2
        M_orig = -14;
    elseif f_offset_MHz < 1
        M_orig = -14 - 15 * (f_offset_MHz - 0.215);
    elseif f_offset_MHz < 5
        M_orig = -13;
    elseif f_offset_MHz < 10
        M_orig = -13;
    elseif f_offset_MHz <= 15
        M_orig = -15;
    else
        M_orig = -50;
    end

    eirp_o = M_orig;
end

function [azimuth, elevation] = satellite_angles(lat_rx, lon_rx, lat_sat, lon_sat, alt_sat)
   if nargin < 5 || isempty(alt_sat)
        alt_sat = 35786; % km
   end
    Re = 6371; % km
    lat_rx = deg2rad(lat_rx);
    lon_rx = deg2rad(lon_rx);

    lat_sat = deg2rad(lat_sat);
    lon_sat = deg2rad(lon_sat);
    rx = Re * [
        cos(lat_rx)*cos(lon_rx);
        cos(lat_rx)*sin(lon_rx);
        sin(lat_rx)];
    Rs = Re + alt_sat;
    sat = Rs * [
        cos(lat_sat)*cos(lon_sat);
        cos(lat_sat)*sin(lon_sat);
        sin(lat_sat)];
    los = sat - rx;
    east = [
        -sin(lon_rx);
         cos(lon_rx);
         0];
    north = [
        -sin(lat_rx)*cos(lon_rx);
        -sin(lat_rx)*sin(lon_rx);
         cos(lat_rx)];
    up = [
         cos(lat_rx)*cos(lon_rx);
         cos(lat_rx)*sin(lon_rx);
         sin(lat_rx)];
    e = dot(los,east);
    n = dot(los,north);
    u = dot(los,up);
    azimuth = atan2d(e,n);
    azimuth = mod(azimuth,360);
    elevation = atan2d(u,sqrt(e^2+n^2));
end

function [G, phi_min] = S465_gain(ratio_D_lambda, phi_deg)
    if ratio_D_lambda <= 0
        error('D/λ must be positivve');
    end
    if phi_deg < 0 || phi_deg > 180
        error('Angle phi must be in [0, 180] degrees.');
    end
    if ratio_D_lambda >= 50
        phi_min = max(1, 100 / ratio_D_lambda);
    else % ratio_D_lambda < 50
        if ratio_D_lambda < 33.3
            phi_min = 2.5;
        else
            phi_min = max(2, 114 * (ratio_D_lambda)^(-1.09));
        end
    end
    if phi_deg < phi_min
        error('phi (%.2f°) less than allowed phi_min = %.2f°.', phi_deg, phi_min);
    end
    if phi_deg < 48
        G = 32 - 25 * log10(phi_deg);
    else % phi_deg >= 48
        G = -10;
    end
end

function d_solution = solve_distance_from_loss(L_target, f, h_tx, h_rx,p_forest)
    E_R = 6371; 
    F = @(d) total_loss(d,f,h_tx,h_rx,E_R,p_forest) - L_target;
    d_solution = fzero(F, [0.0001, 8000]);
end

function x = norminv_plain(p)
    x = -sqrt(2)*erfcinv(2*p);
end

function horison = radioHorison(h_tx,h_rx,E_R) 
    k_refr = 1.33;
    d_tx = sqrt(2*E_R*h_tx/1000) * k_refr;
    d_rx = sqrt(2*E_R*h_rx/1000) * k_refr;
    horison = d_tx + d_rx;
end

function L = total_loss(d, f, h_tx, h_rx, E_R,p_forest)
    if(d <= 10^-2) L = -1; return; end
    k_refr = 1.33;
    gamma = 0.008;

    sigma_l = 4;
    sigma_s = 6;

    p_es = 3;
    p_ctt = p_forest;
    L_l = -2 .* log10( ...
        10.^(-5 .* log10(f) - 12.5) + ...
        10.^(-16.5));
    d_tx = sqrt(2*E_R*h_tx/1000) * k_refr;
    d_rx = sqrt(2*E_R*h_rx/1000) * k_refr;
    Qinv = norminv_plain(p_ctt/100);
    d_fs = sqrt(d.^2 + ((h_tx-h_rx)/1000).^2);
    L_bfsg = 92.4 + 20.*log10(f) + 20.*log10(d_fs) + gamma.*d_fs;
    L_s = 32.98 +  23.9.*log10(d) + 3.*log10(f);
    sigma_cb = sqrt( ...
        (sigma_l^2 .* 10.^(-0.2.*L_l) + ...
         sigma_s^2 .* 10.^(-0.2.*L_s)) ./ ...
        (10.^(-0.2.*L_l) + ...
         10.^(-0.2.*L_s)));
    L_ctt = -5 .* log10(10.^(-0.2.*L_l) + 10.^(-0.2.*L_s)) - sigma_cb .* Qinv;
    if(p_forest == 0) L_ctt = 0; end
    E_sp = 2.6 .* (1 - exp(-0.1*(d_tx+d_rx))) .* log10(p_es/50);
    L_diff = diffraction_loss(d,f,h_tx,h_rx,E_R);
    Lt = L_bfsg + abs(L_ctt)- E_sp + L_diff;
    [Lt,d, f, d_fs];
    L = Lt;
end

function G_dB = fss_filter_gain(f_MHz,guardInterval,attenuation,disable)
    if(disable == 1) G_dB = 0; return; end
    f_pass_lo = 3800 + guardInterval;
    f_pass_hi = 4200;
    f_stop_lo = 3600 + guardInterval;
    f_stop_hi = 4400;

    Astop = attenuation; % dB
    G_dB = zeros(size(f_MHz));
    idx = f_MHz <= f_stop_lo;
    G_dB(idx) = -Astop;
    idx = (f_MHz > f_stop_lo) & (f_MHz < f_pass_lo);
    x = (f_MHz(idx) - f_stop_lo) / (f_pass_lo - f_stop_lo);
    H = 0.5 * (1 - cos(pi*x));
    G_dB(idx) = 20*log10(H);
    G_dB(idx) = max(G_dB(idx), -Astop);
    idx = (f_MHz >= f_pass_lo) & (f_MHz <= f_pass_hi);
    G_dB(idx) = 0;
    idx = (f_MHz > f_pass_hi) & (f_MHz < f_stop_hi);
    x = (f_stop_hi - f_MHz(idx)) / (f_stop_hi - f_pass_hi);
    H = 0.5 * (1 - cos(pi*x));
    G_dB(idx) = 20*log10(H);
    G_dB(idx) = max(G_dB(idx), -Astop);
    idx = f_MHz >= f_stop_hi;
    G_dB(idx) = -Astop;
end

function Ld = diffraction_loss(d,f,h_tx,h_rx,E_R)
    if(d < radioHorison(h_tx,h_rx,E_R)) Ld = 0; return; end
    Re = E_R*1000*4/3;
    d_m = d*1000;
    lambda = 3e8/(f*1e9);
    h_bulge = d_m.^2/(8*Re);
    h_los = (h_tx+h_rx)/2;
    clearance = h_los - h_bulge;
    nu = -clearance .* sqrt(2./(lambda*d_m));
    Ld = zeros(size(d));
    idx = nu > -0.78;
    Ld(idx) = 6.9 + 20*log10(sqrt((nu(idx)-0.1).^2+1) + nu(idx)-0.1 );
    Ld(Ld<0)=0;
end

function recv_temp_K = recvTemp(phi_deg,NF_db)
    recv_temp_K = atmos_temp(phi_deg)+space_temp+feed_temp+lna_temp(NF_db);
end

function N_db = recvNoiseCalc(temp_K,bandwidth_Hz)
    k = 1.38*10^-23;
    N_db = 10*log10(k)+10*log10(temp_K)+10*log10(bandwidth_Hz)+30;
end

function T_atm = atmosTemp(phi_deg)
   phi_rad = deg2rad(phi_deg);
   T_atm = 290*(1-exp(-0.03/sin(phi_rad)));
end

function T_lna = lnaTemp(NF)
    T_lna = 290*(10^(NF/10)-1);
end