После того как мы установили SoapyHackRf драйвер, можно заняться сборкой NBFM приёмника в GnuRadio.
Упрощено, наша схема будет состоять из следующих частей:
Запускаем GnuRadio и займемся первым блоком: источник сигнала.
Источник сигнала
Здесь не будет никаких чудес, его роль будет выполнять блок Osmocom Source. Добавим так же 2 блока «Variable»: для хранения текущей частоты на которой осуществляется прием, и для частоты семплирования HackRF. В блоке Osmocom Source в полях «Ch0 Frequency (Hz)» и «Sample rate (sps)» укажем имена переменных хранящих требуемые значения.
Теперь перейдем к ФНЧ. Она нам потребуется что бы отсечь ненужные частоы, а так же в этой части мы выполним децимацию (снижение) частоты семплирования, дабы не тратить ресурсы процессора на обработку лишней для нас информации.
В GnuRadio наш ФНЧ может быть организован 2 методами.
ФНЧ с использованием Xlating FIR Filter
Добавьте сам блок Xlating FIR Filter, и 3 блока переменных. Я назову их «input_decimation«, «main_sample_rate» и «xlate_firdes_taps«.
input_decimation задайте значение «100», это значит что частота семплирования приходящих с HackRF данных будет снижена в 100 раз.
main_sample_rate присвойте значение «hackrf_sample_rate/input_decimation»
xlate_firdes_taps переменная будет служить для хранения коэффициентов FIR фильтра. Введите сюда следующие данные «firdes.low_pass(1, hackrf_sample_rate, 12e3, 1e3, firdes.WIN_HAMMING, 6.76)»
Теперь немного остановимся и разберем эти значиния. Для того что-бы понять как работает КИХ-фильтр, и для чего ему нужны коэффициенты вы можете ознакомиться с этой статьей. Но вернемся к разбору строки. Я помечу цветом каждый параметр, и опишу для чего он нужен.
firdes.low_pass(1, hackrf_sample_rate, 12e3, 1e3, firdes.WIN_HAMMING)
firdes.lowpass — из библиотеки КИХ фильтров вызываем функцию генерации коэффициентов для ФНЧ фильтра
1 — усиление. 1, значит без усиления
hackrf_sample_rate — частота семплирования входных данных. У нас она 8e6 или 8000000 sps как заданно в переменной.
12e3 — частота среза фильтра. Так как каналы в LPD диапазоне идут с шагом 25КГц и 12.5 КГц, и мы работаем с комплексным сигналом, то для того чтобы отсечь лишнее нам потребуется 12КГц справа и слева от нулевой частоты (25 КГц / 2 = 12.5 Округляем до 12.)
1e3 — ширина переходной полосы фильтра. Задаем в 1 КГц.
firdes.WIN_HAMMING — используем оконную функцию Хэмминга
Теперь настроим блок Xlating FIR Filter
Далее добавим на схему спектроанализатор, и зададим ему частоту семплирования «main_sample_rate», и подключим к выводу Xlating FIR Filter. Смотрим что у нас получилось.
Теперь проанализируем поведение нашей схемы. Обработка данных будет происходить следующим путем:
На вход у нас поступает сигнал с полосой 8Мгц
Фильтр вырезает из этого сигнала кусок в 24 Кгц (плюс немного на полосу перехода)
Затем происходит децимация частоты семплирования в 100 раз, что дает нам сигнал с полосой в 80 КГц.
Запустим наш граф, дабы сравнить наши предсказания с реальной ситуацией.
Да! Оно работает как надо. Теперь попробуем построить ФНЧ по второму методу
ФНЧ на блоках «Rational Resampler» и «Low Pass Filter»
Удалим блок Xlating FIR Filter, и вместо него добавим блоки «Rational Resampler» и «Low Pass Filter». Соединим их как показано на рисунке, Rational Resampler к источнику сигнала, Low Pass Filter к выходу ресемплера, выход фильтра на спектроанализатор.
Настроим параметры Rational Resampler задав в поле «Decimation» значение «input_decimation». Далее настроим Low Pass Filter как показано на рисунке ниже.
Думаю вы уже увидели знакомые параметры фильтра: Cutoff Freq (частота среза) задана в 12 Кгц, и Transition Width (полоса перехода) в 1 КГц.
Давайте теперь вновь проанализируем что произойдет.
Так же как и раньше на вход поступает сигнал шириной в 8 Мгц
Далее происходит децимация в 100 раз блоком Rational Resampler, в результате чего теряется вся информация о сигналах за пределами полосы в 80 КГц.
Далее применяем ФНЧ, оставляя лишь сигналы в интересующей нас полосе.
Запустим наш граф, дабы поглядеть как он поведет себя.
Как можно видеть, поведение его аналогично.
Вы можете спросить «а какой тип фильтра я должен использовать?». Ответ на это будет такой: если вам требуется применить фильтр к очень широкополосному сигналу — ваш выбор это Xlating FIR Filter, если частота семплирования не слишком великат о блок Low Pass Filter ваш выбор Если частота семплирования велика, но требуется не очень широкий фильтр, то можно понизить частоту семплирования ресемплером, а затем применить Low Pass Filter
Демодулятор
Двигаемся дальше, к следующему блоку, а именно — демодулятору.
GnuRadio имеет готовый блок для демодуляции FM сигнала — блок «NBFM ReceIve». Кинем его на схему, и подключим его вход к выходу ФНЧ. Откроем свойства NBFM Receive и зададим параметры как на картинке.Пояснения по параметрам: параметры Audio Rate и Quadrature Rate должны быть целым числом, поэтому они обрабатываются Python-функцией int(). Так же отношение значений Quadrature Rate/Audio Rate должно быть целым числом.
Audio Rate — частота семплирования на выходе блока
Quadrature Rate — частота семплирования на входе блока.
Max Deviation — отклонение частоты, как подсказывает нам Википедия, для сигналов с шагом частоты 25 КГц отклонение составляет 5 КГц, для шага 12.5 КГц — 2.5 КГц
Вывод аудио
Остался последний блок — вывод аудио. Здесь тоже все просто, добавляем блоки Rational Resampler и Audio Sink. Rational Resampler трансформирует нашу частоту семплирования в 80 КГц в используемую звуковой картой 48 КГц. Для этого зададим в ресемплере значение decimation равное 10, и interpolation равное 6.
Взглянем на получившийся граф.
Все. Можно его запускать, и проверять рацеией на частоте 433.200
Так же можете ознакомится с видео. в котором показан весь процесс создания приемника.
странно в окне FFT Plot не чего не рисует (нет спектра ) , и на хакрф не горит индикатор прием??
А если прицепить ко входу спектроанализатора простой источник синуса?