Hai, Habr.
Bagian
ketiga menjelaskan cara mengakses penerima SDR menggunakan Python. Sekarang kita akan berkenalan dengan program
Radio GNU - sistem yang memungkinkan Anda membuat konfigurasi perangkat radio yang cukup kompleks tanpa menulis satu baris kode pun.

Sebagai contoh, perhatikan masalah penerimaan paralel beberapa stasiun FM pada satu penerima. Kami akan menggunakan RTL SDR V3 yang sama dengan penerima.
Berlanjut di bawah potongan.
Instalasi
Untuk memulai, GNU Radio perlu diinstal, kit distribusi untuk Windows dapat diunduh di
sini . Sistem ini adalah lintas platform, ada juga versi untuk Linux dan OSX (tampaknya GNU Radio berhasil diluncurkan pada Raspberry Pi, tetapi saya tidak dapat memberikan jaminan 100%).
Sebenarnya, GNU Radio adalah keseluruhan kerangka kerja untuk pemrosesan sinyal digital, di mana program ini "dirakit" dari modul yang terpisah. Ada sejumlah besar blok siap pakai, jika mau, Anda juga dapat membuat blok Anda sendiri. Modul-modul itu sendiri ditulis dalam C ++, dan Python berinteraksi satu sama lain. Mereka yang ingin dapat melihat API secara
lebih rinci , tetapi dalam praktiknya ini kemungkinan besar tidak berguna - semua tindakan dapat dilakukan secara visual dalam program Pendamping Radio GNU.
Sistem difokuskan pada pemrosesan aliran data, sehingga setiap blok biasanya memiliki input dan output. Selanjutnya, menghubungkan blok di editor, kami mendapatkan sistem yang sudah jadi. Antarmuka GNU Radio itu sendiri cukup sederhana, kesulitannya adalah dalam memahami apa yang dilakukan blok. Seperti disebutkan sebelumnya, pekerjaan tingkat rendah dengan SDR memiliki ambang input tinggi dan membutuhkan pengetahuan tentang DSP dan matematika. Tetapi kami akan mempertimbangkan tugas sederhana yang tidak membutuhkan pengetahuan khusus. Jadi mari kita mulai.
Memulai
Kami meluncurkan GNU Radio Companion, membuat proyek baru, pilih jenis proyek WX GUI, tambahkan ke layar dan hubungkan dua blok, seperti yang ditunjukkan pada tangkapan layar.

Kami melihat dua jenis blok - Sumber (sumber) dan Sink (keluaran, "tiriskan"). RTL-SDR adalah penerima kami, FFT GUI adalah penganalisa spektrum virtual.
Variabel Tingkat Sampel diatur ke 2048000, ini adalah tingkat sampel penerima kami. Frekuensi RTL-SDR default adalah 100 MHz.
Kami memulai proyek - semuanya berfungsi, kami melihat berbagai stasiun FM. Program pertama untuk GNU Radio sudah siap!

Jika kita melihat log, kita akan melihat garis seperti itu.
Menghasilkan: 'D: \\ MyProjects \\ GNURadio \\ top_block.py'
Menjalankan: C: \ Python27 \ python.exe -u D: \ MyProjects \ GNURadio \ top_block.pyYa, kita dapat melihat file top_block.py yang dihasilkan GNU Radio Companion untuk kita. True Jedi dapat menulis secara langsung dengan Python, tetapi kode yang diperlukan, seperti yang kita lihat, cukup besar. Kami membuatnya dalam 1 menit.
Namun, jika kita menghapus inisialisasi yang rumit, kita akan melihat bahwa tidak ada begitu banyak baris kode.
from gnuradio import gr from gnuradio.wxgui import fftsink2 import osmosdr class top_block(grc_wxgui.top_block_gui): def __init__(self): grc_wxgui.top_block_gui.__init__(self, title="Top Block") self.samp_rate = samp_rate = 2048000 self.wxgui_fftsink2_0 = fftsink2.fft_sink_c(...) self.Add(self.wxgui_fftsink2_0.win) self.rtlsdr_source_0 = osmosdr.source(args="numchan=" + str(1) + " " + '' ) self.connect((self.rtlsdr_source_0, 0), (self.wxgui_fftsink2_0, 0)) def main(top_block_cls=top_block, options=None): tb = top_block_cls() tb.Start(True) tb.Wait()
Jadi pada dasarnya, itu bisa ditulis secara manual. Tetapi masih lebih cepat dengan mouse. Meskipun kemampuan untuk mengubah kode kadang-kadang bisa berguna jika Anda ingin menambahkan beberapa logika non-standar.
Terima Radio FM
Sekarang cobalah untuk mengambil salah satu stasiun. Seperti yang terlihat dari tangkapan layar, frekuensi pusat penerima adalah 100 MHz dan bandwidth sekitar 2 MHz. Dalam spektrum kita melihat dua stasiun, masing-masing pada 100,1 MHz dan 100,7 MHz.
Langkah pertama adalah mentransfer spektrum stasiun ke pusat, sekarang 100 KHz ke kanan. Untuk melakukan ini, kita mengingat rumus sekolah untuk mengalikan cosinus - akibatnya akan ada dua frekuensi, jumlah dan perbedaan - stasiun yang diinginkan akan pindah ke pusat, yang adalah apa yang kita butuhkan (dan kita menyaring kelebihannya).
Kami membuat dua variabel untuk menyimpan freq_center = 100000000 dan freq_1 = 100100000 frekuensi, kami juga menambahkan generator sinyal dengan frekuensi freq_center - freq_1.

