Строим цифровой DDC/DUC трансивер своими руками (часть 2)

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

Главным прогрессом стал перенос кода, занимающегося обработкой, фильтрацией и выводом звукового потока в STM32 модуль.

Смотря на опыт своих коллег из UHSDR был реализован фильтр Гильберта, ФНЧ и прочие модули на DSP подсистеме процессора. Это позволило разгрузить FPGA и в будущем позволит оперативно менять параметры фильтров под нужды пользователя (например частоту среза).

Также, весь модуль WM8731 теперь тактируется и полностью подключен к STM32. На нём же реализованы АРУ, Loopback система для проверки микрофона, доработан FFT, водопад и прочее. Всё общение с кодеком происходит по средством DMA.

Также, теперь настройки и параметры хранятся во Flash-памяти.

Файлы проекта будут хранится в GitHub репозитории https://github.com/XGudron/UA3REO-DDC-Transceiver (подключение выводов и схемотехника может отличаться на момент просмотра от времени написания статьи, если нужны старые версии — смотрите историю старые ревизии кода в репозитории).

Начал рисовать схему соединения и модулей в DipTrace (есть в файлах проекта).

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

У меня нет особых навыков в измерении характеристик приёмников, да и аппаратуры соответствующей почти нет, но подключив вывод к звуковой плате компьютера было измерено, что шумовая планка составляет -100дБ (предел микрофонного входа звуковухи), а подавление зеркального канала более -90дБ (сигнал с генератора показывает -10дБ в нужной полосе, и уходит в шумы -100дБ при смене LSB/USB). Если раздобуду калиброванный генератор сигнала, то измерю текущую чувствительность.

Так как в ходе подготовки статьи не было интересных аппаратных изменений, расскажу про организацию передачи звуковых данных из FPGA в кодек.

Проблема заключается в том, что если прочитать данные, обработать их фильтрами Гильберта и FIR, и отправить на кодек — то получится сильная рваная зарежка. Для этого, пока аудио-кодек занимается передачей звука, надо успевать подготовить новую порцию данных.

После долгих (очень долгих) экспериментов я остановился на следующей схеме работы:

  1. Из FPGA, на частоте приближенной к частоте дискретизации аудио-кодека (а 100% соответствия добиться не получается, т.к. PLL I2S шины работает чуть ниже 48кгц и периодически «гуляет») заполняет кольцевой буффер, как только он доходит до его конца, данные начинают заполнятся с начала.
  2. Обработчик звука (там где происходит вся фильтрация) берёт ровно половину буффера FPGA до текущей позиции, производит свои преобразования и складирует результат в один из буфферов, сначала А, потом B, по очереди.
  3. В это время DMA аудио-кодека тоже работает в кольцевом режиме и вызывает 2 прерывания: по завершению кольца и на его середине.
  4. Когда мы находимся на конце буффера, мы загружаем вторую половину кольца новыми данными из буффера аудио-процессора, а когда находимся на середине — первую половину буффера. Тем самым, DMA, всегда имеет «хвост» из свежих данных, готовых к передаче. В связи с этим звук получается достаточно чистым и без искажений.

Полезные ссылки:

  1. https://hubstub.ru/stm32/169-stm32-dma-mem2mem.html
  2. https://github.com/DFRobot/STM32/blob/master/libraries/DFRobotBlunoM3/Wire/Wire.cpp
  3. https://fiiir.com/
  4. https://github.com/df8oe/UHSDR
  5. https://stackoverflow.com/questions/47610302/how-to-use-w25q16-flash-memory-in-stm32f4-with-hal-driver

2 мысли о “Строим цифровой DDC/DUC трансивер своими руками (часть 2)”

  1. Здравствуйте. Когда будете оформлять проект с генератором на 96МГц, можете заострить внимание, какие параметры нужно менять в случае смены тактовой частоты? У меня есть генератор на 122,88МГц от соответствующего проекта.

    1. Да, конечно!
      Предварительно список следующий:
      1. (FPGA) Перенастроить NCO на нужную частоту
      2. (FPGA) Перенастроить CIC и CICCOMP на новый уровень децимации
      3. (FPGA) Перенастроить PLL для выдачи нужных частот на фильтр CICCOMP
      4. (STM32) Изменить формулу расчёта частоты

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *