哈Ha
在
上一部分中,我们研究了使用GNU Radio发送简单信号的可能性。 现在,我们将进一步探讨如何传达更复杂的内容。 让我们从业余无线电信号WSPR开始,然后创建一个可运行的软件QAM调制解调器。

与以前的情况一样,我们将无需编写任何代码即可完成此程序,该程序也将是跨平台的,并且将能够在OSX / Linux和Windows下运行。 我还将展示如何在不使用任何硬件的情况下使用GNU Radio调试调制解调器。
继续下割。
对于尚未使用GNU Radio的用户,建议阅读第
4部分和第
5部分,其中描述了使用该程序的原理。
WSPR
让我们从一个简单的
WSPR开始 -这种通信是专门为弱信号的传播测试而设计的,即 我们需要的是LimeSDR等设备的功率电平不超过100mW。 WSPR信号在非常窄的频带内以非常低的速度(每条消息2分钟,大约30个字节)传输,这使得它甚至可以在噪声水平以下被接收。 使用GNU Radio发送此类信号。
首先,您需要记录信号。 为此,请使用
WSJT程序,设置所有必需的参数(电源,呼号,位置等)。 在设置中将虚拟音频电缆指定为输出音频设备,并以WAV记录信号。 需要在任何编辑器中修剪边缘的暂停(例如,酷编辑),因此,我们应该获得一个持续时间约为2分钟的文件。
现在,在GNU Radio Companion中创建一个图形。

该方法并没有声称效率最高,但是非常简单明了。 WSPR信号最初为1500 Hz,记录的wav文件的采样频率为22050 s / s。 首先,我们对信号进行57/5次重新采样,以使采样频率达到所需的250.000 s / s。 然后我们将频率上移10KHz(有用信号将在11.5KHz的频率处),将信号转换为接收器所需的复数形式,并切除多余的滤波器,剩下11-12KHz的频率。
WSPR信号是有时间限制的,每隔一分钟(0:00、0:02等)传输一次。 我通过肉眼手动启动了到GNU Radio的传输,确定了以小时为单位的间隔,任何想要的人都可以在Python中添加脚本来自动开始传输。
我们正在等待合适的时间,打开发射器,接收器并检查结果。

如果您愿意,还可以根据输入数据(呼叫符号,位置,发送功率)将WSPR文件自动生成添加到程序中,可以在github上获取用于Python的WSPR生成示例。
有趣的是,尽管信号仍在解码,但在432 MHz处的频率漂移已经非常明显。 但是在1.3 GHz的频率下,漂移变得如此之大,以至于WSPR不再被接受-SDR需要一个具有更稳定信号的外部参考发生器(或至少在传输过程中进行软件频率校正,尽管这样做不太方便)。
如果SDR允许您以低频传输,则可以尝试在HF频带上传输。 因此,使用HackRF,可以从室内天线以14 MHz的频率在1000 km处发射1000 km的信号,这被认为是一个很好的结果。 尽管高频(433 MHz和1.3 GHz)对于实验来说可能更加有趣,但是信号仅以直接的视线传输,因此对于此类实验,您需要在接收方再有一个参与者。 这样的测试的第二个优点是,只有延迟不传输到wspr中的HF,但是对高频的掌握却少得多。 因此,使用LimeSDR或USRP之类的板卡,您可以进行非常有趣的超高频接收和传输实验。
QAM调制解调器
让我们走得更远。 WSPR是一种相当简单的格式,让我们做一些更有趣的事情-一个成熟的(差不多)调制解调器。 使用
正交幅度调制时,信号的幅度和相位都会同时变化,从而可以以更高的速度传输数据(但占用的带宽也更大)。
考虑第一部分-发射器。

如您所见,我们从data.txt文件中读取数据,然后以25KHz的采样频率将数据发送到数据包编码器,该数据包编码器将流转换为4位代码。 该流进入正交调制器,然后将采样频率增加到250KHz的发射机频率,信号向上移动80KHz(许多接收机在零频率处有一个峰值,这会产生干扰)。 星座图矩形组件设置调制参数-字符数以及相位和幅度偏移。
第一部分准备就绪。 我们开始“传输”并看到我们的信号。

