Radio definida por software: ¿cómo funciona? Parte 6

Hola Habr

En la parte anterior, vimos la posibilidad de transmitir señales simples usando GNU Radio. Ahora iremos más allá y veremos cómo transmitir algo más complicado. Comencemos con las señales de radio de aficionados WSPR, y luego creemos un módem QAM de software que funcione.



Y como en el caso anterior, haremos esto sin escribir una sola línea de código, el programa también será multiplataforma y podrá funcionar tanto en OSX / Linux como en Windows. También mostraré cómo depurar un módem usando GNU Radio, sin ningún tipo de hardware.

Continúa debajo del corte.

Para aquellos que no han usado GNU Radio, se recomienda leer las partes 4 y 5 , que describen los principios de trabajar con el programa.

Wspr


Comencemos con uno más simple, con WSPR : este tipo de comunicación se hizo especialmente para pruebas de propagación de señales débiles, es decir, lo que necesitamos es un nivel de potencia de dispositivos como LimeSDR de no más de 100 mW. La señal WSPR se transmite a una velocidad muy baja (2 minutos por mensaje de aproximadamente 30 bytes) en una banda muy estrecha, lo que permite recibirla incluso por debajo del nivel de ruido. Transmita tal señal usando GNU Radio.

Primero necesitas grabar la señal. Para hacer esto, tome el programa WSJT , configure todos los parámetros necesarios (encendido, señal de llamada, ubicación, etc.). Especifique el cable de audio virtual como el dispositivo de audio de salida en la configuración y grabe la señal en WAV. Las pausas en los bordes deben cortarse en cualquier editor (por ejemplo, Cool Edit), como resultado, deberíamos obtener un archivo con una duración de aproximadamente 2 minutos.

Ahora cree un gráfico en GNU Radio Companion.



Este método no pretende ser la máxima eficiencia, pero es bastante simple y directo. La señal WSPR está inicialmente a una frecuencia de 1500 Hz, el archivo wav grabado tiene una frecuencia de muestreo de 22050 s / s. Primero, volveremos a muestrear la señal 57/5 veces para llevar la frecuencia de muestreo a los 250,000 s / s requeridos. Luego, aumentamos la frecuencia en 10KHz (la señal útil estará en la frecuencia de 11.5KHz), traducimos la señal a la forma compleja requerida por el receptor y cortamos el filtro sobrante, dejando las frecuencias de 11-12KHz.

Las señales WSPR tienen un límite de tiempo y se transmiten cada minuto par (0:00, 0:02, etc.). Comencé la transferencia a GNU Radio manualmente, a simple vista, determinando el intervalo por hora, cualquiera que quiera puede agregar un script en Python para iniciar automáticamente la transferencia.

Estamos esperando el momento adecuado, enciende el transmisor, el receptor y verifica el resultado.



Si lo desea, también puede agregar la generación automática de un archivo WSPR al programa en función de los datos de entrada (distintivo de llamada, ubicación, potencia de transmisión), se pueden tomar ejemplos de generación WSPR para Python en github.

Es interesante notar que a 432 MHz la deriva de frecuencia ya es bastante notable, aunque la señal todavía está decodificada. Pero a una frecuencia de 1.3 GHz, la deriva se vuelve tan grande que WSPR ya no se acepta: se necesita un generador de referencia externo con una señal más estable para SDR (o al menos corrección de frecuencia de software durante la transmisión, aunque esto es menos conveniente).

Si el SDR le permite transmitir a bajas frecuencias, puede intentar la transmisión en la banda de HF. Por lo tanto, con HackRF, era posible transmitir una señal a 1000 km a 14 MHz desde una antena de habitación, lo que puede considerarse un buen resultado. Aunque las altas frecuencias (433 MHz y 1.3 GHz) son quizás aún más interesantes para los experimentos, las señales se transmiten solo en línea de visión directa, por lo que para tales experimentos necesita un segundo participante en el lado receptor. La segunda ventaja de tales pruebas es que solo los perezosos no transmitieron a HF en wspr, pero las frecuencias altas son mucho menos dominadas. Entonces, con placas como LimeSDR o USRP, puede realizar experimentos bastante interesantes con recepción y transmisión a frecuencias ultra altas.

