Aprendendo o rádio GNU com um microfone



Um artigo anterior sobre SDR e GNU Radio mostrou que o tópico é interessante para a comunidade. Dado que quase não há informações sobre o pacote GNU Radio em russo, e nem tudo está claro em inglês, decidi descrever minhas experiências com o GNU Radio.

Sobre SDR e GNU Radio, eu já escrevi em um artigo anterior . Deixe-me lembrá-lo, meu objetivo é mostrar como interceptar e até irradiar um sinal de rádio para controlar dispositivos domésticos inteligentes (e de fato a IoT). Considero importante chamar a atenção para a segurança na IoT. Mas isso ainda está muito longe ... Para começar, eu teria que lidar com a GNU Radio!

Nem todo mundo tem um receptor SDR, e pareceu-me que seria útil mostrar o que pode ser feito com o GNU Radio com o que todos têm - a saber, o microfone e os fones de ouvido do seu PC.

Sob o corte, alguns exercícios interessantes com som.

Soa ao redor


Então, vamos começar com um simples: estudar o espectro de sons ao redor. Assumimos que você instalou o pacote GNU Radio ou lançou a imagem Ubuntu / Windows preparada com o GNU Radio. Caso contrário, baixe uma imagem baseada no Ubuntu no site da GNU Radio .

Vamos começar criando um projeto simples de captura de microfone. Para fazer isso, adicione o bloco Fonte de áudio, defina samp_rate 48000 (muitas placas funcionam em 44100 Hz e não em 48000 Hz).

Você pode descobrir o limite da sua placa no Linux assim:
$ 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

Surge imediatamente a pergunta: por que 48 kHz? Afinal, eles dizem, ouvimos detalhes de até 20 kHz, e isso não é tudo.
--, , 2 . , 24 — . .

48 44.1 — . , CD. .

De volta ao nosso esquema de rádio GNU. Conecte a fonte de áudio WX FFT. Não se esqueça de substituir a GUI do QT pela GUI do WX em top_block, bem como alterar o tipo de entrada para Flutuar. E agora vamos dar uma volta pelo apartamento, emitindo sons diferentes. A física da escola nos contou muito sobre o que veremos, mas tudo isso é esquecido, e é sempre mais interessante ver com seus próprios olhos do que ler em um livro didático.

A primeira coisa que veremos é que nada é visível! Toda a parte significativa do espectro está concentrada nos primeiros 2 ou 3 kHz. Bem, ok, vamos adicionar um novo bloco entre a fonte e o WX FFT: Rational Resampler - permitirá alterar a taxa de amostragem, deixando apenas a parte correta do espectro. Por conveniência, criaremos um novo bloco Variável (variável), chamaremos resamp e definiremos o valor, por exemplo, 15. No bloco resampler no campo Decimation, insira o nome dessa variável. Agora, um sinal com uma taxa de amostragem igual a samp_rate / resamp, ou seja, Neste bloco, no campo Taxa de Amostra, você precisa inserir esta expressão. Agora nosso sinal se estenderá para 1,5 kHz, o que já é melhor. Bem, agora tudo está visível!

Portanto, comece com uma nota para 440 Hz. Verifique sua voz quanto à frequêncialimpeza. Imediatamente um achado interessante (lembro-lhe, devemos saber isso da escola): publicamos não uma frequência, mas um conjunto de múltiplas frequências - tom e conotação. Quem tem um piano ou outro instrumento em casa, pode experimentá-los. É assim que a nota da primeira oitava se parece com um piano.



Mas para a pequena oitava. Tudo está como no livro didático - há 2 vezes mais picos, o pico mais baixo tornou-se 2 vezes mais baixo (220 Hz)



Freqüências múltiplas não estão presentes aleatoriamente. De fato, no caso de um piano / violão / ... (cordas), o som é extraído pela vibração da corda. E a cadeia tem duas extremidades fixas, ou seja, somente modos com comprimento de onda longo λ / 2 = L * n podem ser emitidos, onde n = 1,2,3 ...

Da mesma forma com a voz. Os ligamentos permitem alterar as características da laringe, que atua como um ressonador (perdoe-me amantes de anatomia por nomes imprecisos). Novamente, as paredes são fixas, existem pontos nodais nas vibrações, ou seja, novamente a mesma fórmula para modos animados.

E agora vamos aplaudir:


(azul - o espectro do "silêncio", verde - o espectro do algodão)

Oh, aqui todas as frequências são visíveis (preste atenção à escala de frequências e ao nível do sinal em comparação com os gráficos acima!). É lógico, porque o algodão é um aumento de pressão a curto prazo (muito acentuado), ou seja, quase δ-função, e seu espectro contém todas as frequências.

