Oi Habr.
Na parte "aniversário" da série sobre SDR, quero falar sobre um dos protocolos, graças ao qual muitos presuntos "involuntariamente" se juntaram ao mundo dos sinais digitais de banda larga. Esse padrão também foi a primeira (e até onde sabemos, a única) tentativa de transmitir som digital em comprimentos de onda curtos.

Como muitos provavelmente já adivinharam, falaremos sobre o padrão DRM -
Digital Radio Mondiale (não confunda com outro DRM, Gerenciamento de Direitos Digitais).
Bem, porque Se estamos falando sobre SDR, veremos não apenas como receber DRM, mas também como transmiti-lo. Continua sob o corte.
A história
A história do padrão DRM não é fácil. Foi introduzido pela primeira vez em 2003 e as transmissões de teste foram feitas desde 2007, e com sucesso variável continuam periodicamente e paradas.
O DRM foi baseado em duas idéias principais.
- Transmissão de som em comprimentos de onda curtos com "qualidade digital", sem ruído e desbotamento, com uma taxa de bits de 6 a 34Kbit / s. No entanto, a "qualidade digital" aqui pode ser escrita apenas entre aspas, porque com taxa de bits de 12Kbit, o som vem
de uma qualidade relativamente baixa. Além disso, o sinal HF está realmente sujeito a ruídos e desbotamento e, para que o “dígito” seja decodificado, é necessária uma relação sinal / ruído muito alta - de modo que o sinal analógico comum soe ainda melhor. Em geral, basta tentar pelo menos uma vez na vida real aceitar o DRM para entender que a ideia não decola. Porém, a transmissão foi realizada periodicamente, inclusive da Rússia (veja KDPV), e algumas estações de rádio às vezes ainda transmitem em DRM. - Transmissão de som na banda FM. Esse padrão foi chamado de DRM +. Aqui a idéia era economizar o recurso de frequência - graças à compressão digital, até 4 transmissões de áudio podem ser transmitidas imediatamente na faixa de 100KHz, o que prometeu boas vantagens em grandes cidades como Londres, onde não há mais frequências livres. Por outro lado, o DAB já trabalhava na Europa, e outro padrão simplesmente não era necessário aqui. Segundo a Wikipedia, a transmissão de teste do DRM + foi realizada na Escócia no ano de 2010, até agora não ouvi nenhum caso real de transmissão do DRM +.
O padrão DRM é essencialmente um tanto surreal - há anos as estações de rádio operam, as transmissões estão sendo transmitidas ... Mas não há receptores desse padrão à venda. Geralmente. Nenhuma. É claro que, como o padrão é digital, o receptor comum apenas pode ouvir assobios e ninguém ainda aprendeu a decodificar o QAM de ouvido. Portanto, a recepção do DRM era apenas entretenimento para rádio amador. Parece que existem 1 ou 2 receptores, sobre os quais existem alguns vídeos no youtube (
1 e
2 ), mas não há nada à venda agora no Ebay ou na Amazon.
O segundo problema de receber DRM é que, nas cidades de HF, a transmissão é de fato morta - há tanta interferência de eletrodomésticos e fontes de alimentação que, mesmo se você ligar o rádio HF, você ouvirá um estalo e ruído - a decodificação nessas condições não funciona. no melhor dos casos, o receptor poderá mostrar a proteção de tela da estação, mas sem som. É claro que você pode colocar a antena na varanda ou no telhado, configurá-la com cuidado e, em princípio, é bem possível receber e decodificar DRM de um apartamento da cidade para radioamadores. As pessoas comuns não se incomodam com isso 100%, ninguém vai subir no telhado para pendurar uma antena para receber um sinal de áudio com uma taxa de bits de 12Kbit / s.
Em geral, não há receptores, nem audiência. Mas há uma transmissão. O esquilo do filme está descansando ...
A propósito, agora, no momento da redação deste artigo (julho de 2019), a transmissão de teste DRM + está sendo realizada em São Petersburgo, para que aqueles que desejam
ser um esquilo possam tentar receber um sinal (não há nada para ouvir, não há receptores ou mesmo decodificadores de software SDR para DRM +). Para recepção, você pode usar RTL-SDR e, se tiver sorte, na banda FM poderá ver um sinal digital com uma largura de cerca de 100KHz. Descodificadores, no entanto, como já mencionado, não foram encontrados para ele.
Recepção DRM
Os primeiros relatórios de presuntos DRM no radioscanner datam de 2008. A recepção de um sinal digital com uma largura de 10KHz não é possível em um receptor doméstico (e até amador), portanto, aqueles que desejavam soldar o conversor para enviar o receptor IF para a placa de som. Após o surgimento do SDR, o problema resolvido por si só, é possível escolher qualquer largura de banda dentro dos recursos do receptor (para os primeiros SDRs baseados em uma placa de som, geralmente era 48KHz, o que é mais do que suficiente). A decodificação foi realizada usando um programa
Dream muito conveniente e de alta qualidade.
Como mencionado acima, as estações DRM funcionam regularmente, e encontrá-las no ar não é tão difícil. Por exemplo, na
websdr, esse sinal é facilmente distinguível no espectro - se um sinal digital de 10KHz é visível na faixa de transmissão, então é isso. Exemplo de captura de tela de uma estação operando a 15 MHz, obtida no momento da escrita:

Apenas decodificá-lo usando websdr não funcionará, a largura de banda do receptor on-line é muito pequena. No entanto, qualquer pessoa pode ouvir DRM, um arquivo gravado do ar real pode ser baixado
aqui . Para decodificação, você pode usar o programa Dream já mencionado, uma versão funcional com todas as DLLs necessárias pode ser encontrada
no site do radioscanner .
Se falarmos sobre os receptores "de ferro", foi anunciado, por exemplo, o receptor Gospell GR-216, mas não está ativo no eBay ou na Amazon.
Edit: como solicitado nos comentários, agora este receptor é vendido no mercado australiano sob a marca Tecsun Q-3061. O preço de emissão é de 500 AUD, ou cerca de US $ 350.

Aqueles que desejam hospedar estações DRM podem ver a programação em
https://www.drm.org/what-can-i-hear/broadcast-schedule-2/ .
Transmissão DRM
Agora nos tornamos não menos interessantes - a possibilidade de transmitir sinais DRM (e se não me engano, isso é descrito no RuNet pela primeira vez). Isso pode ser feito usando o GNU Radio e o
módulo gr-drm .

Tecnicamente, o DRM usa modulação QAM e possui algumas configurações de taxa de bits e largura de banda. Além disso, não apenas o som (mono e estéreo) pode ser transmitido, mas também o texto, o logotipo do canal e outras informações de serviço. Para HF (modos AD), a banda ocupada pode variar de 4,5 a 20 KHz, no entanto, na prática, apenas sinais de 10 KHz foram encontrados. Para VHF (modo E), como já mencionado, uma banda de 100KHz é usada.
Tabela de
www.drm.org/DRM_Handbook_2018.pdf :

