SDR радио приемник.

7-го мая мы будем отмечать день Радио. К этому празднику мы подготовили проект — SDR радио приемник из платы Марсоход2. Теперь наше радио работает!

На видео демонстрации выше видно, что к ноутбуку кабелем USB подключена плата Марсоход2. К плате Марсоход2 подключен просто кусок провода примерно 5 метров, он вывешен на удочке на улицу в окно нашей лаборатории. На ноутбуке запущена программа HDSDR с помощью которой можно перестраивать приемник и слушать радио трансляции. Мы не делали никаких предварительных активных усилителей или фильтров (да, мы знаем, что это не очень правильно), но вот так — просто прием на кусок провода, подключенный к АЦП платы. Несколько станций в принципе ловятся: некоторые на английском языке, некоторые неизвестных нам языках, может китайский или вьетнамский. Довольно сильный сигнал от http://russian.cri.cn/ – международное радио Китая, на русском языке — как раз на видео ролике вверху мы его и ловим.

Вот еще одна видео демонстрация:

Может быть эта демонстрация даже чем-то еще интересней. Здесь одна плата Марсоход2 выступает в роли АМ передатчика и транслирует музыку в эфир на антенну — кусок провода свернутый в колечко. У нас был проект АМ радио передатчика — вот его и используем (правда немного модифицированный проект, здесь несущая частота 7МГц). Ну а вторая плата Марсоход2 выступает в роли SDR радиоприемника. Одной платой передаем радиосигнал, а второй ловим и слушаем. Ну да, дистанция не большая — всего-то метр, но все равно интересно.

SDR – это Software Defined Radio. Сделать цифровой радиоприемник из платы Марсоход2 мы хотели давно. Однако, тема не простая и поэтому все никак не решались взяться за это дело. Тут несколько проблем:

  • для радиоприемника важна антенна, как ее делать? Нужен ли предварительный усилитель? Как его рассчитать и сделать? Как вы уже поняли в конце концов ничего специального делать не стали.. ленивые..
  • проект состоит из двух частей — это проект в ПЛИС и библиотека DLL для связи платы с программой HDSDR, то есть нужны 2 компонента, а это в 2 раза больше работы;
  • на плате Марсоход2 есть АЦП 20МГц, 8 бит — не очень высокая частота и не очень много бит на одну выборку — не было уверенности, что будет работать;
  • на плате Марсоход2 в ПЛИС не так чтобы много умножителей. У нас стоит FPGA EP3C10E144C8 – здесь всего 46 девятибитных умножителей, а для проекта SDR нужно их много, ведь там цифровые фильтры и все такое..

За основу нашего проекта взят другой проект, описанный на хабрахабре: "Простой SDR приёмник на ПЛИС" https://habrahabr.ru/post/204310/

По сути дела мы постарались портировать этот проект на нашу плату, но, конечно, проект сильно отличается: у нас другая разрядность АЦП, у нас используется последовательный порт вместо ethernet, другая разрядность на фильтрах, более короткий FIR фильтр из-за лимита умножителей в ПЛИС, другая Winrad DLL, 32-х битные выборки на канале вместо 16-ти битных...

Структура нашего SDR приемника вот такая:


sdr radio in Marsohod2 FPGA board structure

В проекте есть NCO, управляемый генератор гармонических колебаний и его можно перестраивать в некотором диапазоне частот, скажем до 8МГц. Выходы NCO – это две шины данных с синусоидальными отсчетами и косинусоидальными отсчетами. Эти шины идут на два умножителя. Сюда же на умножители приходит оцифрованный сигнал с АЦП.

Поскольку данные с АЦП 8-ми разрядные, и с NCO я беру только 8 бит, то в результате умножения получается 16-ти битное знаковое число. Операция умножения производит перенос спектра радио сигнала. Нас интересуют те спектральные составляющие, которые попали в область нижних частот.

Передать этот поток в ПК для анализа довольно трудно, ведь здесь поток у нас 20 миллионов выборок в секунду. Нужно произвести передискретизацию на более низкую частоту, но перед этой операцией нужен фильтр нижних частот. Используется так называемый CIC фильтр, который позволяет понижать частоту дискретизации в десятки или сотни раз. В среде ALtera Quartus II есть megafunction Wizard, который позволяет создавать и конфигурировать CIC фильтр для проектов ПЛИС:

CIC filter decimation 1/200

В нашем проекте производится снижение частоты в 200 раз, то есть после CIC фильтра частота отсчетов может быть уже 100кГц.

После CIC фильтра идет FIR фильтр, который должен компенсировать пологое спадание АЧХ CIC фильтра. Я надеюсь еще написать про это подробнее в отдельной статье - тут дело сложное, нужно рассчитать коэффициенты фильтра. FIR фильтр так же создается в среде Quartus II в визарде:

fir filter altera quartus II wizard

На выходе FIR фильтра уже получатся многоразрядные числа. В нашем проекте megafunction wizard говорит, что выходных бит 37(!) и предлагает выбрать нужные: либо отбросить старшие либо отбросить и округлить младшие.. Вот смотрите, что дает визард:

fir filter quatus ii wizard

Не простая задача на самом деле. Мы выбрали отбросить старшие 5 бит и будем передавать в ПК только 32 младших бита. От этого выбора зависит качество воспроизведения и громкость. Если отбрасывать младшие биты, то получится тихо. Если отбросить много старших, то будет сильно искажаться сигнал, будет "булькотеть".

Еще важное замечание. Поскольку используются мегафункции Altera Quartus II для CIC, FIR фильтров, то квартус в данном случае будет генерировать прошивку для ПЛИС с ограничением по времени. Это они так защищают свои IP-core. Для реального коммерческого проекта понадобится платная версия Quartus II, а не Web Edition. В принципе, фильтры можно и самому написать. У меня уже был пример реализации FIR фильтра - можно его попробовать.

Весь проект для ПЛИС выполнен в среде Altera Quartus II v13.1:

qii top

Модуль самого верхнего уровня в графическом представлении. Можно кликнуть по изображению, чтобы увеличить его. В принципе все модули здесь повторяют структурную схему, показанную выше.

Хочу обратить ваше внимание на модуль beeper. Этот модуль создан исключительно для отладки. Когда у нас еще не было никакой антенны и мы вообще не знали получится ли у нас радиоприемник, мы использовали этот наш бипер, как источник радио сигнала. Этот модуль выдает произведение двух синусоид, то есть как бы амплитудно модулированный сигнал. На бипер идут две кнопочки — одна меняет частоту тона, другая длительность гудка бипера. Получается звук ну как у первого советского спутника. Если не использовать вход АЦП и подать на умножители шину данных с beeper, то вы сможете услышать этот самый звук в SDR радио.

Теперь о программе на компьютере.

hdsdr

Выглядит программа вот так, как на рисунке выше. Мы используем программу HDSDR – ее можно скачать на сайте автора http://www.hdsdr.de/.

Чтобы программа поддерживала платы сторонних производителей нужно написать дополнительную DLL, которая используя специальное API служит мостиком между платой и программой HDSDR. DLL мы написали в MS Visual Studio 2012.

Все исходники: для Visual Studio и для Altera Quartus II можно взять на github: https://github.com/marsohod4you/FPGA_SDR

Дополнительно по теме SDR радио приемника:

  1. Протокол передачи данных SDR радио для Марсоход2.
  2. Структура Winrad DLL и отладка DLL в Microsoft Visual Studio.
  3. Расчет коэффициентов FIR фильтра в GNU Octave.

Пробуйте наш проект на ваших платах и слушайте радио!

 


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