Hola Habr
La
tercera parte describe cómo acceder al receptor SDR usando Python. Ahora nos familiarizaremos con el programa
GNU Radio , un sistema que le permite crear una configuración bastante compleja de un dispositivo de radio sin escribir una sola línea de código.

Como ejemplo, considere el problema de la recepción en paralelo de varias estaciones de FM en un receptor. Utilizaremos el mismo RTL SDR V3 que el receptor.
Continúa debajo del corte.
Instalación
Para comenzar, es necesario instalar GNU Radio, el kit de distribución para Windows se puede descargar
aquí . Este sistema es multiplataforma, también hay versiones para Linux y OSX (parece que GNU Radio se lanzó con éxito en la Raspberry Pi, pero no puedo dar una garantía del 100%).
De hecho, GNU Radio es un marco completo para el procesamiento de señales digitales, en el que el programa se "ensambla" desde módulos separados. Hay una gran cantidad de bloques prefabricados, si lo desea, también puede crear los suyos. Los módulos en sí están escritos en C ++, y Python interactúa entre sí. Aquellos que lo deseen pueden ver la API con
más detalle , pero en la práctica esto probablemente no sea útil: todas las acciones se pueden hacer visualmente en el programa GNU Radio Companion.
El sistema se centra en el procesamiento de flujos de datos, de modo que cada bloque generalmente tiene una entrada y una salida. Luego, conectando los bloques en el editor, obtenemos un sistema listo para usar. La interfaz de GNU Radio en sí es bastante simple, la dificultad está en comprender lo que está haciendo un bloque. Como se mencionó anteriormente, el trabajo de bajo nivel con SDR tiene un umbral de entrada alto y requiere algunos conocimientos de DSP y matemáticas. Pero consideraremos una tarea simple para la cual no se requiere conocimiento especial. Entonces comencemos.
Empezando
Iniciamos GNU Radio Companion, creamos un nuevo proyecto, seleccionamos el tipo de proyecto WX GUI, lo agregamos a la pantalla y conectamos los dos bloques, como se muestra en la captura de pantalla.

Vemos dos tipos de bloques: Fuente (fuente) y Sumidero (salida, "drenaje"). RTL-SDR es nuestro receptor, FFT GUI es un analizador de espectro virtual.
La variable de frecuencia de muestreo se establece en 2048000, esta es la frecuencia de muestreo de nuestro receptor. La frecuencia predeterminada de RTL-SDR es de 100 MHz.
Comenzamos el proyecto: todo funciona, vemos una variedad de estaciones de FM. ¡El primer programa para GNU Radio está listo!

Si miramos el registro, veremos tales líneas.
Generando: 'D: \\ MyProjects \\ GNURadio \\ top_block.py'
Ejecutando: C: \ Python27 \ python.exe -u D: \ MyProjects \ GNURadio \ top_block.pySí, podemos ver el archivo top_block.py que GNU Radio Companion generó para nosotros. True Jedi puede escribir directamente en Python, pero el código requerido, como vemos, es bastante grande. Lo creamos en 1 minuto.
Sin embargo, si eliminamos la engorrosa inicialización, veremos que no hay tantas líneas clave de código.
from gnuradio import gr from gnuradio.wxgui import fftsink2 import osmosdr class top_block(grc_wxgui.top_block_gui): def __init__(self): grc_wxgui.top_block_gui.__init__(self, title="Top Block") self.samp_rate = samp_rate = 2048000 self.wxgui_fftsink2_0 = fftsink2.fft_sink_c(...) self.Add(self.wxgui_fftsink2_0.win) self.rtlsdr_source_0 = osmosdr.source(args="numchan=" + str(1) + " " + '' ) self.connect((self.rtlsdr_source_0, 0), (self.wxgui_fftsink2_0, 0)) def main(top_block_cls=top_block, options=None): tb = top_block_cls() tb.Start(True) tb.Wait()
Básicamente, se puede escribir manualmente. Pero aún es más rápido con un mouse. Aunque la capacidad de cambiar el código a veces puede ser útil si desea agregar alguna lógica no estándar.
Recibir radio FM
Ahora intenta tomar una de las estaciones. Como se vio en las capturas de pantalla, la frecuencia central del receptor es de 100 MHz y el ancho de banda es de aproximadamente 2 MHz. En el espectro vemos dos estaciones, a 100.1 MHz y 100.7 MHz, respectivamente.
El primer paso es transferir el espectro de la estación al centro, ahora está a 100KHz a la derecha. Para hacer esto, recordamos la fórmula de la escuela para multiplicar cosenos, como resultado habrá dos frecuencias, la suma y la diferencia, la estación deseada se moverá al centro, que es lo que necesitamos (y filtramos el exceso).
Creamos dos variables para almacenar las frecuencias freq_center = 100000000 y freq_1 = 100100000, también agregamos un generador de señal con frecuencia freq_center - freq_1.