Uma descrição mais detalhada do padrão está
em PDF , você pode ler brevemente no
Signalwiki .
Vamos voltar ao nosso gráfico de conexão. Como você pode ver, o codificador DRM gera um sinal de vários componentes.
- Canal de acesso rápido (FAC). Contém informações sobre propriedades do sinal ODFM e configuração SDC / MSC. As informações do canal são transmitidas a cada 0,4s, o que permite que o receptor comece a receber rapidamente um sinal de estação. Os parâmetros de sinal podem ser configurados no bloco DRM Configuration.
- Canal de descrição do serviço (SDC). Descreve o canal de transmissão do MSC.
- Canal de serviço principal (MSC). Contém quadros de dados; QAM16 ou QAM64 pode ser usado para transmissão.
Bem, o mais interessante é que tudo isso pode ser executado sem problemas em um PC comum. O Gr-drm está incluído no pacote PothosSDR para Windows, mas, infelizmente, não funciona lá - há um sinal, mas a decodificação está errada. No Ubuntu, tudo começa bem.
Você pode usar um arquivo WAV ou um transceptor SDR completo, como o HackRF, como um dispositivo de saída no GNU Radio. Para aqueles que querem experimentar por conta própria, o arquivo GRC está sob o spoiler.
rdm_transmit.grc<?xml version='1.0' encoding='utf-8'?> <?grc format='1' created='3.7.11'?> <flow_graph> <timestamp>Tue Apr 29 11:37:08 2014</timestamp> <block> <key>options</key> <param> <key>author</key> <value>Felix Wunsch</value> </param> <param> <key>window_size</key> <value>3000, 2000</value> </param> <param> <key>category</key> <value>Custom</value> </param> <param> <key>comment</key> <value></value> </param> <param> <key>description</key> <value>Generic DRM Transmitter. For the MSC, only SM and EEP is implemented.</value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> <key>_coordinate</key> <value>(1016, 16)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>generate_options</key> <value>no_gui</value> </param> <param> <key>hier_block_src_path</key> <value>.:</value> </param> <param> <key>id</key> <value>drm_transmitter</value> </param> <param> <key>max_nouts</key> <value>0</value> </param> <param> <key>qt_qss_theme</key> <value></value> </param> <param> <key>realtime_scheduling</key> <value></value> </param> <param> <key>run_command</key> <value>{python} -u {filename}</value> </param> <param> <key>run_options</key> <value>run</value> </param> <param> <key>run</key> <value>True</value> </param> <param> <key>thread_safe_setters</key> <value></value> </param> <param> <key>title</key> <value>DRM Transmitter</value> </param> </block> <block> <key>variable</key> <param> <key>comment</key> <value></value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> <key>_coordinate</key> <value>(240, 60)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>file_dest</value> </param> <param> <key>value</key> <value>"D:\\MyProjects\\GNURadio\\gr-drm-master\\apps\\sound_drm_out.wav"</value> </param> </block> <block> <key>variable</key> <param> <key>comment</key> <value></value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> <key>_coordinate</key> <value>(56, 60)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>file_source</value> </param> <param> <key>value</key> <value>"D:\\MyProjects\\GNURadio\\gr-drm-master\\apps\\sound.wav"</value> </param> </block> <block> <key>variable_drm_config</key> <param> <key>audio_sample_rate</key> <value>12000</value> </param> <param> <key>comment</key> <value>Before generating the flow graph, define the path to a 24 kHz wav-file and change the parameters of the UHD sink. Do not forget to set the correct audio_sample_rate.</value> </param> <param> <key>_enabled</key> <value>1</value> </param> <param> <key>_coordinate</key> <value>(1208, 12)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>tp</value> </param> <param> <key>long_interl</key> <value>True</value> </param> <param> <key>msc_mapping</key> <value>2</value> </param> <param> <key>msc_prot_level_2_16</key> <value>1</value> </param> <param> <key>msc_prot_level_2_64</key> <value>0</value> </param> <param> <key>RM</key> <value>1</value> </param> <param> <key>sdc_mapping</key> <value>0</value> </param> <param> <key>SO</key> <value>3</value> </param> <param> <key>station_label</key> <value>"Radioscanner Test"</value> </param> <param> <key>text_message</key> <value>"DRM transmission with GNU Radio"</value> </param> </block> <block> <key>analog_sig_source_x</key> <param> <key>amp</key> <value>1</value> </param> <param> <key>alias</key> <value></value> </param> <param> <key>comment</key> <value></value> </param> <param> <key>affinity</key> <value></value> </param> <param> <key>_enabled</key> <value>1</value> </param> <param> <key>freq</key> <value>7000</value> </param> <param> <key>_coordinate</key> <value>(576, 624)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>analog_sig_source_x_0</value> </param> <param> <key>maxoutbuf</key> <value>0</value> </param> <param> <key>minoutbuf</key> <value>0</value> </param> <param> <key>offset</key> <value>0</value> </param> <param> <key>type</key> <value>complex</value> </param> <param> <key>samp_rate</key> <value>drm.FS_SOUNDCARD</value> </param> <param> <key>waveform</key> <value>analog.GR_COS_WAVE</value> </param> </block> <block> <key>audio_sink</key> <param> <key>alias</key> <value></value> </param> <param> <key>comment</key> <value></value> </param> <param> <key>affinity</key> <value></value> </param> <param> <key>device_name</key> <value></value> </param> <param> <key>_enabled</key> <value>0</value> </param> <param> <key>_coordinate</key> <value>(1184, 556)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>audio_sink_0</value> </param> <param> <key>num_inputs</key> <value>1</value> </param> <param> <key>ok_to_block</key> <value>True</value> </param> <param> <key>samp_rate</key> <value>48000</value> </param> </block> <block> <key>audio_source</key> <param> <key>alias</key> <value></value> </param> <param> <key>comment</key> <value></value> </param> <param> <key>affinity</key> <value></value> </param> <param> <key>device_name</key> <value></value> </param> <param> <key>_enabled</key> <value>0</value> </param> <param> <key>_coordinate</key> <value>(56, 156)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>audio_source_0</value> </param> <param> <key>maxoutbuf</key> <value>0</value> </param> <param> <key>minoutbuf</key> <value>0</value> </param> <param> <key>num_outputs</key> <value>1</value> </param> <param> <key>ok_to_block</key> <value>True</value> </param> <param> <key>samp_rate</key> <value>44100</value> </param> </block> <block> <key>blocks_complex_to_real</key> <param> <key>alias</key> <value></value> </param> <param> <key>comment</key> <value></value> </param> <param> <key>affinity</key> <value></value> </param> <param> <key>_enabled</key> <value>1</value> </param> <param> <key>_coordinate</key> <value>(1008, 640)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>blocks_complex_to_real_0</value> </param> <param> <key>maxoutbuf</key> <value>0</value> </param> <param> <key>minoutbuf</key> <value>0</value> </param> <param> <key>vlen</key> <value>1</value> </param> </block> <block> <key>blocks_multiply_const_vxx</key> <param> <key>alias</key> <value></value> </param> <param> <key>comment</key> <value></value> </param> <param> <key>const</key> <value>32768</value> </param> <param> <key>affinity</key> <value></value> </param> <param> <key>_enabled</key> <value>1</value> </param> <param> <key>_coordinate</key> <value>(272, 236)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>blocks_multiply_const_vxx_0</value> </param> <param> <key>type</key> <value>float</value> </param> <param> <key>maxoutbuf</key> <value>0</value> </param> <param> <key>minoutbuf</key> <value>0</value> </param> <param> <key>vlen</key> <value>1</value> </param> </block> <block> <key>blocks_multiply_const_vxx</key> <param> <key>alias</key> <value></value> </param> <param> <key>comment</key> <value>Prevent clipping</value> </param> <param> <key>const</key> <value>7e-3</value> </param> <param> <key>affinity</key> <value></value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> <key>_coordinate</key> <value>(688, 468)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>blocks_multiply_const_vxx_1</value> </param> <param> <key>type</key> <value>complex</value> </param> <param> <key>maxoutbuf</key> <value>0</value> </param> <param> <key>minoutbuf</key> <value>0</value> </param> <param> <key>vlen</key> <value>1</value> </param> </block> <block> <key>blocks_multiply_xx</key> <param> <key>alias</key> <value></value> </param> <param> <key>comment</key> <value></value> </param> <param> <key>affinity</key> <value></value> </param> <param> <key>_enabled</key> <value>1</value> </param> <param> <key>_coordinate</key> <value>(864, 624)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>blocks_multiply_xx_0</value> </param> <param> <key>type</key> <value>complex</value> </param> <param> <key>maxoutbuf</key> <value>0</value> </param> <param> <key>minoutbuf</key> <value>0</value> </param> <param> <key>num_inputs</key> <value>2</value> </param> <param> <key>vlen</key> <value>1</value> </param> </block> <block> <key>blocks_wavfile_sink</key> <param> <key>bits_per_sample</key> <value>16</value> </param> <param> <key>alias</key> <value></value> </param> <param> <key>comment</key> <value></value> </param> <param> <key>affinity</key> <value></value> </param> <param> <key>_enabled</key> <value>1</value> </param> <param> <key>file</key> <value>file_dest</value> </param> <param> <key>_coordinate</key> <value>(1200, 620)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>blocks_wavfile_sink_0</value> </param> <param> <key>nchan</key> <value>1</value> </param> <param> <key>samp_rate</key> <value>drm.FS_SOUNDCARD</value> </param> </block> <block> <key>blocks_wavfile_source</key> <param> <key>alias</key> <value></value> </param> <param> <key>comment</key> <value></value> </param> <param> <key>affinity</key> <value></value> </param> <param> <key>_enabled</key> <value>1</value> </param> <param> <key>file</key> <value>file_source</value> </param> <param> <key>_coordinate</key> <value>(56, 228)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>blocks_wavfile_source_0</value> </param> <param> <key>maxoutbuf</key> <value>0</value> </param> <param> <key>minoutbuf</key> <value>0</value> </param> <param> <key>nchan</key> <value>1</value> </param> <param> <key>repeat</key> <value>False</value> </param> </block> <block> <key>cell_mapping_cc</key> <param> <key>alias</key> <value></value> </param> <param> <key>comment</key> <value>Multiplex the three logical channels and the pilot cells and create transmission frames.</value> </param> <param> <key>affinity</key> <value></value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> <key>_coordinate</key> <value>(1184, 264)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>cell_mapping_cc_0</value> </param> <param> <key>maxoutbuf</key> <value>0</value> </param> <param> <key>minoutbuf</key> <value>0</value> </param> <param> <key>tp</key> <value>tp</value> </param> </block> <block> <key>digital_ofdm_cyclic_prefixer</key> <param> <key>alias</key> <value></value> </param> <param> <key>cp_len</key> <value>tp.ofdm().nfft()*tp.ofdm().cp_ratio_enum()/tp.ofdm().cp_ratio_denom()</value> </param> <param> <key>comment</key> <value></value> </param> <param> <key>affinity</key> <value></value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> <key>input_size</key> <value>tp.ofdm().nfft()</value> </param> <param> <key>_coordinate</key> <value>(456, 448)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>digital_ofdm_cyclic_prefixer_1</value> </param> <param> <key>tagname</key> <value></value> </param> <param> <key>maxoutbuf</key> <value>0</value> </param> <param> <key>minoutbuf</key> <value>0</value> </param> <param> <key>rolloff</key> <value>0</value> </param> </block> <block> <key>drm_audio_encoder_sb</key> <param> <key>alias</key> <value></value> </param> <param> <key>comment</key> <value></value> </param> <param> <key>affinity</key> <value></value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> <key>_coordinate</key> <value>(456, 240)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>drm_audio_encoder_sb_0</value> </param> <param> <key>maxoutbuf</key> <value>0</value> </param> <param> <key>minoutbuf</key> <value>0</value> </param> <param> <key>len_out</key> <value>tp.msc().L_MUX()</value> </param> <param> <key>tp</key> <value>tp</value> </param> </block> <block> <key>drm_generate_fac_b</key> <param> <key>alias</key> <value></value> </param> <param> <key>comment</key> <value></value> </param> <param> <key>affinity</key> <value></value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> <key>_coordinate</key> <value>(56, 344)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>drm_generate_fac_b_0</value> </param> <param> <key>maxoutbuf</key> <value>0</value> </param> <param> <key>minoutbuf</key> <value>0</value> </param> <param> <key>tp</key> <value>tp</value> </param> </block> <block> <key>drm_generate_sdc_b</key> <param> <key>alias</key> <value></value> </param> <param> <key>comment</key> <value></value> </param> <param> <key>affinity</key> <value></value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> <key>_coordinate</key> <value>(56, 296)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>drm_generate_sdc_b_0</value> </param> <param> <key>maxoutbuf</key> <value>0</value> </param> <param> <key>minoutbuf</key> <value>0</value> </param> <param> <key>tp</key> <value>tp</value> </param> </block> <block> <key>drm_interleaver_cc</key> <param> <key>alias</key> <value></value> </param> <param> <key>comment</key> <value>Additional interleaving</value> </param> <param> <key>affinity</key> <value></value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> <key>_coordinate</key> <value>(952, 240)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>drm_interleaver_cc_0</value> </param> <param> <key>depth</key> <value>drm.INTL_DEPTH_DRM</value> </param> <param> <key>interl_seq</key> <value>tp.msc().cell_interl_seq()</value> </param> <param> <key>long_interl</key> <value>tp.cfg().long_interl()</value> </param> <param> <key>maxoutbuf</key> <value>0</value> </param> <param> <key>minoutbuf</key> <value>0</value> </param> </block> <block> <key>drm_scrambler_bb</key> <param> <key>alias</key> <value></value> </param> <param> <key>block_len</key> <value>tp.msc().L_MUX()</value> </param> <param> <key>comment</key> <value></value> </param> <param> <key>affinity</key> <value></value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> <key>_coordinate</key> <value>(608, 240)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>drm_scrambler_bb_0</value> </param> <param> <key>maxoutbuf</key> <value>0</value> </param> <param> <key>minoutbuf</key> <value>0</value> </param> </block> <block> <key>drm_scrambler_bb</key> <param> <key>alias</key> <value></value> </param> <param> <key>block_len</key> <value>tp.fac().L()</value> </param> <param> <key>comment</key> <value></value> </param> <param> <key>affinity</key> <value></value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> <key>_coordinate</key> <value>(608, 344)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>drm_scrambler_bb_0_0</value> </param> <param> <key>maxoutbuf</key> <value>0</value> </param> <param> <key>minoutbuf</key> <value>0</value> </param> </block> <block> <key>drm_scrambler_bb</key> <param> <key>alias</key> <value></value> </param> <param> <key>block_len</key> <value>tp.sdc().L()</value> </param> <param> <key>comment</key> <value></value> </param> <param> <key>affinity</key> <value></value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> <key>_coordinate</key> <value>(608, 296)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>drm_scrambler_bb_0_1</value> </param> <param> <key>maxoutbuf</key> <value>0</value> </param> <param> <key>minoutbuf</key> <value>0</value> </param> </block> <block> <key>fft_vxx</key> <param> <key>alias</key> <value></value> </param> <param> <key>comment</key> <value></value> </param> <param> <key>affinity</key> <value></value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> <key>fft_size</key> <value>tp.ofdm().nfft()</value> </param> <param> <key>forward</key> <value>False</value> </param> <param> <key>_coordinate</key> <value>(232, 440)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>fft_vxx_0</value> </param> <param> <key>type</key> <value>complex</value> </param> <param> <key>maxoutbuf</key> <value>0</value> </param> <param> <key>minoutbuf</key> <value>0</value> </param> <param> <key>nthreads</key> <value>1</value> </param> <param> <key>shift</key> <value>True</value> </param> <param> <key>window</key> <value></value> </param> </block> <block> <key>mlc_bc</key> <param> <key>alias</key> <value></value> </param> <param> <key>channel_type</key> <value>"FAC"</value> </param> <param> <key>comment</key> <value>Apply channel coding and interleaving</value> </param> <param> <key>affinity</key> <value></value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> <key>_coordinate</key> <value>(744, 340)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>mlc_bc_0</value> </param> <param> <key>maxoutbuf</key> <value>0</value> </param> <param> <key>minoutbuf</key> <value>0</value> </param> <param> <key>tp</key> <value>tp</value> </param> </block> <block> <key>mlc_bc</key> <param> <key>alias</key> <value></value> </param> <param> <key>channel_type</key> <value>"MSC"</value> </param> <param> <key>comment</key> <value></value> </param> <param> <key>affinity</key> <value></value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> <key>_coordinate</key> <value>(744, 236)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>mlc_bc_0_0</value> </param> <param> <key>maxoutbuf</key> <value>0</value> </param> <param> <key>minoutbuf</key> <value>0</value> </param> <param> <key>tp</key> <value>tp</value> </param> </block> <block> <key>mlc_bc</key> <param> <key>alias</key> <value></value> </param> <param> <key>channel_type</key> <value>"SDC"</value> </param> <param> <key>comment</key> <value></value> </param> <param> <key>affinity</key> <value></value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> <key>_coordinate</key> <value>(744, 292)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>mlc_bc_0_1</value> </param> <param> <key>maxoutbuf</key> <value>0</value> </param> <param> <key>minoutbuf</key> <value>0</value> </param> <param> <key>tp</key> <value>tp</value> </param> </block> <block> <key>rational_resampler_xxx</key> <param> <key>alias</key> <value></value> </param> <param> <key>comment</key> <value>Ingoing sample rate is assumed to be 48 kHz. 250 kHz is one of the lowest achievable rates of the USRP.</value> </param> <param> <key>affinity</key> <value></value> </param> <param> <key>decim</key> <value>drm.FS_SOUNDCARD / 1000</value> </param> <param> <key>_enabled</key> <value>0</value> </param> <param> <key>fbw</key> <value>0</value> </param> <param> <key>_coordinate</key> <value>(864, 448)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>rational_resampler_xxx_0</value> </param> <param> <key>interp</key> <value>250</value> </param> <param> <key>maxoutbuf</key> <value>0</value> </param> <param> <key>minoutbuf</key> <value>0</value> </param> <param> <key>taps</key> <value></value> </param> <param> <key>type</key> <value>ccc</value> </param> </block> <block> <key>rational_resampler_xxx</key> <param> <key>alias</key> <value></value> </param> <param> <key>comment</key> <value></value> </param> <param> <key>affinity</key> <value></value> </param> <param> <key>decim</key> <value>441</value> </param> <param> <key>_enabled</key> <value>0</value> </param> <param> <key>fbw</key> <value>0</value> </param> <param> <key>_coordinate</key> <value>(248, 136)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>rational_resampler_xxx_0_0</value> </param> <param> <key>interp</key> <value>240</value> </param> <param> <key>maxoutbuf</key> <value>0</value> </param> <param> <key>minoutbuf</key> <value>0</value> </param> <param> <key>taps</key> <value></value> </param> <param> <key>type</key> <value>fff</value> </param> </block> <block> <key>virtual_source</key> <param> <key>comment</key> <value></value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> <key>_coordinate</key> <value>(56, 468)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>sym_in</value> </param> <param> <key>stream_id</key> <value>symbols</value> </param> </block> <block> <key>virtual_sink</key> <param> <key>comment</key> <value></value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> <key>_coordinate</key> <value>(1408, 292)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>sym_out</value> </param> <param> <key>stream_id</key> <value>symbols</value> </param> </block> <block> <key>uhd_usrp_sink</key> <param> <key>alias</key> <value></value> </param> <param> <key>ant0</key> <value>TXA</value> </param> <param> <key>bw0</key> <value>0</value> </param> <param> <key>center_freq0</key> <value>5e6</value> </param> <param> <key>norm_gain0</key> <value>False</value> </param> <param> <key>gain0</key> <value>0</value> </param> <param> <key>ant10</key> <value></value> </param> <param> <key>bw10</key> <value>0</value> </param> <param> <key>center_freq10</key> <value>0</value> </param> <param> <key>norm_gain10</key> <value>False</value> </param> <param> <key>gain10</key> <value>0</value> </param> <param> <key>ant11</key> <value></value> </param> <param> <key>bw11</key> <value>0</value> </param> <param> <key>center_freq11</key> <value>0</value> </param> <param> <key>norm_gain11</key> <value>False</value> </param> <param> <key>gain11</key> <value>0</value> </param> <param> <key>ant12</key> <value></value> </param> <param> <key>bw12</key> <value>0</value> </param> <param> <key>center_freq12</key> <value>0</value> </param> <param> <key>norm_gain12</key> <value>False</value> </param> <param> <key>gain12</key> <value>0</value> </param> <param> <key>ant13</key> <value></value> </param> <param> <key>bw13</key> <value>0</value> </param> <param> <key>center_freq13</key> <value>0</value> </param> <param> <key>norm_gain13</key> <value>False</value> </param> <param> <key>gain13</key> <value>0</value> </param> <param> <key>ant14</key> <value></value> </param> <param> <key>bw14</key> <value>0</value> </param> <param> <key>center_freq14</key> <value>0</value> </param> <param> <key>norm_gain14</key> <value>False</value> </param> <param> <key>gain14</key> <value>0</value> </param> <param> <key>ant15</key> <value></value> </param> <param> <key>bw15</key> <value>0</value> </param> <param> <key>center_freq15</key> <value>0</value> </param> <param> <key>norm_gain15</key> <value>False</value> </param> <param> <key>gain15</key> <value>0</value> </param> <param> <key>ant16</key> <value></value> </param> <param> <key>bw16</key> <value>0</value> </param> <param> <key>center_freq16</key> <value>0</value> </param> <param> <key>norm_gain16</key> <value>False</value> </param> <param> <key>gain16</key> <value>0</value> </param> <param> <key>ant17</key> <value></value> </param> <param> <key>bw17</key> <value>0</value> </param> <param> <key>center_freq17</key> <value>0</value> </param> <param> <key>norm_gain17</key> <value>False</value> </param> <param> <key>gain17</key> <value>0</value> </param> <param> <key>ant18</key> <value></value> </param> <param> <key>bw18</key> <value>0</value> </param> <param> <key>center_freq18</key> <value>0</value> </param> <param> <key>norm_gain18</key> <value>False</value> </param> <param> <key>gain18</key> <value>0</value> </param> <param> <key>ant19</key> <value></value> </param> <param> <key>bw19</key> <value>0</value> </param> <param> <key>center_freq19</key> <value>0</value> </param> <param> <key>norm_gain19</key> <value>False</value> </param> <param> <key>gain19</key> <value>0</value> </param> <param> <key>ant1</key> <value></value> </param> <param> <key>bw1</key> <value>0</value> </param> <param> <key>center_freq1</key> <value>0</value> </param> <param> <key>norm_gain1</key> <value>False</value> </param> <param> <key>gain1</key> <value>0</value> </param> <param> <key>ant20</key> <value></value> </param> <param> <key>bw20</key> <value>0</value> </param> <param> <key>center_freq20</key> <value>0</value> </param> <param> <key>norm_gain20</key> <value>False</value> </param> <param> <key>gain20</key> <value>0</value> </param> <param> <key>ant21</key> <value></value> </param> <param> <key>bw21</key> <value>0</value> </param> <param> <key>center_freq21</key> <value>0</value> </param> <param> <key>norm_gain21</key> <value>False</value> </param> <param> <key>gain21</key> <value>0</value> </param> <param> <key>ant22</key> <value></value> </param> <param> <key>bw22</key> <value>0</value> </param> <param> <key>center_freq22</key> <value>0</value> </param> <param> <key>norm_gain22</key> <value>False</value> </param> <param> <key>gain22</key> <value>0</value> </param> <param> <key>ant23</key> <value></value> </param> <param> <key>bw23</key> <value>0</value> </param> <param> <key>center_freq23</key> <value>0</value> </param> <param> <key>norm_gain23</key> <value>False</value> </param> <param> <key>gain23</key> <value>0</value> </param> <param> <key>ant24</key> <value></value> </param> <param> <key>bw24</key> <value>0</value> </param> <param> <key>center_freq24</key> <value>0</value> </param> <param> <key>norm_gain24</key> <value>False</value> </param> <param> <key>gain24</key> <value>0</value> </param> <param> <key>ant25</key> <value></value> </param> <param> <key>bw25</key> <value>0</value> </param> <param> <key>center_freq25</key> <value>0</value> </param> <param> <key>norm_gain25</key> <value>False</value> </param> <param> <key>gain25</key> <value>0</value> </param> <param> <key>ant26</key> <value></value> </param> <param> <key>bw26</key> <value>0</value> </param> <param> <key>center_freq26</key> <value>0</value> </param> <param> <key>norm_gain26</key> <value>False</value> </param> <param> <key>gain26</key> <value>0</value> </param> <param> <key>ant27</key> <value></value> </param> <param> <key>bw27</key> <value>0</value> </param> <param> <key>center_freq27</key> <value>0</value> </param> <param> <key>norm_gain27</key> <value>False</value> </param> <param> <key>gain27</key> <value>0</value> </param> <param> <key>ant28</key> <value></value> </param> <param> <key>bw28</key> <value>0</value> </param> <param> <key>center_freq28</key> <value>0</value> </param> <param> <key>norm_gain28</key> <value>False</value> </param> <param> <key>gain28</key> <value>0</value> </param> <param> <key>ant29</key> <value></value> </param> <param> <key>bw29</key> <value>0</value> </param> <param> <key>center_freq29</key> <value>0</value> </param> <param> <key>norm_gain29</key> <value>False</value> </param> <param> <key>gain29</key> <value>0</value> </param> <param> <key>ant2</key> <value></value> </param> <param> <key>bw2</key> <value>0</value> </param> <param> <key>center_freq2</key> <value>0</value> </param> <param> <key>norm_gain2</key> <value>False</value> </param> <param> <key>gain2</key> <value>0</value> </param> <param> <key>ant30</key> <value></value> </param> <param> <key>bw30</key> <value>0</value> </param> <param> <key>center_freq30</key> <value>0</value> </param> <param> <key>norm_gain30</key> <value>False</value> </param> <param> <key>gain30</key> <value>0</value> </param> <param> <key>ant31</key> <value></value> </param> <param> <key>bw31</key> <value>0</value> </param> <param> <key>center_freq31</key> <value>0</value> </param> <param> <key>norm_gain31</key> <value>False</value> </param> <param> <key>gain31</key> <value>0</value> </param> <param> <key>ant3</key> <value></value> </param> <param> <key>bw3</key> <value>0</value> </param> <param> <key>center_freq3</key> <value>0</value> </param> <param> <key>norm_gain3</key> <value>False</value> </param> <param> <key>gain3</key> <value>0</value> </param> <param> <key>ant4</key> <value></value> </param> <param> <key>bw4</key> <value>0</value> </param> <param> <key>center_freq4</key> <value>0</value> </param> <param> <key>norm_gain4</key> <value>False</value> </param> <param> <key>gain4</key> <value>0</value> </param> <param> <key>ant5</key> <value></value> </param> <param> <key>bw5</key> <value>0</value> </param> <param> <key>center_freq5</key> <value>0</value> </param> <param> <key>norm_gain5</key> <value>False</value> </param> <param> <key>gain5</key> <value>0</value> </param> <param> <key>ant6</key> <value></value> </param> <param> <key>bw6</key> <value>0</value> </param> <param> <key>center_freq6</key> <value>0</value> </param> <param> <key>norm_gain6</key> <value>False</value> </param> <param> <key>gain6</key> <value>0</value> </param> <param> <key>ant7</key> <value></value> </param> <param> <key>bw7</key> <value>0</value> </param> <param> <key>center_freq7</key> <value>0</value> </param> <param> <key>norm_gain7</key> <value>False</value> </param> <param> <key>gain7</key> <value>0</value> </param> <param> <key>ant8</key> <value></value> </param> <param> <key>bw8</key> <value>0</value> </param> <param> <key>center_freq8</key> <value>0</value> </param> <param> <key>norm_gain8</key> <value>False</value> </param> <param> <key>gain8</key> <value>0</value> </param> <param> <key>ant9</key> <value></value> </param> <param> <key>bw9</key> <value>0</value> </param> <param> <key>center_freq9</key> <value>0</value> </param> <param> <key>norm_gain9</key> <value>False</value> </param> <param> <key>gain9</key> <value>0</value> </param> <param> <key>clock_rate</key> <value>0.0</value> </param> <param> <key>comment</key> <value></value> </param> <param> <key>affinity</key> <value></value> </param> <param> <key>dev_addr</key> <value></value> </param> <param> <key>dev_args</key> <value>""</value> </param> <param> <key>_enabled</key> <value>0</value> </param> <param> <key>_coordinate</key> <value>(1168, 424)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>uhd_usrp_sink_0</value> </param> <param> <key>type</key> <value>fc32</value> </param> <param> <key>clock_source0</key> <value></value> </param> <param> <key>sd_spec0</key> <value></value> </param> <param> <key>time_source0</key> <value></value> </param> <param> <key>clock_source1</key> <value></value> </param> <param> <key>sd_spec1</key> <value></value> </param> <param> <key>time_source1</key> <value></value> </param> <param> <key>clock_source2</key> <value></value> </param> <param> <key>sd_spec2</key> <value></value> </param> <param> <key>time_source2</key> <value></value> </param> <param> <key>clock_source3</key> <value></value> </param> <param> <key>sd_spec3</key> <value></value> </param> <param> <key>time_source3</key> <value></value> </param> <param> <key>clock_source4</key> <value></value> </param> <param> <key>sd_spec4</key> <value></value> </param> <param> <key>time_source4</key> <value></value> </param> <param> <key>clock_source5</key> <value></value> </param> <param> <key>sd_spec5</key> <value></value> </param> <param> <key>time_source5</key> <value></value> </param> <param> <key>clock_source6</key> <value></value> </param> <param> <key>sd_spec6</key> <value></value> </param> <param> <key>time_source6</key> <value></value> </param> <param> <key>clock_source7</key> <value></value> </param> <param> <key>sd_spec7</key> <value></value> </param> <param> <key>time_source7</key> <value></value> </param> <param> <key>nchan</key> <value>1</value> </param> <param> <key>num_mboards</key> <value>1</value> </param> <param> <key>samp_rate</key> <value>48000 * 250 / 48</value> </param> <param> <key>hide_cmd_port</key> <value>False</value> </param> <param> <key>hide_lo_controls</key> <value>True</value> </param> <param> <key>stream_args</key> <value></value> </param> <param> <key>stream_chans</key> <value>[]</value> </param> <param> <key>sync</key> <value></value> </param> <param> <key>len_tag_name</key> <value></value> </param> <param> <key>otw</key> <value></value> </param> </block> <connection> <source_block_id>analog_sig_source_x_0</source_block_id> <sink_block_id>blocks_multiply_xx_0</sink_block_id> <source_key>0</source_key> <sink_key>1</sink_key> </connection> <connection> <source_block_id>audio_source_0</source_block_id> <sink_block_id>rational_resampler_xxx_0_0</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> <source_block_id>blocks_complex_to_real_0</source_block_id> <sink_block_id>audio_sink_0</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> <source_block_id>blocks_complex_to_real_0</source_block_id> <sink_block_id>blocks_wavfile_sink_0</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> <source_block_id>blocks_multiply_const_vxx_0</source_block_id> <sink_block_id>drm_audio_encoder_sb_0</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> <source_block_id>blocks_multiply_const_vxx_1</source_block_id> <sink_block_id>blocks_multiply_xx_0</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> <source_block_id>blocks_multiply_const_vxx_1</source_block_id> <sink_block_id>rational_resampler_xxx_0</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> <source_block_id>blocks_multiply_xx_0</source_block_id> <sink_block_id>blocks_complex_to_real_0</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> <source_block_id>blocks_wavfile_source_0</source_block_id> <sink_block_id>blocks_multiply_const_vxx_0</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> <source_block_id>cell_mapping_cc_0</source_block_id> <sink_block_id>sym_out</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> <source_block_id>digital_ofdm_cyclic_prefixer_1</source_block_id> <sink_block_id>blocks_multiply_const_vxx_1</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> <source_block_id>drm_audio_encoder_sb_0</source_block_id> <sink_block_id>drm_scrambler_bb_0</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> <source_block_id>drm_generate_fac_b_0</source_block_id> <sink_block_id>drm_scrambler_bb_0_0</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> <source_block_id>drm_generate_sdc_b_0</source_block_id> <sink_block_id>drm_scrambler_bb_0_1</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> <source_block_id>drm_interleaver_cc_0</source_block_id> <sink_block_id>cell_mapping_cc_0</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> <source_block_id>drm_scrambler_bb_0</source_block_id> <sink_block_id>mlc_bc_0_0</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> <source_block_id>drm_scrambler_bb_0_0</source_block_id> <sink_block_id>mlc_bc_0</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> <source_block_id>drm_scrambler_bb_0_1</source_block_id> <sink_block_id>mlc_bc_0_1</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> <source_block_id>fft_vxx_0</source_block_id> <sink_block_id>digital_ofdm_cyclic_prefixer_1</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> <source_block_id>mlc_bc_0</source_block_id> <sink_block_id>cell_mapping_cc_0</sink_block_id> <source_key>0</source_key> <sink_key>2</sink_key> </connection> <connection> <source_block_id>mlc_bc_0_0</source_block_id> <sink_block_id>drm_interleaver_cc_0</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> <source_block_id>mlc_bc_0_1</source_block_id> <sink_block_id>cell_mapping_cc_0</sink_block_id> <source_key>0</source_key> <sink_key>1</sink_key> </connection> <connection> <source_block_id>rational_resampler_xxx_0</source_block_id> <sink_block_id>uhd_usrp_sink_0</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> <source_block_id>rational_resampler_xxx_0_0</source_block_id> <sink_block_id>drm_audio_encoder_sb_0</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> <source_block_id>sym_in</source_block_id> <sink_block_id>fft_vxx_0</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> </flow_graph>
Infelizmente, o USRP não transmite para o HF, mas eu não tenho o HackRF. Portanto, não foi possível fazer um teste de transmissão real, no entanto, posso confirmar que a decodificação de som através do Dream ocorre sem erros.
Conclusão
Por incrível que pareça, apesar da aparentemente desesperança de 99%, o padrão DRM ainda está vivo. No entanto, é improvável que ele tenha sucesso e vá além de quaisquer experimentos locais - a qualidade do som no DRM não atende aos padrões modernos e não há receptores no mercado. Do ponto de vista técnico, o que parecia ser um "avanço" em 2003 é agora de pouca relevância.
Mas, por outro lado, o padrão DRM contém muitas idéias interessantes, sua recepção foi (e é) uma experiência bastante interessante para radioamadores, qualquer um pode participar enquanto a estação drm está no ar.
Com isso, a série de artigos sobre SDR está concluída, espero que alguém esteja interessado e útil.
Todas as experiências bem sucedidas.