Thetis Extended Version (Beta): GPU FFT водопад, 16-битный конвейер и стабилизация PureSignal
Автор: Юрий (EU2AV)
Дата: 2026-07-19
Версия: 2.10.3.16 Beta
Продолжая работу над хостовой частью программного обеспечения, мы переходим к одному из самых масштабных обновлений интерфейса и DSP-тракта. Данный релиз выходит под названием Thetis Extended Version, и мы намеренно используем это наименование, чтобы в будущем избежать любой путаницы с другими авторскими сборками или форками Thetis.
⚠️ Важное примечание На текущий момент этот релиз имеет статус Бета-версии. Мы публикуем его для широкого тестирования сообществом OpenHPSDR, чтобы собрать обратную связь, отловить краевые случаи на разном железе и довести функционал до безупречного состояния перед переводом в стабильную ветку.
В этом материале я хочу подробно и без прикрас рассказать о том, что было сделано: от разработки GPU-ускоренного БПФ с нуля до математически точного управления скоростью прокрутки и глубокой стабилизации PureSignal.
GPU FFT Waterfall (Stage 9): разработка с нуля
Одной из главных целей было перенести вычисление спектра для водопада с CPU на видеокарту, чтобы достичь разрешения, недоступного классическому пути WDSP, и при этом не нагружать процессор.
Столкнувшись с тем, что готовых, рабочих исходных кодов для реализации такого специфического пайплайна в архитектуре Thetis в открытом доступе не существует, этот функционал был разработан и написан с нуля.
Что было реализовано:
- Lock-free I/Q ring buffer: безблокировочная передача сырых данных с потоков DSP напрямую в видеокарту
- Compute Shader FFT: вычисление БПФ размером от 1024 до 262144 точек непосредственно на GPU
- A/B калибровка в реальном времени: автоматическая нормализация уровней GPU-спектра относительно CPU/WDSP (с использованием EMA), чтобы переключение между режимами происходило бесшовно, без скачков или полос
- Отсутствие нагрузки на CPU: поток рендеринга получает только готовые строки, а задержка чтения (deferred readback) настроена так, чтобы никогда не блокировать UI
На практике это означает, что на видеокартах уровня Radeon RX 570 / GTX 1050 и выше теперь комфортно работать с размером БПФ 131072 и даже 262144 (разрешение 0.73 Гц на полосе 192 кГц), чего ранее добиться без фатальных просадок FPS было невозможно.
Сравнение CPU и GPU FFT при одинаковом разрешении
Рис. 1: CPU FFT (65536) Водопад на CPU, FFT 65536
Рис. 2: GPU FFT (65536) Водопад на GPU FFT, тоже разрешение 65536
На этих скриншотах показан один и тот же участок диапазона 14.100-14.140 МГц при одинаковом размере БПФ (65536 точек). Визуально спектр идентичен — это результат работы системы автоматической калибровки (A/B calibration), которая выравнивает уровни GPU относительно CPU/WDSP.
💡 Ключевое различие При использовании GPU FFT нагрузка на процессор практически нулевая, что позволяет устанавливать размеры БПФ до 262144 точек без каких-либо просадок производительности. На CPU такие размеры просто недостижимы в реальном времени.
Математически точный Auto Overlap
В классических реализациях существует известная проблема: при фиксированном проценте перекрытия (Overlap) скорость прокрутки водопада падает вдвое при каждом удвоении размера БПФ. Старые эвристические попытки «автоматизировать» это приводили к подергиваниям или игнорированию настроек пользователя.
Мы внедрили новую математическую формулу. Теперь система целевой частоты кадров работает следующим образом:
- Задается целевая скорость прокрутки (например, 30 строк в секунду)
- Система автоматически вычисляет необходимый шаг дискретизации (
step = round(Fs / R*)) - Процент перекрытия выводится из этой формулы (
overlap = 1 − step / N) и программно ограничивается безопасным максимумом в 95%
✓ Результат Скорость прокрутки водопада теперь абсолютно идентична при любом размере БПФ и любой частоте обновления монитора. Пользователю больше не нужно подбирать проценты вручную.
16-битный конвейер и Tone Mapping (HDR)
Опираясь на предыдущую миграцию на Direct2D 1.1, мы полностью раскрыли потенциал 16-битного формата (R16G16B16A16_Float, 65 536 уровней). Но просто увеличить разрядность мало. Для работы с экстремальным динамическим диапазоном (например, когда рядом с шумовым полом находится станция S9+60 дБ) мы добавили Tone Mapping:
- Reinhard: классическая HDR-кривая, мягко сжимающая пики
- ACES Filmic: кинематографическая кривая с естественным спадом ярких участков
В сочетании с новым упорядоченным дизерингом (Bayer 8×8) это полностью устраняет визуальный «бандинг» (ступенчатость градиентов) на плавных участках шума, делая картинку сопоставимой с лучшими образцами SDR-программ.
Noise Floor Pro и Zoom Adaptive
Умное отслеживание шумового пола теперь работает на основе перцентильного детектирования (quickselect), что гораздо устойчивее к плотным скоплениям сигналов, чем простое усреднение.
Функция Auto Threshold позволяет порогам водопада автоматически следовать за измеренным шумовым полом, сохраняя при этом заданную пользователем форму палитры (динамический диапазон).
Дополнительно внедрен режим Zoom Adaptive: при широком обзоре полосы улучшения отключены для экономии ресурсов, но при приближении (zoom in) к конкретному сигналу система автоматически активирует Tone Mapping и временную фильтрацию для максимальной детализации.
Стабилизация PureSignal (PS-A)
Поскольку ошибки коррекции PureSignal напрямую отражаются на водопаде в виде IMD-гребенок («comb artifacts»), мы уделили огромное внимание стабильности этого тракта:
- Cold-start guard: в течение первых 6 секунд после включения или жесткого сброса калибровочные данные отбрасываются. Это дает цепочке TX/PA/feedback время на стабилизацию, полностью исключая появление «гребенки» при первой калибровке
- Correction hold: при кратковременных сбоях сбора данных коррекция не отключается полностью, а удерживает последнее рабочее состояние, пока собирается новый набор
- Сбор данных через VOX-паузы: амплитудные «ведра» (buckets) теперь сохраняются между речевыми паузами, что позволяет коррекции быстро включаться после первых же фраз и непрерывно отслеживать нагрев PA, а не начинать сбор с нуля
Статус Бета-версии и обратная связь
Коллеги, еще раз подчеркиваю: это Бета-версия Thetis Extended Version. Мы сознательно выпускаем её в таком виде, чтобы получить максимально широкую обратную связь от сообщества.
Мы особенно ждем отчетов от владельцев видеокарт разных поколений:
- Корректно ли определяется уровень поддержки (Level 1 / Level 2)?
- Нет ли артефактов при переключении размера БПФ на лету?
- Как ведет себя Auto Overlap на нестандартных частотах обновления монитора (144 Гц и выше)?
📋 Лог-файлы для отладки Любые логи (файлы gpu_waterfall.log и PSAutoAttenuate.log в папке %APPDATA%\OpenHPSDR\Thetis-x64\) с описанием проблемы будут бесценны для финальной полировки кода перед стабильным релизом. Наша цель — сделать этот функционал надежным стандартом, а не экспериментом.
Часто задаваемые вопросы из нашего сообщества скопировал из чата думаю это будет тоже полезно для понимания новой архитектуры: Юрий, можно коротко как работает FFT через GPU ? OpenCL, CUDA или нечто третье ? Ответ:Отлично, что работает стабильно!
Отвечаю по GPU FFT:
DirectCompute (HLSL compute shaders) — ни OpenCL, ни CUDA.
Коротко как это работает:
- Захват I/Q: Сырые сэмплы захватываются из ChannelMaster через lock-free ring buffer (на потоках DSP, без блокировок)
- Upload на GPU: Данные загружаются напрямую в VRAM (буферы pre-allocated до 262144 точек)
- Compute Shader FFT:
waterfall_fft_stage_ab_cs.hlsl— битовая реверсия + стадии БПФwaterfall_fft_magnitude_cs.hlsl— вычисление магнитудыwaterfall_resolve_cs.hlsl— разрешение перекрывающихся окон- Всё на HLSL, Direct3D 11 compute pipeline
- Post-processing:
waterfall_postproc.hlsl— конвертация в dBm, применение палитры, gamma, tone mapping, temporal filtering
- Readback: Готовая строка водопада читается обратно с задержкой в один кадр (deferred readback с
MapFlags.DoNotWait), чтобы не блокировать render thread
Преимущества DirectCompute перед OpenCL/CUDA в нашем случае:
- Нативная интеграция с DirectX (Thetis уже использует SharpDX)
- Нет overhead на меж-API копирование буферов
- Zero extra CPU load — рендер-поток получает только готовые строки
Требования: Direct3D 11 с поддержкой compute shaders (RX 570+, GTX 1050+). На старых GPU — автоматический fallback на CPU (Level 0).
Благодарности
На отладку и тестирование всех этих функций ушла не одна неделя интенсивной работы. Хочу выразить искреннюю благодарность Анатолию (RA1CY) за неоценимую помощь в отладке, проведение многочисленных экспериментов и тестов, а также за предоставление детальных отчетов по работе водопада в различных режимах. Без его поддержки и готовности тестировать промежуточные версии этот релиз не состоялся бы.
Ссылки для скачивания
- Установщик (Beta): Тетис можно скачать тут (обновлено на beta-2. 19.07.26) https://eu2av.net/download/file.php?id=2065
- Руководство пользователя: Waterfall_Pro_User_Guide.html (включено в архив)
- Исходный код: [GitHub — ссылка будет позже]
📖 Документация В архиве с установщиком вы найдете полное руководство пользователя (Waterfall_Pro_User_Guide.html) с детальным описанием всех новых функций, настройками и рекомендациями по использованию.
Буду рад вашим комментариям, тестам и конструктивной критике.
Юрий, EU2AV
Разработчик SDR, радиолюбитель
eu2av.com | OpenHPSDR Community
Спасибо сообществу за тестирование и обратную связь. 73! 🎙️ 📡 🇾
Yuri, can you please create a Discord server where the users of your software can gather as a community?
Kind thanks,
Mark K1LSB
Great stuff, Yuri!
Scott Hello, Thank you for your interest in the topic. I hope that little by little I will be able to significantly transform thetis.