В одной из предыдущих статей про Software Defined Radio был задан вопрос, как декодировать RDS с помощью GNU Radio. Декодер RDS является не таким уж простым для создания с нуля, но к счастью для нас, в GNU Radio он уже встроен, так что несложно посмотреть как он работает, не написав ни одной строчки кода, достаточно лишь приемника RTL-SDR.
Как это работает, продолжение под катом.
Про GNU Radio и его установку я повторяться не буду, это уже описывалось ранее. Если совсем кратко, дистрибутив под Windows можно взять здесь. Перейдем собственно к RDS.
Если кто вдруг не в курсе, RDS (Radio Data System) — это протокол, используемый в обычном FM-вещании для передачи дополнительной цифровой информации (время, курсы валют, погода и пр). Передача идет со скоростью 1187.5bps на частоте 57КГц (3я гармоника пилот-тона), для минимизации полосы частот используется фазовое кодирование BPSK (Binary Phase Shift Keying). Побитовый уровень RDS уже рассматривался на хабре ранее, ну а мы перейдем к GNU Radio.
Декодер для GNU Radio был сделан примерно лет 10 назад, но ту версию смотреть уже бесполезно, названия многих блоков поменялись, и приведенные там примеры уже не работают. Обновленный форк можно взять отсюда.
Собрать gr-rds из исходников под Windows, кстати, не получилось — в cmake выдаются ошибки на отсутствие Boost, хотя он поставлен. Непонятно кстати, почему за годы существования cmake и boost, cmake так и не научили находить пути в Windows — вроде найти папку на диске это совсем не rocket science (если кто знает решение, напишите в комментариях, хотя судя по Stack Overflow, проблема существует годами и всем пофиг). Но это нам как оказалось, и не нужно — декодер RDS уже добавлен в GNU Radio, так что из проекта на github нам нужны только примеры, которые лежат в папке apps.
Блок-схема, прилагаемая в примерах, является довольно-таки монструозной, к тому же, при ее открытии выдаются ошибки (блоки помечены красным).
В реале, впрочем, все проще — 2/3 схемы это стерео-плеер для FM, где из исходного сигнала извлекаются L+R и L-R каналы, обрабатываются и подаются на звуковую карту. Нам это сейчас неактуально, так что эти блоки можно удалить (тем более, что «из коробки» оно почему-то и не заработало, а разбираться было лень). Ошибки возникают из-за параметра Grid Position, который видимо, не поддерживается Windows-версией, но его можно без проблем удалить, на функциональность не влияет.
После удаления «всего лишнего» работающая схема RDS декодера выглядит так:
Посмотрим, что тут есть.
Исходный сигнал поступает из RTL-SDR Source, частота задается параметром freq, имеющим тип WX GUI Slider (да, в GNU Radio можно создать свой UI, и есть базовые контролы). Чтобы избежать пика на нулевой частоте в центре, используется параметр freq_offset, блок Frequency Xlating сдвигает частоту на это значение. Блок WBFM Receive, как понятно из названия, выполняет FM-демодуляцию, затем частота сдвигается еще раз, чтобы выделить сам RDS на 57КГц. Блок Root Cosined Filter выделяет узкую частоту, ну а MPSK-декодер с параметром 2 выполняет BPSK декодирование (сам RDS передается с помощью фазовой модуляции с двумя состояниями). В RDS используется дифференциальное кодирование, поэтому вызывается соответствующий дифференциальный декодер, ну и наконец готовый бинарный поток подается на блок RDS Decoder (его исходники можно посмотреть на github). После декодера не менее важная часть это RDS-парсер — типов пакетов в RDS довольно-таки много, и парсер делает всю работу по их расшифровке.
Собственно и все. Результаты работы декодера на КДПВ и скриншотах.
Если кому-то необходимо использовать программу в no-UI режиме, можно использовать блок FR Tap, более подробное описание здесь, я лично его не пробовал. Если же интересен более низкий побитовый уровень RDS, я его рассматривал ранее, для общего интереса тоже может быть полезно.
Как обычно, всем удачных экспериментов.
Исходный GRC-файл, работающий под Windows, под спойлером (частоту радиостанции только придется поменять).
<?xml version='1.0' encoding='utf-8'?>
<?grc format='1' created='3.7.11'?>
<flow_graph>
<timestamp>Thu Aug 28 08:24:49 2014</timestamp>
<block>
<key>options</key>
<param>
<key>author</key>
<value></value>
</param>
<param>
<key>window_size</key>
<value>1600, 1600</value>
</param>
<param>
<key>category</key>
<value>Custom</value>
</param>
<param>
<key>comment</key>
<value></value>
</param>
<param>
<key>description</key>
<value></value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
<key>_coordinate</key>
<value>(14, 9)</value>
</param>
<param>
<key>_rotation</key>
<value>0</value>
</param>
<param>
<key>generate_options</key>
<value>wx_gui</value>
</param>
<param>
<key>hier_block_src_path</key>
<value>.:</value>
</param>
<param>
<key>id</key>
<value>rds_rx</value>
</param>
<param>
<key>max_nouts</key>
<value>0</value>
</param>
<param>
<key>qt_qss_theme</key>
<value></value>
</param>
<param>
<key>realtime_scheduling</key>
<value></value>
</param>
<param>
<key>run_command</key>
<value>{python} -u {filename}</value>
</param>
<param>
<key>run_options</key>
<value>prompt</value>
</param>
<param>
<key>run</key>
<value>True</value>
</param>
<param>
<key>thread_safe_setters</key>
<value></value>
</param>
<param>
<key>title</key>
<value>Stereo FM receiver and RDS Decoder</value>
</param>
</block>
<block>
<key>variable</key>
<param>
<key>comment</key>
<value></value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
<key>_coordinate</key>
<value>(8, 156)</value>
</param>
<param>
<key>_rotation</key>
<value>0</value>
</param>
<param>
<key>id</key>
<value>audio_decim</value>
</param>
<param>
<key>value</key>
<value>5</value>
</param>
</block>
<block>
<key>variable</key>
<param>
<key>comment</key>
<value></value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
<key>_coordinate</key>
<value>(112, 156)</value>
</param>
<param>
<key>_rotation</key>
<value>0</value>
</param>
<param>
<key>id</key>
<value>audio_decim_rate</value>
</param>
<param>
<key>value</key>
<value>baseband_rate/audio_decim</value>
</param>
</block>
<block>
<key>variable</key>
<param>
<key>comment</key>
<value></value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
<key>_coordinate</key>
<value>(112, 92)</value>
</param>
<param>
<key>_rotation</key>
<value>0</value>
</param>
<param>
<key>id</key>
<value>baseband_rate</value>
</param>
<param>
<key>value</key>
<value>samp_rate/bb_decim</value>
</param>
</block>
<block>
<key>variable</key>
<param>
<key>comment</key>
<value></value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
<key>_coordinate</key>
<value>(240, 156)</value>
</param>
<param>
<key>_rotation</key>
<value>0</value>
</param>
<param>
<key>id</key>
<value>bb_decim</value>
</param>
<param>
<key>value</key>
<value>4</value>
</param>
</block>
<block>
<key>variable_slider</key>
<param>
<key>comment</key>
<value></value>
</param>
<param>
<key>converver</key>
<value>float_converter</value>
</param>
<param>
<key>value</key>
<value>100.7e6</value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
<key>_coordinate</key>
<value>(448, 4)</value>
</param>
<param>
<key>_rotation</key>
<value>0</value>
</param>
<param>
<key>grid_pos</key>
<value></value>
</param>
<param>
<key>id</key>
<value>freq</value>
</param>
<param>
<key>label</key>
<value>Freq</value>
</param>
<param>
<key>max</key>
<value>107.9e6</value>
</param>
<param>
<key>min</key>
<value>88.1e6</value>
</param>
<param>
<key>notebook</key>
<value></value>
</param>
<param>
<key>num_steps</key>
<value>99</value>
</param>
<param>
<key>style</key>
<value>wx.SL_HORIZONTAL</value>
</param>
</block>
<block>
<key>variable</key>
<param>
<key>comment</key>
<value></value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
<key>_coordinate</key>
<value>(448, 132)</value>
</param>
<param>
<key>_rotation</key>
<value>0</value>
</param>
<param>
<key>id</key>
<value>freq_offset</value>
</param>
<param>
<key>value</key>
<value>250000</value>
</param>
</block>
<block>
<key>variable</key>
<param>
<key>comment</key>
<value></value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
<key>_coordinate</key>
<value>(224, 92)</value>
</param>
<param>
<key>_rotation</key>
<value>0</value>
</param>
<param>
<key>id</key>
<value>freq_tune</value>
</param>
<param>
<key>value</key>
<value>freq - freq_offset</value>
</param>
</block>
<block>
<key>variable_slider</key>
<param>
<key>comment</key>
<value></value>
</param>
<param>
<key>converver</key>
<value>float_converter</value>
</param>
<param>
<key>value</key>
<value>20</value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
<key>_coordinate</key>
<value>(336, 4)</value>
</param>
<param>
<key>_rotation</key>
<value>0</value>
</param>
<param>
<key>grid_pos</key>
<value></value>
</param>
<param>
<key>id</key>
<value>gain</value>
</param>
<param>
<key>label</key>
<value>RF Gain</value>
</param>
<param>
<key>max</key>
<value>49.6</value>
</param>
<param>
<key>min</key>
<value>0</value>
</param>
<param>
<key>notebook</key>
<value></value>
</param>
<param>
<key>num_steps</key>
<value>124</value>
</param>
<param>
<key>style</key>
<value>wx.SL_HORIZONTAL</value>
</param>
</block>
<block>
<key>variable</key>
<param>
<key>comment</key>
<value></value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
<key>_coordinate</key>
<value>(8, 92)</value>
</param>
<param>
<key>_rotation</key>
<value>0</value>
</param>
<param>
<key>id</key>
<value>samp_rate</value>
</param>
<param>
<key>value</key>
<value>1000000</value>
</param>
</block>
<block>
<key>variable</key>
<param>
<key>comment</key>
<value></value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
<key>_coordinate</key>
<value>(336, 132)</value>
</param>
<param>
<key>_rotation</key>
<value>0</value>
</param>
<param>
<key>id</key>
<value>xlate_bandwidth</value>
</param>
<param>
<key>value</key>
<value>100000</value>
</param>
</block>
<block>
<key>analog_wfm_rcv</key>
<param>
<key>audio_decimation</key>
<value>bb_decim</value>
</param>
<param>
<key>alias</key>
<value></value>
</param>
<param>
<key>comment</key>
<value></value>
</param>
<param>
<key>affinity</key>
<value></value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
<key>_coordinate</key>
<value>(576, 356)</value>
</param>
<param>
<key>_rotation</key>
<value>0</value>
</param>
<param>
<key>id</key>
<value>analog_wfm_rcv_0</value>
</param>
<param>
<key>maxoutbuf</key>
<value>0</value>
</param>
<param>
<key>minoutbuf</key>
<value>0</value>
</param>
<param>
<key>quad_rate</key>
<value>samp_rate</value>
</param>
</block>
<block>
<key>blocks_complex_to_real</key>
<param>
<key>alias</key>
<value></value>
</param>
<param>
<key>comment</key>
<value></value>
</param>
<param>
<key>affinity</key>
<value></value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
<key>_coordinate</key>
<value>(792, 632)</value>
</param>
<param>
<key>_rotation</key>
<value>0</value>
</param>
<param>
<key>id</key>
<value>blocks_complex_to_real_0</value>
</param>
<param>
<key>maxoutbuf</key>
<value>0</value>
</param>
<param>
<key>minoutbuf</key>
<value>0</value>
</param>
<param>
<key>vlen</key>
<value>1</value>
</param>
</block>
<block>
<key>blocks_keep_one_in_n</key>
<param>
<key>alias</key>
<value></value>
</param>
<param>
<key>comment</key>
<value></value>
</param>
<param>
<key>affinity</key>
<value></value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
<key>_coordinate</key>
<value>(280, 788)</value>
</param>
<param>
<key>_rotation</key>
<value>0</value>
</param>
<param>
<key>id</key>
<value>blocks_keep_one_in_n_0</value>
</param>
<param>
<key>maxoutbuf</key>
<value>0</value>
</param>
<param>
<key>minoutbuf</key>
<value>0</value>
</param>
<param>
<key>n</key>
<value>2</value>
</param>
<param>
<key>type</key>
<value>byte</value>
</param>
<param>
<key>vlen</key>
<value>1</value>
</param>
</block>
<block>
<key>digital_binary_slicer_fb</key>
<param>
<key>alias</key>
<value></value>
</param>
<param>
<key>comment</key>
<value></value>
</param>
<param>
<key>affinity</key>
<value></value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
<key>_coordinate</key>
<value>(112, 792)</value>
</param>
<param>
<key>_rotation</key>
<value>0</value>
</param>
<param>
<key>id</key>
<value>digital_binary_slicer_fb_0</value>
</param>
<param>
<key>maxoutbuf</key>
<value>0</value>
</param>
<param>
<key>minoutbuf</key>
<value>0</value>
</param>
</block>
<block>
<key>digital_diff_decoder_bb</key>
<param>
<key>alias</key>
<value></value>
</param>
<param>
<key>comment</key>
<value></value>
</param>
<param>
<key>affinity</key>
<value></value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
<key>_coordinate</key>
<value>(424, 788)</value>
</param>
<param>
<key>_rotation</key>
<value>0</value>
</param>
<param>
<key>id</key>
<value>digital_diff_decoder_bb_0</value>
</param>
<param>
<key>maxoutbuf</key>
<value>0</value>
</param>
<param>
<key>minoutbuf</key>
<value>0</value>
</param>
<param>
<key>modulus</key>
<value>2</value>
</param>
</block>
<block>
<key>digital_mpsk_receiver_cc</key>
<param>
<key>alias</key>
<value></value>
</param>
<param>
<key>comment</key>
<value></value>
</param>
<param>
<key>affinity</key>
<value></value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
<key>_coordinate</key>
<value>(528, 488)</value>
</param>
<param>
<key>_rotation</key>
<value>0</value>
</param>
<param>
<key>gain_mu</key>
<value>0.05</value>
</param>
<param>
<key>gain_omega</key>
<value>0.001</value>
</param>
<param>
<key>id</key>
<value>digital_mpsk_receiver_cc_0</value>
</param>
<param>
<key>w</key>
<value>1*cmath.pi/100.0</value>
</param>
<param>
<key>M</key>
<value>2</value>
</param>
<param>
<key>fmax</key>
<value>0.06</value>
</param>
<param>
<key>maxoutbuf</key>
<value>0</value>
</param>
<param>
<key>fmin</key>
<value>-0.06</value>
</param>
<param>
<key>minoutbuf</key>
<value>0</value>
</param>
<param>
<key>mu</key>
<value>0.5</value>
</param>
<param>
<key>omega_relative_limit</key>
<value>0.005</value>
</param>
<param>
<key>omega</key>
<value>samp_rate/bb_decim/audio_decim/ 2375.0</value>
</param>
<param>
<key>theta</key>
<value>0</value>
</param>
</block>
<block>
<key>freq_xlating_fir_filter_xxx</key>
<param>
<key>alias</key>
<value></value>
</param>
<param>
<key>center_freq</key>
<value>freq_offset</value>
</param>
<param>
<key>comment</key>
<value></value>
</param>
<param>
<key>affinity</key>
<value></value>
</param>
<param>
<key>decim</key>
<value>1</value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
<key>_coordinate</key>
<value>(279, 296)</value>
</param>
<param>
<key>_rotation</key>
<value>0</value>
</param>
<param>
<key>id</key>
<value>freq_xlating_fir_filter_xxx_0</value>
</param>
<param>
<key>maxoutbuf</key>
<value>0</value>
</param>
<param>
<key>minoutbuf</key>
<value>0</value>
</param>
<param>
<key>samp_rate</key>
<value>samp_rate</value>
</param>
<param>
<key>taps</key>
<value>firdes.low_pass(1, samp_rate, xlate_bandwidth, 100000)</value>
</param>
<param>
<key>type</key>
<value>ccc</value>
</param>
</block>
<block>
<key>freq_xlating_fir_filter_xxx</key>
<param>
<key>alias</key>
<value></value>
</param>
<param>
<key>center_freq</key>
<value>57e3</value>
</param>
<param>
<key>comment</key>
<value></value>
</param>
<param>
<key>affinity</key>
<value></value>
</param>
<param>
<key>decim</key>
<value>audio_decim</value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
<key>_coordinate</key>
<value>(72, 532)</value>
</param>
<param>
<key>_rotation</key>
<value>0</value>
</param>
<param>
<key>id</key>
<value>freq_xlating_fir_filter_xxx_1</value>
</param>
<param>
<key>maxoutbuf</key>
<value>0</value>
</param>
<param>
<key>minoutbuf</key>
<value>0</value>
</param>
<param>
<key>samp_rate</key>
<value>baseband_rate</value>
</param>
<param>
<key>taps</key>
<value>firdes.low_pass(2500.0,baseband_rate,2.4e3,2e3,firdes.WIN_HAMMING)</value>
</param>
<param>
<key>type</key>
<value>fcc</value>
</param>
</block>
<block>
<key>gr_rds_decoder</key>
<param>
<key>alias</key>
<value></value>
</param>
<param>
<key>comment</key>
<value></value>
</param>
<param>
<key>affinity</key>
<value></value>
</param>
<param>
<key>debug</key>
<value>False</value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
<key>_coordinate</key>
<value>(632, 780)</value>
</param>
<param>
<key>_rotation</key>
<value>0</value>
</param>
<param>
<key>id</key>
<value>gr_rds_decoder_0</value>
</param>
<param>
<key>log</key>
<value>False</value>
</param>
<param>
<key>maxoutbuf</key>
<value>0</value>
</param>
<param>
<key>minoutbuf</key>
<value>0</value>
</param>
</block>
<block>
<key>gr_rds_panel</key>
<param>
<key>alias</key>
<value></value>
</param>
<param>
<key>comment</key>
<value></value>
</param>
<param>
<key>affinity</key>
<value></value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
<key>freq</key>
<value>freq</value>
</param>
<param>
<key>_coordinate</key>
<value>(984, 792)</value>
</param>
<param>
<key>_rotation</key>
<value>0</value>
</param>
<param>
<key>grid_pos</key>
<value></value>
</param>
<param>
<key>id</key>
<value>gr_rds_panel_0</value>
</param>
<param>
<key>notebook</key>
<value></value>
</param>
</block>
<block>
<key>gr_rds_parser</key>
<param>
<key>alias</key>
<value></value>
</param>
<param>
<key>comment</key>
<value></value>
</param>
<param>
<key>affinity</key>
<value></value>
</param>
<param>
<key>debug</key>
<value>False</value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
<key>_coordinate</key>
<value>(800, 772)</value>
</param>
<param>
<key>_rotation</key>
<value>0</value>
</param>
<param>
<key>id</key>
<value>gr_rds_parser_0</value>
</param>
<param>
<key>log</key>
<value>True</value>
</param>
<param>
<key>maxoutbuf</key>
<value>0</value>
</param>
<param>
<key>minoutbuf</key>
<value>0</value>
</param>
<param>
<key>pty_locale</key>
<value>0</value>
</param>
<param>
<key>reset</key>
<value>0</value>
</param>
</block>
<block>
<key>import</key>
<param>
<key>alias</key>
<value></value>
</param>
<param>
<key>comment</key>
<value></value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
<key>_coordinate</key>
<value>(576, 4)</value>
</param>
<param>
<key>_rotation</key>
<value>0</value>
</param>
<param>
<key>id</key>
<value>import_0</value>
</param>
<param>
<key>import</key>
<value>import math</value>
</param>
</block>
<block>
<key>notebook</key>
<param>
<key>alias</key>
<value></value>
</param>
<param>
<key>comment</key>
<value></value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
<key>_coordinate</key>
<value>(184, 6)</value>
</param>
<param>
<key>_rotation</key>
<value>0</value>
</param>
<param>
<key>grid_pos</key>
<value></value>
</param>
<param>
<key>id</key>
<value>nb</value>
</param>
<param>
<key>labels</key>
<value>['BB', 'Demod', 'L+R', 'Pilot', 'DSBSC', 'RDS', 'L-R', 'RDS constellation','Waterfall']</value>
</param>
<param>
<key>notebook</key>
<value></value>
</param>
<param>
<key>style</key>
<value>wx.NB_TOP</value>
</param>
</block>
<block>
<key>root_raised_cosine_filter</key>
<param>
<key>alpha</key>
<value>1</value>
</param>
<param>
<key>alias</key>
<value></value>
</param>
<param>
<key>comment</key>
<value></value>
</param>
<param>
<key>affinity</key>
<value></value>
</param>
<param>
<key>decim</key>
<value>1</value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
<key>type</key>
<value>fir_filter_ccf</value>
</param>
<param>
<key>_coordinate</key>
<value>(304, 516)</value>
</param>
<param>
<key>_rotation</key>
<value>0</value>
</param>
<param>
<key>gain</key>
<value>1</value>
</param>
<param>
<key>id</key>
<value>root_raised_cosine_filter_0</value>
</param>
<param>
<key>interp</key>
<value>1</value>
</param>
<param>
<key>maxoutbuf</key>
<value>0</value>
</param>
<param>
<key>minoutbuf</key>
<value>0</value>
</param>
<param>
<key>ntaps</key>
<value>100</value>
</param>
<param>
<key>samp_rate</key>
<value>samp_rate/bb_decim/audio_decim</value>
</param>
<param>
<key>sym_rate</key>
<value>2375</value>
</param>
</block>
<block>
<key>rtlsdr_source</key>
<param>
<key>alias</key>
<value></value>
</param>
<param>
<key>ant0</key>
<value></value>
</param>
<param>
<key>bb_gain0</key>
<value>20</value>
</param>
<param>
<key>bw0</key>
<value>0</value>
</param>
<param>
<key>dc_offset_mode0</key>
<value>0</value>
</param>
<param>
<key>corr0</key>
<value>0</value>
</param>
<param>
<key>freq0</key>
<value>freq_tune</value>
</param>
<param>
<key>gain_mode0</key>
<value>False</value>
</param>
<param>
<key>if_gain0</key>
<value>20</value>
</param>
<param>
<key>iq_balance_mode0</key>
<value>0</value>
</param>
<param>
<key>gain0</key>
<value>gain</value>
</param>
<param>
<key>ant10</key>
<value></value>
</param>
<param>
<key>bb_gain10</key>
<value>20</value>
</param>
<param>
<key>bw10</key>
<value>0</value>
</param>
<param>
<key>dc_offset_mode10</key>
<value>0</value>
</param>
<param>
<key>corr10</key>
<value>0</value>
</param>
<param>
<key>freq10</key>
<value>100e6</value>
</param>
<param>
<key>gain_mode10</key>
<value>False</value>
</param>
<param>
<key>if_gain10</key>
<value>20</value>
</param>
<param>
<key>iq_balance_mode10</key>
<value>0</value>
</param>
<param>
<key>gain10</key>
<value>10</value>
</param>
<param>
<key>ant11</key>
<value></value>
</param>
<param>
<key>bb_gain11</key>
<value>20</value>
</param>
<param>
<key>bw11</key>
<value>0</value>
</param>
<param>
<key>dc_offset_mode11</key>
<value>0</value>
</param>
<param>
<key>corr11</key>
<value>0</value>
</param>
<param>
<key>freq11</key>
<value>100e6</value>
</param>
<param>
<key>gain_mode11</key>
<value>False</value>
</param>
<param>
<key>if_gain11</key>
<value>20</value>
</param>
<param>
<key>iq_balance_mode11</key>
<value>0</value>
</param>
<param>
<key>gain11</key>
<value>10</value>
</param>
<param>
<key>ant12</key>
<value></value>
</param>
<param>
<key>bb_gain12</key>
<value>20</value>
</param>
<param>
<key>bw12</key>
<value>0</value>
</param>
<param>
<key>dc_offset_mode12</key>
<value>0</value>
</param>
<param>
<key>corr12</key>
<value>0</value>
</param>
<param>
<key>freq12</key>
<value>100e6</value>
</param>
<param>
<key>gain_mode12</key>
<value>False</value>
</param>
<param>
<key>if_gain12</key>
<value>20</value>
</param>
<param>
<key>iq_balance_mode12</key>
<value>0</value>
</param>
<param>
<key>gain12</key>
<value>10</value>
</param>
<param>
<key>ant13</key>
<value></value>
</param>
<param>
<key>bb_gain13</key>
<value>20</value>
</param>
<param>
<key>bw13</key>
<value>0</value>
</param>
<param>
<key>dc_offset_mode13</key>
<value>0</value>
</param>
<param>
<key>corr13</key>
<value>0</value>
</param>
<param>
<key>freq13</key>
<value>100e6</value>
</param>
<param>
<key>gain_mode13</key>
<value>False</value>
</param>
<param>
<key>if_gain13</key>
<value>20</value>
</param>
<param>
<key>iq_balance_mode13</key>
<value>0</value>
</param>
<param>
<key>gain13</key>
<value>10</value>
</param>
<param>
<key>ant14</key>
<value></value>
</param>
<param>
<key>bb_gain14</key>
<value>20</value>
</param>
<param>
<key>bw14</key>
<value>0</value>
</param>
<param>
<key>dc_offset_mode14</key>
<value>0</value>
</param>
<param>
<key>corr14</key>
<value>0</value>
</param>
<param>
<key>freq14</key>
<value>100e6</value>
</param>
<param>
<key>gain_mode14</key>
<value>False</value>
</param>
<param>
<key>if_gain14</key>
<value>20</value>
</param>
<param>
<key>iq_balance_mode14</key>
<value>0</value>
</param>
<param>
<key>gain14</key>
<value>10</value>
</param>
<param>
<key>ant15</key>
<value></value>
</param>
<param>
<key>bb_gain15</key>
<value>20</value>
</param>
<param>
<key>bw15</key>
<value>0</value>
</param>
<param>
<key>dc_offset_mode15</key>
<value>0</value>
</param>
<param>
<key>corr15</key>
<value>0</value>
</param>
<param>
<key>freq15</key>
<value>100e6</value>
</param>
<param>
<key>gain_mode15</key>
<value>False</value>
</param>
<param>
<key>if_gain15</key>
<value>20</value>
</param>
<param>
<key>iq_balance_mode15</key>
<value>0</value>
</param>
<param>
<key>gain15</key>
<value>10</value>
</param>
<param>
<key>ant16</key>
<value></value>
</param>
<param>
<key>bb_gain16</key>
<value>20</value>
</param>
<param>
<key>bw16</key>
<value>0</value>
</param>
<param>
<key>dc_offset_mode16</key>
<value>0</value>
</param>
<param>
<key>corr16</key>
<value>0</value>
</param>
<param>
<key>freq16</key>
<value>100e6</value>
</param>
<param>
<key>gain_mode16</key>
<value>False</value>
</param>
<param>
<key>if_gain16</key>
<value>20</value>
</param>
<param>
<key>iq_balance_mode16</key>
<value>0</value>
</param>
<param>
<key>gain16</key>
<value>10</value>
</param>
<param>
<key>ant17</key>
<value></value>
</param>
<param>
<key>bb_gain17</key>
<value>20</value>
</param>
<param>
<key>bw17</key>
<value>0</value>
</param>
<param>
<key>dc_offset_mode17</key>
<value>0</value>
</param>
<param>
<key>corr17</key>
<value>0</value>
</param>
<param>
<key>freq17</key>
<value>100e6</value>
</param>
<param>
<key>gain_mode17</key>
<value>False</value>
</param>
<param>
<key>if_gain17</key>
<value>20</value>
</param>
<param>
<key>iq_balance_mode17</key>
<value>0</value>
</param>
<param>
<key>gain17</key>
<value>10</value>
</param>
<param>
<key>ant18</key>
<value></value>
</param>
<param>
<key>bb_gain18</key>
<value>20</value>
</param>
<param>
<key>bw18</key>
<value>0</value>
</param>
<param>
<key>dc_offset_mode18</key>
<value>0</value>
</param>
<param>
<key>corr18</key>
<value>0</value>
</param>
<param>
<key>freq18</key>
<value>100e6</value>
</param>
<param>
<key>gain_mode18</key>
<value>False</value>
</param>
<param>
<key>if_gain18</key>
<value>20</value>
</param>
<param>
<key>iq_balance_mode18</key>
<value>0</value>
</param>
<param>
<key>gain18</key>
<value>10</value>
</param>
<param>
<key>ant19</key>
<value></value>
</param>
<param>
<key>bb_gain19</key>
<value>20</value>
</param>
<param>
<key>bw19</key>
<value>0</value>
</param>
<param>
<key>dc_offset_mode19</key>
<value>0</value>
</param>
<param>
<key>corr19</key>
<value>0</value>
</param>
<param>
<key>freq19</key>
<value>100e6</value>
</param>
<param>
<key>gain_mode19</key>
<value>False</value>
</param>
<param>
<key>if_gain19</key>
<value>20</value>
</param>
<param>
<key>iq_balance_mode19</key>
<value>0</value>
</param>
<param>
<key>gain19</key>
<value>10</value>
</param>
<param>
<key>ant1</key>
<value></value>
</param>
<param>
<key>bb_gain1</key>
<value>20</value>
</param>
<param>
<key>bw1</key>
<value>0</value>
</param>
<param>
<key>dc_offset_mode1</key>
<value>0</value>
</param>
<param>
<key>corr1</key>
<value>0</value>
</param>
<param>
<key>freq1</key>
<value>100e6</value>
</param>
<param>
<key>gain_mode1</key>
<value>False</value>
</param>
<param>
<key>if_gain1</key>
<value>20</value>
</param>
<param>
<key>iq_balance_mode1</key>
<value>0</value>
</param>
<param>
<key>gain1</key>
<value>10</value>
</param>
<param>
<key>ant20</key>
<value></value>
</param>
<param>
<key>bb_gain20</key>
<value>20</value>
</param>
<param>
<key>bw20</key>
<value>0</value>
</param>
<param>
<key>dc_offset_mode20</key>
<value>0</value>
</param>
<param>
<key>corr20</key>
<value>0</value>
</param>
<param>
<key>freq20</key>
<value>100e6</value>
</param>
<param>
<key>gain_mode20</key>
<value>False</value>
</param>
<param>
<key>if_gain20</key>
<value>20</value>
</param>
<param>
<key>iq_balance_mode20</key>
<value>0</value>
</param>
<param>
<key>gain20</key>
<value>10</value>
</param>
<param>
<key>ant21</key>
<value></value>
</param>
<param>
<key>bb_gain21</key>
<value>20</value>
</param>
<param>
<key>bw21</key>
<value>0</value>
</param>
<param>
<key>dc_offset_mode21</key>
<value>0</value>
</param>
<param>
<key>corr21</key>
<value>0</value>
</param>
<param>
<key>freq21</key>
<value>100e6</value>
</param>
<param>
<key>gain_mode21</key>
<value>False</value>
</param>
<param>
<key>if_gain21</key>
<value>20</value>
</param>
<param>
<key>iq_balance_mode21</key>
<value>0</value>
</param>
<param>
<key>gain21</key>
<value>10</value>
</param>
<param>
<key>ant22</key>
<value></value>
</param>
<param>
<key>bb_gain22</key>
<value>20</value>
</param>
<param>
<key>bw22</key>
<value>0</value>
</param>
<param>
<key>dc_offset_mode22</key>
<value>0</value>
</param>
<param>
<key>corr22</key>
<value>0</value>
</param>
<param>
<key>freq22</key>
<value>100e6</value>
</param>
<param>
<key>gain_mode22</key>
<value>False</value>
</param>
<param>
<key>if_gain22</key>
<value>20</value>
</param>
<param>
<key>iq_balance_mode22</key>
<value>0</value>
</param>
<param>
<key>gain22</key>
<value>10</value>
</param>
<param>
<key>ant23</key>
<value></value>
</param>
<param>
<key>bb_gain23</key>
<value>20</value>
</param>
<param>
<key>bw23</key>
<value>0</value>
</param>
<param>
<key>dc_offset_mode23</key>
<value>0</value>
</param>
<param>
<key>corr23</key>
<value>0</value>
</param>
<param>
<key>freq23</key>
<value>100e6</value>
</param>
<param>
<key>gain_mode23</key>
<value>False</value>
</param>
<param>
<key>if_gain23</key>
<value>20</value>
</param>
<param>
<key>iq_balance_mode23</key>
<value>0</value>
</param>
<param>
<key>gain23</key>
<value>10</value>
</param>
<param>
<key>ant24</key>
<value></value>
</param>
<param>
<key>bb_gain24</key>
<value>20</value>
</param>
<param>
<key>bw24</key>
<value>0</value>
</param>
<param>
<key>dc_offset_mode24</key>
<value>0</value>
</param>
<param>
<key>corr24</key>
<value>0</value>
</param>
<param>
<key>freq24</key>
<value>100e6</value>
</param>
<param>
<key>gain_mode24</key>
<value>False</value>
</param>
<param>
<key>if_gain24</key>
<value>20</value>
</param>
<param>
<key>iq_balance_mode24</key>
<value>0</value>
</param>
<param>
<key>gain24</key>
<value>10</value>
</param>
<param>
<key>ant25</key>
<value></value>
</param>
<param>
<key>bb_gain25</key>
<value>20</value>
</param>
<param>
<key>bw25</key>
<value>0</value>
</param>
<param>
<key>dc_offset_mode25</key>
<value>0</value>
</param>
<param>
<key>corr25</key>
<value>0</value>
</param>
<param>
<key>freq25</key>
<value>100e6</value>
</param>
<param>
<key>gain_mode25</key>
<value>False</value>
</param>
<param>
<key>if_gain25</key>
<value>20</value>
</param>
<param>
<key>iq_balance_mode25</key>
<value>0</value>
</param>
<param>
<key>gain25</key>
<value>10</value>
</param>
<param>
<key>ant26</key>
<value></value>
</param>
<param>
<key>bb_gain26</key>
<value>20</value>
</param>
<param>
<key>bw26</key>
<value>0</value>
</param>
<param>
<key>dc_offset_mode26</key>
<value>0</value>
</param>
<param>
<key>corr26</key>
<value>0</value>
</param>
<param>
<key>freq26</key>
<value>100e6</value>
</param>
<param>
<key>gain_mode26</key>
<value>False</value>
</param>
<param>
<key>if_gain26</key>
<value>20</value>
</param>
<param>
<key>iq_balance_mode26</key>
<value>0</value>
</param>
<param>
<key>gain26</key>
<value>10</value>
</param>
<param>
<key>ant27</key>
<value></value>
</param>
<param>
<key>bb_gain27</key>
<value>20</value>
</param>
<param>
<key>bw27</key>
<value>0</value>
</param>
<param>
<key>dc_offset_mode27</key>
<value>0</value>
</param>
<param>
<key>corr27</key>
<value>0</value>
</param>
<param>
<key>freq27</key>
<value>100e6</value>
</param>
<param>
<key>gain_mode27</key>
<value>False</value>
</param>
<param>
<key>if_gain27</key>
<value>20</value>
</param>
<param>
<key>iq_balance_mode27</key>
<value>0</value>
</param>
<param>
<key>gain27</key>
<value>10</value>
</param>
<param>
<key>ant28</key>
<value></value>
</param>
<param>
<key>bb_gain28</key>
<value>20</value>
</param>
<param>
<key>bw28</key>
<value>0</value>
</param>
<param>
<key>dc_offset_mode28</key>
<value>0</value>
</param>
<param>
<key>corr28</key>
<value>0</value>
</param>
<param>
<key>freq28</key>
<value>100e6</value>
</param>
<param>
<key>gain_mode28</key>
<value>False</value>
</param>
<param>
<key>if_gain28</key>
<value>20</value>
</param>
<param>
<key>iq_balance_mode28</key>
<value>0</value>
</param>
<param>
<key>gain28</key>
<value>10</value>
</param>
<param>
<key>ant29</key>
<value></value>
</param>
<param>
<key>bb_gain29</key>
<value>20</value>
</param>
<param>
<key>bw29</key>
<value>0</value>
</param>
<param>
<key>dc_offset_mode29</key>
<value>0</value>
</param>
<param>
<key>corr29</key>
<value>0</value>
</param>
<param>
<key>freq29</key>
<value>100e6</value>
</param>
<param>
<key>gain_mode29</key>
<value>False</value>
</param>
<param>
<key>if_gain29</key>
<value>20</value>
</param>
<param>
<key>iq_balance_mode29</key>
<value>0</value>
</param>
<param>
<key>gain29</key>
<value>10</value>
</param>
<param>
<key>ant2</key>
<value></value>
</param>
<param>
<key>bb_gain2</key>
<value>20</value>
</param>
<param>
<key>bw2</key>
<value>0</value>
</param>
<param>
<key>dc_offset_mode2</key>
<value>0</value>
</param>
<param>
<key>corr2</key>
<value>0</value>
</param>
<param>
<key>freq2</key>
<value>100e6</value>
</param>
<param>
<key>gain_mode2</key>
<value>False</value>
</param>
<param>
<key>if_gain2</key>
<value>20</value>
</param>
<param>
<key>iq_balance_mode2</key>
<value>0</value>
</param>
<param>
<key>gain2</key>
<value>10</value>
</param>
<param>
<key>ant30</key>
<value></value>
</param>
<param>
<key>bb_gain30</key>
<value>20</value>
</param>
<param>
<key>bw30</key>
<value>0</value>
</param>
<param>
<key>dc_offset_mode30</key>
<value>0</value>
</param>
<param>
<key>corr30</key>
<value>0</value>
</param>
<param>
<key>freq30</key>
<value>100e6</value>
</param>
<param>
<key>gain_mode30</key>
<value>False</value>
</param>
<param>
<key>if_gain30</key>
<value>20</value>
</param>
<param>
<key>iq_balance_mode30</key>
<value>0</value>
</param>
<param>
<key>gain30</key>
<value>10</value>
</param>
<param>
<key>ant31</key>
<value></value>
</param>
<param>
<key>bb_gain31</key>
<value>20</value>
</param>
<param>
<key>bw31</key>
<value>0</value>
</param>
<param>
<key>dc_offset_mode31</key>
<value>0</value>
</param>
<param>
<key>corr31</key>
<value>0</value>
</param>
<param>
<key>freq31</key>
<value>100e6</value>
</param>
<param>
<key>gain_mode31</key>
<value>False</value>
</param>
<param>
<key>if_gain31</key>
<value>20</value>
</param>
<param>
<key>iq_balance_mode31</key>
<value>0</value>
</param>
<param>
<key>gain31</key>
<value>10</value>
</param>
<param>
<key>ant3</key>
<value></value>
</param>
<param>
<key>bb_gain3</key>
<value>20</value>
</param>
<param>
<key>bw3</key>
<value>0</value>
</param>
<param>
<key>dc_offset_mode3</key>
<value>0</value>
</param>
<param>
<key>corr3</key>
<value>0</value>
</param>
<param>
<key>freq3</key>
<value>100e6</value>
</param>
<param>
<key>gain_mode3</key>
<value>False</value>
</param>
<param>
<key>if_gain3</key>
<value>20</value>
</param>
<param>
<key>iq_balance_mode3</key>
<value>0</value>
</param>
<param>
<key>gain3</key>
<value>10</value>
</param>
<param>
<key>ant4</key>
<value></value>
</param>
<param>
<key>bb_gain4</key>
<value>20</value>
</param>
<param>
<key>bw4</key>
<value>0</value>
</param>
<param>
<key>dc_offset_mode4</key>
<value>0</value>
</param>
<param>
<key>corr4</key>
<value>0</value>
</param>
<param>
<key>freq4</key>
<value>100e6</value>
</param>
<param>
<key>gain_mode4</key>
<value>False</value>
</param>
<param>
<key>if_gain4</key>
<value>20</value>
</param>
<param>
<key>iq_balance_mode4</key>
<value>0</value>
</param>
<param>
<key>gain4</key>
<value>10</value>
</param>
<param>
<key>ant5</key>
<value></value>
</param>
<param>
<key>bb_gain5</key>
<value>20</value>
</param>
<param>
<key>bw5</key>
<value>0</value>
</param>
<param>
<key>dc_offset_mode5</key>
<value>0</value>
</param>
<param>
<key>corr5</key>
<value>0</value>
</param>
<param>
<key>freq5</key>
<value>100e6</value>
</param>
<param>
<key>gain_mode5</key>
<value>False</value>
</param>
<param>
<key>if_gain5</key>
<value>20</value>
</param>
<param>
<key>iq_balance_mode5</key>
<value>0</value>
</param>
<param>
<key>gain5</key>
<value>10</value>
</param>
<param>
<key>ant6</key>
<value></value>
</param>
<param>
<key>bb_gain6</key>
<value>20</value>
</param>
<param>
<key>bw6</key>
<value>0</value>
</param>
<param>
<key>dc_offset_mode6</key>
<value>0</value>
</param>
<param>
<key>corr6</key>
<value>0</value>
</param>
<param>
<key>freq6</key>
<value>100e6</value>
</param>
<param>
<key>gain_mode6</key>
<value>False</value>
</param>
<param>
<key>if_gain6</key>
<value>20</value>
</param>
<param>
<key>iq_balance_mode6</key>
<value>0</value>
</param>
<param>
<key>gain6</key>
<value>10</value>
</param>
<param>
<key>ant7</key>
<value></value>
</param>
<param>
<key>bb_gain7</key>
<value>20</value>
</param>
<param>
<key>bw7</key>
<value>0</value>
</param>
<param>
<key>dc_offset_mode7</key>
<value>0</value>
</param>
<param>
<key>corr7</key>
<value>0</value>
</param>
<param>
<key>freq7</key>
<value>100e6</value>
</param>
<param>
<key>gain_mode7</key>
<value>False</value>
</param>
<param>
<key>if_gain7</key>
<value>20</value>
</param>
<param>
<key>iq_balance_mode7</key>
<value>0</value>
</param>
<param>
<key>gain7</key>
<value>10</value>
</param>
<param>
<key>ant8</key>
<value></value>
</param>
<param>
<key>bb_gain8</key>
<value>20</value>
</param>
<param>
<key>bw8</key>
<value>0</value>
</param>
<param>
<key>dc_offset_mode8</key>
<value>0</value>
</param>
<param>
<key>corr8</key>
<value>0</value>
</param>
<param>
<key>freq8</key>
<value>100e6</value>
</param>
<param>
<key>gain_mode8</key>
<value>False</value>
</param>
<param>
<key>if_gain8</key>
<value>20</value>
</param>
<param>
<key>iq_balance_mode8</key>
<value>0</value>
</param>
<param>
<key>gain8</key>
<value>10</value>
</param>
<param>
<key>ant9</key>
<value></value>
</param>
<param>
<key>bb_gain9</key>
<value>20</value>
</param>
<param>
<key>bw9</key>
<value>0</value>
</param>
<param>
<key>dc_offset_mode9</key>
<value>0</value>
</param>
<param>
<key>corr9</key>
<value>0</value>
</param>
<param>
<key>freq9</key>
<value>100e6</value>
</param>
<param>
<key>gain_mode9</key>
<value>False</value>
</param>
<param>
<key>if_gain9</key>
<value>20</value>
</param>
<param>
<key>iq_balance_mode9</key>
<value>0</value>
</param>
<param>
<key>gain9</key>
<value>10</value>
</param>
<param>
<key>comment</key>
<value></value>
</param>
<param>
<key>affinity</key>
<value></value>
</param>
<param>
<key>args</key>
<value></value>
</param>
<param>
<key>_enabled</key>
<value>1</value>
</param>
<param>
<key>_coordinate</key>
<value>(24, 272)</value>
</param>
<param>
<key>_rotation</key>
<value>0</value>
</param>
<param>
<key>id</key>
<value>rtlsdr_source_0</value>
</param>
<param>
<key>maxoutbuf</key>
<value>0</value>
</param>
<param>
<key>clock_source0</key>
<value></value>
</param>
<param>
<key>time_source0</key>
<value></value>
</param>
<param>
<key>clock_source1</key>
<value></value>
</param>
<param>
<key>time_source1</key>
<value></value>
</param>
<param>
<key>clock_source2</key>
<value></value>
</param>
<param>
<key>time_source2</key>
<value></value>
</param>
<param>
<key>clock_source3</key>
<value></value>
</param>
<param>
<key>time_source3</key>
<value></value>
</param>
<param>
<key>clock_source4</key>
<value></value>
</param>
<param>
<key>time_source4</key>
<value></value>
</param>
<param>
<key>clock_source5</key>
<value></value>
</param>
<param>
<key>time_source5</key>
<value></value>
</param>
<param>
<key>clock_source6</key>
<value></value>
</param>
<param>
<key>time_source6</key>
<value></value>
</param>
<param>
<key>clock_source7</key>
<value></value>
</param>
<param>
<key>time_source7</key>
<value></value>
</param>
<param>
<key>minoutbuf</key>
<value>0</value>
</param>
<param>
<key>nchan</key>
<value>1</value>
</param>
<param>
<key>num_mboards</key>
<value>1</value>
</param>
<param>
<key>type</key>
<value>fc32</value>
</param>
<param>
<key>sample_rate</key>
<value>samp_rate</value>
</param>
<param>
<key>sync</key>
<value></value>
</param>
</block>
<block>
<key>wxgui_fftsink2</key>
<param>
<key>avg_alpha</key>
<value>0.8</value>
</param>
<param>
<key>average</key>
<value>True</value>
</param>
<param>
<key>baseband_freq</key>
<value>0</value>
</param>
<param>
<key>alias</key>
<value></value>
</param>
<param>
<key>comment</key>
<value></value>
</param>
<param>
<key>affinity</key>
<value></value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
<key>fft_size</key>
<value>1024</value>
</param>
<param>
<key>freqvar</key>
<value>None</value>
</param>
<param>
<key>_coordinate</key>
<value>(1056, 56)</value>
</param>
<param>
<key>_rotation</key>
<value>0</value>
</param>
<param>
<key>grid_pos</key>
<value></value>
</param>
<param>
<key>id</key>
<value>wxgui_fftsink2_0</value>
</param>
<param>
<key>notebook</key>
<value>nb, 0</value>
</param>
<param>
<key>peak_hold</key>
<value>False</value>
</param>
<param>
<key>ref_level</key>
<value>-30</value>
</param>
<param>
<key>ref_scale</key>
<value>2.0</value>
</param>
<param>
<key>fft_rate</key>
<value>15</value>
</param>
<param>
<key>samp_rate</key>
<value>samp_rate</value>
</param>
<param>
<key>title</key>
<value>Baseband</value>
</param>
<param>
<key>type</key>
<value>complex</value>
</param>
<param>
<key>win_size</key>
<value></value>
</param>
<param>
<key>win</key>
<value>None</value>
</param>
<param>
<key>y_divs</key>
<value>10</value>
</param>
<param>
<key>y_per_div</key>
<value>10</value>
</param>
</block>
<block>
<key>wxgui_fftsink2</key>
<param>
<key>avg_alpha</key>
<value>0.8</value>
</param>
<param>
<key>average</key>
<value>True</value>
</param>
<param>
<key>baseband_freq</key>
<value>0</value>
</param>
<param>
<key>alias</key>
<value></value>
</param>
<param>
<key>comment</key>
<value></value>
</param>
<param>
<key>affinity</key>
<value></value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
<key>fft_size</key>
<value>1024</value>
</param>
<param>
<key>freqvar</key>
<value>None</value>
</param>
<param>
<key>_coordinate</key>
<value>(1056, 280)</value>
</param>
<param>
<key>_rotation</key>
<value>0</value>
</param>
<param>
<key>grid_pos</key>
<value></value>
</param>
<param>
<key>id</key>
<value>wxgui_fftsink2_0_0</value>
</param>
<param>
<key>notebook</key>
<value>nb, 1</value>
</param>
<param>
<key>peak_hold</key>
<value>False</value>
</param>
<param>
<key>ref_level</key>
<value>0</value>
</param>
<param>
<key>ref_scale</key>
<value>2.0</value>
</param>
<param>
<key>fft_rate</key>
<value>15</value>
</param>
<param>
<key>samp_rate</key>
<value>baseband_rate</value>
</param>
<param>
<key>title</key>
<value>FM Demod</value>
</param>
<param>
<key>type</key>
<value>float</value>
</param>
<param>
<key>win_size</key>
<value></value>
</param>
<param>
<key>win</key>
<value>None</value>
</param>
<param>
<key>y_divs</key>
<value>10</value>
</param>
<param>
<key>y_per_div</key>
<value>10</value>
</param>
</block>
<block>
<key>wxgui_scopesink2</key>
<param>
<key>ac_couple</key>
<value>False</value>
</param>
<param>
<key>alias</key>
<value></value>
</param>
<param>
<key>comment</key>
<value></value>
</param>
<param>
<key>affinity</key>
<value></value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
<key>_coordinate</key>
<value>(1056, 500)</value>
</param>
<param>
<key>_rotation</key>
<value>0</value>
</param>
<param>
<key>grid_pos</key>
<value></value>
</param>
<param>
<key>id</key>
<value>wxgui_scopesink2_1</value>
</param>
<param>
<key>notebook</key>
<value>nb,7</value>
</param>
<param>
<key>num_inputs</key>
<value>1</value>
</param>
<param>
<key>samp_rate</key>
<value>2375</value>
</param>
<param>
<key>t_scale</key>
<value>0</value>
</param>
<param>
<key>title</key>
<value>Scope Plot</value>
</param>
<param>
<key>trig_mode</key>
<value>wxgui.TRIG_MODE_AUTO</value>
</param>
<param>
<key>type</key>
<value>complex</value>
</param>
<param>
<key>v_offset</key>
<value>0</value>
</param>
<param>
<key>v_scale</key>
<value>0.4</value>
</param>
<param>
<key>win_size</key>
<value></value>
</param>
<param>
<key>xy_mode</key>
<value>True</value>
</param>
<param>
<key>y_axis_label</key>
<value>Counts</value>
</param>
</block>
<connection>
<source_block_id>analog_wfm_rcv_0</source_block_id>
<sink_block_id>freq_xlating_fir_filter_xxx_1</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
<source_block_id>analog_wfm_rcv_0</source_block_id>
<sink_block_id>wxgui_fftsink2_0_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
<source_block_id>blocks_complex_to_real_0</source_block_id>
<sink_block_id>digital_binary_slicer_fb_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
<source_block_id>blocks_keep_one_in_n_0</source_block_id>
<sink_block_id>digital_diff_decoder_bb_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
<source_block_id>digital_binary_slicer_fb_0</source_block_id>
<sink_block_id>blocks_keep_one_in_n_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
<source_block_id>digital_diff_decoder_bb_0</source_block_id>
<sink_block_id>gr_rds_decoder_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
<source_block_id>digital_mpsk_receiver_cc_0</source_block_id>
<sink_block_id>blocks_complex_to_real_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
<source_block_id>digital_mpsk_receiver_cc_0</source_block_id>
<sink_block_id>wxgui_scopesink2_1</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
<source_block_id>freq_xlating_fir_filter_xxx_0</source_block_id>
<sink_block_id>analog_wfm_rcv_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
<source_block_id>freq_xlating_fir_filter_xxx_0</source_block_id>
<sink_block_id>wxgui_fftsink2_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
<source_block_id>freq_xlating_fir_filter_xxx_1</source_block_id>
<sink_block_id>root_raised_cosine_filter_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
<source_block_id>gr_rds_decoder_0</source_block_id>
<sink_block_id>gr_rds_parser_0</sink_block_id>
<source_key>out</source_key>
<sink_key>in</sink_key>
</connection>
<connection>
<source_block_id>gr_rds_parser_0</source_block_id>
<sink_block_id>gr_rds_panel_0</sink_block_id>
<source_key>out</source_key>
<sink_key>in</sink_key>
</connection>
<connection>
<source_block_id>root_raised_cosine_filter_0</source_block_id>
<sink_block_id>digital_mpsk_receiver_cc_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
<source_block_id>rtlsdr_source_0</source_block_id>
<sink_block_id>freq_xlating_fir_filter_xxx_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
</flow_graph>
Комментарии (12)
Serjaru
15.06.2019 23:31+1Лучше конечно всё это крутить под линукс (дебиан или убунту), там все нормально собирается. С виндами все топорно! А так gnu-radio хорош, еще много тем не раскрыто. Есть интересные фичи с LimeSDR & HackRF
Balling
16.06.2019 03:57Спасибо за статью! Приятно, что мое предложение о теме статьи оказалось неплохим)) Если что, насчет boost, у них там для нового релиза 3.8 столько всего, в том числе и boost 1.7x. Может тогда все заработает…
Но вообще-то, скорее всего вы взяли не тот форк. Нужно было вот этот. Она от разраба gnu radio.
github.com/bastibl/gr-rds
Он уже поддерживает Gnu radio 3.8 (да-да, она еще не вышла даже))DmitrySpb79 Автор
16.06.2019 11:10Да, бета Gnu Radio 3.8 уже существует, хотя не знаю, выкладывали они её или нет.
Но проблема с компиляцией под Windows в том, что функция find_package из cmake не находит Boost.
Соответственно, компиляция останавливается на этом шаге:
find_package(Boost "1.35" COMPONENTS system) if(NOT Boost_FOUND) message(FATAL_ERROR "Boost required to compile gr-rds") endif()
GNU Radio тут не при чем.Balling
16.06.2019 11:15github.com/gnuradio/gnuradio/releases/tag/3.8tech-preview
Скорее всего, собирать под windows предполагается под linux (кросс-компиляция).
И все же форк не тот… Нужно от bastibl.DmitrySpb79 Автор
16.06.2019 11:18Да, кросскомпиляция это возможный вариант.
Но поскольку декодер RDS уже встроен в GNU Radio, этот вопрос имеет чисто теоретический интерес (хотя все равно было бы полезно разобраться).
По сути, от gr-rds нам нужны только примеры из папки apps, без них было бы не разобраться. Там кстати еще и пример RDS-передачи есть, тоже интересно попробовать.Balling
16.06.2019 11:23А вы точно все проверили с stackoverflow? cmake.org/cmake/help/v3.0/module/FindBoost.html
set (Boost_DETAILED_FAILURE_MSG ON)
set (Boost_THREADAPI win32)
set (BOOST_ROOT "/boost_1_40_0")
set (Boost_LIBRARY_DIR /boost_1_40_0/lib")
set (Boost_COMPILER "-vc")
set (Boost_USE_STATIC_RUNTIME ON)
set (BOOST_DEBUG ON) #< — Real life saver
cmake --help-module FindBoost
И вообще собирать для windows под windows что-то с boost это не очень… Все linux используют))DmitrySpb79 Автор
16.06.2019 11:25Спасибо, я пробовал указывать BOOST_ROOT и Boost_LIBRARY_DIR, дальше после нескольких попыток забил. Если будет не лень, попробую потом еще раз.
drWhy
Позвольте крепко пожать вашу виртуальную руку за настойчивое рассмотрение данной несомненно интересной темы.
Один из предыдущих китайских приёмников на кухне хорошо ловил переговоры пилотов, что отмечалось в одной из предыдущих статей. Нынешний только перегревается на солнце и весьма плавает частотой, что есть печально.
Задача: SDR usb свисток плюс простейший китайский приёмник (сейчас почти везде есть usb). Востребована прошивка для свистка (или приёмника), могущая обеспечить взаимную функциональность — sdr принимает, другое китайское чудо воспроизводит.
Рекомендации?
DmitrySpb79 Автор
Спасибо. Пока тема кому-то интересна и количество просмотров не упало до нуля, почему бы не продолжить.
Насчет авиадиапазона, можно запустить SDR-свисток на Raspberry Pi и вывести звук через USB-карту на другой приемник, но имхо будет слишком громоздко, проще новый приемник купить. Я в китайских приемниках совсем не разбираюсь, так что ничего посоветовать не могу. Отзывы поищите например на radioscanner.
На самом свистке прошивку поменять невозможно, там в чипе все жестко закодировано.
drWhy
Имелась в виду прошивка для свистка, которая заставит его принимать заданный диапазон, необязательно авиа, типа плейлиста для медиаплеера, и отдавать в виде файла для приёмника через usb/SD.
Разнообразные поделки на тему интернет-радио пока не радуют обоснованностью цены, проще старый системник поставить для приёма плейлиста.
Существуют (теоретически) SD wi-fi карты, возможно, они способны отдать заданный поток приёмнику (в большинстве сейчас присутствуют usb/SD). Если есть владельцы, отзовитесь, пожалуйста.
Как вариант, fm-трансмиттер.
Но кастомная прошивка SDR свистка или приёмника могла бы помочь горюшку без пложения сущностей.
По существу: в Австралии в RDS вещают дифпоправку для gps. Мелочь, но полезно…
DmitrySpb79 Автор
Stanislavvv
rtl-sdr принимают в диапазоне от 24МГц до ~1.5ГГц. Насколько я помню, авиадиапазон — это 108-136МГц, так что чего-то дополнительного из железа, кроме rtlsdr-свистка подходящей антенны не потребуется и весь приём будет программным.
Можно извратиться примерно так:
1) сделать приём на RPi(или другой комп)+rtlsdr звука
2) транслировать звук в сеть при помощи vlc и какой-то матери
3) принимать транслированное тем же vlc или любым другим плеером, умеющим нужный формат/битрейт.
Дальнейшие извращения — использование RPi как fm-передатчика для потока, но это уже отдельная тема, которую на хабре, помнится, обсуждали несколько лет назад.