我们甚至不需要任何设备就可以测试发射器-为此,有一个特殊的Channel Model模块-通信通道模型。 您可以在此处设置噪声,频移等。
这就是我们的信号在传输前后的样子。 顺便说一下,正如您所看到的,低于120 dB的发射机的所有“谐波”都远远低于噪声水平。

现在接待处。 实际上,同一件事,只是相反的顺序。

另外,您可以在最后一个UDP Sink块处停止。 目前尚不清楚原因,但是在GNU Radio中没有用于查看文本数据的组件。 因此,我们仅通过UDP将数据发送到任何本地端口(我选择999)。
为了接收,我们用Python编写了一个简单的程序。
import socket UDP_IP = "127.0.0.1" UDP_PORT = 999 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
结果:运行脚本,运行GNU Radio,并在控制台中查看收到的消息。

如您所见,一切正常,并且您既没有接收器也没有天线:)
对于那些想要重复实验的人,项目的grc文件位于破坏者之下。 它应该在Linux和Windows上都可以工作。
qam_test.grc <?xml version='1.0' encoding='utf-8'?> <?grc format='1' created='3.7.11'?> <flow_graph> <timestamp>Mon May 27 21:52:42 2019</timestamp> <block> <key>options</key> <param> <key>author</key> <value></value> </param> <param> <key>window_size</key> <value></value> </param> <param> <key>category</key> <value>[GRC Hier Blocks]</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>(8, 8)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>generate_options</key> <value>qt_gui</value> </param> <param> <key>hier_block_src_path</key> <value>.:</value> </param> <param> <key>id</key> <value>top_block</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></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>(1144, 172)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>excess_bw</value> </param> <param> <key>value</key> <value>0.35</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>(1104, 436)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>nfilts</value> </param> <param> <key>value</key> <value>32</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>(1096, 588)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>nfilts_0</value> </param> <param> <key>value</key> <value>32</value> </param> </block> <block> <key>variable_constellation_rect</key> <param> <key>comment</key> <value></value> </param> <param> <key>const_points</key> <value>[0.707+0.707j, -0.707+0.707j, -0.707-0.707j, 0.707-0.707j]</value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> <key>_coordinate</key> <value>(1104, 16)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>qpsk</value> </param> <param> <key>imag_sect</key> <value>2</value> </param> <param> <key>real_sect</key> <value>2</value> </param> <param> <key>rot_sym</key> <value>4</value> </param> <param> <key>soft_dec_lut</key> <value>None</value> </param> <param> <key>precision</key> <value>8</value> </param> <param> <key>sym_map</key> <value>[0, 1, 2, 3]</value> </param> <param> <key>w_imag_sect</key> <value>1</value> </param> <param> <key>w_real_sect</key> <value>1</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>(1104, 372)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>rrc_taps</value> </param> <param> <key>value</key> <value>firdes.root_raised_cosine(nfilts, nfilts, 1.0/float(sps), 0.35, 45*nfilts)</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>(1112, 508)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>rrc_taps_0</value> </param> <param> <key>value</key> <value>firdes.root_raised_cosine(nfilts, nfilts, 1.0/float(sps), 0.35, 45*nfilts)</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>(168, 12)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>samp_rate</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>(1144, 244)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>sps</value> </param> <param> <key>value</key> <value>4</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>(1104, 308)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>timing_loop_bw</value> </param> <param> <key>value</key> <value>6.28/100.0</value> </param> </block> <block> <key>analog_sig_source_x</key> <param> <key>amp</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>_enabled</key> <value>True</value> </param> <param> <key>freq</key> <value>80000</value> </param> <param> <key>_coordinate</key> <value>(664, 20)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>analog_sig_source_x_0</value> </param> <param> <key>maxoutbuf</key> <value>0</value> </param> <param> <key>minoutbuf</key> <value>0</value> </param> <param> <key>offset</key> <value>0</value> </param> <param> <key>type</key> <value>complex</value> </param> <param> <key>samp_rate</key> <value>samp_rate</value> </param> <param> <key>waveform</key> <value>analog.GR_COS_WAVE</value> </param> </block> <block> <key>analog_sig_source_x</key> <param> <key>amp</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>_enabled</key> <value>True</value> </param> <param> <key>freq</key> <value>-80000</value> </param> <param> <key>_coordinate</key> <value>(48, 540)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>analog_sig_source_x_1</value> </param> <param> <key>maxoutbuf</key> <value>0</value> </param> <param> <key>minoutbuf</key> <value>0</value> </param> <param> <key>offset</key> <value>0</value> </param> <param> <key>type</key> <value>complex</value> </param> <param> <key>samp_rate</key> <value>samp_rate</value> </param> <param> <key>waveform</key> <value>analog.GR_COS_WAVE</value> </param> </block> <block> <key>blks2_packet_decoder</key> <param> <key>access_code</key> <value></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>1</value> </param> <param> <key>_coordinate</key> <value>(296, 676)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>blks2_packet_decoder_0</value> </param> <param> <key>maxoutbuf</key> <value>0</value> </param> <param> <key>minoutbuf</key> <value>0</value> </param> <param> <key>type</key> <value>byte</value> </param> <param> <key>threshold</key> <value>-1</value> </param> </block> <block> <key>blks2_packet_encoder</key> <param> <key>access_code</key> <value></value> </param> <param> <key>bits_per_symbol</key> <value>4</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>1</value> </param> <param> <key>_coordinate</key> <value>(224, 76)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>blks2_packet_encoder_0</value> </param> <param> <key>type</key> <value>byte</value> </param> <param> <key>maxoutbuf</key> <value>0</value> </param> <param> <key>minoutbuf</key> <value>0</value> </param> <param> <key>pad_for_usrp</key> <value>True</value> </param> <param> <key>payload_length</key> <value>0</value> </param> <param> <key>preamble</key> <value></value> </param> <param> <key>samples_per_symbol</key> <value>4</value> </param> </block> <block> <key>blocks_file_source</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>1</value> </param> <param> <key>file</key> <value>D:\MyProjects\GNURadio\data.txt</value> </param> <param> <key>_coordinate</key> <value>(8, 92)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>blocks_file_source_0</value> </param> <param> <key>maxoutbuf</key> <value>0</value> </param> <param> <key>minoutbuf</key> <value>0</value> </param> <param> <key>type</key> <value>byte</value> </param> <param> <key>repeat</key> <value>True</value> </param> <param> <key>vlen</key> <value>1</value> </param> </block> <block> <key>blocks_multiply_xx</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>(920, 88)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>blocks_multiply_xx_0</value> </param> <param> <key>type</key> <value>complex</value> </param> <param> <key>maxoutbuf</key> <value>0</value> </param> <param> <key>minoutbuf</key> <value>0</value> </param> <param> <key>num_inputs</key> <value>2</value> </param> <param> <key>vlen</key> <value>1</value> </param> </block> <block> <key>blocks_multiply_xx</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>(224, 496)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>blocks_multiply_xx_1</value> </param> <param> <key>type</key> <value>complex</value> </param> <param> <key>maxoutbuf</key> <value>0</value> </param> <param> <key>minoutbuf</key> <value>0</value> </param> <param> <key>num_inputs</key> <value>2</value> </param> <param> <key>vlen</key> <value>1</value> </param> </block> <block> <key>blocks_throttle</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>1</value> </param> <param> <key>_coordinate</key> <value>(96, 196)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>blocks_throttle_1</value> </param> <param> <key>ignoretag</key> <value>True</value> </param> <param> <key>maxoutbuf</key> <value>0</value> </param> <param> <key>minoutbuf</key> <value>0</value> </param> <param> <key>samples_per_second</key> <value>25000</value> </param> <param> <key>type</key> <value>byte</value> </param> <param> <key>vlen</key> <value>1</value> </param> </block> <block> <key>blocks_udp_sink</key> <param> <key>alias</key> <value></value> </param> <param> <key>comment</key> <value></value> </param> <param> <key>affinity</key> <value></value> </param> <param> <key>ipaddr</key> <value>127.0.0.1</value> </param> <param> <key>port</key> <value>999</value> </param> <param> <key>_enabled</key> <value>1</value> </param> <param> <key>_coordinate</key> <value>(680, 660)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>blocks_udp_sink_0</value> </param> <param> <key>type</key> <value>byte</value> </param> <param> <key>psize</key> <value>64</value> </param> <param> <key>eof</key> <value>True</value> </param> <param> <key>vlen</key> <value>1</value> </param> </block> <block> <key>channels_channel_model</key> <param> <key>alias</key> <value></value> </param> <param> <key>block_tags</key> <value>False</value> </param> <param> <key>comment</key> <value></value> </param> <param> <key>affinity</key> <value></value> </param> <param> <key>_enabled</key> <value>1</value> </param> <param> <key>epsilon</key> <value>1.0</value> </param> <param> <key>freq_offset</key> <value>0.0</value> </param> <param> <key>_coordinate</key> <value>(504, 284)</value> </param> <param> <key>_rotation</key> <value>180</value> </param> <param> <key>id</key> <value>channels_channel_model_0</value> </param> <param> <key>maxoutbuf</key> <value>0</value> </param> <param> <key>minoutbuf</key> <value>0</value> </param> <param> <key>noise_voltage</key> <value>0.1</value> </param> <param> <key>seed</key> <value>0</value> </param> <param> <key>taps</key> <value>1.0 + 1.0j</value> </param> </block> <block> <key>digital_qam_demod</key> <param> <key>alias</key> <value></value> </param> <param> <key>comment</key> <value></value> </param> <param> <key>affinity</key> <value></value> </param> <param> <key>differential</key> <value>True</value> </param> <param> <key>_enabled</key> <value>1</value> </param> <param> <key>excess_bw</key> <value>0.35</value> </param> <param> <key>freq_bw</key> <value>6.28/100.0</value> </param> <param> <key>_coordinate</key> <value>(672, 456)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>mod_code</key> <value>"gray"</value> </param> <param> <key>id</key> <value>digital_qam_demod_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> <param> <key>constellation_points</key> <value>4</value> </param> <param> <key>phase_bw</key> <value>6.28/100.0</value> </param> <param> <key>samples_per_symbol</key> <value>4</value> </param> <param> <key>timing_bw</key> <value>6.28/100.0</value> </param> <param> <key>verbose</key> <value>False</value> </param> </block> <block> <key>digital_qam_mod</key> <param> <key>alias</key> <value></value> </param> <param> <key>comment</key> <value></value> </param> <param> <key>affinity</key> <value></value> </param> <param> <key>differential</key> <value>True</value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> <key>excess_bw</key> <value>0.35</value> </param> <param> <key>_coordinate</key> <value>(384, 116)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>mod_code</key> <value>"gray"</value> </param> <param> <key>id</key> <value>digital_qam_mod_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> <param> <key>constellation_points</key> <value>4</value> </param> <param> <key>samples_per_symbol</key> <value>4</value> </param> <param> <key>verbose</key> <value>False</value> </param> </block> <block> <key>low_pass_filter</key> <param> <key>beta</key> <value>6.76</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>cutoff_freq</key> <value>12000</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>(320, 460)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>gain</key> <value>1</value> </param> <param> <key>id</key> <value>low_pass_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>samp_rate</key> <value>samp_rate</value> </param> <param> <key>width</key> <value>1000</value> </param> <param> <key>win</key> <value>firdes.WIN_HAMMING</value> </param> </block> <block> <key>qtgui_const_sink_x</key> <param> <key>autoscale</key> <value>False</value> </param> <param> <key>axislabels</key> <value>True</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>1</value> </param> <param> <key>_coordinate</key> <value>(456, 20)</value> </param> <param> <key>gui_hint</key> <value></value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>grid</key> <value>False</value> </param> <param> <key>id</key> <value>qtgui_const_sink_x_0</value> </param> <param> <key>legend</key> <value>True</value> </param> <param> <key>alpha1</key> <value>1.0</value> </param> <param> <key>color1</key> <value>"blue"</value> </param> <param> <key>label1</key> <value></value> </param> <param> <key>marker1</key> <value>0</value> </param> <param> <key>style1</key> <value>0</value> </param> <param> <key>width1</key> <value>1</value> </param> <param> <key>alpha10</key> <value>1.0</value> </param> <param> <key>color10</key> <value>"red"</value> </param> <param> <key>label10</key> <value></value> </param> <param> <key>marker10</key> <value>0</value> </param> <param> <key>style10</key> <value>0</value> </param> <param> <key>width10</key> <value>1</value> </param> <param> <key>alpha2</key> <value>1.0</value> </param> <param> <key>color2</key> <value>"red"</value> </param> <param> <key>label2</key> <value></value> </param> <param> <key>marker2</key> <value>0</value> </param> <param> <key>style2</key> <value>0</value> </param> <param> <key>width2</key> <value>1</value> </param> <param> <key>alpha3</key> <value>1.0</value> </param> <param> <key>color3</key> <value>"red"</value> </param> <param> <key>label3</key> <value></value> </param> <param> <key>marker3</key> <value>0</value> </param> <param> <key>style3</key> <value>0</value> </param> <param> <key>width3</key> <value>1</value> </param> <param> <key>alpha4</key> <value>1.0</value> </param> <param> <key>color4</key> <value>"red"</value> </param> <param> <key>label4</key> <value></value> </param> <param> <key>marker4</key> <value>0</value> </param> <param> <key>style4</key> <value>0</value> </param> <param> <key>width4</key> <value>1</value> </param> <param> <key>alpha5</key> <value>1.0</value> </param> <param> <key>color5</key> <value>"red"</value> </param> <param> <key>label5</key> <value></value> </param> <param> <key>marker5</key> <value>0</value> </param> <param> <key>style5</key> <value>0</value> </param> <param> <key>width5</key> <value>1</value> </param> <param> <key>alpha6</key> <value>1.0</value> </param> <param> <key>color6</key> <value>"red"</value> </param> <param> <key>label6</key> <value></value> </param> <param> <key>marker6</key> <value>0</value> </param> <param> <key>style6</key> <value>0</value> </param> <param> <key>width6</key> <value>1</value> </param> <param> <key>alpha7</key> <value>1.0</value> </param> <param> <key>color7</key> <value>"red"</value> </param> <param> <key>label7</key> <value></value> </param> <param> <key>marker7</key> <value>0</value> </param> <param> <key>style7</key> <value>0</value> </param> <param> <key>width7</key> <value>1</value> </param> <param> <key>alpha8</key> <value>1.0</value> </param> <param> <key>color8</key> <value>"red"</value> </param> <param> <key>label8</key> <value></value> </param> <param> <key>marker8</key> <value>0</value> </param> <param> <key>style8</key> <value>0</value> </param> <param> <key>width8</key> <value>1</value> </param> <param> <key>alpha9</key> <value>1.0</value> </param> <param> <key>color9</key> <value>"red"</value> </param> <param> <key>label9</key> <value></value> </param> <param> <key>marker9</key> <value>0</value> </param> <param> <key>style9</key> <value>0</value> </param> <param> <key>width9</key> <value>1</value> </param> <param> <key>name</key> <value>""</value> </param> <param> <key>nconnections</key> <value>1</value> </param> <param> <key>size</key> <value>1024</value> </param> <param> <key>tr_chan</key> <value>0</value> </param> <param> <key>tr_level</key> <value>0.0</value> </param> <param> <key>tr_mode</key> <value>qtgui.TRIG_MODE_FREE</value> </param> <param> <key>tr_slope</key> <value>qtgui.TRIG_SLOPE_POS</value> </param> <param> <key>tr_tag</key> <value>""</value> </param> <param> <key>type</key> <value>complex</value> </param> <param> <key>update_time</key> <value>0.10</value> </param> <param> <key>xmax</key> <value>2</value> </param> <param> <key>xmin</key> <value>-2</value> </param> <param> <key>ymax</key> <value>2</value> </param> <param> <key>ymin</key> <value>-2</value> </param> </block> <block> <key>rational_resampler_xxx</key> <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>fbw</key> <value>0</value> </param> <param> <key>_coordinate</key> <value>(648, 148)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>rational_resampler_xxx_0</value> </param> <param> <key>interp</key> <value>10</value> </param> <param> <key>maxoutbuf</key> <value>0</value> </param> <param> <key>minoutbuf</key> <value>0</value> </param> <param> <key>taps</key> <value></value> </param> <param> <key>type</key> <value>ccc</value> </param> </block> <block> <key>rational_resampler_xxx</key> <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>10</value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> <key>fbw</key> <value>0</value> </param> <param> <key>_coordinate</key> <value>(480, 484)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>rational_resampler_xxx_0_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>taps</key> <value></value> </param> <param> <key>type</key> <value>ccc</value> </param> </block> <connection> <source_block_id>analog_sig_source_x_0</source_block_id> <sink_block_id>blocks_multiply_xx_0</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> <source_block_id>analog_sig_source_x_1</source_block_id> <sink_block_id>blocks_multiply_xx_1</sink_block_id> <source_key>0</source_key> <sink_key>1</sink_key> </connection> <connection> <source_block_id>blks2_packet_decoder_0</source_block_id> <sink_block_id>blocks_udp_sink_0</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> <source_block_id>blks2_packet_encoder_0</source_block_id> <sink_block_id>digital_qam_mod_0</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> <source_block_id>blocks_file_source_0</source_block_id> <sink_block_id>blocks_throttle_1</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> <source_block_id>blocks_multiply_xx_0</source_block_id> <sink_block_id>channels_channel_model_0</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> <source_block_id>blocks_multiply_xx_1</source_block_id> <sink_block_id>low_pass_filter_0</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> <source_block_id>blocks_throttle_1</source_block_id> <sink_block_id>blks2_packet_encoder_0</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> <source_block_id>channels_channel_model_0</source_block_id> <sink_block_id>blocks_multiply_xx_1</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> <source_block_id>digital_qam_demod_0</source_block_id> <sink_block_id>blks2_packet_decoder_0</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> <source_block_id>digital_qam_mod_0</source_block_id> <sink_block_id>qtgui_const_sink_x_0</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> <source_block_id>digital_qam_mod_0</source_block_id> <sink_block_id>rational_resampler_xxx_0</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> <source_block_id>low_pass_filter_0</source_block_id> <sink_block_id>rational_resampler_xxx_0_0</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> <source_block_id>rational_resampler_xxx_0</source_block_id> <sink_block_id>blocks_multiply_xx_0</sink_block_id> <source_key>0</source_key> <sink_key>1</sink_key> </connection> <connection> <source_block_id>rational_resampler_xxx_0_0</source_block_id> <sink_block_id>digital_qam_demod_0</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> </flow_graph>
GNU Radio网站提供了有关创建更复杂调制解调器的很好指南,但是他们使用自定义模块进行解调,该模块仅在Linux下启动。 在上面的示例中,这没有问题。
结论
如您所见,GNU Radio是一个相当有趣的程序,用于以不同的方式处理信号,您可以在其中执行许多不同的有趣的事情。 如果观众不失去兴趣(我觉得自己钻研了对大多数人都不感兴趣的狭窄话题),则可以尝试考虑传输更有趣的内容,例如视频。