Pode ser usado a propósito. Quem se lembra dos anos 90 desses porta-chaves por encontrar chaves que começaram a emitir sons quando assobiaram? Foi uma coisa conveniente. Então eles também reagiram ao algodão, porque ao som do algodão, há também uma frequência correspondente ao apito.

Espectro do alfabeto


Agora vamos nos ouvir. Diga letras diferentes do alfabeto e observe o espectro (de preferência sem reamostragem, para ver quais frequências são usadas na faixa de 0 a 20 kHz). Uma pessoa usa vários tipos de geração de som: labial (começando com a abertura dos lábios, que cria muitas frequências ao mesmo tempo), laringe, dental, lingual e nasal. Os sons de assobios e assobios são especialmente interessantes (são a laringe e o dente) - seu espectro é muito amplo e está localizado principalmente no espectro> 2,5 kHz (para o som "c" até> 5 kHz). Isso explica por que as palavras com esse som são difíceis de ouvir no telefone (antigamente, a largura de banda era de 3 kHz ou até menor - tente adicionar um filtro passa-baixo e envie o resultado ao Audio Sink com fones de ouvido - o resultado será semelhante a um bom e velho telefone com fio).

Quem tem filhos, ouça-os - eles são muito mais altos, sua voz contém muitas frequências altas. É por isso que a voz deles no telefone é sempre estranha, e muitas vezes é simplesmente impossível entendê-las (a distorção da voz é muito maior do que a de um adulto).

A propósito, tentei arrancar a nota mais alta de mim. Bem, eu não levei acima de 700 Hz. O filho levou 1200 Hz! Eu não esperava essa limitação de mim mesmo - isso é menos de 5% do espectro que ouço. Eu me senti falho ...

Fale com os golfinhos


Bem, ok, não podemos soar tão alto, então use essa banda para outra. Agora vamos tentar fazer a transmissão de voz através do ultra-som. Colocamos um filtro passa-baixo (passa-baixo) após o bloco da fonte de áudio, multiplicamos pelo cosseno de 15 kHz (transferindo nosso sinal 15 kHz mais alto) e o enviamos para o alto-falante (ele lida com isso mais ou menos). Mas esse arquivo pode ser gravado usando o File Sink. Tendo perdido esse arquivo, um ouvinte de terceiros não poderá analisar o que é dito lá. Jogo de espião na classe de nível 2.



Agora vamos fazer o oposto - vamos restaurar o sinal codificado. Um microfone de laptop comum não aceita bem as altas frequências, mas a partir de um arquivo é fácil (para os nossos testes é suficiente). A voz após a recuperação é muito bem recebida.



Aproximadamente dessa maneira, você pode até transferir dados: aquiUm exemplo de uma interface de rede baseada em transmissão ultrassônica .

Este exemplo mostra que você pode fazer muito com o GNU Radio e uma placa de som!

Visão Geral das Unidades de Rádio GNU


O GNU Radio tem muitos blocos diferentes, e classificá-los não é fácil. E o mais difícil é entender o que existe. Abaixo darei apenas os blocos mais populares usados ​​"na vida cotidiana".

Operações matemáticas:

Adicionar adição de dois sinais
Mulitly - multiplicação de dois sinais (por exemplo, para AM)
Adicionar Const - adicionar (subtrair) uma constante (por exemplo, ao desmodular AM remover o componente DC)
Multiply Const - multiplicar um sinal por uma constante (por amplificação, por exemplo)
Char / Integer / Float / Complex para Char / Inteiro / Float / Complex - conversão de tipos de dados

Fontes:

Fonte constante - uma fonte que sempre produz o mesmo valor
Fonte de sinal - uma fonte que produz um sinal sinusoidal (para um sinal sintético)
Fonte / coletor de áudio - captura de uma placa de som ou saída para ele
Fonte / coletor de arquivos - leia um arquivo (use o acelerador para restrições na velocidade de leitura para a taxa de amostragem desejada) e gravar no
arquivo Source / Sink do arquivo Wav - ler / gravar o arquivo WAV
TCP / UDP; Source / Sink - a capacidade de conectar o projeto ao software de rede via
soquetes de Source / Sink osmocom TCP ou UDP - receber dados de RTL-SDR ou HackRF One ou
fonte vetorial de transmissão (para HackRF One) - fonte de uma sequência de números

Filtros e modulação:

Filtro passa baixa / alta / passa banda - filtros de baixa frequência / alta frequência / passa banda
Filtro FIR Xlating de frequência - combina desvio de frequência e filtro passa-baixo para selecionar a faixa de frequência desejada
AM / FM / GFSK / ... Mod / Demod - vários moduladores e demoduladores

Amostragem:

