Этот снимок облаков в инфракрасном канале принял телефон LG D325 2014 года. Без RTL‑SDR и без внешнего радиочипа: только собственный сотовый модем телефона, которому я поменял 2 672 байта в прошивке.

Meteor‑M N2-3, HRPT, канал MSU‑MR 5 (ИК), ночной пролёт. Принят на LG D325.
Проект называется D325f‑SDR. Модем отдаёт в Android сырые IQ‑отсчёты: 7,68 MS/s, около 5 МГц полосы, 8 бит. Телефон сам рисует спектр и водопад, демодулирует AM, FM, SSB и CW и пишет IQ в файл. Ниже 1000 МГц роль гетеродина играет Bluetooth того же телефона, это, пожалуй, самая необычная часть.
В статье расскажу, как это устроено: доработка платы, патч прошивки модема Qualcomm Hexagon, ядро, приложение, измерения в сравнении с RTL‑SDR V4 и приём спутников на 1,7 ГГц. Всё открыто: GitHub, лицензия GPL-3.0. Видео на 3 минуты — YouTube.
В каждом телефоне уже есть SDR
Современный сотовый модем — это и есть программное радио. Радиочасть (в LG D325 это трансивер семейства WTR) переносит сигнал в нулевую промежуточную частоту и оцифровывает, а всё остальное — демодуляция, синхронизация, декодирование — делает программа на DSP. В телефоне стоит Qualcomm MSM8610 (Snapdragon 200), в нём DSP Hexagon с прошивкой модема M8610B‑AAAANAZM-1.0.6047.
Проблема в том, что эти IQ‑отсчёты никогда не покидают модем. Android видит только готовые данные: звонки, SMS, пакеты. А ещё модем слушает только свои сотовые диапазоны, и на его входе стоят фильтры этих диапазонов.
Значит, чтобы сделать из модема приёмник, нужно три вещи:
Подать сигнал в обход фильтров — это железо.
Заставить модем настраиваться на любую частоту и отдавать IQ наружу — это патч прошивки модема.
Забрать IQ в Android и обработать — это ядро, вспомогательная программа и приложение.

тракт сигнала D325f‑SDR · 7 звеньев
Ниже 1000 МГц к принимаемому сигналу подмешивается несущая Bluetooth — об этом отдельный раздел ниже.
Железо: два провода и гнездо наушников
Антенну нужно подать прямо на линии приёма перед трансивером, в обход дуплексеров и фильтров. Я подпаял два тонких провода: к тракту B8 (у дуплексера FL2002, ближе к трансиверу) и к тракту B1 (у FL2001). Провода выведены на гнездо наушников 3,5 мм.

Точки подпайки B8 и B1. Рисунок перерисован мной по фото платы, не в масштабе.
Тонкий провод на плате телефона легко оторвать вместе с пятачком, поэтому все спайки я залил УФ‑отверждаемой паяльной маской: точечно наносил пинцетом и засвечивал УФ‑лампой. Это хорошо видно в видео.
Распиновка гнезда получилась такая:
Контакт | В телефоне | В переходнике SMA |
Ring | обход B1 | центр SMA — штатно |
Tip | обход B8 | центр SMA только для 1090 МГц |
Sleeve | антенна Wi‑Fi/BT | не подключён |
Антенна подключается через самодельный переходник SMA → 3,5 мм, обёрнутый медной фольгой. Корпус SMA я намеренно оставил неподключённым: с ним приём заметно хуже.

