Привет, Хабр.

В «юбилейной» части цикла про SDR хочется рассказать об одном из протоколов, благодаря которому многие радиолюбители «невольно» приобщились к миру цифровых широкополосных сигналов. Этот стандарт также являлся первой (и насколько известно, единственной) попыткой передачи цифрового звука на коротких волнах.



Как многие наверное уже догадались, речь пойдет о стандарте DRM — Digital Radio Mondiale (не путать с другим DRM, Digital Rights Management).

Ну и т.к. мы будем говорить об SDR, то посмотрим не только как принимать DRM, но и как его передавать. Продолжение под катом.

История


История стандарта DRM весьма непроста. Впервые он был представлен в 2003м году, а тестовые передачи производились с 2007г, и с переменным успехом продолжаются периодически и до сих пор.

В основу DRM было заложено две основные идеи.

  • Передача звука на коротких волнах с «цифровым качеством», без шумов и замираний, с битрейтом от 6 до 34КБит/с. Впрочем, «цифровое качество» тут можно написать лишь в кавычках, т.к. при битрейте в 12КБит звук получается весьма от... относительно низкого качества. К тому же, сигнал на КВ действительно подвержен и помехам, и замираниям, и чтобы «цифра» могла декодироваться, нужно весьма высокое соотношение сигнал/шум — такое, при котором обычный аналоговый сигнал будет звучать даже лучше. В общем, достаточно хоть раз попробовать в реале принять DRM, чтобы понять что идея «не взлетит». Но вещание все же периодически проводилось, в том числе и из России (см. КДПВ), а некоторые радиостанции иногда транслируют в DRM до сих пор.
  • Передача звука в FM-диапазоне. Этот стандарт был назван DRM+. Здесь идея была в экономии частотного ресурса — благодаря цифровому сжатию, в полосе 100КГц можно передать сразу до 4х аудиопередач, что сулило неплохие плюсы в крупных городах типа Лондона, где свободных частот уже нет. С другой стороны, в Европе уже работал DAB, и еще один стандарт тут просто был не нужен. Если верить Википедии, тестовое вещание DRM+ осуществлялось в Шотландии в 2010м году, о каких-то реальных случая вещания DRM+ пока слышать не доводилось.

Стандарт DRM по сути является несколько сюрреалистичным — годами работают радиостанции, транслируются радиопередачи… А приемников этого стандарта в продаже нет. Вообще. Никаких. Понятное дело, что раз стандарт цифровой, то обычным приемником можно услышать лишь шипение, да и декодировать QAM на слух пока еще никто не научился. Так что прием DRM являлся развлечением лишь для радиолюбителей. Вроде бы 1-2 приемника таки существовали, о чем есть даже пара видео в youtube (1 и 2), но ни на Ebay, ни на Amazon ничего в продаже сейчас нет.

Вторая проблема приема DRM состоит в том, что в городах КВ вещание де-факто мертво — помех от бытовой аппаратуры и блоков питания сейчас столько, что даже если включить КВ-радио, то будет слышен один треск и шум — декодирование в таких условиях работать не будет, в лучшем случае приемник сможет показать заставку станции, но без звука. Можно конечно поставить антенну на балкон или на крышу, тщательно ее настроить, и в принципе, принять и декодировать DRM из городской квартиры для радиолюбителей вполне реально. Обычные же люди этим 100% заморачиваться не будут, никто не полезет на крышу вешать антенну, чтобы принять аудиосигнал с битрейтом 12КБит/с.

В общем, приемников нет, аудитории нет. А вещание есть. Суслик из фильма отдыхает…

Кстати, прямо сейчас, на момент написания статьи (июль 2019) тестовое вещание DRM+ проводится в Петербурге, так что желающие побыть сусликом могут попробовать принять сигнал (только слушать его нечем, ни приемников, ни даже софтовых SDR-декодеров для DRM+ нет). Для приема можно воспользоваться RTL-SDR, и если повезет, то в FM-диапазоне можно будет увидеть цифровой сигнал шириной около 100КГц. Декодеров, впрочем, как уже говорилось, для него найти не удалось.

Прием DRM


Первые сообщения о приеме радиолюбителями DRM на сайте radioscanner датируются 2008 годом. Прием цифрового сигнала шириной 10КГц невозможен на обычный бытовой (и даже радиолюбительский) приемник, так что желающим тогда приходилось паять конвертор для вывода ПЧ приемника к звуковой карте. После появления SDR проблема решилась сама собой, там можно выбрать любую ширину полосы в пределах возможностей приемника (для первых SDR на базе звуковой карты это обычно было 48КГц, что более чем достаточно). Само декодирование осуществлялось с помощью весьма удобной и качественной программы Dream.

Как уже говорилось выше, DRM-станции работают довольно-таки регулярно, и найти их в эфире не так уж сложно. Например, на websdr такой сигнал очень легко различим на спектре — если в широковещательном диапазоне виден цифровой сигнал шириной 10КГц, то это он и есть. Пример скриншота станции, работающей на 15МГц, сделанного во время написания статьи:



Только декодировать его с помощью websdr не выйдет, ширина полосы у онлайн-приемника слишком мала. Впрочем послушать DRM может любой желающий, записанный с реального эфира файл можно скачать здесь. Для декодирования можно воспользоваться уже упомянутой программой Dream, рабочую версию со всеми необходимыми DLL можно взять на сайте radioscanner.

Если говорить о «железных» приемниках, то анонсировался, например, приемник Gospell GR-216, но «вживую» его нет ни на eBay, ни на Amazon.
Правка: как подсказали в комментариях, сейчас этот приемник продается на австралийском рынке под маркой Tecsun Q-3061. Цена вопроса составляет 500AUD, или около 350$.


Желающие принять станции DRM самостоятельно, могут посмотреть расписание на странице https://www.drm.org/what-can-i-hear/broadcast-schedule-2/.

Передача DRM


Теперь перейдем к не менее интересному — возможности передачи DRM-сигналов (и если не ошибаюсь, в рунете это описывается впервые). Сделать это можно с помощью GNU Radio и модуля gr-drm.



Технически, DRM использует QAM-модуляцию, и имеет довольно много настроек битрейта и занимаемой полосы. Также может передаваться не только звук (как моно, так и стерео), но и текст, логотип канала и другая служебная информация. Для КВ (режимы A-D) занимаемая полоса может варьироваться от 4.5 до 20КГц, впрочем, на практике, встречались только 10КГц сигналы. Для УКВ (режим E), как уже говорилось, используется полоса в 100КГц.

Таблица с www.drm.org/DRM_Handbook_2018.pdf:


Более подробное описание стандарта есть в PDF, кратко можно почитать на Signalwiki.

Вернемся к нашему графу соединений. Как можно видеть, DRM-кодер формирует сигнал из нескольких компонентов.

  • Fast Access Channel (FAC). Содержит информацию о свойствах ODFM-сигнала и конфигурации SDC/MSC. Информация о канале передается каждые 0.4с, что позволяет приемнику довольно быстро начать прием сигнала станции. Параметры сигнала можно настроить в блоке DRM Configuration.
  • Service Description Channel (SDC). Содержит описание канала передачи MSC.
  • Main Service Channel (MSC). Содержит фреймы данных, для передачи может использоваться QAM16 или QAM64.

Ну и самое интересное то, что всё это без проблем можно запустить на обычном ПК. Gr-drm включен в пакет PothosSDR для Windows, но там он увы, не работает — сигнал есть, но декодирование происходит с ошибками. Под Ubuntu все запускается нормально.

В качестве выходного устройства в GNU Radio можно использовать WAV-файл или полноценный SDR-трансивер, например HackRF. Для тех, кто захочет поэкспериментировать самостоятельно, GRC-файл под спойлером.

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>


Увы, USRP на КВ не передает, а HackRF у меня нет. Так что реальный эфирный тест сделать не удалось, впрочем могу подтвердить, что декодирование звука через Dream происходит без ошибок.

Заключение


Как ни странно, но несмотря на, казалось бы, 99% бесперспективность, стандарт DRM пока еще жив. Впрочем, вряд ли он будет успешным и уйдет дальше каких-либо локальных экспериментов — качество звука в DRM уже не отвечает современным нормам, да и приемников на рынке нет. С технической точки зрения, то, что казалось «прорывом» в 2003м, сейчас уже мало актуально.

