Строим цифровой 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) Изменить формулу расчёта частоты

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

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