Патч модема: 2 672 байта в прошивке Hexagon
Патч меняет шесть файлов прошивки модема, всего 2 672 байта, и делает три вещи:
Команда в заводском режиме. В режим заводского теста (FTM) добавлен обработчик команды FTM902, через него потоком управляет Android.
Производитель по прерыванию. На каждый аппаратный блок IQ он копирует отсчёты в кольцевой буфер в общей памяти SMEM, в формате CI8 (8 бит I и Q).
Хук расчёта PLL (D3FQ). Перед штатным расчётом синтезатора можно подставить любую частоту в герцах, а не только сетку каналов LTE. Поток стартует только после того, как модем сообщит о захвате PLL.
Кольцо — 126 976 байт, это всего около 8,3 мс на 7,68 MS/s. Забирает его нативная вспомогательная программа с root: она переводит модем в FTM через DIAG, настраивает частоту, запускает кольцо и передаёт блоки приложению, а на выходе возвращает обычный режим. Самый длинный задокументированный приём — 158 с, 1 186 008 блоков без потерь.
Захват PLL на прямом приёме подтверждён на 1700 и 2120–2170 МГц, а в измерениях ниже — до 2400 МГц. 5000 МГц уже не захватывается, и патч такую частоту отклоняет.
Как ставится патч
Прошивку Qualcomm я не распространяю. Патчер — отдельное приложение Modem Patcher — применяет разницу к собственному modem‑разделу телефона:
Проверяет модель телефона и SHA-256 шести изменяемых файлов; с чужой прошивкой не работает.
Save dump — сохраняет дамп раздела, его нужно скопировать на ПК.
Apply patch — записывает и сразу читает каждую запись обратно, в конце лога — PATCHED и READBACK_VERIFIED.
После перезагрузки версия baseband меняется на P8610B‑AAAANAZM-1.0.6047.
Restore stock возвращает сток, а для оборванной записи есть восстановление из дампа и ZIP‑файлы для TWRP.
Ядро и загрузка с microSD
Ядру LineageOS 14.1 нужна одна реальная правка: при загрузке оно выделяет элемент SMEM № 471 на 128 КиБ, и туда пропатченный модем пишет кольцо IQ. Патч лежит на GitHub вместе с полным конфигом, а полный исходник дерева — в релизе рядом с boot.img, как требует GPL.
Есть и необычная деталь: у моего телефона умерла встроенная память eMMC, и он целиком работает с microSD‑карты с той же разметкой разделов, что и у eMMC. Чтобы Android увидел карту как основной диск, в дереве устройств выключен контроллер eMMC: SD‑карта становится mmcblk0, и штатные номера разделов в fstab указывают на неё.
Поэтому образов два:
Образ | Для какого телефона | Статус |
boot.img | работает с microSD, контроллер eMMC выключен | работает на моём телефоне |
boot‑emmc.img | работает со встроенной eMMC, то же ядро и ramdisk | на телефоне пока не проверен |
Разница между ними — одно свойство в дереве устройств: status у sdhci@f9824900, «disabled» или «ok». Скрипт, который делает второй образ из первого, тоже в репозитории.
Приложение
Интерфейс и DSP взяты из RF Analyzer Денниса Манца (Dennis Mantz), к нему я добавил источник «LG D325 · SDR». В версии 2.0 есть:
спектр и водопад в реальном времени, демодуляция AM, NFM, WFM, USB, LSB и CW;
запись IQ и звука, причём водопад и звук работают и во время записи; воспроизведение IQ‑файлов;
запись по расписанию при погашенном экране — удобно для спутниковых пролётов;
восстановление при сбоях модема: разрыв в записи заполняется нулями, и время в файле не съезжает;
контроль температуры и действия после записи;
переключатель инверсии IQ, настройки LNA, DVGA и Bluetooth, 13 языков.
Сетевых функций (сервер, стриминг) нет намеренно: пока Bluetooth работает как непрерывная несущая, Wi‑Fi на этом телефоне нормально не работает — у них один чип.

