Hai, Habr.
Pada bagian
sebelumnya, kami melihat kemungkinan pengiriman sinyal sederhana menggunakan GNU Radio. Sekarang kita akan melangkah lebih jauh dan melihat bagaimana menyampaikan sesuatu yang lebih rumit. Mari kita mulai dengan sinyal radio amatir WSPR, dan kemudian buat modem QAM perangkat lunak yang berfungsi.

Dan seperti pada kasus sebelumnya, kita akan melakukan ini tanpa menulis satu baris kode, program ini juga akan cross-platform, dan akan dapat bekerja baik di OSX / Linux dan di bawah Windows. Saya juga akan menunjukkan cara men-debug modem menggunakan GNU Radio, tanpa perangkat keras sama sekali.
Berlanjut di bawah potongan.
Bagi mereka yang belum menggunakan GNU Radio, disarankan untuk membaca bagian
4 dan
5 , yang menjelaskan prinsip-prinsip bekerja dengan program ini.
Wspr
Mari kita mulai dengan yang lebih sederhana, dengan
WSPR - jenis komunikasi ini secara khusus dibuat untuk tes propagasi sinyal lemah, yaitu yang kita butuhkan adalah level daya perangkat seperti LimeSDR tidak lebih dari 100mW. Sinyal WSPR ditransmisikan pada kecepatan yang sangat rendah (2 menit per pesan sekitar 30 byte) dalam pita yang sangat sempit, yang memungkinkannya untuk diterima bahkan di bawah tingkat kebisingan. Kirim sinyal seperti itu menggunakan GNU Radio.
Pertama, Anda perlu merekam sinyal. Untuk melakukan ini, ambil program
WSJT , atur semua parameter yang diperlukan (daya, tanda panggilan, lokasi, dll.). Tentukan Kabel Audio Virtual sebagai perangkat audio output dalam pengaturan, dan rekam sinyal dalam WAV. Jeda di tepian perlu dipotong di editor mana pun (misalnya, Cool Edit), sebagai hasilnya, kita harus mendapatkan file dengan durasi sekitar 2 menit.
Sekarang buat grafik di GNU Radio Companion.

Metode ini tidak mengklaim sebagai efisiensi maksimum, tetapi cukup sederhana dan mudah. Sinyal WSPR awalnya pada frekuensi 1500 Hz, file wav yang direkam memiliki frekuensi sampling 22050 s / s. Pertama, kami menguji ulang sinyal 57/5 kali untuk membawa frekuensi sampling ke 250.000 s / s yang diperlukan. Kemudian kita menggeser frekuensi hingga 10KHz (sinyal yang berguna akan berada pada frekuensi 11,5KHz), menerjemahkan sinyal ke dalam bentuk kompleks yang diperlukan oleh penerima, dan memotong kelebihan filter, meninggalkan frekuensi 11-12KHz.
Sinyal WSPR terikat waktu dan ditransmisikan setiap menit (0:00, 0:02, dll.). Saya memulai transfer ke GNU Radio secara manual, dengan mata, menentukan interval per jam, siapa pun yang ingin dapat menambahkan skrip dengan Python untuk secara otomatis memulai transfer.
Kami sedang menunggu waktu yang tepat, menyalakan pemancar, penerima, dan memeriksa hasilnya.

