Hallo Habr.
Im "Jubiläum" -Teil der Serie über SDR möchte ich über eines der Protokolle sprechen, dank derer viele Schinken "unabsichtlich" in die Welt der digitalen Breitbandsignale eingetreten sind. Dieser Standard war auch der erste (und unseres Wissens einzige) Versuch, digitalen Schall mit kurzen Wellenlängen zu übertragen.

Wie viele wahrscheinlich bereits vermutet haben, werden wir über den DRM-Standard -
Digital Radio Mondiale (nicht zu verwechseln mit anderen DRM, Digital Rights Management) sprechen.
Nun, weil Wenn wir über SDR sprechen, werden wir nicht nur sehen, wie DRM empfangen, sondern auch gesendet wird. Fortsetzung unter dem Schnitt.
Die Geschichte
Die Geschichte des DRM-Standards ist nicht einfach. Es wurde erstmals im Jahr 2003 eingeführt, und seit 2007 werden Testübertragungen durchgeführt, die mit unterschiedlichem Erfolg regelmäßig und immer noch fortgesetzt werden.
DRM basierte auf zwei Hauptideen.
- Schallübertragung bei kurzen Wellenlängen mit „digitaler Qualität“ ohne Rauschen und Fading mit einer Bitrate von 6 bis 34 Kbit / s. "Digitale Qualität" kann hier jedoch nur in Anführungszeichen geschrieben werden, weil Bei einer Bitrate von 12 Kbit kommt der Sound
von einer relativ geringen Qualität. Darüber hinaus ist das HF-Signal sowohl Rauschen als auch Fading ausgesetzt. Damit die „Ziffer“ dekodiert werden kann, ist ein sehr hohes Signal-Rausch-Verhältnis erforderlich, sodass das normale analoge Signal noch besser klingt. Im Allgemeinen reicht es aus, mindestens einmal im wirklichen Leben zu versuchen, DRM zu akzeptieren, um zu verstehen, dass sich die Idee nicht durchsetzen wird. Trotzdem wurde regelmäßig ausgestrahlt, auch aus Russland (siehe KDPV), und einige Radiosender sendeten manchmal noch in DRM. - Tonübertragung im FM-Band. Dieser Standard wurde DRM + genannt. Hier ging es darum, die Frequenzressource zu schonen - dank digitaler Komprimierung können bis zu 4 Audioübertragungen sofort im 100-kHz-Band übertragen werden, was in Großstädten wie London, wo es keine freien Frequenzen mehr gibt, gute Vorteile versprach. Auf der anderen Seite hat DAB bereits in Europa gearbeitet, und ein anderer Standard wurde hier einfach nicht benötigt. Laut Wikipedia wurde die Testsendung von DRM + im Jahr 2010 in Schottland durchgeführt. Bisher habe ich noch keine wirklichen Fälle von DRM + gehört.
Der DRM-Standard ist im Wesentlichen etwas surreal - seit Jahren arbeiten Radiosender, Sendungen werden gesendet ... Aber es gibt keine Empfänger dieses Standards zum Verkauf. Im Allgemeinen. Keine. Da der Standard digital ist, kann der übliche Empfänger nur Zischen hören, und noch hat niemand gelernt, wie man QAM nach Gehör dekodiert. Der Empfang von DRM war also nur Unterhaltung für Amateurfunk. Es scheint, dass 1-2 Empfänger existierten, über die es sogar ein paar Videos auf Youtube gibt (
1 und
2 ), aber bei Ebay oder Amazon gibt es derzeit nichts zum Verkauf.
Das zweite Problem beim Empfang von DRM besteht darin, dass in den Städten des HF-Rundfunks de facto keine Störungen auftreten - Haushaltsgeräte und Netzteile stören so stark, dass Sie selbst beim Einschalten des HF-Radios ein Knistern und Rauschen hören - die Dekodierung funktioniert unter solchen Bedingungen nicht Im besten Fall kann der Empfänger die Bildschirmschoner-Station anzeigen, jedoch ohne Ton. Sie können die Antenne natürlich auf den Balkon oder auf das Dach stellen, sorgfältig konfigurieren und im Prinzip ist es durchaus möglich, DRM von einer Stadtwohnung für Funkamateure zu empfangen und zu dekodieren. Normale Leute werden sich nicht zu 100% darum kümmern, niemand wird auf das Dach klettern, um eine Antenne aufzuhängen und ein Audiosignal mit einer Bitrate von 12 Kbit / s zu empfangen.
Im Allgemeinen gibt es keine Empfänger, kein Publikum. Aber es gibt eine Sendung. Der Gopher aus dem Film ruht sich aus ...
Übrigens wird derzeit zum Zeitpunkt des Schreibens (Juli 2019) in St. Petersburg eine DRM + -Testsendung durchgeführt, sodass diejenigen, die
ein Gopher sein möchten
, versuchen können, ein Signal zu empfangen (es gibt nichts zu hören, es gibt keine Empfänger oder sogar Software-SDR-Decoder für DRM +). Für den Empfang können Sie RTL-SDR verwenden. Wenn Sie Glück haben, sehen Sie im FM-Band ein digitales Signal mit einer Breite von ca. 100 kHz. Decoder konnten jedoch, wie bereits erwähnt, für ihn nicht gefunden werden.
DRM-Empfang
Die ersten Berichte über DRM-Schinken auf dem Radioscanner stammen aus dem Jahr 2008. Der Empfang eines digitalen Signals mit einer Breite von 10 kHz ist bei einem normalen Haushaltsempfänger (und sogar bei Amateurempfängern) nicht möglich. Daher mussten diejenigen, die den Konverter löten mussten, um den ZF-Empfänger an die Soundkarte auszugeben. Nach dem Erscheinen von SDR, dem von selbst gelösten Problem, können Sie eine beliebige Bandbreite innerhalb der Funktionen des Empfängers auswählen (für die ersten SDRs, die auf einer Soundkarte basieren, waren es normalerweise 48 kHz, was mehr als genug ist). Die Dekodierung selbst wurde mit einem sehr praktischen und hochwertigen
Dream- Programm durchgeführt.
Wie oben erwähnt, arbeiten DRM-Stationen ziemlich regelmäßig, und es ist nicht so schwierig, sie in der Luft zu finden. Zum Beispiel ist auf
websdr ein solches Signal im Spektrum sehr leicht zu unterscheiden - wenn ein digitales 10-kHz-Signal im Sendebereich sichtbar ist, dann ist es das. Beispiel-Screenshot einer Station mit 15 MHz zum Zeitpunkt des Schreibens:

Nur das Dekodieren mit websdr funktioniert nicht, die Bandbreite des Online-Empfängers ist zu klein. Jeder kann DRM hören, eine aus der Luft aufgenommene Datei kann hier heruntergeladen
werden . Zum Dekodieren können Sie das bereits erwähnte Dream-Programm verwenden. Eine funktionierende Version mit allen erforderlichen DLLs finden Sie
auf der Radioscanner-Website .
Wenn wir über die "Eisen" -Empfänger sprechen, wurde beispielsweise der Gospell GR-216-Empfänger angekündigt, der jedoch weder bei eBay noch bei Amazon live ist.
Bearbeiten: Wie in den Kommentaren vorgeschlagen, wird dieser Empfänger jetzt auf dem australischen Markt unter dem Markennamen Tecsun Q-3061 verkauft. Der Ausgabepreis beträgt 500 AUD oder etwa 350 USD.

Diejenigen, die DRM-Stationen selbst hosten möchten, können den Zeitplan unter
https://www.drm.org/what-can-i-hear/broadcast-schedule-2/ einsehen.
DRM-Übertragung
Nun wenden wir uns nicht weniger interessant zu - der Möglichkeit, DRM-Signale zu übertragen (und wenn ich mich nicht irre, wird dies zum ersten Mal in RuNet beschrieben). Dies kann mit GNU Radio und dem
gr-drm-Modul erfolgen .

Technisch gesehen verwendet DRM die QAM-Modulation und verfügt über einige Einstellungen für Bitrate und Bandbreite. Außerdem kann nicht nur Ton (sowohl Mono als auch Stereo) übertragen werden, sondern auch Text, Kanallogo und andere Serviceinformationen. Für HF (AD-Modi) kann das belegte Band von 4,5 bis 20 kHz variieren, in der Praxis wurden jedoch nur 10-kHz-Signale angetroffen. Für UKW (Modus E) wird, wie bereits erwähnt, ein 100-kHz-Band verwendet.
Tabelle von
www.drm.org/DRM_Handbook_2018.pdf :

Eine detailliertere Beschreibung des Standards finden Sie
im PDF- Format . Sie können es kurz auf
Signalwiki lesen.
Kehren wir zu unserem Verbindungsdiagramm zurück. Wie Sie sehen können, erzeugt der DRM-Encoder ein Signal von mehreren Komponenten.
- Fast Access Channel (FAC). Enthält Informationen zu den ODFM-Signaleigenschaften und zur SDC / MSC-Konfiguration. Kanalinformationen werden alle 0,4 s übertragen, wodurch der Empfänger schnell mit dem Empfang eines Stationssignals beginnen kann. Signalparameter können im DRM-Konfigurationsblock konfiguriert werden.
- Service Description Channel (SDC). Beschreibt den MSC-Übertragungskanal.
- Hauptdienstkanal (MSC). Enthält Datenrahmen, QAM16 oder QAM64 können zur Übertragung verwendet werden.
Das Interessanteste ist, dass all dies problemlos auf einem normalen PC ausgeführt werden kann. Gr-drm ist im PothosSDR-Paket für Windows enthalten, funktioniert dort jedoch leider nicht - es gibt ein Signal, aber die Dekodierung erfolgt mit Fehlern. Unter Ubuntu läuft alles gut.
Sie können eine WAV-Datei oder einen vollständigen SDR-Transceiver wie HackRF als Ausgabegerät in GNU Radio verwenden. Für diejenigen, die alleine experimentieren möchten, befindet sich die GRC-Datei unter dem 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>
Leider sendet USRP nicht an HF, aber ich habe kein HackRF. Es war also nicht möglich, einen echten Broadcast-Test durchzuführen. Ich kann jedoch bestätigen, dass die Sounddecodierung über Dream fehlerfrei erfolgt.
Fazit
Seltsamerweise lebt der DRM-Standard trotz der scheinbar 99% igen Hoffnungslosigkeit immer noch. Es ist jedoch unwahrscheinlich, dass er erfolgreich sein und über lokale Experimente hinausgehen wird - die Klangqualität in DRM entspricht nicht den modernen Standards und es gibt keine Empfänger auf dem Markt. Aus technischer Sicht ist das, was 2003 als „Durchbruch“ erschien, heute von geringer Relevanz.
Andererseits enthält der DRM-Standard viele interessante Ideen, sein Empfang war (und ist) eine ziemlich interessante Erfahrung für Funkamateure, jeder, der daran teilnehmen kann, während die DRM-Station auf Sendung ist.
Damit ist die Artikelserie über SDR beendet, ich hoffe jemand war interessiert und nützlich.
Alle erfolgreichen Experimente.