Но с другой стороны, стандарт DRM содержит немало интересных идей, его прием был (и есть) достаточно интересный для радиолюбителей опыт, приобщиться к которому, пока еще drm-станции есть в эфире, может любой желающий.

На этом цикл статей про SDR закончен, надеюсь кому-то это было интересно и полезно.
Всем удачных экспериментов.

Комментарии (10)


  1. I-denis
    30.07.2019 08:54
    +1

    DRM наверное был бы эффективен для локального вещания на КВ, когда антена излучает в зенит. Дальних скачков мы не получим, зато будем иметь покрытие радиусом 200-300-400км по сути без мертвых зон. Без замирания и прочих прелестей характерных для дальнего распространения сигнала


    1. DmitrySpb79 Автор
      30.07.2019 10:08

      Да, как можно видеть из таблицы выше, поддержка NVIS в стандарте есть. Но битрейт 12-20КБит/с для нормального звука все равно мало.


      1. I-denis
        30.07.2019 11:51

        DRM broadcasting can be done using a choice of different bandwidths:
        4.5 kHz. Gives the ability for the broadcaster to do a simulcast and use the lower-sideband area of a 9 kHz raster channel for AM, with a 4.5 kHz DRM signal occupying the area traditionally taken by the upper-sideband.However the resulting bit rate and audio quality is not good.
        5 kHz. Gives the ability for the broadcaster to do a simulcast and use the lower-sideband area of a 10 kHz raster channel for AM, with a 5 kHz DRM signal occupying the area traditionally taken by the upper-sideband. However the resulting bit rate and audio quality is marginal (7.1–16.7 kbit/s for 5 kHz). This technique could be used on the shortwave bands throughout the world.
        9 kHz. Occupies half the standard bandwidth of a region 1 long wave or medium wave broadcast channel.
        10 kHz. Occupies half the standard bandwidth of a region 2 broadcast channel. could be used to simulcast with analogue audio channel restricted to NRSC5. Occupies a full worldwide short wave broadcast channel (giving 14.8–34.8 kbit/s)
        18 kHz. Occupies full bandwidth of region 1 long wave or medium wave channels according to the existing frequency plan. This offers better audio quality.
        20 kHz. Occupies full bandwidth of region 2 or region 3 AM channel according to the existing frequency plan. This offers highest audio quality of the DRM30 standard (giving 30.6–72 kbit/s).
        100 kHz for DRM+. This bandwidth can be used in band I, II, and III and DRM+ can transmit four different programs in this bandwidth or even one low definition digital video channel.


        1. DmitrySpb79 Автор
          30.07.2019 12:16

          Да, DRM-поток можно довольно гибко настраивать, но в реале больше 20КБит/с не встречал. Oн и при 20-то декодируется только при очень хорошем с/ш, 38 не попадалось ни разу.


  1. Alxzzz77
    30.07.2019 11:36

    Увы, USRP на КВ не передает

    Разве? А как же карты UBX, BasicTX, LFTX?


    1. DmitrySpb79 Автор
      30.07.2019 19:52

      > BasicTX, LFTX?
      Штука интересная, но у меня её нет.


  1. I-denis
    30.07.2019 11:57

    1. DmitrySpb79 Автор
      30.07.2019 12:12

      На Амазоне он со статусом Currently unavailable давным-давно висит.


    1. DmitrySpb79 Автор
      30.07.2019 19:38

      Со вторым кстати интересно, это тот же Gospell GR-216, который описан в тексте, но продаваемый под маркой Tecsun Q-3061 на австралийский рынок.

      The Tecsun Radios Australia Q-3061 DRM Shortwave Radio has been a long time coming and after evaluating dozens of samples over the years we have finally found a stand-alone desktop DRM radio that is suitable for Australian, New Zealand, and Pacific Islands listeners.

      Может что-то там у них и передается, интересно.


  1. Storm21110
    31.07.2019 23:11

    www.rtl-sdr.com/big-list-rtl-sdr-supported-software огромный список ПО для SDR.
    Сам не проверял, но в 2х программах заявлена поддержка DRM+: Wavesink Plus
    и Sodira.

    Спасибо за отличный цикл статей.