Porque Dado que el sistema está basado en Python, podemos usar expresiones en los campos de entrada de parámetros, lo cual es bastante conveniente.
El diagrama debería verse así:

Ahora debe agregar varios bloques a la vez: reduzca la frecuencia de reloj de la señal de entrada (es igual a 2048 KHz), filtre la señal, aplíquela al decodificador de FM y luego vuelva a reducir la frecuencia de reloj a 48 KHz.
El resultado se muestra en la imagen:

Lo consideramos con cuidado. Dividimos la velocidad del reloj de 2048KHz por 4 veces con el bloque Rational Resampler (obtenemos 512KHz), luego, después del filtro Low Pass, hay un decodificador WBFM con decimación 10 (obtenemos 51.2KHz). En principio, esta señal ya se puede alimentar a la tarjeta de sonido, pero el tono será ligeramente diferente. Una vez más, cambiamos la frecuencia del reloj a 48/51, como resultado, la frecuencia del reloj será de 48.2 KHz, la diferencia ya puede ser descuidada.
El segundo punto importante es el tipo de entradas. Se recibe una señal IQ
compleja (entradas / salidas en azul) desde el receptor, se emite una señal
real desde el decodificador FM: las entradas y salidas son amarillas. Si se mezcla, nada funcionará.
Ya había más información sobre Habré , es suficiente para que entendamos el principio general.
En general, corre, asegúrate de que todo funcione. Puede ejecutar el programa y escuchar la radio. Iremos más allá, todavía tenemos radio
definida por software , agregaremos la recepción simultánea de la segunda estación.
Recepción multicanal
El segundo receptor se agrega mediante su método de programación favorito: Ctrl + C / Ctrl + V. Agregue la variable freq_2, copie los bloques y conéctelos de la misma manera.

El resultado es bastante surrealista: puede escuchar dos estaciones de FM simultáneamente. Usando el mismo método (Ctrl + V), puede agregar una tercera estación.
Registro
Escuchar dos estaciones de forma original, pero en la práctica no es muy útil. Haremos algo más necesario, por ejemplo, agregar grabación de sonido a archivos separados. Esto puede ser bastante conveniente: se pueden grabar varios canales simultáneamente desde un receptor físico.
Agregue un componente File Sink a cada salida, como se muestra en la captura de pantalla.

La versión de Windows por alguna razón requiere rutas de archivos absolutas, de lo contrario la grabación no funciona. Comenzamos, estamos convencidos de que todo es normal. El tamaño de los archivos guardados es bastante grande, porque El formato predeterminado es flotante. La entrada en formato int dejará a los lectores como tarea.
Los archivos resultantes se pueden abrir en Cool Edit y asegúrese de que el sonido se grabe normalmente.


Por supuesto, el número de canales grabados se puede aumentar, solo está limitado por el ancho de banda del receptor y la potencia de la computadora. Además de File Sink, UDP Sink también se puede usar, por lo que el programa se puede usar para transmitir a través de la red.
Ejecutar desde la línea de comando
Y el último. Si utiliza el programa de forma autónoma, por ejemplo, para la grabación multicanal, entonces la interfaz de usuario, en principio, no es necesaria. En el bloque superior izquierdo de Opciones, cambie el parámetro Opciones de ejecución a Sin interfaz de usuario. Ejecute el programa nuevamente, asegúrese de que todo funcione. Ahora guardamos el archivo generado top_block.py: podemos ejecutarlo desde la línea de comandos, por ejemplo, desde un archivo bat o desde la consola.

Si alguien está interesado, el archivo generado se guarda en un spoiler.
También es conveniente que el sistema sea multiplataforma, y el programa resultante puede ejecutarse en Linux, Windows y OSX.
Conclusión
Podemos decir que GNU Radio es un sistema bastante complicado, no en términos de bloques de dibujo, por supuesto, sino en términos de entender cómo funciona todo. Pero hacer algunas cosas simples es bastante factible e interesante. GNU Radio también se utiliza convenientemente como un "laboratorio virtual" para la capacitación: puede conectar un osciloscopio virtual o un analizador de espectro a cualquier parte del circuito y ver cómo se ve la señal.
Si no hay ningún deseo individual, el tema de la recepción de SDR probablemente se puede cerrar: todos los puntos principales ya se han considerado, y el número de vistas desde la primera hasta la tercera parte cae
casi exponencialmente (aunque todavía se puede escribir sobre la transferencia, pero requiere un costo más " hardware "para pruebas que RTL SDR). Sin embargo, espero que algunos lectores entiendan cómo funciona esto. Bueno, todos los experimentos exitosos.