QAM Modem


Vamos más allá. WSPR es un formato bastante simple, hagamos algo más interesante: un módem completo (bueno, casi). Con la modulación de amplitud en cuadratura, tanto la amplitud como la fase de la señal cambian simultáneamente, lo que permite que los datos se transmitan a mayor velocidad (pero la banda ocupada también es más grande).

Considere la primera parte: el transmisor.



Como puede ver, leemos los datos del archivo data.txt, luego, con una frecuencia de muestreo de 25KHz, enviamos datos al codificador de paquetes, que convierte la transmisión en un código de 4 bits. Este flujo va al modulador de cuadratura, luego la frecuencia de muestreo se incrementa a una frecuencia del transmisor de 250KHz, y la señal se desplaza hacia arriba en 80KHz (muchos receptores tienen un pico a frecuencia cero, y esto interferirá). El componente Constellation Rect establece los parámetros de modulación: el número de caracteres y el cambio de fase y amplitud.

La primera parte está lista. Comenzamos la "transferencia" y vemos nuestra señal.



Podemos probar nuestro transmisor sin siquiera tener ningún equipo, para esto hay un bloque de modelo de canal especial, un modelo de canal de comunicación. Allí puede configurar el ruido, el cambio de frecuencia, etc.

Así es como se ve nuestra señal antes y después de la transmisión. Por cierto, como puede ver, todos los "armónicos" del transmisor por debajo de 120 dB han bajado mucho más que el nivel de ruido.



Ahora la recepción. De hecho, lo mismo, solo en orden inverso.



Por separado, puede detenerse en el último bloque UDP Sink. No está claro por qué, pero en GNU Radio no hay ningún componente para ver datos de texto. Por lo tanto, simplemente enviamos datos a través de UDP a cualquier puerto local (elegí 999).

Para recibir, escribimos un programa simple en Python.

import socket UDP_IP = "127.0.0.1" UDP_PORT = 999 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # UDP sock.bind((UDP_IP, UDP_PORT)) sock.settimeout(1.0) while True: try: data, addr = sock.recvfrom(64) # buffer size is 64 bytes print("Msg:", data) except socket.timeout: pass 

Resultado: ejecute el script, ejecute GNU Radio y vea los mensajes recibidos en la consola.



Como puede ver, todo funciona y no puede tener un receptor o antenas :)

Para aquellos que desean repetir experimentos, el archivo grc del proyecto está bajo el spoiler. Debería funcionar tanto en Linux como en Windows.

