Ранее я уже писал про самодельный SDR приемник, сделанный на базе отладочной платы DE0-nano. Как и большинство других SDR приемников, он не был способен работать без подключения к компьютеру. При этом в использованной ПЛИС оставалось еще большое количество неиспользованных ресурсов, так что я решил сделать приемник полностью автономным.
О том, как же работает весь SDR приемник целиком, и как его реализовать — далее.
Немного про предыдущий проект
Задачей любого приемника является усиление сигнала с антенны, выделение нужного высокочастотного сигнала, перенос его в область низких частот (чаще всего звуковых), и демодуляция получившегося сигнала. Непростой проблемой при этом является именно выделение определенного высокочастотного сигнала из всего радиоэфира. Обычно нужный сигнал расположен относительно в узкой полосе частот (большинство радиолюбительских сигналов имеют ширину менее 4 кГц), а рядом с ним находятся другие радиосигналы, прием которых будет только мешать. Поэтому аналоговые радиолюбительские приемники довольно сложны, в них приходится делать несколько преобразований частоты, и устанавливать достаточно сложные полосовые фильтры. Наличие различных методов модуляции сигналов также требует вводить в приемник набор разных демодуляторов.
С распространением мощной вычислительной техники появилась возможность переложить часть функционала приемника на компьютер. За счет цифровой обработки сигнала можно создавать очень эффективные полосовые фильтры (хотя бы и низкочастотные), проводить демодуляцию сигналов любого типа, отображать спектр принимаемого сигнала.
В большинстве современных приемников перенос сигнала с более высокой частоты на более низкую производится путем смешивания (перемножения) исходного сигнала с сигналом от опорного генератора — гетеродина. В результате на выходе смесителя появляется сигнал с частотой, равной разности частот исходного сигнала и гетеродина.
Однако при этом могут приниматся сигналы, находящиеся как ниже, так и выше частоты гетеродина (частоты A и B на рисунке). Это явление называется «зеркальным каналом». Для борьбы с ним в аналоговых приемниках совместно используются фильтры и перенос на промежуточные частоты.
Есть и другой метод подавления зеркального канала — фазовый, использующий квадратурное смешение сигналов (описание метода). Особенность этого метода — для его реализации в приемнике нужно реализовать два фазовращаетеля достаточно высокого порядка, причем их характеристики должны быть идентичны, что требует точного подбора компонентов и усложняет конструкцию приемника и его наладку.
Так как в цифровой форме можно абсолютно одинаково обработать несколько различных сигналов, то появилась возможность создавать довольно простые, но эффективные приемники. В таких приемниках сигнал после квадратурного смесителя отфильтровывается от ВЧ сигналов, усиливается, оцифровывается АЦП и передается на компьютер или DSP. Именно эта технология используется в большинстве SDR приемников.
Структурная схема такого приемника:
При наличии подходящего высокоскоростного АЦП и ПЛИС можно выполнять в цифровой форме даже квадратурное преобразование и децимацию получившегося сигнала. Приемники такого типа называются DDC (Digital Down Conversion). За счет того, что в таком приемнике практически нет аналоговых компонентов, можно получить очень высокий коэффициент подавления «зеркального канала».
Именно такой приемник я описывал ранее. Он включал в себя внешний АЦП, и реализованные в ПЛИС умножители сигналов, цифровой генератор сигналов, CIC и FIR фильтры, а также модули для передачи полученной информации на компьютер. Приемник выдавал через Ethernet поток данных 16 бит x 50 ksps x 2 канала.
А теперь стоит перейти к описанию SDR приемника, способного работать автономно.
Выделение сигнала и его демодуляция
Ранее в моем приемнике эти операции выполнял компьютер. Теперь требовалось реализовать их на ПЛИС.
Структурная схема получившегося демодулятора:
Так как хотелось иметь возможность изменять частоту принимаемого сигнала, не изменяя при этом основную частоту настойки приемника, то потребовалось добавить в блок демодулятора дополнительные генератор и комплексный умножитель. Генератор (NCO1) формирует синусоиду и косинусоиду, и может перестраиваться в диапазоне 0-25 кГц.
Для переноса нужного сигнала в область нулевых частот используется квадратурный умножитель. Важная особенность его работы — за счет того, что перемножаются комплексные сигналы, на его выходе не возникает зеркального канала.
Также имеется модуль, позволяющий поменять местами шины, соединяющие NCO1 и умножитель, за счет чего изменяется направление сдвига сигнала (на схеме этот модуль не показан).
Результат переноса сигналов:
Однако вышеупомянутый перенос частоты не решает проблемы зеркального канала.
Фаза сигналов на выходе квадратурного смесителя зависит от их положения относительно частоты гетеродина: находящиеся выше этой частоты будут иметь разность фаз в каналах I и Q +90 градусов, ниже -90 градусов.
Таким образом, если дополнительно сдвинуть все сигналы в канале I на +90 градусов, то разность фаз сигналов будет составлять уже либо 180, либо 0 градусов. Достаточно сложить получившиеся сигналы друг с другом, и нежелательный зеркальный канал будет подавлен (сложение сигналов с разностью фаз в 180 градусов дает ноль). Если вместо сложения выполнять вычитание сигналов — то будет приниматься именно зеркальный канал — таким образом можно переключать вид принимаемой полосы: LSB/USB.
Для выполнения фазового сдвига в модуль демодулятора введен цифровой фазосдвигающий фильтр — преобразователь Гильберта (Hilbert Transform). Он осуществляет сдвиг фаз всех частотных составляющих сигнала на 90 градусов.
Фильтр был рассчитан при помощи инструмента FDATool, входящего в состав Matlab. Фактически, фильтр Гильберта — это просто разновидность КИХ-фильтра с определенными коэффициентами. FDATool позволяет даже сгенерировать VHDL-код для получившегося фильтра. Порядок использованного фильтра — 65.
Особенность фильтра Гильберта — на частотах 0 и Fs/2 его коэффициент пропускания стремится к 0. В данном случае это значит, что частоты в НЧ области от 0 до ~500 Гц приниматься не будут.
Фильтр Гильберта задерживает сигнал на N/2 выборок, где N-порядок фильтра. Для компенсации этого эффекта в канал Q введена линия задержки (FIFO буфер), задерживающий сигнал на 34 выборки.
После того, как сигналы каналов I и Q сложены, получившийся сигнал нужно отфильтровать, пропустив на выход сигналы, находящиеся в полосе 0-3 кГц. Это делается для облегчения приема SSB сигналов, которые обычно имеют такую полосу. Замечу, что если в эту полосу попадут несколько радиостанций, работающих телеграфом, то все они будут слышны.
В качестве фильтра используется готовый КИХ-фильтр из Quartus. Он имеет порядок 32, коэффициенты для него, были также рассчитаны в FDATool.
АЧХ получившегося фильтра:
Все модули демодулятора имеют разрядность 12 бит. Меньшая разрядность давала бы не очень качественный звук, большая потребовала бы больше ресурсов ПЛИС, которых явно не хватало. Тактовой частотой для всех модулей является частота 50 кГц (скорость потока данных на выходе децимирующих фильтров).
Вывод звука
Для того, чтобы вывести звуковой сигнал из ПЛИС, я использовал формирователь ШИМ. Это не самый лучший способ создания звукового сигнала, но наиболее простой. Тактовая частота формирователя ШИМ выбрана достаточно высокой — 100 МГц. С такой частотой при разрядности 12 бит частота импульсов ШИМ — 24кГц.
Так как принимаемые сигналы имеют очень большой динамический диапазон, то для нормального приема в конструкцию пришлось ввести программную автоматическую регулировку усиления (AGC). Реализована она довольно просто — при слишком большой амплитуде сигнала на выходе демодулятора модуль АРУ ослабляет сигнал на входе демодулятора (для этих целей используется входящий в него блок Right Shifter). Сигнал ослабляется в 2^N раз за счет простого сдвига, что не очень удобно, но очень просто реализуется программно и практически не требует ресурсов ПЛИС. Если в течении 0.2 сек сигнал на выходе демодулятора будет низким, то ослабление сигнала уменьшается. Недостаток такого метода — переключение усиления иногда довольно хорошо слышно.
FFT, вывод спектра на экран и управление приемником
Ранее я уже реализовывал на DE0-nano работу с VGA монитором. Также я экспериментировал с модулем FFT.
Таким образом достаточно было перенести имеющиеся модули в проект приемника, и подключить выходы децимирующих фильтров к входу модуля FFT — и появилась возможность наблюдать спектр радиосигнала в полосе +-25кГц от частоты главного гетеродина — NCO2. Демодулятор звука и FFT при этом работают независимо, так что можно изменять частоту принимаемого сигнала, не изменяя частоты настройки приемника.
Модуль FFT — готовый из Quartus, длинной 512 точек, работает совместно с модулем оконной функции.
Традиционно при отображении спектра используют его логарифмическое представление. Однако мне оно показалось не очень информативным, кроме того, модуль аппаратного вычисления логарифма занимал слишком много ресурсов ПЛИС, а вычисление логарифма программно выходило слишком долгим. Так что значение амплитуды спектра перед выводом на экран просто уменьшается в 2^N раз, число N можно изменять программно.
В данном проекте захват данных от модуля FFT, вывод данных на VGA экран, работа с SDRAM, управление приемником идет при помощи системы SOPC, в состав которой входит софтовый процессор NIOS II.
Упрощенная структурная схема SOPC:
Для управления приемником я решил использовать мышь с интерфейсом PS/2. Он довольно прост, вся связь идет по двум проводам. На сайте Altera среди примеров для некоторых отладочных плат явно упоминался модуль для SOPC, предназначенный для работы с PS/2. Попадался и код (ссылок указать не могу, так как вновь найти нужные не удалось). Найденный пример пришлось изменить для работы с моей системной частотой, однако вначале он все равно не заработал. Ситуация осложнялась тем, что шина PS/2 — двунаправленная, причем пятивольтовая, а ПЛИС работает от 3.3В. Как оказалось, для того, чтобы мышь нормально заработала, нужно подавать на нее 5В (при 3.3В мышь не запускается), в настройках Quartus выводы, используемые для PS/2 должны быть указаны как работающие от 3.3В (остальные выводы у меня настроены на 2.5 В). Также для надежной работы пришлось установить конденсатор в 470пФ между линией CLK и землей. Возможно, если использовать внешний преобразователь уровней напряжений, то проблем можно было бы избежать.
Далее удалось наладить связь с мышью из Nios, но и тут возникла проблема — мне не удавалось настроить частоту выдачи данных мышью. Как оказалось позже, это была проблема конкретного вида мыши. Работа с мышью на программном уровне не сложна — после инициализации при перемещении она посылает на ПЛИС 3 байта, которые принимает контроллер мыши в SOPC. Он же генерирует прерывание для Nios, в обработчике которого Nios вычисляет новые координаты курсора.
Интерфейс, реализованный на Nios, позволяет наблюдать спектр, «водопад», управлять настройкой приемника (главным гетеродином), настройкой частоты приема звука, видом принимаемой полосы — USB/LSB. Частоту настройки можно изменять, нажимая на соответствующую цифру на индикаторе частоты левой/правой кнопкой мыши (аналогичным образом частоту можно менять во многих компьютерных SDR программах). Частоту настройки приема звука можно менять, нажимая мышью в нужное место на спектре или «водопаде».
Структурная схема всего приемника:
Ресурсы ПЛИС, используемые проектом
Как я уже писал выше, в процессе создания проекта возникли определенные трудности, связанные с объемом проекта. В нем используется большое количество фильтров, которые занимают место как в логических элементах (LE), так и используют аппаратные умножители. При настройке параметров каждого блока приходилось выбирать, какую длину фильтра использовать. Из-за недостатка ресурсов некоторые фильтры пришлось переключить в симметричный режим, что позволяет сократить число используемых фильтром умножителей вдвое. Тем не менее, параметры фильтра Гильберта и КИХ-фильтра в демодуляторе вышли достаточно посредственными (в компьютерных программах они гораздо эффективней). Стоит заметить, что в получившейся конструкции ресурсы ПЛИС используются не в полную силу — тактовая частота большинства модулей — 50кГц, хотя они могут работать на куда более высокой частоте.
Также достаточно много ресурсов занимает SOPC вместе с Nios — более 6000 LE.
Всего в проекте используется:
LE: 21,445 / 22,320 (96 %)
9-битных умножителей: 98 / 132 (74 %)
Как видно, практически все LE ПЛИС использованы.
Общий вид приемника:
Крупным планом:
Вид экрана во время работы (во время CQ WW RTTY DX Contest):
Прием SSB:
Видео работы приемника:
Из видео можно судить о качестве работы приемника. Стоит заметить, что на слух звук несколько лучше, чем на записи на видео телефоном. Также, как я упоминал ранее в предыдущем посте, антенна используется не лучшая.
На приемник удавалось принять сигналы rtty (подключенный к приемнику КПК их декодировал), принимались сигналы JT65 (они декодировались на компьютере). Хорошо было слышно немецкую радиостанцию, передававшую метеофакс.
Ссылка на проект