Karena Karena sistem ini didasarkan pada Python, kita dapat menggunakan ekspresi di bidang input parameter, yang cukup nyaman.
Diagram akan terlihat seperti ini:

Sekarang Anda perlu menambahkan beberapa blok sekaligus - mengurangi frekuensi clock dari sinyal input (2048KHz), menyaring sinyal, menerapkannya ke decoder FM, kemudian mengurangi frekuensi clock lagi menjadi 48KHz.
Hasilnya ditunjukkan pada gambar:

Kami mempertimbangkan dengan cermat. Kami membagi kecepatan clock 2048KHz sebanyak 4 kali dengan blok Rational Resampler (kami mendapatkan 512KHz), kemudian setelah filter Low Pass ada decoder WBFM dengan decimation 10 (kita mendapatkan 51.2KHz). Pada prinsipnya, sinyal ini sudah dapat diumpankan ke kartu suara, tetapi nada akan sedikit berbeda. Sekali lagi, kami mengubah frekuensi jam menjadi 48/51, sebagai akibatnya, frekuensi clock akan menjadi 48,2 KHz, perbedaannya sudah dapat diabaikan.
Poin penting kedua adalah jenis input. Sinyal IQ
kompleks (input / output berwarna biru) diterima dari receiver, sinyal
nyata adalah output dari dekoder FM - input dan output berwarna kuning. Jika campur aduk, tidak ada yang akan berhasil. Lebih banyak
tentang Habré , sudah cukup bagi kita untuk memahami prinsip umum.
Secara umum, jalankan, pastikan semuanya bekerja. Anda dapat menjalankan program dan mendengarkan radio. Kami akan melangkah lebih jauh - kami masih memiliki radio yang
Ditetapkan Perangkat Lunak - kami akan menambahkan penerimaan simultan stasiun kedua.
Penerimaan multichannel
Penerima kedua ditambahkan oleh metode pemrograman favorit Anda - Ctrl + C / Ctrl + V. Tambahkan variabel freq_2, salin blok dan hubungkan dengan cara yang sama.

Hasilnya cukup nyata - Anda dapat mendengarkan dua stasiun FM secara bersamaan. Dengan menggunakan metode yang sama (Ctrl + V), Anda dapat menambahkan stasiun ketiga.
Rekam
Mendengarkan dua stasiun dengan cara yang orisinal, tetapi dalam praktiknya tidak terlalu berguna. Kami akan melakukan sesuatu yang lebih penting, misalnya, menambahkan rekaman suara ke file terpisah. Ini bisa sangat nyaman - beberapa saluran dapat direkam secara bersamaan dari satu penerima fisik.
Tambahkan komponen File Sink ke setiap output, seperti yang ditunjukkan pada tangkapan layar.

Versi Windows karena alasan tertentu memerlukan jalur file absolut, jika tidak rekaman tidak akan berfungsi. Kami mulai, kami yakin bahwa semuanya normal. Ukuran file yang disimpan cukup besar, karena format default adalah float. Entri dalam format int akan meninggalkan pembaca sebagai pekerjaan rumah.
File yang dihasilkan dapat dibuka di Cool Edit dan pastikan bahwa suara direkam secara normal.


Tentu saja, jumlah saluran yang direkam dapat ditingkatkan, hanya dibatasi oleh bandwidth penerima dan daya komputer. Selain File Sink, UDP Sink juga dapat digunakan, sehingga program dapat digunakan untuk disiarkan melalui jaringan.
Jalankan dari baris perintah
Dan yang terakhir. Jika Anda menggunakan program secara mandiri, misalnya, untuk perekaman multi-saluran, maka UI, pada prinsipnya, tidak diperlukan. Di blok kiri atas Opsi, ubah parameter Opsi Jalankan ke Tidak Ada UI. Jalankan kembali program tersebut, pastikan semuanya bekerja. Sekarang kita menyimpan file yang dihasilkan top_block.py - kita bisa menjalankannya dari baris perintah, misalnya dari file bat atau dari konsol.

Jika ada yang tertarik, file yang dihasilkan disimpan di bawah spoiler.
Juga nyaman bahwa sistemnya adalah lintas platform, dan program yang dihasilkan dapat berjalan di Linux, Windows dan OSX.
Kesimpulan
Kita dapat mengatakan bahwa GNU Radio adalah sistem yang agak rumit, bukan dalam hal menggambar blok tentu saja, tetapi dalam hal memahami bagaimana semuanya bekerja. Tetapi untuk melakukan beberapa hal sederhana cukup layak dan menarik. GNU Radio juga mudah digunakan sebagai "laboratorium virtual" untuk pelatihan - Anda dapat menghubungkan osiloskop virtual atau penganalisa spektrum ke bagian mana pun dari sirkuit dan melihat bagaimana sinyal terlihat.
Jika tidak ada keinginan individu, topik penerimaan SDR mungkin dapat ditutup - semua poin utama telah dipertimbangkan, dan jumlah tampilan dari bagian pertama hingga ketiga turun
hampir secara eksponensial (meskipun Anda masih dapat menulis tentang transfer, tetapi membutuhkan lebih mahal " perangkat keras ”untuk pengujian daripada RTL SDR). Meskipun demikian, saya berharap bahwa beberapa pemahaman tentang bagaimana ini bekerja tetap dengan pembaca. Nah, semua percobaan berhasil.