Hai, Habr.
Dalam bagian "anniversary" dari seri tentang SDR, saya ingin berbicara tentang salah satu protokol, berkat banyak ham yang "tanpa disadari" bergabung dengan dunia sinyal broadband digital. Standar ini juga merupakan yang pertama (dan sejauh yang kami tahu, satu-satunya) upaya untuk mentransmisikan suara digital pada panjang gelombang pendek.

Seperti yang mungkin sudah banyak ditebak, kita akan berbicara tentang standar DRM -
Digital Radio Mondiale (jangan bingung dengan DRM lainnya, Manajemen Hak Digital).
Ya, karena Jika kita berbicara tentang SDR, maka kita akan melihat tidak hanya bagaimana menerima DRM, tetapi juga bagaimana mengirimkannya. Berlanjut di bawah potongan.
Ceritanya
Sejarah standar DRM tidak mudah. Ini pertama kali diperkenalkan pada tahun 2003, dan uji transmisi telah dilakukan sejak 2007, dan dengan berbagai keberhasilan berlanjut secara berkala dan tetap.
DRM didasarkan pada dua ide utama.
- Transmisi suara pada panjang gelombang pendek dengan "kualitas digital", tanpa noise dan fading, dengan bit rate dari 6 hingga 34Kbit / s. Namun, "kualitas digital" di sini hanya dapat ditulis dalam tanda kutip, karena pada bitrate 12Kbit, suaranya berasal
dari cukup ... kualitas relatif rendah. Selain itu, sinyal HF benar-benar tunduk pada noise dan fading, dan agar "digit" didekodekan, diperlukan rasio signal-to-noise yang sangat tinggi - sedemikian rupa sehingga sinyal analog biasa akan terdengar lebih baik. Secara umum, cukup untuk mencoba setidaknya sekali dalam kehidupan nyata untuk menerima DRM untuk memahami bahwa ide tersebut tidak akan lepas landas. Namun penyiaran tetap dilakukan secara berkala, termasuk dari Rusia (lihat KDPV), dan beberapa stasiun radio terkadang masih menyiarkan di DRM. - Transmisi suara di pita FM. Standar ini disebut DRM +. Di sini idenya adalah untuk menghemat sumber daya frekuensi - berkat kompresi digital, hingga 4 transmisi audio dapat segera ditransmisikan dalam pita 100KHz, yang menjanjikan keuntungan baik di kota-kota besar seperti London, di mana tidak ada frekuensi gratis lagi. Di sisi lain, DAB sudah bekerja di Eropa, dan standar lain sama sekali tidak diperlukan di sini. Menurut Wikipedia, siaran uji DRM + dilakukan di Skotlandia pada tahun 2010, sejauh ini saya belum mendengar adanya kasus nyata penyiaran DRM +.
Standar DRM pada dasarnya agak surealis - selama bertahun-tahun stasiun radio telah beroperasi, siaran disiarkan ... Tetapi tidak ada penerima standar ini yang dijual. Umumnya. Tidak ada Jelas bahwa karena standarnya digital, penerima yang biasa hanya dapat mendengar desisan, dan belum ada yang pernah belajar cara mendekodekan QAM dengan telinga. Jadi penerimaan DRM adalah hiburan hanya untuk radio ham. Tampaknya 1-2 penerima memang ada, tentang yang bahkan ada beberapa video di youtube (
1 dan
2 ), tetapi tidak ada yang dijual sekarang di Ebay atau Amazon.
Masalah kedua menerima DRM adalah bahwa di kota-kota penyiaran HF secara de facto sudah mati - ada begitu banyak gangguan dari peralatan rumah tangga dan catu daya sehingga bahkan jika Anda menghidupkan radio HF, Anda akan mendengar satu derak dan derau - decoding dalam kondisi seperti itu tidak berfungsi. akan, dalam kasus terbaik, penerima akan dapat menampilkan stasiun screen saver, tetapi tanpa suara. Anda tentu saja dapat meletakkan antena di balkon atau di atap, mengkonfigurasinya dengan hati-hati, dan pada prinsipnya, sangat mungkin untuk menerima dan mendekodekan DRM dari apartemen kota untuk amatir radio. Orang biasa tidak akan repot dengan ini 100%, tidak ada yang akan naik ke atap untuk menggantung antena untuk menerima sinyal audio dengan bitrate 12Kbit / s.
Secara umum, tidak ada penerima, tidak ada audiens. Tapi ada siarannya. Gopher dari film sedang beristirahat ...
Ngomong-ngomong, saat ini, pada saat penulisan (Juli 2019), siaran uji DRM + sedang dilakukan di St. Petersburg, sehingga mereka yang ingin
menjadi seorang gopher dapat mencoba menerima sinyal (tidak ada yang mendengarkan, tidak ada penerima atau bahkan decoder SDR perangkat lunak untuk DRM +). Untuk penerimaan, Anda dapat menggunakan RTL-SDR, dan jika Anda beruntung, maka di pita FM Anda dapat melihat sinyal digital dengan lebar sekitar 100KHz. Namun, decoder, sebagaimana telah disebutkan, tidak dapat ditemukan untuknya.
Penerimaan DRM
Laporan pertama tentang DRM ham pada tanggal radioscanner kembali ke 2008. Penerimaan sinyal digital dengan lebar 10KHz tidak dimungkinkan pada penerima rumah tangga biasa (dan bahkan amatir), jadi mereka yang ingin harus menyolder konverter untuk mengeluarkan penerima IF ke kartu suara. Setelah kemunculan SDR, masalah teratasi dengan sendirinya, di sana Anda dapat memilih bandwidth apa pun sesuai kemampuan penerima (untuk SDR pertama berdasarkan kartu suara biasanya 48KHz, yang lebih dari cukup). Penguraiannya sendiri dilakukan dengan menggunakan program
Dream yang sangat nyaman dan berkualitas tinggi.
Seperti disebutkan di atas, stasiun DRM bekerja cukup teratur, dan menemukannya di udara tidak begitu sulit. Misalnya, di
websdr sinyal seperti itu sangat mudah dibedakan pada spektrum - jika sinyal digital 10KHz terlihat dalam rentang siaran, maka inilah dia. Contoh tangkapan layar stasiun yang beroperasi pada 15 MHz yang diambil pada saat penulisan:

Hanya decoding menggunakan websdr tidak akan berfungsi, bandwidth penerima online terlalu kecil. Namun, siapa pun dapat mendengarkan DRM, file yang direkam dari udara nyata dapat diunduh di
sini . Untuk decoding, Anda dapat menggunakan program Dream yang telah disebutkan, versi yang berfungsi dengan semua DLL yang diperlukan dapat ditemukan
di situs web radioscanner .
Jika kita berbicara tentang penerima "besi", diumumkan, misalnya, penerima Gospell GR-216, tetapi tidak langsung di eBay atau Amazon.
Sunting: seperti yang disarankan dalam komentar, receiver ini sekarang dijual di pasar Australia dengan nama merek Tecsun Q-3061. Harga masalah adalah 500AUD, atau sekitar $ 350.

Mereka yang ingin meng-host stasiun DRM sendiri dapat melihat jadwal di
https://www.drm.org/what-can-i-hear/broadcast-schedule-2/ .
Transmisi DRM
Sekarang kita beralih ke yang tidak kalah menarik - kemungkinan mentransmisikan sinyal-DRM (dan jika saya tidak salah, ini dijelaskan dalam RuNet untuk pertama kalinya). Ini dapat dilakukan dengan menggunakan GNU Radio dan
modul gr-drm .

Secara teknis, DRM menggunakan modulasi QAM, dan memiliki beberapa pengaturan bitrate dan bandwidth. Selain itu, tidak hanya suara (baik mono dan stereo) dapat ditransmisikan, tetapi juga teks, logo saluran, dan informasi layanan lainnya. Untuk HF (mode AD), pita yang ditempati dapat bervariasi dari 4,5 hingga 20 KHz, namun dalam praktiknya, hanya 10 sinyal KHz yang ditemukan. Untuk VHF (mode E), sebagaimana telah disebutkan, pita 100KHz digunakan.
Tabel dari
www.drm.org/DRM_Handbook_2018.pdf :

