Задача приложения — смотреть эфир платой, которая отдаёт поток восьмибитных отсчётов I/Q, и делать это без внешней обработки: панорама, водопад, автоматический поиск сигналов, запись найденного и демодуляция. Ниже — как устроены ступени тракта и что выяснилось по ходу разработки.
Колбэк платы отдаёт блоки фиксированного размера, обычно по шестнадцать килобайт. Блоки сразу расходятся двум потребителям: запись берёт их напрямую, обработка — через кольцевой буфер. Обработка идёт в отдельном потоке, чтобы отрисовка не тормозила приём, а пропуск блоков не превращался в дыры в спектре.
БПФ собственное, по основанию два, только для размеров-степеней двойки. Окно Ханна. Размер берётся разный: крупный — для полотна на экране, компактный — для детектора, чтобы поиск не отставал от отрисовки.
Мощность считается в dBFS с постоянной поправкой, полученной на тонах известного уровня. Такая калибровка позволяет сравнивать показания прибора с генератором, а не только смотреть относительную картину.
Диапазон шире, чем полоса потока, поэтому его приходится обходить. Если плата умеет шагать сама, блоки приходят с заголовком частоты и обход идёт аппаратно. Если не умеет — диапазон делится на пачки с перекрытием в половину ширины, чтобы не потерять сигнал на стыке.
Раскладка пачек считается одним местом в коде: ширина — не больше потока, шаг — половина ширины, края диапазона покрываются, а узкий диапазон укладывается в одну пачку по центру.
Первая версия сравнивала весь кадр с одним порогом. На практике в полосе обхода шум стоит заметно выше, чем в центре, да и усиление на каждом шаге своё — от этого детектор выдавал десятки ложных находок.
Сейчас шум оценивается по кадру как процентиль бинов, а каждый бин сравнивается с шумом рядом с ним: берутся окна слева и справа, из них берётся большее. В находке хранится местный шум, поэтому «дБ над шумом» в таблице совпадает с тем, что видно на графике глазами.
Рекордер занимает плату на несколько секунд. Если запускать запись на первую же находку, слабый сигнал отбирает время у сильного, а остальные находки за эти секунды просто теряются.
Решение — очередь по силе сигнала: до восьми находок ждут своей очереди, а снимок параметров берётся в момент постановки в очередь, а не в момент записи.
Первая версия калибровки измеряла уровень ровно в центре настройки — и попадала на юбку собственной линии приёмника, которая растёт вместе с усилением. Результат был стабильно завышен и зависел от усиления.
Сейчас приёмник настраивается на полмегагерца выше измеряемой частоты, пик ищется в стороне от центра, и только потом считается поправка. В журнал пишутся полоса, число бинов и абсолютная частота найденного пика — чтобы ошибку настройки можно было увидеть сразу.
| Что проверяли | Результат |
|---|---|
| Непрерывная запись | поток без пропусков, RMS и пик в норме |
| Запись фрагмента с тоном 1 кГц | в звуковом файле 1001 Гц — тракт точный |
| Поиск на тестовом источнике | пять настоящих несущих, одна шумовая, фрагменты записаны подряд |
| Калибровка по генератору | ступени усилителя отражены ровно, ошибка настройки — единицы ppm |