Rational Resampler - permite converter a sequência de amostras recebida de uma taxa de amostra para outra por dizimação e interpolação (usada para "ajustar" à taxa de amostra desejada).
Regulador de pressão - limita a velocidade de envio de amostras à taxa de amostra desejada (se não houver blocos no projeto que limitem a velocidade processamento)
Delay - retarda o fluxo para o número desejado de contagem

UI:

WX GUI FFT Sink - saída gráfica do espectro de sinal
WX GUI Sink Waterfall - saída de potência espectral no modo "cascata" (ao longo do eixo X - frequência, ao longo do tempo Y, Z (cor) - amplitude). Útil para encontrar a frequência de radiação de uma fonte que raramente transmite em um determinado intervalo.WX
GUI Constellation Sink - exibe o diagrama de fases do sinal (diferença de fase entre as oscilações das partes reais e imaginárias do sinal)
WX GUI Sink Scope - osciloscope

Diversos:

Variável - uma variável que permite o uso de variáveis ​​em vez de números em vários blocos
seletores - um multiplexador, em combinação com o WX Slider, permite "ligar
/ desligar " Empacotar / Descompactar entradas e saídas K bits - converte de 0/1 bytes em uma sequência de K bits e vice-versa bytes em uma sequência de bytes 0/1, correspondente a bits (conveniente para pacotes de codificação / decodificação - os bytes 0/1 podem ser multiplicados pela operadora, por exemplo)

O que mais você precisa saber sobre o GNU Radio Companion (GRC)?


Todos os blocos no GRC que possuem entradas ou saídas requerem uma definição de tipo de dados. O tipo de saída de um bloco deve ser o mesmo que o tipo de entrada do bloco associado a ele. A saída de um bloco pode ser transferida para vários blocos (isto é, desenha vários links). Mas apenas um fluxo pode inserir uma entrada!

A maioria dos blocos possui documentação mínima na guia na janela de configurações, bem como nas notas de rodapé dos parâmetros. Embora geralmente isso não seja suficiente. Uma doca um pouco desatualizada está aqui .

Todos os parâmetros de bloco podem ser expressões Python. I.e. em vez de um número, você pode substituir uma fórmula pela participação de variáveis ​​definidas por blocos de variáveis.

Muitas vezes, você deseja "torcer" os parâmetros do projeto alterando os valores das variáveis. Para fazer isso, use o WX Slider ou um componente similar da interface do usuário, usando seu nome em vez da variável desejada. Depois de iniciar o projeto, um controle deslizante aparecerá na interface do usuário. Isso é conveniente para sintonizar os parâmetros de frequência ou filtro.

Erros no tipo de links ou nos parâmetros do bloco são destacados em vermelho. Eles também bloqueiam o lançamento do projeto (nas configurações do bloco destacadas em vermelho, você pode ler sobre o problema). Existem erros em tempo de execução que aparecem mesmo quando o projeto é iniciado - o log na parte inferior da janela do GRC informa qual é o problema.

Alguns blocos requerem um número inteiro como parâmetro. A substituição da fórmula pode levar à incompatibilidade de tipos. Use a função Python int () para converter em um número inteiro.

Para desativar o bloco, use Desativar / Ativar. Isso permitirá não excluir o bloco, mas simplesmente excluí-lo do projeto por um tempo, salvando todos os parâmetros inseridos.

Todos os esquemas no GRC são convertidos em scripts Python, o que permite alterá-los posteriormente, além de automatizar alguns processos ignorando o GRC.

Muitas vezes, é conveniente salvar um sinal de som / rádio em um arquivo para análise posterior. Para fazer isso, use o bloco coletor de arquivos. Observe que, ao ler um arquivo, é necessário lembrar o formato de dados usado ao escrever (tipo de número), bem como a taxa de amostragem. Eu recomendo incluir esses valores no nome do arquivo, além da descrição do próprio sinal gravado - isso permitirá que você se lembre de como lê-lo mais tarde.

Ao reproduzir de um arquivo, use o bloco do acelerador para limitar a velocidade de leitura. Isso não é necessário se houver outro bloco no circuito que limite fisicamente a velocidade da leitura dos dados. Por exemplo, o bloco Coletor de áudio limita a velocidade dos dados fornecidos, conforme especificado nas configurações de Taxa de amostra.

Use o ícone de lupa na barra de ferramentas para encontrar o bloco que você precisa. Clicar duas vezes no nome na lista de blocos disponíveis adicionará o bloco ao projeto. Em vez disso, você pode arrastá-lo da lista para o local desejado no projeto.

Tente colocar convenientemente os blocos no projeto. Isso não afeta nada além de legibilidade.

Espero que este artigo incentive alguém a experimentar o som.

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


All Articles