Jika diinginkan, Anda juga dapat menambahkan pembuatan otomatis file WSPR ke program berdasarkan input data (tanda panggilan, lokasi, daya pancar), contoh pembuatan WSPR untuk Python dapat diambil di github.
Sangat menarik untuk dicatat bahwa pada 432 MHz penyimpangan frekuensi sudah cukup terlihat, meskipun sinyal masih diterjemahkan. Tetapi pada frekuensi 1,3 GHz, arus menjadi begitu besar sehingga WSPR tidak lagi diterima - diperlukan generator referensi eksternal dengan sinyal yang lebih stabil untuk SDR (atau setidaknya koreksi frekuensi perangkat lunak selama transmisi, meskipun ini kurang nyaman).
Jika SDR memungkinkan Anda mengirim pada frekuensi rendah, maka Anda dapat mencoba transmisi pada pita HF. Jadi, dengan HackRF dimungkinkan untuk mengirimkan sinyal pada 1000 km pada 14 MHz dari antena ruang, yang dapat dianggap sebagai hasil yang baik. Meskipun frekuensi tinggi (433 MHz dan 1,3 GHz) mungkin bahkan lebih menarik untuk percobaan, sinyal hanya ditransmisikan dalam garis pandang langsung, jadi untuk percobaan tersebut Anda memerlukan peserta kedua di sisi penerima. Kelebihan kedua dari tes tersebut adalah bahwa hanya malas yang tidak mentransmisikan ke HF di wspr, tetapi frekuensi tinggi jauh lebih sedikit dikuasai. Jadi, dengan papan seperti LimeSDR atau USRP, Anda dapat melakukan eksperimen yang cukup menarik dengan penerimaan dan transmisi pada frekuensi sangat tinggi.
Modem QAM
Mari kita melangkah lebih jauh. WSPR adalah format yang cukup sederhana, mari kita lakukan sesuatu yang lebih menarik - modem penuh (well, hampir). Dengan
modulasi amplitudo quadrature, baik amplitudo dan fase sinyal secara bersamaan berubah, yang memungkinkan data ditransmisikan pada kecepatan yang lebih tinggi (tetapi pita yang ditempati juga lebih besar).
Pertimbangkan bagian pertama - pemancar.

Seperti yang Anda lihat, kami membaca data dari file data.txt, kemudian dengan frekuensi sampling 25 kHz kami mengirim data ke paket encoder, yang mengubah aliran menjadi kode 4-bit. Aliran ini menuju ke modulator quadrature, kemudian frekuensi sampling ditingkatkan menjadi frekuensi pemancar 250KHz, dan sinyal dialihkan ke atas sebesar 80KHz (banyak penerima memiliki puncak pada frekuensi nol, dan ini akan mengganggu). Komponen Constellation Rectangular mengatur parameter modulasi - jumlah karakter dan pergeseran fasa dan amplitudo.
Bagian pertama sudah siap. Kami memulai "transfer" dan melihat sinyal kami.

Kita dapat menguji pemancar kita tanpa memiliki peralatan apa pun - untuk ini ada blok Model Saluran khusus - model saluran komunikasi. Di sana Anda dapat mengatur kebisingan, pergeseran frekuensi, dll.
Seperti inilah sinyal kami sebelum dan sesudah transmisi. By the way, seperti yang Anda lihat, semua "harmonik" dari pemancar di bawah 120 dB telah jauh lebih rendah daripada tingkat kebisingan.

Sekarang resepsi. Padahal, hal yang sama, hanya dalam urutan terbalik.

Secara terpisah, Anda bisa berhenti di blok Sink UDP terakhir. Tidak jelas alasannya, tetapi di GNU Radio tidak ada komponen untuk melihat data teks. Oleh karena itu, kami cukup mengirim data melalui UDP ke port lokal mana pun (saya memilih 999).
Untuk menerima, kami akan menulis program Python sederhana.
import socket UDP_IP = "127.0.0.1" UDP_PORT = 999 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Hasil: jalankan skrip, jalankan GNU Radio, dan lihat pesan yang diterima di konsol.

Seperti yang Anda lihat, semuanya berfungsi, dan Anda tidak dapat memiliki penerima atau antena :)
Bagi mereka yang ingin mengulangi percobaan, file-grc proyek berada di bawah spoiler. Ini harus bekerja pada Linux dan 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>
Ada panduan yang baik untuk membuat modem yang lebih canggih
di situs web GNU Radio , tetapi mereka menggunakan blok khusus untuk demodulasi, yang diluncurkan hanya di Linux. Tidak ada masalah dengan ini pada contoh di atas.
Kesimpulan
Seperti yang Anda lihat, GNU Radio adalah program yang agak menarik untuk bekerja dengan sinyal dengan cara yang berbeda, di mana Anda dapat melakukan banyak hal menarik yang berbeda. Jika audiens tidak kehilangan minat (ada perasaan bahwa saya mempelajari topik-topik sempit yang kurang menarik bagi kebanyakan orang), Anda dapat mencoba mempertimbangkan untuk mentransmisikan sesuatu yang lebih menarik, misalnya, sebuah video.