FM 102–109 МГц на экране телефона, через Bluetooth‑гетеродин.
Bluetooth как гетеродин
Сам модем строится только выше примерно гигагерца. Чтобы принимать FM, КВ и UHF, я использую Bluetooth‑чип того же телефона (WCN3620) как гетеродин. Приложение включает непрерывную несущую на 2402 + канал МГц, а модем настраивается на разность:
f_{\text{модем}} = (2402 + \text{канал}) - Fгде F — частота, которую хочется принять. Несущая и принимаемый сигнал смешиваются на входе, и модем слышит разностную частоту. Например, для FM на 100 МГц и канала 0 модем стоит на 2302 МГц. Спектр при этом зеркальный, поэтому в приложении есть переключатель инверсии. Выше границы (в 2.0 по умолчанию 1000 МГц) модем принимает напрямую.
Так я принял FM‑вещание (в IQ видны стереопилот 19 кГц и RDS), аналоговое ТВ на 551,25 МГц и КВ на 8–15 МГц, включая речь на 14,970 МГц. Как именно несущая попадает в приёмный тракт, я измерениями ещё не определил.
Канал и LTE
Канал Bluetooth решает, где настроен сам модем, и это важно:
на КВ канал должен быть не выше 30 (2432 МГц), иначе PLL модема не захватывается;
если частота модема попадает в канал базовой станции (в основном LTE 1800 и 2300 МГц), поднимается вся полоса и приём пропадает. Канал надо подобрать так, чтобы модем оказался между несущими.

92 МГц: частота модема попала в канал LTE, и поднялась вся полоса. Помогает сдвиг канала Bluetooth.
Уровень мощности
У несущей 10 уровней мощности, от 0 до 9. Лучше всего у меня работает уровень 7. На 8 и 9 растёт только мощность в эфире, а приём становится хуже, поэтому в 2.0 по умолчанию стоит 7, а на 8–9 приложение показывает предупреждение. Измерения — в следующем разделе.
Измерения
Чтобы понять, насколько телефон годится как приёмник, я сравнил его с RTL‑SDR V4. Источник — CW‑сигнал HackRF, всё внутри экранированного бокса: источник и антенна приёмника внутри, наружу ничего не излучалось. На LG я записал 23 файла (CI8, 7,68 MS/s), на RTL‑SDR — 16 (CU8, 2,5 MS/s), с одним источником и одинаковым расположением антенн.

мои измерения, предварительные · 14 частот, где есть оба приёмника
Связь идёт через эфир, поэтому уровень на входе в дБм неизвестен: это сравнение двух приёмников, а не калиброванная чувствительность. На 1800–2400 МГц LG тоже принимает (SNR 41–51 дБ), там RTL‑SDR V4 сравнить не с чем. На 433 и 1565 МГц LG перегружался, эти точки на график не попали. На 1190–1565 МГц и выше 2400 МГц PLL у меня захватывается нестабильно. Моя гипотеза — недоступны калибровки NV, ведь eMMC мертва, но это я не проверял.
Второе измерение — мощность самой несущей Bluetooth на каждом уровне. HackRF в одинаковых условиях, без перегрузки: каждый шаг — 3–5 дБ, от 0 до 9 — 39 дБ.

мои измерения HackRF, 3 ноября 2026 · абсолютные значения — оценка
Абсолютную мощность я не мерил, график построен от данных даташита. С поправкой на усиление антенны цифры могут немного сдвинуться.
Спутники на 1,7 ГГц
Раз модем без проблем захватывает PLL на 1700 МГц, телефон должен слышать метеоспутники в L‑диапазоне. Антенна — самодельная спираль с рефлектором как облучатель спутниковой тарелки, запись на 7,68 MS/s, декодер — SatDump.

Спираль с рефлектором на 1,7 ГГц и тарелка, перед которой она стоит.
Meteor‑M № 2–3, HRPT. Пролёт принят на LG D325 и декодирован в SatDump, это тот самый снимок из начала статьи. Исходную IQ‑запись я, к сожалению, потерял, остались только кадры. Я проверил их своим декодером без SatDump: восстанавливается 2019 из примерно 2050 строк MSU‑MR. Пролёт ночной, поэтому изображение есть только в ИК‑каналах.
MetOp‑B, AHRPT, 1701,3 МГц. Здесь сигнал на самом пороге. Демодулятор QPSK держит сигнал (SNR ≈ 2–5 дБ), Viterbi и синхронизация кадров захвачены, но Reed‑Solomon ошибки уже не исправляет, и чистой картинки пока нет. В спектре записи чётко видна линия символьной частоты 2,333 МГц, на констелляции — QPSK. Для чистого изображения не хватает примерно 2–3 дБ: следующий шаг — LNA прямо у антенны и фильтр.