qam_test.grc
 <?xml version='1.0' encoding='utf-8'?> <?grc format='1' created='3.7.11'?> <flow_graph> <timestamp>Mon May 27 21:52:42 2019</timestamp> <block> <key>options</key> <param> <key>author</key> <value></value> </param> <param> <key>window_size</key> <value></value> </param> <param> <key>category</key> <value>[GRC Hier Blocks]</value> </param> <param> <key>comment</key> <value></value> </param> <param> <key>description</key> <value></value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> <key>_coordinate</key> <value>(8, 8)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>generate_options</key> <value>qt_gui</value> </param> <param> <key>hier_block_src_path</key> <value>.:</value> </param> <param> <key>id</key> <value>top_block</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>prompt</value> </param> <param> <key>run</key> <value>True</value> </param> <param> <key>thread_safe_setters</key> <value></value> </param> <param> <key>title</key> <value></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>(1144, 172)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>excess_bw</value> </param> <param> <key>value</key> <value>0.35</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>(1104, 436)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>nfilts</value> </param> <param> <key>value</key> <value>32</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>(1096, 588)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>nfilts_0</value> </param> <param> <key>value</key> <value>32</value> </param> </block> <block> <key>variable_constellation_rect</key> <param> <key>comment</key> <value></value> </param> <param> <key>const_points</key> <value>[0.707+0.707j, -0.707+0.707j, -0.707-0.707j, 0.707-0.707j]</value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> <key>_coordinate</key> <value>(1104, 16)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>qpsk</value> </param> <param> <key>imag_sect</key> <value>2</value> </param> <param> <key>real_sect</key> <value>2</value> </param> <param> <key>rot_sym</key> <value>4</value> </param> <param> <key>soft_dec_lut</key> <value>None</value> </param> <param> <key>precision</key> <value>8</value> </param> <param> <key>sym_map</key> <value>[0, 1, 2, 3]</value> </param> <param> <key>w_imag_sect</key> <value>1</value> </param> <param> <key>w_real_sect</key> <value>1</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>(1104, 372)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>rrc_taps</value> </param> <param> <key>value</key> <value>firdes.root_raised_cosine(nfilts, nfilts, 1.0/float(sps), 0.35, 45*nfilts)</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>(1112, 508)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>rrc_taps_0</value> </param> <param> <key>value</key> <value>firdes.root_raised_cosine(nfilts, nfilts, 1.0/float(sps), 0.35, 45*nfilts)</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>(168, 12)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>samp_rate</value> </param> <param> <key>value</key> <value>250000</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>(1144, 244)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>sps</value> </param> <param> <key>value</key> <value>4</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>(1104, 308)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>timing_loop_bw</value> </param> <param> <key>value</key> <value>6.28/100.0</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>True</value> </param> <param> <key>freq</key> <value>80000</value> </param> <param> <key>_coordinate</key> <value>(664, 20)</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>samp_rate</value> </param> <param> <key>waveform</key> <value>analog.GR_COS_WAVE</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>True</value> </param> <param> <key>freq</key> <value>-80000</value> </param> <param> <key>_coordinate</key> <value>(48, 540)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>analog_sig_source_x_1</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>samp_rate</value> </param> <param> <key>waveform</key> <value>analog.GR_COS_WAVE</value> </param> </block> <block> <key>blks2_packet_decoder</key> <param> <key>access_code</key> <value></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>_coordinate</key> <value>(296, 676)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>blks2_packet_decoder_0</value> </param> <param> <key>maxoutbuf</key> <value>0</value> </param> <param> <key>minoutbuf</key> <value>0</value> </param> <param> <key>type</key> <value>byte</value> </param> <param> <key>threshold</key> <value>-1</value> </param> </block> <block> <key>blks2_packet_encoder</key> <param> <key>access_code</key> <value></value> </param> <param> <key>bits_per_symbol</key> <value>4</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>_coordinate</key> <value>(224, 76)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>blks2_packet_encoder_0</value> </param> <param> <key>type</key> <value>byte</value> </param> <param> <key>maxoutbuf</key> <value>0</value> </param> <param> <key>minoutbuf</key> <value>0</value> </param> <param> <key>pad_for_usrp</key> <value>True</value> </param> <param> <key>payload_length</key> <value>0</value> </param> <param> <key>preamble</key> <value></value> </param> <param> <key>samples_per_symbol</key> <value>4</value> </param> </block> <block> <key>blocks_file_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>D:\MyProjects\GNURadio\data.txt</value> </param> <param> <key>_coordinate</key> <value>(8, 92)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>blocks_file_source_0</value> </param> <param> <key>maxoutbuf</key> <value>0</value> </param> <param> <key>minoutbuf</key> <value>0</value> </param> <param> <key>type</key> <value>byte</value> </param> <param> <key>repeat</key> <value>True</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>True</value> </param> <param> <key>_coordinate</key> <value>(920, 88)</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_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>True</value> </param> <param> <key>_coordinate</key> <value>(224, 496)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>blocks_multiply_xx_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>num_inputs</key> <value>2</value> </param> <param> <key>vlen</key> <value>1</value> </param> </block> <block> <key>blocks_throttle</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>(96, 196)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>blocks_throttle_1</value> </param> <param> <key>ignoretag</key> <value>True</value> </param> <param> <key>maxoutbuf</key> <value>0</value> </param> <param> <key>minoutbuf</key> <value>0</value> </param> <param> <key>samples_per_second</key> <value>25000</value> </param> <param> <key>type</key> <value>byte</value> </param> <param> <key>vlen</key> <value>1</value> </param> </block> <block> <key>blocks_udp_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>ipaddr</key> <value>127.0.0.1</value> </param> <param> <key>port</key> <value>999</value> </param> <param> <key>_enabled</key> <value>1</value> </param> <param> <key>_coordinate</key> <value>(680, 660)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>id</key> <value>blocks_udp_sink_0</value> </param> <param> <key>type</key> <value>byte</value> </param> <param> <key>psize</key> <value>64</value> </param> <param> <key>eof</key> <value>True</value> </param> <param> <key>vlen</key> <value>1</value> </param> </block> <block> <key>channels_channel_model</key> <param> <key>alias</key> <value></value> </param> <param> <key>block_tags</key> <value>False</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>epsilon</key> <value>1.0</value> </param> <param> <key>freq_offset</key> <value>0.0</value> </param> <param> <key>_coordinate</key> <value>(504, 284)</value> </param> <param> <key>_rotation</key> <value>180</value> </param> <param> <key>id</key> <value>channels_channel_model_0</value> </param> <param> <key>maxoutbuf</key> <value>0</value> </param> <param> <key>minoutbuf</key> <value>0</value> </param> <param> <key>noise_voltage</key> <value>0.1</value> </param> <param> <key>seed</key> <value>0</value> </param> <param> <key>taps</key> <value>1.0 + 1.0j</value> </param> </block> <block> <key>digital_qam_demod</key> <param> <key>alias</key> <value></value> </param> <param> <key>comment</key> <value></value> </param> <param> <key>affinity</key> <value></value> </param> <param> <key>differential</key> <value>True</value> </param> <param> <key>_enabled</key> <value>1</value> </param> <param> <key>excess_bw</key> <value>0.35</value> </param> <param> <key>freq_bw</key> <value>6.28/100.0</value> </param> <param> <key>_coordinate</key> <value>(672, 456)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>mod_code</key> <value>"gray"</value> </param> <param> <key>id</key> <value>digital_qam_demod_0</value> </param> <param> <key>log</key> <value>False</value> </param> <param> <key>maxoutbuf</key> <value>0</value> </param> <param> <key>minoutbuf</key> <value>0</value> </param> <param> <key>constellation_points</key> <value>4</value> </param> <param> <key>phase_bw</key> <value>6.28/100.0</value> </param> <param> <key>samples_per_symbol</key> <value>4</value> </param> <param> <key>timing_bw</key> <value>6.28/100.0</value> </param> <param> <key>verbose</key> <value>False</value> </param> </block> <block> <key>digital_qam_mod</key> <param> <key>alias</key> <value></value> </param> <param> <key>comment</key> <value></value> </param> <param> <key>affinity</key> <value></value> </param> <param> <key>differential</key> <value>True</value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> <key>excess_bw</key> <value>0.35</value> </param> <param> <key>_coordinate</key> <value>(384, 116)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>mod_code</key> <value>"gray"</value> </param> <param> <key>id</key> <value>digital_qam_mod_0</value> </param> <param> <key>log</key> <value>False</value> </param> <param> <key>maxoutbuf</key> <value>0</value> </param> <param> <key>minoutbuf</key> <value>0</value> </param> <param> <key>constellation_points</key> <value>4</value> </param> <param> <key>samples_per_symbol</key> <value>4</value> </param> <param> <key>verbose</key> <value>False</value> </param> </block> <block> <key>low_pass_filter</key> <param> <key>beta</key> <value>6.76</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>cutoff_freq</key> <value>12000</value> </param> <param> <key>decim</key> <value>1</value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> <key>type</key> <value>fir_filter_ccf</value> </param> <param> <key>_coordinate</key> <value>(320, 460)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>gain</key> <value>1</value> </param> <param> <key>id</key> <value>low_pass_filter_0</value> </param> <param> <key>interp</key> <value>1</value> </param> <param> <key>maxoutbuf</key> <value>0</value> </param> <param> <key>minoutbuf</key> <value>0</value> </param> <param> <key>samp_rate</key> <value>samp_rate</value> </param> <param> <key>width</key> <value>1000</value> </param> <param> <key>win</key> <value>firdes.WIN_HAMMING</value> </param> </block> <block> <key>qtgui_const_sink_x</key> <param> <key>autoscale</key> <value>False</value> </param> <param> <key>axislabels</key> <value>True</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>_coordinate</key> <value>(456, 20)</value> </param> <param> <key>gui_hint</key> <value></value> </param> <param> <key>_rotation</key> <value>0</value> </param> <param> <key>grid</key> <value>False</value> </param> <param> <key>id</key> <value>qtgui_const_sink_x_0</value> </param> <param> <key>legend</key> <value>True</value> </param> <param> <key>alpha1</key> <value>1.0</value> </param> <param> <key>color1</key> <value>"blue"</value> </param> <param> <key>label1</key> <value></value> </param> <param> <key>marker1</key> <value>0</value> </param> <param> <key>style1</key> <value>0</value> </param> <param> <key>width1</key> <value>1</value> </param> <param> <key>alpha10</key> <value>1.0</value> </param> <param> <key>color10</key> <value>"red"</value> </param> <param> <key>label10</key> <value></value> </param> <param> <key>marker10</key> <value>0</value> </param> <param> <key>style10</key> <value>0</value> </param> <param> <key>width10</key> <value>1</value> </param> <param> <key>alpha2</key> <value>1.0</value> </param> <param> <key>color2</key> <value>"red"</value> </param> <param> <key>label2</key> <value></value> </param> <param> <key>marker2</key> <value>0</value> </param> <param> <key>style2</key> <value>0</value> </param> <param> <key>width2</key> <value>1</value> </param> <param> <key>alpha3</key> <value>1.0</value> </param> <param> <key>color3</key> <value>"red"</value> </param> <param> <key>label3</key> <value></value> </param> <param> <key>marker3</key> <value>0</value> </param> <param> <key>style3</key> <value>0</value> </param> <param> <key>width3</key> <value>1</value> </param> <param> <key>alpha4</key> <value>1.0</value> </param> <param> <key>color4</key> <value>"red"</value> </param> <param> <key>label4</key> <value></value> </param> <param> <key>marker4</key> <value>0</value> </param> <param> <key>style4</key> <value>0</value> </param> <param> <key>width4</key> <value>1</value> </param> <param> <key>alpha5</key> <value>1.0</value> </param> <param> <key>color5</key> <value>"red"</value> </param> <param> <key>label5</key> <value></value> </param> <param> <key>marker5</key> <value>0</value> </param> <param> <key>style5</key> <value>0</value> </param> <param> <key>width5</key> <value>1</value> </param> <param> <key>alpha6</key> <value>1.0</value> </param> <param> <key>color6</key> <value>"red"</value> </param> <param> <key>label6</key> <value></value> </param> <param> <key>marker6</key> <value>0</value> </param> <param> <key>style6</key> <value>0</value> </param> <param> <key>width6</key> <value>1</value> </param> <param> <key>alpha7</key> <value>1.0</value> </param> <param> <key>color7</key> <value>"red"</value> </param> <param> <key>label7</key> <value></value> </param> <param> <key>marker7</key> <value>0</value> </param> <param> <key>style7</key> <value>0</value> </param> <param> <key>width7</key> <value>1</value> </param> <param> <key>alpha8</key> <value>1.0</value> </param> <param> <key>color8</key> <value>"red"</value> </param> <param> <key>label8</key> <value></value> </param> <param> <key>marker8</key> <value>0</value> </param> <param> <key>style8</key> <value>0</value> </param> <param> <key>width8</key> <value>1</value> </param> <param> <key>alpha9</key> <value>1.0</value> </param> <param> <key>color9</key> <value>"red"</value> </param> <param> <key>label9</key> <value></value> </param> <param> <key>marker9</key> <value>0</value> </param> <param> <key>style9</key> <value>0</value> </param> <param> <key>width9</key> <value>1</value> </param> <param> <key>name</key> <value>""</value> </param> <param> <key>nconnections</key> <value>1</value> </param> <param> <key>size</key> <value>1024</value> </param> <param> <key>tr_chan</key> <value>0</value> </param> <param> <key>tr_level</key> <value>0.0</value> </param> <param> <key>tr_mode</key> <value>qtgui.TRIG_MODE_FREE</value> </param> <param> <key>tr_slope</key> <value>qtgui.TRIG_SLOPE_POS</value> </param> <param> <key>tr_tag</key> <value>""</value> </param> <param> <key>type</key> <value>complex</value> </param> <param> <key>update_time</key> <value>0.10</value> </param> <param> <key>xmax</key> <value>2</value> </param> <param> <key>xmin</key> <value>-2</value> </param> <param> <key>ymax</key> <value>2</value> </param> <param> <key>ymin</key> <value>-2</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>1</value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> <key>fbw</key> <value>0</value> </param> <param> <key>_coordinate</key> <value>(648, 148)</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>10</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>10</value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> <key>fbw</key> <value>0</value> </param> <param> <key>_coordinate</key> <value>(480, 484)</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>1</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> <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>0</sink_key> </connection> <connection> <source_block_id>analog_sig_source_x_1</source_block_id> <sink_block_id>blocks_multiply_xx_1</sink_block_id> <source_key>0</source_key> <sink_key>1</sink_key> </connection> <connection> <source_block_id>blks2_packet_decoder_0</source_block_id> <sink_block_id>blocks_udp_sink_0</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> <source_block_id>blks2_packet_encoder_0</source_block_id> <sink_block_id>digital_qam_mod_0</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> <source_block_id>blocks_file_source_0</source_block_id> <sink_block_id>blocks_throttle_1</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>channels_channel_model_0</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> <source_block_id>blocks_multiply_xx_1</source_block_id> <sink_block_id>low_pass_filter_0</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> <source_block_id>blocks_throttle_1</source_block_id> <sink_block_id>blks2_packet_encoder_0</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> <source_block_id>channels_channel_model_0</source_block_id> <sink_block_id>blocks_multiply_xx_1</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> <source_block_id>digital_qam_demod_0</source_block_id> <sink_block_id>blks2_packet_decoder_0</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> <source_block_id>digital_qam_mod_0</source_block_id> <sink_block_id>qtgui_const_sink_x_0</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> <source_block_id>digital_qam_mod_0</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>low_pass_filter_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>rational_resampler_xxx_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>rational_resampler_xxx_0_0</source_block_id> <sink_block_id>digital_qam_demod_0</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> </flow_graph> 


Una buena guía para crear un módem más sofisticado está en el sitio web de GNU Radio , pero usan un bloque personalizado para la demodulación, que solo fue posible ejecutar bajo Linux. No hay ningún problema con esto en el ejemplo anterior.

Conclusión


Como puede ver, GNU Radio es un programa bastante interesante para trabajar con señales de diferentes maneras, en las que puede hacer muchas cosas interesantes diferentes. Si la audiencia no pierde interés (existe la sensación de que profundizo en temas estrechos que son de poco interés para la mayoría), puede intentar transmitir algo más interesante, por ejemplo, un video.

Source: https://habr.com/ru/post/453766/


All Articles