Deskripsi standar yang lebih terperinci adalah
dalam PDF , Anda dapat membaca secara singkat di
Signalwiki .
Mari kita kembali ke grafik koneksi kita. Seperti yang Anda lihat, encoder DRM menghasilkan sinyal dari beberapa komponen.
- Saluran Akses Cepat (FAC). Berisi informasi tentang properti sinyal ODFM dan konfigurasi SDC / MSC. Informasi saluran ditransmisikan setiap 0,4 detik, yang memungkinkan penerima dengan cepat mulai menerima sinyal stasiun. Parameter sinyal dapat dikonfigurasi di blok Konfigurasi DRM.
- Saluran Uraian Layanan (SDC). Menjelaskan saluran transmisi MSC.
- Saluran Servis Utama (MSC). Berisi frame data; QAM16 atau QAM64 dapat digunakan untuk transmisi.
Nah, hal yang paling menarik adalah bahwa semua ini dapat dijalankan tanpa masalah pada PC biasa. Gr-drm termasuk dalam paket PothosSDR untuk Windows, tetapi sayangnya, itu tidak bekerja di sana - ada sinyal, tetapi decoding terjadi dengan kesalahan. Di bawah Ubuntu, semuanya berjalan dengan baik.
Anda dapat menggunakan file WAV atau transceiver SDR lengkap seperti HackRF sebagai perangkat output di GNU Radio. Bagi mereka yang ingin bereksperimen sendiri, file GRC berada di bawah spoiler.
rdm_transmit.grc<?xml version='1.0' encoding='utf-8'?> <?grc format='1' created='3.7.11'?> <flow_graph> <timestamp>Tue Apr 29 11:37:08 2014</timestamp> <block> <key>options</key> <param> <key>author</key> <value>Felix Wunsch</value> </param> <param> <key>window_size</key> <value>3000, 2000</value> </param> <param> <key>category</key> <value>Custom</value> </param> <param> <key>comment</key> <value></value> </param> <param> <key>description</key> <value>Generic DRM Transmitter. For the MSC, only SM and EEP is implemented.</value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> <key>_coordinate</key> <value>(1016, 16)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>generate_options</key> <value>no_gui</value> </param> <param> <key>hier_block_src_path</key> <value>.:</value> </param> <param> <key>id</key> <value>drm_transmitter</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>run</value> </param> <param> <key>run</key> <value>True</value> </param> <param> <key>thread_safe_setters</key> <value></value> </param> <param> <key>title</key> <value>DRM Transmitter</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, 60)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>file_dest</value> </param> <param> <key>value</key> <value>"D:\\MyProjects\\GNURadio\\gr-drm-master\\apps\\sound_drm_out.wav"</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>(56, 60)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>file_source</value> </param> <param> <key>value</key> <value>"D:\\MyProjects\\GNURadio\\gr-drm-master\\apps\\sound.wav"</value> </param> </block> <block> <key>variable_drm_config</key> <param> <key>audio_sample_rate</key> <value>12000</value> </param> <param> <key>comment</key> <value>Before generating the flow graph, define the path to a 24 kHz wav-file and change the parameters of the UHD sink. Do not forget to set the correct audio_sample_rate.</value> </param> <param> <key>_enabled</key> <value>1</value> </param> <param> <key>_coordinate</key> <value>(1208, 12)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>tp</value> </param> <param> <key>long_interl</key> <value>True</value> </param> <param> <key>msc_mapping</key> <value>2</value> </param> <param> <key>msc_prot_level_2_16</key> <value>1</value> </param> <param> <key>msc_prot_level_2_64</key> <value>0</value> </param> <param> <key>RM</key> <value>1</value> </param> <param> <key>sdc_mapping</key> <value>0</value> </param> <param> <key>SO</key> <value>3</value> </param> <param> <key>station_label</key> <value>"Radioscanner Test"</value> </param> <param> <key>text_message</key> <value>"DRM transmission with GNU Radio"</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>1</value> </param> <param> <key>freq</key> <value>7000</value> </param> <param> <key>_coordinate</key> <value>(576, 624)</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>drm.FS_SOUNDCARD</value> </param> <param> <key>waveform</key> <value>analog.GR_COS_WAVE</value> </param> </block> <block> <key>audio_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>device_name</key> <value></value> </param> <param> <key>_enabled</key> <value>0</value> </param> <param> <key>_coordinate</key> <value>(1184, 556)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>audio_sink_0</value> </param> <param> <key>num_inputs</key> <value>1</value> </param> <param> <key>ok_to_block</key> <value>True</value> </param> <param> <key>samp_rate</key> <value>48000</value> </param> </block> <block> <key>audio_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>device_name</key> <value></value> </param> <param> <key>_enabled</key> <value>0</value> </param> <param> <key>_coordinate</key> <value>(56, 156)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>audio_source_0</value> </param> <param> <key>maxoutbuf</key> <value>0</value> </param> <param> <key>minoutbuf</key> <value>0</value> </param> <param> <key>num_outputs</key> <value>1</value> </param> <param> <key>ok_to_block</key> <value>True</value> </param> <param> <key>samp_rate</key> <value>44100</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>1</value> </param> <param> <key>_coordinate</key> <value>(1008, 640)</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_multiply_const_vxx</key> <param> <key>alias</key> <value></value> </param> <param> <key>comment</key> <value></value> </param> <param> <key>const</key> <value>32768</value> </param> <param> <key>affinity</key> <value></value> </param> <param> <key>_enabled</key> <value>1</value> </param> <param> <key>_coordinate</key> <value>(272, 236)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>blocks_multiply_const_vxx_0</value> </param> <param> <key>type</key> <value>float</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_multiply_const_vxx</key> <param> <key>alias</key> <value></value> </param> <param> <key>comment</key> <value>Prevent clipping</value> </param> <param> <key>const</key> <value>7e-3</value> </param> <param> <key>affinity</key> <value></value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> <key>_coordinate</key> <value>(688, 468)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>blocks_multiply_const_vxx_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>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>1</value> </param> <param> <key>_coordinate</key> <value>(864, 624)</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_wavfile_sink</key> <param> <key>bits_per_sample</key> <value>16</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>file</key> <value>file_dest</value> </param> <param> <key>_coordinate</key> <value>(1200, 620)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>blocks_wavfile_sink_0</value> </param> <param> <key>nchan</key> <value>1</value> </param> <param> <key>samp_rate</key> <value>drm.FS_SOUNDCARD</value> </param> </block> <block> <key>blocks_wavfile_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>file_source</value> </param> <param> <key>_coordinate</key> <value>(56, 228)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>blocks_wavfile_source_0</value> </param> <param> <key>maxoutbuf</key> <value>0</value> </param> <param> <key>minoutbuf</key> <value>0</value> </param> <param> <key>nchan</key> <value>1</value> </param> <param> <key>repeat</key> <value>False</value> </param> </block> <block> <key>cell_mapping_cc</key> <param> <key>alias</key> <value></value> </param> <param> <key>comment</key> <value>Multiplex the three logical channels and the pilot cells and create transmission frames.</value> </param> <param> <key>affinity</key> <value></value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> <key>_coordinate</key> <value>(1184, 264)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>cell_mapping_cc_0</value> </param> <param> <key>maxoutbuf</key> <value>0</value> </param> <param> <key>minoutbuf</key> <value>0</value> </param> <param> <key>tp</key> <value>tp</value> </param> </block> <block> <key>digital_ofdm_cyclic_prefixer</key> <param> <key>alias</key> <value></value> </param> <param> <key>cp_len</key> <value>tp.ofdm().nfft()*tp.ofdm().cp_ratio_enum()/tp.ofdm().cp_ratio_denom()</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>input_size</key> <value>tp.ofdm().nfft()</value> </param> <param> <key>_coordinate</key> <value>(456, 448)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>digital_ofdm_cyclic_prefixer_1</value> </param> <param> <key>tagname</key> <value></value> </param> <param> <key>maxoutbuf</key> <value>0</value> </param> <param> <key>minoutbuf</key> <value>0</value> </param> <param> <key>rolloff</key> <value>0</value> </param> </block> <block> <key>drm_audio_encoder_sb</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>(456, 240)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>drm_audio_encoder_sb_0</value> </param> <param> <key>maxoutbuf</key> <value>0</value> </param> <param> <key>minoutbuf</key> <value>0</value> </param> <param> <key>len_out</key> <value>tp.msc().L_MUX()</value> </param> <param> <key>tp</key> <value>tp</value> </param> </block> <block> <key>drm_generate_fac_b</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>(56, 344)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>drm_generate_fac_b_0</value> </param> <param> <key>maxoutbuf</key> <value>0</value> </param> <param> <key>minoutbuf</key> <value>0</value> </param> <param> <key>tp</key> <value>tp</value> </param> </block> <block> <key>drm_generate_sdc_b</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>(56, 296)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>drm_generate_sdc_b_0</value> </param> <param> <key>maxoutbuf</key> <value>0</value> </param> <param> <key>minoutbuf</key> <value>0</value> </param> <param> <key>tp</key> <value>tp</value> </param> </block> <block> <key>drm_interleaver_cc</key> <param> <key>alias</key> <value></value> </param> <param> <key>comment</key> <value>Additional interleaving</value> </param> <param> <key>affinity</key> <value></value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> <key>_coordinate</key> <value>(952, 240)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>drm_interleaver_cc_0</value> </param> <param> <key>depth</key> <value>drm.INTL_DEPTH_DRM</value> </param> <param> <key>interl_seq</key> <value>tp.msc().cell_interl_seq()</value> </param> <param> <key>long_interl</key> <value>tp.cfg().long_interl()</value> </param> <param> <key>maxoutbuf</key> <value>0</value> </param> <param> <key>minoutbuf</key> <value>0</value> </param> </block> <block> <key>drm_scrambler_bb</key> <param> <key>alias</key> <value></value> </param> <param> <key>block_len</key> <value>tp.msc().L_MUX()</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>(608, 240)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>drm_scrambler_bb_0</value> </param> <param> <key>maxoutbuf</key> <value>0</value> </param> <param> <key>minoutbuf</key> <value>0</value> </param> </block> <block> <key>drm_scrambler_bb</key> <param> <key>alias</key> <value></value> </param> <param> <key>block_len</key> <value>tp.fac().L()</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>(608, 344)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>drm_scrambler_bb_0_0</value> </param> <param> <key>maxoutbuf</key> <value>0</value> </param> <param> <key>minoutbuf</key> <value>0</value> </param> </block> <block> <key>drm_scrambler_bb</key> <param> <key>alias</key> <value></value> </param> <param> <key>block_len</key> <value>tp.sdc().L()</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>(608, 296)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>drm_scrambler_bb_0_1</value> </param> <param> <key>maxoutbuf</key> <value>0</value> </param> <param> <key>minoutbuf</key> <value>0</value> </param> </block> <block> <key>fft_vxx</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>fft_size</key> <value>tp.ofdm().nfft()</value> </param> <param> <key>forward</key> <value>False</value> </param> <param> <key>_coordinate</key> <value>(232, 440)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>fft_vxx_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>nthreads</key> <value>1</value> </param> <param> <key>shift</key> <value>True</value> </param> <param> <key>window</key> <value></value> </param> </block> <block> <key>mlc_bc</key> <param> <key>alias</key> <value></value> </param> <param> <key>channel_type</key> <value>"FAC"</value> </param> <param> <key>comment</key> <value>Apply channel coding and interleaving</value> </param> <param> <key>affinity</key> <value></value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> <key>_coordinate</key> <value>(744, 340)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>mlc_bc_0</value> </param> <param> <key>maxoutbuf</key> <value>0</value> </param> <param> <key>minoutbuf</key> <value>0</value> </param> <param> <key>tp</key> <value>tp</value> </param> </block> <block> <key>mlc_bc</key> <param> <key>alias</key> <value></value> </param> <param> <key>channel_type</key> <value>"MSC"</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>(744, 236)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>mlc_bc_0_0</value> </param> <param> <key>maxoutbuf</key> <value>0</value> </param> <param> <key>minoutbuf</key> <value>0</value> </param> <param> <key>tp</key> <value>tp</value> </param> </block> <block> <key>mlc_bc</key> <param> <key>alias</key> <value></value> </param> <param> <key>channel_type</key> <value>"SDC"</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>(744, 292)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>mlc_bc_0_1</value> </param> <param> <key>maxoutbuf</key> <value>0</value> </param> <param> <key>minoutbuf</key> <value>0</value> </param> <param> <key>tp</key> <value>tp</value> </param> </block> <block> <key>rational_resampler_xxx</key> <param> <key>alias</key> <value></value> </param> <param> <key>comment</key> <value>Ingoing sample rate is assumed to be 48 kHz. 250 kHz is one of the lowest achievable rates of the USRP.</value> </param> <param> <key>affinity</key> <value></value> </param> <param> <key>decim</key> <value>drm.FS_SOUNDCARD / 1000</value> </param> <param> <key>_enabled</key> <value>0</value> </param> <param> <key>fbw</key> <value>0</value> </param> <param> <key>_coordinate</key> <value>(864, 448)</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>250</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>441</value> </param> <param> <key>_enabled</key> <value>0</value> </param> <param> <key>fbw</key> <value>0</value> </param> <param> <key>_coordinate</key> <value>(248, 136)</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>240</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>fff</value> </param> </block> <block> <key>virtual_source</key> <param> <key>comment</key> <value></value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> <key>_coordinate</key> <value>(56, 468)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>sym_in</value> </param> <param> <key>stream_id</key> <value>symbols</value> </param> </block> <block> <key>virtual_sink</key> <param> <key>comment</key> <value></value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> <key>_coordinate</key> <value>(1408, 292)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>sym_out</value> </param> <param> <key>stream_id</key> <value>symbols</value> </param> </block> <block> <key>uhd_usrp_sink</key> <param> <key>alias</key> <value></value> </param> <param> <key>ant0</key> <value>TXA</value> </param> <param> <key>bw0</key> <value>0</value> </param> <param> <key>center_freq0</key> <value>5e6</value> </param> <param> <key>norm_gain0</key> <value>False</value> </param> <param> <key>gain0</key> <value>0</value> </param> <param> <key>ant10</key> <value></value> </param> <param> <key>bw10</key> <value>0</value> </param> <param> <key>center_freq10</key> <value>0</value> </param> <param> <key>norm_gain10</key> <value>False</value> </param> <param> <key>gain10</key> <value>0</value> </param> <param> <key>ant11</key> <value></value> </param> <param> <key>bw11</key> <value>0</value> </param> <param> <key>center_freq11</key> <value>0</value> </param> <param> <key>norm_gain11</key> <value>False</value> </param> <param> <key>gain11</key> <value>0</value> </param> <param> <key>ant12</key> <value></value> </param> <param> <key>bw12</key> <value>0</value> </param> <param> <key>center_freq12</key> <value>0</value> </param> <param> <key>norm_gain12</key> <value>False</value> </param> <param> <key>gain12</key> <value>0</value> </param> <param> <key>ant13</key> <value></value> </param> <param> <key>bw13</key> <value>0</value> </param> <param> <key>center_freq13</key> <value>0</value> </param> <param> <key>norm_gain13</key> <value>False</value> </param> <param> <key>gain13</key> <value>0</value> </param> <param> <key>ant14</key> <value></value> </param> <param> <key>bw14</key> <value>0</value> </param> <param> <key>center_freq14</key> <value>0</value> </param> <param> <key>norm_gain14</key> <value>False</value> </param> <param> <key>gain14</key> <value>0</value> </param> <param> <key>ant15</key> <value></value> </param> <param> <key>bw15</key> <value>0</value> </param> <param> <key>center_freq15</key> <value>0</value> </param> <param> <key>norm_gain15</key> <value>False</value> </param> <param> <key>gain15</key> <value>0</value> </param> <param> <key>ant16</key> <value></value> </param> <param> <key>bw16</key> <value>0</value> </param> <param> <key>center_freq16</key> <value>0</value> </param> <param> <key>norm_gain16</key> <value>False</value> </param> <param> <key>gain16</key> <value>0</value> </param> <param> <key>ant17</key> <value></value> </param> <param> <key>bw17</key> <value>0</value> </param> <param> <key>center_freq17</key> <value>0</value> </param> <param> <key>norm_gain17</key> <value>False</value> </param> <param> <key>gain17</key> <value>0</value> </param> <param> <key>ant18</key> <value></value> </param> <param> <key>bw18</key> <value>0</value> </param> <param> <key>center_freq18</key> <value>0</value> </param> <param> <key>norm_gain18</key> <value>False</value> </param> <param> <key>gain18</key> <value>0</value> </param> <param> <key>ant19</key> <value></value> </param> <param> <key>bw19</key> <value>0</value> </param> <param> <key>center_freq19</key> <value>0</value> </param> <param> <key>norm_gain19</key> <value>False</value> </param> <param> <key>gain19</key> <value>0</value> </param> <param> <key>ant1</key> <value></value> </param> <param> <key>bw1</key> <value>0</value> </param> <param> <key>center_freq1</key> <value>0</value> </param> <param> <key>norm_gain1</key> <value>False</value> </param> <param> <key>gain1</key> <value>0</value> </param> <param> <key>ant20</key> <value></value> </param> <param> <key>bw20</key> <value>0</value> </param> <param> <key>center_freq20</key> <value>0</value> </param> <param> <key>norm_gain20</key> <value>False</value> </param> <param> <key>gain20</key> <value>0</value> </param> <param> <key>ant21</key> <value></value> </param> <param> <key>bw21</key> <value>0</value> </param> <param> <key>center_freq21</key> <value>0</value> </param> <param> <key>norm_gain21</key> <value>False</value> </param> <param> <key>gain21</key> <value>0</value> </param> <param> <key>ant22</key> <value></value> </param> <param> <key>bw22</key> <value>0</value> </param> <param> <key>center_freq22</key> <value>0</value> </param> <param> <key>norm_gain22</key> <value>False</value> </param> <param> <key>gain22</key> <value>0</value> </param> <param> <key>ant23</key> <value></value> </param> <param> <key>bw23</key> <value>0</value> </param> <param> <key>center_freq23</key> <value>0</value> </param> <param> <key>norm_gain23</key> <value>False</value> </param> <param> <key>gain23</key> <value>0</value> </param> <param> <key>ant24</key> <value></value> </param> <param> <key>bw24</key> <value>0</value> </param> <param> <key>center_freq24</key> <value>0</value> </param> <param> <key>norm_gain24</key> <value>False</value> </param> <param> <key>gain24</key> <value>0</value> </param> <param> <key>ant25</key> <value></value> </param> <param> <key>bw25</key> <value>0</value> </param> <param> <key>center_freq25</key> <value>0</value> </param> <param> <key>norm_gain25</key> <value>False</value> </param> <param> <key>gain25</key> <value>0</value> </param> <param> <key>ant26</key> <value></value> </param> <param> <key>bw26</key> <value>0</value> </param> <param> <key>center_freq26</key> <value>0</value> </param> <param> <key>norm_gain26</key> <value>False</value> </param> <param> <key>gain26</key> <value>0</value> </param> <param> <key>ant27</key> <value></value> </param> <param> <key>bw27</key> <value>0</value> </param> <param> <key>center_freq27</key> <value>0</value> </param> <param> <key>norm_gain27</key> <value>False</value> </param> <param> <key>gain27</key> <value>0</value> </param> <param> <key>ant28</key> <value></value> </param> <param> <key>bw28</key> <value>0</value> </param> <param> <key>center_freq28</key> <value>0</value> </param> <param> <key>norm_gain28</key> <value>False</value> </param> <param> <key>gain28</key> <value>0</value> </param> <param> <key>ant29</key> <value></value> </param> <param> <key>bw29</key> <value>0</value> </param> <param> <key>center_freq29</key> <value>0</value> </param> <param> <key>norm_gain29</key> <value>False</value> </param> <param> <key>gain29</key> <value>0</value> </param> <param> <key>ant2</key> <value></value> </param> <param> <key>bw2</key> <value>0</value> </param> <param> <key>center_freq2</key> <value>0</value> </param> <param> <key>norm_gain2</key> <value>False</value> </param> <param> <key>gain2</key> <value>0</value> </param> <param> <key>ant30</key> <value></value> </param> <param> <key>bw30</key> <value>0</value> </param> <param> <key>center_freq30</key> <value>0</value> </param> <param> <key>norm_gain30</key> <value>False</value> </param> <param> <key>gain30</key> <value>0</value> </param> <param> <key>ant31</key> <value></value> </param> <param> <key>bw31</key> <value>0</value> </param> <param> <key>center_freq31</key> <value>0</value> </param> <param> <key>norm_gain31</key> <value>False</value> </param> <param> <key>gain31</key> <value>0</value> </param> <param> <key>ant3</key> <value></value> </param> <param> <key>bw3</key> <value>0</value> </param> <param> <key>center_freq3</key> <value>0</value> </param> <param> <key>norm_gain3</key> <value>False</value> </param> <param> <key>gain3</key> <value>0</value> </param> <param> <key>ant4</key> <value></value> </param> <param> <key>bw4</key> <value>0</value> </param> <param> <key>center_freq4</key> <value>0</value> </param> <param> <key>norm_gain4</key> <value>False</value> </param> <param> <key>gain4</key> <value>0</value> </param> <param> <key>ant5</key> <value></value> </param> <param> <key>bw5</key> <value>0</value> </param> <param> <key>center_freq5</key> <value>0</value> </param> <param> <key>norm_gain5</key> <value>False</value> </param> <param> <key>gain5</key> <value>0</value> </param> <param> <key>ant6</key> <value></value> </param> <param> <key>bw6</key> <value>0</value> </param> <param> <key>center_freq6</key> <value>0</value> </param> <param> <key>norm_gain6</key> <value>False</value> </param> <param> <key>gain6</key> <value>0</value> </param> <param> <key>ant7</key> <value></value> </param> <param> <key>bw7</key> <value>0</value> </param> <param> <key>center_freq7</key> <value>0</value> </param> <param> <key>norm_gain7</key> <value>False</value> </param> <param> <key>gain7</key> <value>0</value> </param> <param> <key>ant8</key> <value></value> </param> <param> <key>bw8</key> <value>0</value> </param> <param> <key>center_freq8</key> <value>0</value> </param> <param> <key>norm_gain8</key> <value>False</value> </param> <param> <key>gain8</key> <value>0</value> </param> <param> <key>ant9</key> <value></value> </param> <param> <key>bw9</key> <value>0</value> </param> <param> <key>center_freq9</key> <value>0</value> </param> <param> <key>norm_gain9</key> <value>False</value> </param> <param> <key>gain9</key> <value>0</value> </param> <param> <key>clock_rate</key> <value>0.0</value> </param> <param> <key>comment</key> <value></value> </param> <param> <key>affinity</key> <value></value> </param> <param> <key>dev_addr</key> <value></value> </param> <param> <key>dev_args</key> <value>""</value> </param> <param> <key>_enabled</key> <value>0</value> </param> <param> <key>_coordinate</key> <value>(1168, 424)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>uhd_usrp_sink_0</value> </param> <param> <key>type</key> <value>fc32</value> </param> <param> <key>clock_source0</key> <value></value> </param> <param> <key>sd_spec0</key> <value></value> </param> <param> <key>time_source0</key> <value></value> </param> <param> <key>clock_source1</key> <value></value> </param> <param> <key>sd_spec1</key> <value></value> </param> <param> <key>time_source1</key> <value></value> </param> <param> <key>clock_source2</key> <value></value> </param> <param> <key>sd_spec2</key> <value></value> </param> <param> <key>time_source2</key> <value></value> </param> <param> <key>clock_source3</key> <value></value> </param> <param> <key>sd_spec3</key> <value></value> </param> <param> <key>time_source3</key> <value></value> </param> <param> <key>clock_source4</key> <value></value> </param> <param> <key>sd_spec4</key> <value></value> </param> <param> <key>time_source4</key> <value></value> </param> <param> <key>clock_source5</key> <value></value> </param> <param> <key>sd_spec5</key> <value></value> </param> <param> <key>time_source5</key> <value></value> </param> <param> <key>clock_source6</key> <value></value> </param> <param> <key>sd_spec6</key> <value></value> </param> <param> <key>time_source6</key> <value></value> </param> <param> <key>clock_source7</key> <value></value> </param> <param> <key>sd_spec7</key> <value></value> </param> <param> <key>time_source7</key> <value></value> </param> <param> <key>nchan</key> <value>1</value> </param> <param> <key>num_mboards</key> <value>1</value> </param> <param> <key>samp_rate</key> <value>48000 * 250 / 48</value> </param> <param> <key>hide_cmd_port</key> <value>False</value> </param> <param> <key>hide_lo_controls</key> <value>True</value> </param> <param> <key>stream_args</key> <value></value> </param> <param> <key>stream_chans</key> <value>[]</value> </param> <param> <key>sync</key> <value></value> </param> <param> <key>len_tag_name</key> <value></value> </param> <param> <key>otw</key> <value></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>1</sink_key> </connection> <connection> <source_block_id>audio_source_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>blocks_complex_to_real_0</source_block_id> <sink_block_id>audio_sink_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>blocks_wavfile_sink_0</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> <source_block_id>blocks_multiply_const_vxx_0</source_block_id> <sink_block_id>drm_audio_encoder_sb_0</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> <source_block_id>blocks_multiply_const_vxx_1</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>blocks_multiply_const_vxx_1</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>blocks_multiply_xx_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>blocks_wavfile_source_0</source_block_id> <sink_block_id>blocks_multiply_const_vxx_0</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> <source_block_id>cell_mapping_cc_0</source_block_id> <sink_block_id>sym_out</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> <source_block_id>digital_ofdm_cyclic_prefixer_1</source_block_id> <sink_block_id>blocks_multiply_const_vxx_1</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> <source_block_id>drm_audio_encoder_sb_0</source_block_id> <sink_block_id>drm_scrambler_bb_0</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> <source_block_id>drm_generate_fac_b_0</source_block_id> <sink_block_id>drm_scrambler_bb_0_0</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> <source_block_id>drm_generate_sdc_b_0</source_block_id> <sink_block_id>drm_scrambler_bb_0_1</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> <source_block_id>drm_interleaver_cc_0</source_block_id> <sink_block_id>cell_mapping_cc_0</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> <source_block_id>drm_scrambler_bb_0</source_block_id> <sink_block_id>mlc_bc_0_0</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> <source_block_id>drm_scrambler_bb_0_0</source_block_id> <sink_block_id>mlc_bc_0</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> <source_block_id>drm_scrambler_bb_0_1</source_block_id> <sink_block_id>mlc_bc_0_1</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> <source_block_id>fft_vxx_0</source_block_id> <sink_block_id>digital_ofdm_cyclic_prefixer_1</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> <source_block_id>mlc_bc_0</source_block_id> <sink_block_id>cell_mapping_cc_0</sink_block_id> <source_key>0</source_key> <sink_key>2</sink_key> </connection> <connection> <source_block_id>mlc_bc_0_0</source_block_id> <sink_block_id>drm_interleaver_cc_0</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> <source_block_id>mlc_bc_0_1</source_block_id> <sink_block_id>cell_mapping_cc_0</sink_block_id> <source_key>0</source_key> <sink_key>1</sink_key> </connection> <connection> <source_block_id>rational_resampler_xxx_0</source_block_id> <sink_block_id>uhd_usrp_sink_0</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> <source_block_id>rational_resampler_xxx_0_0</source_block_id> <sink_block_id>drm_audio_encoder_sb_0</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> <source_block_id>sym_in</source_block_id> <sink_block_id>fft_vxx_0</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> </flow_graph>
Sayangnya, USRP tidak mengirim ke HF, tapi saya tidak punya HackRF. Jadi tidak mungkin membuat tes siaran nyata, namun saya dapat mengonfirmasi bahwa penguraian suara melalui Mimpi terjadi tanpa kesalahan.
Kesimpulan
Anehnya, meskipun tampaknya 99% putus asa, standar DRM masih hidup. Namun, kecil kemungkinannya bahwa ia akan berhasil dan melampaui eksperimen lokal - kualitas suara dalam DRM tidak lagi memenuhi standar modern, dan tidak ada receiver di pasaran. Dari sudut pandang teknis, apa yang tampak seperti "terobosan" pada tahun 2003 sekarang kurang relevan.
Namun di sisi lain, standar DRM berisi banyak ide menarik, penerimaannya (dan) adalah pengalaman yang cukup menarik bagi para amatir radio, siapa saja yang dapat bergabung dengannya ketika stasiun drm ada di saluran udara.
Tentang ini, serangkaian artikel tentang SDR selesai, saya harap seseorang tertarik dan bermanfaat.
Semua percobaan berhasil.