MetOp‑B AHRPT, фрагмент 3,9 с с LG D325: спектр, линия символьной частоты и созвездие QPSK.
Кадры Meteor, фрагмент IQ MetOp и записи несущей Bluetooth лежат в отдельном релизе с SHA-256 — можно проверить самостоятельно.
А другие телефоны?
Первый вопрос, который мне задают. Я пробовал три, и ни на одном пока не получилось то же, что на LG:
Телефон | Чип | Что получилось | Во что упёрлось |
Redmi Note 8T | Snapdragon 665 | снимки IQ через штатный FTM без патча модема, чувствительность очень хорошая | только штатные диапазоны LTE, нужны мой модуль Magisk и ядро |
ASUS ZenFone 2 Laser ZE500KL | MSM8916 | хук частоты работает, снимки IQ через FTM есть | не нашёл место в прошивке, откуда IQ можно непрерывно писать в общую память |
Itel Vision 3 | Unisoc SC9863A | — | модем не принимает изменённую прошивку из‑за подписи |
Идея сама по себе общая: приёмник есть в любом модеме. Но на каждом чипе приходится заново искать, как настроить частоту, откуда взять IQ и как вывести их наружу, а на свежих телефонах ещё и обходить проверку подписи модема.
Ограничения и честные оговорки
Одна модель. SDR работал на двух LG D325f: на первом прототипе, который я потом вывел из строя доработками, и на нынешнем. Нужны root, TWRP, LineageOS 14.1 и стоковый baseband M8610B‑AAAANAZM-1.0.6047.
Нет калибровки. Измерения — сравнение с RTL‑SDR, а не чувствительность в дБм. Усиление пока фиксировано.
Маленький буфер. Кольцо в модеме — всего 8 мс, при перегрузке процессора или перегреве поток останавливается.
Риск для телефона. Патч пишет в раздел модема. Сначала копия Boot и дамп модема, потом всё остальное.
Передатчик. В режиме Bluetooth‑гетеродина телефон передаёт непрерывную несущую в диапазоне 2,4 ГГц. В России для устройств малого радиуса действия общего назначения в полосе 2400–2483,5 МГц предел — 10 мВт ЭИИМ (решение ГКРЧ № 07–20-03-001), в ЕС для такой несущей тоже 10 мВт, в США — около 0,75 мВт. Уровень 7 по моей оценке — около 3,5 мВт. Модуль Bluetooth сертифицирован для обычной работы, а не для непрерывной несущей, так что проверяйте правила своей страны. На прямом приёме выше 1000 МГц Bluetooth‑несущая не включается.
Прошивки. Ни прошивка Qualcomm, ни файлы LG в репозитории не распространяются: патч применяется на телефоне к его собственному разделу.
Что дальше
LNA у антенны и фильтр — чтобы получить чистую картинку MetOp.
Повторить всю установку ещё на двух D325 и проверить boot‑emmc.img.
Набор для загрузки с microSD без прошивок LG и Qualcomm — чтобы оживлять D325 с мёртвой eMMC.
Если у вас есть LG D325 или опыт с прошивками модемов Qualcomm и Unisoc — пишите в комментарии или в Issues на GitHub.
Ссылки
Исходники и документация: github.com/loganzarov‑alt/D325f‑SDR
Релиз 2.0: v2.0
Измерения, спутники, другие телефоны: FIELD‑NOTES.md
Публикация в RTL‑SDR Blog: D325f‑SDR: Turning the Cellular Modem in an Old LG Phone into an SDR
Интерфейс приложения основан на RF Analyzer Денниса Манца
Комментарии 0