HackRF как трансивер: Часть 2. Приём NBFM

После того как мы установили SoapyHackRf драйвер, можно заняться сборкой NBFM приёмника в GnuRadio.

Упрощено, наша схема будет состоять из следующих частей:
block-nfm-rx

Запускаем GnuRadio и займемся первым блоком: источник сигнала.

Источник сигнала

Здесь не будет никаких чудес, его роль будет выполнять блок Osmocom Source. Добавим так же 2 блока «Variable»: для хранения текущей частоты на которой осуществляется прием, и для частоты семплирования HackRF. В блоке Osmocom Source в полях «Ch0 Frequency (Hz)» и «Sample rate (sps)» укажем имена переменных хранящих требуемые значения.

step1_osmocom_source

Теперь перейдем к ФНЧ. Она нам потребуется что бы отсечь ненужные частоы, а так же в этой части мы выполним децимацию (снижение) частоты семплирования, дабы не тратить ресурсы процессора на обработку лишней для нас информации.
В 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
step2_xlating_fir_filterДалее добавим на схему спектроанализатор, и зададим ему частоту семплирования «main_sample_rate», и подключим к выводу Xlating FIR Filter. Смотрим что у нас получилось.

step3_lpf_fir_viewТеперь проанализируем поведение нашей схемы. Обработка данных будет происходить следующим путем:
На вход  у нас поступает сигнал с полосой 8Мгц
graph1_xlate_firФильтр вырезает из этого сигнала кусок в 24 Кгц (плюс немного на полосу перехода)
graph2_xlate_firЗатем происходит децимация частоты семплирования в 100 раз, что дает нам сигнал с полосой в 80 КГц.
graph3_xlate_fir

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

step4_lpf_fir_running

Да! Оно работает как надо. Теперь попробуем построить ФНЧ по второму методу

ФНЧ на блоках «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 как показано на рисунке ниже.
step5_simple_lpf_paramДумаю вы уже увидели знакомые параметры фильтра: Cutoff Freq (частота среза) задана в 12 Кгц, и Transition Width (полоса перехода) в 1 КГц.
Давайте теперь вновь проанализируем что произойдет.
Так же как и раньше на вход поступает сигнал шириной в 8 Мгц
graph1_xlate_firДалее происходит децимация в 100 раз блоком Rational Resampler, в результате чего теряется вся информация о сигналах за пределами полосы в 80 КГц.
graph4_simple_lpf

Далее применяем ФНЧ, оставляя лишь сигналы в интересующей нас полосе.
graph3_xlate_fir

Запустим наш граф, дабы поглядеть как он поведет себя.
step6_simple_lpf_runningКак можно видеть, поведение его аналогично.

Вы можете спросить «а какой тип фильтра я должен использовать?». Ответ на это будет такой: если вам требуется применить фильтр к очень широкополосному сигналу — ваш выбор это Xlating FIR Filter, если частота семплирования не слишком великат о блок Low Pass Filter ваш выбор Если частота семплирования велика, но требуется не очень широкий фильтр, то можно понизить частоту семплирования ресемплером, а затем применить Low Pass Filter

Демодулятор

Двигаемся дальше, к следующему блоку, а именно — демодулятору.
GnuRadio имеет готовый блок для демодуляции FM сигнала — блок «NBFM ReceIve». Кинем его на схему, и подключим его вход к выходу ФНЧ. Откроем свойства NBFM Receive и зададим параметры как на картинке.step7_nfm_demod_paramПояснения по параметрам: параметры 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.

Взглянем на получившийся граф.
step8_rx_graph

Все. Можно его запускать, и проверять рацеией на частоте 433.200

Так же можете ознакомится с видео. в котором показан весь процесс создания приемника.

HackRF как трансивер: Часть 2. Приём NBFM: 2 комментария

  1. Александр

    странно в окне FFT Plot не чего не рисует (нет спектра ) , и на хакрф не горит индикатор прием??

    1. Igor Автор записи

      А если прицепить ко входу спектроанализатора простой источник синуса?

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

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