📜 ⬆️ ⬇️

Software Defined Radio - how does it work? Part 8

Hi Habr.

In a previous article about Software Defined Radio, a question was asked how to decode RDS using GNU Radio. The RDS decoder is not so simple to create from scratch, but fortunately for us, it is already built into GNU Radio, so it’s easy to see how it works without writing a single line of code, just RTL-SDR receiver.


')
How it works, continued under the cut.

About GNU Radio and its installation, I will not repeat, it has already been described earlier . In short, the distribution under Windows can be found here . Let's go over to the RDS itself.

If someone suddenly does not know, RDS (Radio Data System) is a protocol used in ordinary FM broadcasting to transmit additional digital information (time, exchange rates, weather, etc.). The transmission goes at a speed of 1187.5bps at a frequency of 57KHz (3rd harmonic of the pilot tone), to minimize the frequency band, BPSK (Binary Phase Shift Keying) phase coding is used. The RDS bit level has already been considered in the Habré earlier , well, we move on to GNU Radio.

The decoder for GNU Radio was made about 10 years ago , but that version is already useless to watch, the names of many units have changed, and the examples cited there no longer work. Updated fork can be taken from here .

By the way, it didn’t work to compile gr-rds from source files for Windows - cmake produces errors for the absence of Boost, although it is installed. It is not clear by the way why over the years of cmake and boost, cmake has not been taught to find ways in Windows - like finding a folder on the disk is not a rocket science at all (if anyone knows the solution, write in the comments, although judging by Stack Overflow, the problem exists for years and all do not care). But it turned out that we don’t need it - the RDS decoder has already been added to GNU Radio, so from the project on github we need only examples that are in the apps folder.

The block diagram attached in the examples is rather monstrous, moreover, when opening it, errors are displayed (blocks are marked in red).



In real life, however, everything is simpler - 2/3 of the scheme is a stereo player for FM, where L + R and LR channels are extracted from the original signal, processed and fed to the sound card. It is irrelevant to us now, so these blocks can be removed (especially since out of the box for some reason it did not work, but it was too lazy to understand). Errors occur due to the Grid Position parameter, which apparently is not supported by the Windows version, but it can be removed without problems, it does not affect the functionality.

After removing “all superfluous”, the working RDS decoder scheme looks like this:



Let's see what is there.

The source signal comes from RTL-SDR Source, the frequency is set by the freq parameter, which has the WX GUI Slider type (yes, you can create your own UI in GNU Radio, and there are basic controls). To avoid a peak at zero frequency in the center, the freq_offset parameter is used, the Frequency Xlating block shifts the frequency by this value. The WBFM Receive unit, as the name implies, performs FM demodulation, then the frequency is shifted again to allocate the RDS itself to 57KHz. The Root Cosined Filter block allocates a narrow frequency, and the MPSK decoder with parameter 2 performs BPSK decoding (RDS itself is transmitted using phase modulation with two states). RDS uses differential encoding , so the corresponding differential decoder is called, and finally the finished binary stream is fed to the RDS Decoder block (its source can be viewed on github ). After the decoder, an equally important part is the RDS parser — there are quite a few types of packages in RDS, and the parser does all the work of decoding them.

Actually that's all. The results of the decoder on KDPV and screenshots.







If someone needs to use the program in no-UI mode, you can use the FR Tap block, a more detailed description here , I personally have not tried it. If the lower bit-rate level of RDS is interesting, I considered it earlier , it can also be useful for general interest.

As usual, all successful experiments.

The original GRC file, running under Windows, under the spoiler (the frequency of the radio station only has to be changed).

rds_rx.grc
<?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> 

Source: https://habr.com/ru/post/456184/


All Articles