Spectro Monitor: устройство тракта

Версия 0.1 · ноябрь 2026 · описание внутренней архитектуры

Задача приложения — смотреть эфир платой, которая отдаёт поток восьмибитных отсчётов I/Q, и делать это без внешней обработки: панорама, водопад, автоматический поиск сигналов, запись найденного и демодуляция. Ниже — как устроены ступени тракта и что выяснилось по ходу разработки.

1. Приём и потоки

Колбэк платы отдаёт блоки фиксированного размера, обычно по шестнадцать килобайт. Блоки сразу расходятся двум потребителям: запись берёт их напрямую, обработка — через кольцевой буфер. Обработка идёт в отдельном потоке, чтобы отрисовка не тормозила приём, а пропуск блоков не превращался в дыры в спектре.

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

2. Спектр

БПФ собственное, по основанию два, только для размеров-степеней двойки. Окно Ханна. Размер берётся разный: крупный — для полотна на экране, компактный — для детектора, чтобы поиск не отставал от отрисовки.

Мощность считается в dBFS с постоянной поправкой, полученной на тонах известного уровня. Такая калибровка позволяет сравнивать показания прибора с генератором, а не только смотреть относительную картину.

3. Перестройка и обход диапазона

Диапазон шире, чем полоса потока, поэтому его приходится обходить. Если плата умеет шагать сама, блоки приходят с заголовком частоты и обход идёт аппаратно. Если не умеет — диапазон делится на пачки с перекрытием в половину ширины, чтобы не потерять сигнал на стыке.

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

4. Детектор

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

Сейчас шум оценивается по кадру как процентиль бинов, а каждый бин сравнивается с шумом рядом с ним: берутся окна слева и справа, из них берётся большее. В находке хранится местный шум, поэтому «дБ над шумом» в таблице совпадает с тем, что видно на графике глазами.

5. Запись и очередь

Рекордер занимает плату на несколько секунд. Если запускать запись на первую же находку, слабый сигнал отбирает время у сильного, а остальные находки за эти секунды просто теряются.

Решение — очередь по силе сигнала: до восьми находок ждут своей очереди, а снимок параметров берётся в момент постановки в очередь, а не в момент записи.

6. Демодуляция

7. Калибровка

Первая версия калибровки измеряла уровень ровно в центре настройки — и попадала на юбку собственной линии приёмника, которая растёт вместе с усилением. Результат был стабильно завышен и зависел от усиления.

Сейчас приёмник настраивается на полмегагерца выше измеряемой частоты, пик ищется в стороне от центра, и только потом считается поправка. В журнал пишутся полоса, число бинов и абсолютная частота найденного пика — чтобы ошибку настройки можно было увидеть сразу.

Проверки

Что проверялиРезультат
Непрерывная записьпоток без пропусков, RMS и пик в норме
Запись фрагмента с тоном 1 кГц в звуковом файле 1001 Гц — тракт точный
Поиск на тестовом источнике пять настоящих несущих, одна шумовая, фрагменты записаны подряд
Калибровка по генератору ступени усилителя отражены ровно, ошибка настройки — единицы ppm

Читать заметки из разработки