Хабрахабр

Software Defined Radio — как это работает? Часть 10

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

Этот стандарт также являлся первой (и насколько известно, единственной) попыткой передачи цифрового звука на коротких волнах. В «юбилейной» части цикла про 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КБит/с.

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

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

Прием DRM

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

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

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

Если говорить о «железных» приемниках, то анонсировался, например, приемник Gospell GR-216, но «вживую» его нет ни на eBay, ни на Amazon.

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

Передача DRM

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

Также может передаваться не только звук (как моно, так и стерео), но и текст, логотип канала и другая служебная информация. Технически, DRM использует QAM-модуляцию, и имеет довольно много настроек битрейта и занимаемой полосы. 5 до 20КГц, впрочем, на практике, встречались только 10КГц сигналы. Для КВ (режимы A-D) занимаемая полоса может варьироваться от 4. Для УКВ (режим 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 все запускается нормально.

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

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> -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-станции есть в эфире, может любой желающий.

Всем удачных экспериментов.

Теги
Показать больше

Похожие статьи

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть