Aprendiendo Radio GNU con un Micrófono



Un artículo anterior sobre SDR y GNU Radio mostró que el tema es interesante para la comunidad. Dado que casi no hay información sobre el paquete de GNU Radio en ruso, y no todo está claro en inglés, decidí describir mis experiencias con GNU Radio.

Sobre SDR y GNU Radio, ya escribí en un artículo anterior . Permítame recordarle, mi objetivo es mostrar cómo interceptar e incluso irradiar una señal de radio para controlar dispositivos domésticos inteligentes (y de hecho IoT). Considero importante llamar la atención sobre la seguridad en IoT. Pero esto aún está muy lejos ... Para empezar, ¡tendría que tratar con GNU Radio!

No todos tienen un receptor SDR, y me pareció que sería útil mostrar lo que se puede hacer con GNU Radio con lo que todos tienen, es decir, el micrófono y los auriculares de su PC.

Debajo del corte algunos ejercicios interesantes con sonido.

Suena alrededor


Entonces, comencemos con uno simple: estudiar el espectro de sonidos alrededor. Asumimos que instaló el paquete GNU Radio o lanzó la imagen preparada de Ubuntu / Windows con GNU Radio. Si no, descargue una imagen basada en Ubuntu desde el sitio web de GNU Radio .

Comencemos creando un proyecto de captura de micrófono simple. Para hacer esto, agregue el bloque Fuente de audio, establezca sample_rate 48000 (muchas tarjetas funcionan a 44100 Hz, y no a 48000 Hz).

Puede averiguar el límite de su tarjeta en Linux de esta manera:
$ pactl list short sinks
0	alsa_output.pci-0000_00_03.0.hdmi-stereo	module-alsa-card.c	s16le 2ch 44100Hz	SUSPENDED
1	alsa_output.pci-0000_00_1b.0.analog-stereo	module-alsa-card.c	s16le 2ch 44100Hz	SUSPENDED

La pregunta surge de inmediato: ¿por qué 48 kHz? Después de todo, dicen, escuchamos detalles de hasta 20 kHz, y eso no es todo.
--, , 2 . , 24 — . .

48 44.1 — . , CD. .

De vuelta a nuestro esquema de Radio GNU. Conecte la fuente de audio WX FFT. No olvide reemplazar la GUI QT con la GUI WX en top_block, así como cambiar el tipo de entrada a Float. Y ahora correremos por el apartamento, haciendo diferentes sonidos. La física escolar nos dijo mucho sobre lo que veremos, pero todo esto se olvida, y siempre es más interesante verlo con nuestros propios ojos que leerlo en un libro de texto.

¡Lo primero que veremos es que nada es visible! Toda la parte significativa del espectro se concentra en los primeros 2 o 3 kHz. Bueno, ok, agreguemos un nuevo bloque entre la fuente y WX FFT: Rational Resampler: le permitirá cambiar la frecuencia de muestreo, dejando solo la parte correcta del espectro. Por conveniencia, crearemos un nuevo bloque de Variable (variable), llamaremos a remuestreo y estableceremos el valor, por ejemplo, 15. En el bloque de muestreador en el campo Decimación, ingrese el nombre de esta variable. Ahora, una señal con una frecuencia de muestreo igual a samp_rate / resamp, es decir en este bloque, en el campo Frecuencia de muestreo, debe insertar esta expresión. Ahora nuestra señal se extenderá a 1.5 kHz, que ya es mejor. Bueno, ahora todo es visible!

Entonces, comience con una nota para 440 Hz. Comprueba tu frecuencia de vozlimpieza Inmediatamente un hallazgo interesante (les recuerdo que debemos saber esto de la escuela): publicamos no una frecuencia, sino un conjunto de frecuencias múltiples: tonos y sobretonos. Quien tenga un piano u otro instrumento en casa, puede probarlo. Así es como la nota para la primera octava parece un piano.



Pero para la octava pequeña. Todo está como en el libro de texto: hay 2 veces más picos, el pico más bajo se ha vuelto 2 veces más bajo (220 Hz)



Las frecuencias múltiples no están presentes al azar. De hecho, en el caso de un piano / guitarra / ... (cuerdas) el sonido se extrae por la vibración de la cuerda. Y la cadena tiene dos extremos fijos, es decir solo se pueden emitir modos con una longitud de onda larga λ / 2 = L * n, donde n = 1,2,3 ...

Del mismo modo con la voz. Los ligamentos le permiten cambiar las características de la laringe, que actúa como un resonador (perdóneme a los amantes de la anatomía por nombres inexactos). Nuevamente, las paredes están fijas, hay puntos nodales en las vibraciones, es decir. de nuevo la misma fórmula para modos excitados.

Y ahora aplaudamos:


(azul - el espectro del "silencio", verde - el espectro del algodón)

Oh, aquí todas las frecuencias son visibles (¡preste atención a la escala de frecuencia y al nivel de señal en comparación con los gráficos de arriba!). Es lógico, porque el algodón es un aumento de la presión a corto plazo (muy fuerte), es decir. casi función δ, y su espectro contiene todas las frecuencias.

Puede ser usado por cierto. ¿Quién recuerda de los años 90 esos llaveros para encontrar teclas que comenzaron a emitir sonidos cuando silbaron? Fue una cosa conveniente. Entonces también reaccionaron al algodón, porque En el sonido del algodón también hay una frecuencia correspondiente al silbato.

Espectro del alfabeto


Ahora escuchemos a nosotros mismos. Diga diferentes letras del alfabeto y observe el espectro (preferiblemente sin remuestreo, para ver qué frecuencias se usan en el rango de 0-20 kHz). Una persona usa varios tipos de generación de sonido: labial (comenzando con la apertura de los labios, que crea muchas frecuencias a la vez), laringe, dental, lingual y nasal. Los silbidos y silbidos son especialmente interesantes (son la laringe y el diente): su espectro es muy amplio y se encuentra principalmente en el espectro> 2.5 kHz (para sonido "c" incluso> 5 kHz). Esto explica por qué las palabras con este sonido son difíciles de escuchar en el teléfono (en los viejos tiempos, el ancho de banda era de 3 kHz o incluso más bajo; intente agregar un filtro de paso bajo y envíe el resultado a Audio Sink con auriculares; el resultado se parecerá a un buen teléfono antiguo).

Quién tiene hijos, escúchelos: son mucho más fuertes, su voz contiene muchas frecuencias altas. Es por eso que su voz por teléfono siempre es extraña, y a menudo es simplemente imposible de entender (la distorsión de la voz es mucho mayor que la de un adulto).

Por cierto, traté de exprimirme la nota más alta. Bueno, no lo tomé por encima de 700 Hz. ¡El hijo tomó 1200 Hz! No esperaba tal limitación de mi parte, esto es menos del 5% del espectro que escucho. Me sentí defectuoso ...

Habla con los delfines


Bueno, no podemos sonar tan alto, así que usa esta banda para otra. Ahora tratemos de hacer la transmisión de voz a través del ultrasonido. Ponemos un filtro de paso bajo (bajas frecuencias) después del bloque de fuente de audio, lo multiplicamos por el coseno de 15 kHz (transfiriendo así nuestra señal 15 kHz más alto) y lo enviamos al altavoz (él hace frente a esto más o menos). Pero dicho archivo se puede escribir usando File Sink. Después de perder dicho archivo, un oyente externo no podrá analizar lo que se dice allí. Juego de espías en la clase de nivel 2.



Ahora hagamos lo contrario: restauraremos la señal codificada. Un micrófono portátil normal no acepta bien las frecuencias altas, pero desde un archivo es fácil (para nuestras pruebas es suficiente). La voz después de la recuperación es muy bien recibida.



Aproximadamente de esta manera, incluso puede transferir datos: aquíUn ejemplo de una interfaz de red basada en transmisión ultrasónica .

¡Este ejemplo muestra que puedes hacer mucho con GNU Radio y una tarjeta de sonido!

Descripción general de las unidades de radio GNU


GNU Radio tiene muchos bloques diferentes, y ordenarlos no es fácil. Y lo más difícil es entender lo que hay allí. A continuación daré solo los bloques más populares utilizados "en la vida cotidiana".

Operaciones matemáticas:

Agregar - adición de dos señales
Mulitly - multiplicación de dos señales (por ejemplo, para AM)
Agregar Const - agregar (restar) una constante (por ejemplo, cuando demodulando AM eliminar el componente DC)
Multiplicar Const - multiplica una señal por una constante (para amplificación, por ejemplo)
Char / Integer / Float / Complex a Char / Integer / Float / Complex - conversión de tipo de datos

Fuentes:

Fuente constante: una fuente que siempre produce el mismo valor
Fuente de señal: una fuente que produce una señal sinusoidal (para una señal sintética)
Fuente de audio / sumidero: captura de una tarjeta de sonido o salida a ella
Fuente de archivo / sumidero: lectura de un archivo (use Throttle para restricciones en la velocidad de lectura a la frecuencia de muestreo deseada) y escribir en el
archivo de fuente / sumidero del archivo Wav - leer / escribir el archivo
TCP / UDP WAV ; Fuente / sumidero - la capacidad de acoplar el proyecto con software de red a través de
sockets de fuente / sumidero osmocom TCP o UDP - recibir datos de
Fuente de vector RTL-SDR o HackRF One o transmisión (para HackRF One) - fuente de una secuencia de números

Filtros y modulación:

Filtro de paso bajo / alto / banda - filtros de paso de banda / frecuencia baja / alta frecuencia
Filtro FIR Xlating de frecuencia - combina cambio de frecuencia y filtro de paso bajo para seleccionar la banda de frecuencia deseada
AM / FM / GFSK / ... Mod / Demod - varios moduladores y demoduladores

Muestreo:

Rational Resampler: le permite convertir la secuencia entrante de muestras de una frecuencia de muestreo a otra mediante diezmado e interpolación (utilizado para "ajustar" a la frecuencia
de muestreo deseada ) Acelerador: limite la velocidad de envío de muestras a la frecuencia de muestreo deseada (si no hay bloques en el proyecto que limiten la velocidad procesamiento)
Retraso: retrasa el flujo en la cantidad deseada de muestras

Interfaz de usuario:

WX GUI FFT Sink - salida gráfica del espectro de señal
WX GUI Waterfall Sink - salida de potencia espectral en el modo "cascada" (a lo largo del eje X - frecuencia, a lo largo del tiempo Y, Z (color) - amplitud). Útil para encontrar la frecuencia de radiación de una fuente que rara vez se transmite en un rango dado.
WX GUI Constellation Sink - muestra el diagrama de fase de la señal (diferencia de fase entre las oscilaciones de las partes real e imaginaria de la señal)
WX GUI Scope Sink - osciloscopio

Varios:

Variable: una variable que le permite usar variables en lugar de números en una variedad de bloques
selectores: un multiplexor, en combinación con WX Slider, le permite "cambiar" las entradas y salidas de
paquete / desempaquetado sobre la marcha K bits - convierte de 0/1 bytes a una secuencia de K bits y viceversa bytes en una secuencia de bytes 0/1, correspondientes a bits (conveniente para codificar / decodificar paquetes; los bytes 0/1 pueden multiplicarse por el operador, por ejemplo)

¿Qué más necesitas saber sobre GNU Radio Companion (GRC)?


Todos los bloques en el GRC que tienen entradas o salidas requieren una definición de tipo de datos. El tipo de salida de un bloque debe ser el mismo que el tipo de entrada del bloque asociado con él. La salida de un bloque se puede transferir a varios bloques (es decir, dibujar varios enlaces). ¡Pero solo una transmisión puede ingresar una entrada!

La mayoría de los bloques tienen una documentación mínima en la pestaña de la ventana de configuración, así como en las notas al pie de los parámetros. Aunque generalmente esto no es suficiente. Un muelle un poco anticuado está aquí .

Todos los parámetros de bloque pueden ser expresiones de Python. Es decir en lugar de un número, puede sustituir una fórmula con la participación de variables definidas por bloques Variable.

A menudo desea "torcer" los parámetros del proyecto cambiando los valores de las variables. Para hacer esto, use el control deslizante WX o un componente de interfaz de usuario similar, usando su nombre en lugar de la variable deseada. Después de comenzar el proyecto, aparecerá un control deslizante en la interfaz de usuario. Esto es conveniente para ajustar la frecuencia o los parámetros del filtro.

Los errores en el tipo de enlaces o en los parámetros del bloque se resaltan en rojo. También bloquean el inicio del proyecto (en la configuración del bloque resaltado en rojo puede leer sobre el problema). Hay errores de tiempo de ejecución que aparecen incluso cuando se inicia el proyecto: el registro en la parte inferior de la ventana de GRC le indicará cuál es el problema.

Algunos bloques requieren un número entero como parámetro. La sustitución de fórmulas puede conducir a una falta de coincidencia de tipos. Use la función Python int () para convertir a un entero.

Para deshabilitar el bloqueo, use Deshabilitar / Habilitar. Esto permitirá no eliminar el bloque, sino simplemente excluirlo del proyecto por un tiempo al guardar todos los parámetros ingresados.

Todos los esquemas en GRC se convierten en scripts de Python, lo que le permite cambiarlos más tarde, así como automatizar algunos procesos sin pasar por GRC.

A menudo es conveniente guardar una señal de sonido / radio en un archivo para su posterior análisis. Para hacer esto, use el bloque de sumidero de archivos. Tenga en cuenta que al leer un archivo, debe recordar el formato de datos utilizado al escribir (tipo de número), así como la frecuencia de muestreo. Recomiendo incluir estos valores en el nombre del archivo además de la descripción de la señal grabada, esto le permitirá recordar cómo leerla más tarde.

Cuando juegues desde un archivo, asegúrate de usar el bloque Throttle para limitar la velocidad de lectura. Esto no es necesario si hay otro bloque en el circuito que limita físicamente la velocidad de lectura de datos. Por ejemplo, el bloque Audio Sink limita la velocidad de los datos que se le proporcionan como se especifica en su configuración de frecuencia de muestreo.

Use el icono de lupa en la barra de herramientas para encontrar el bloque que necesita. Al hacer doble clic en el nombre en la lista de bloques disponibles, se agregará el bloque al proyecto. En su lugar, puede arrastrarlo desde la lista a la ubicación deseada en el proyecto.

Intente colocar convenientemente bloques en el proyecto. Esto no afecta nada más que la legibilidad.

Espero que este artículo aliente a alguien a experimentar con el sonido.

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


All Articles