Analisador de Espectro de Banda Larga com um RTL-SDR

Para a maioria dos utilizadores do RTL-SDR, a cascata (waterfall) é o auge do software de rádio. Mas há alguns problemas que me incomodam.

     – Exibição de frequência limitada. Normalmente, não pode fazer mais do que a largura de banda nativa do seu SDR permite.

     – Exibição por tempo limitado. Ela simplesmente rola da borda para o vazio.

     – Blocos (bins) de FFT limitados. Normalmente, não funciona tão bem quando você deseja substancialmente mais blocos do que pixels que sua tela possui.

     – Renderização qualitativa. Não é fácil relacionar cores com dB.

Rtl_power foi mencionado ligeiramente em posts anteriores, e agora chegou a vez de uma abordagem mais detalhada desse “scanner” de frequências. Suas características únicas incluem:

     – Faixa de frequência ilimitada. Você pode escanear toda a banda, de 24Mhz a 1.766Ghz, de um dongle.

     – Tempo ilimitado. Pelo menos até ficar sem espaço no disco para o log.

     – Blocos (bins) de FFT teoricamente ilimitados.

     – Renderização quantitativa. Os níveis exatos de potência são registrados.

     – É executado em qualquer máquina. Um computador mais lento usará menos amostras.

Novos termos relativos aos parâmetros FFT (Fast Fourier Transform), tais como: window size, FFT size, FFT bin, etc., estarão presentes neste post. Aconselho ao leitor interessado fazer uma busca para um melhor entendimento do que será exposto. No entanto, explicarei o help do rtl_power, o que considero um bom começo:

rtl_power – Referência Completa

A seguir, alguns comentários ao help do rtl_power

$ rtl_power -h

Sintaxe:  rtl_power -f faixa_de_frequência [-opções] [nome_do_arquivo]

-f <inferior:superior:tamanho_do_bloco[Hz]>

Define uma faixa de frequência. Os valores podem ser especificados como um número inteiro (89100000), um número flutuante (89.1e6) ou como um sufixo métrico (89,1M). O tamanho do bloco pode ser ajustado para facilitar a matemática. Os tamanhos válidos do bloco estão entre 0,1Hz e 2,8MHz. As faixas de frequências podem ser de qualquer tamanho.

-i <intervalo de integração> (padrão: 10 segundos)]

Coleta dados por esse período de tempo, relata e repete. Suporta ‘s/m/h’ como sufixo de unidades. O padrão é 10 segundos. O tempo mínimo é de 1 segundo, mas para faixas extremamente grandes pode levar mais de 1 segundo para executar toda a varredura.

-1 <disparo único>, padrão desativado.

Executa um único intervalo de integração, relata e sai. Não é necessário usar -e com esta opção.

-e <tempo_de_execução>

Executa pelo menos esse período de tempo e sai. O padrão é “para sempre”. Suporta unidades ‘s/m/h’.

-d <índice do dispositivo>

Ao usar vários dongles, isso indica qual. Você também pode identificar dongles pelo texto no campo número de série da EEPROM.

-g <ganho>

Um valor de ganho de ponto flutuante. O dongle usará a configuração de ganho mais próxima disponível.

-p <erro ppm>

Corrige o erro em partes por milhão no cristal. Isso substituirá um valor de ppm recuperado do eeprom.

-T habilita bias-T na GPIO PIN 0 (para dispositivos rtl-sdr v3

nome_do_arquivo

(um ‘-‘ direciona a saída para stdout, omitir o nome_do_arquivo também direciona para stdout)

Se você deseja transmitir diretamente para um arquivo, forneça o nome do arquivo como argumento final. Em algumas plataformas, isso pode atingir um limite de 2 GB. Use o redirecionamento de saída (rtl_power …> log.csv) para obter um tamanho ilimitado de arquivo.

-w <janela>

A janela é uma função de modelagem aplicada aos dados antes da FFT. O padrão é nenhum (também conhecido como boxcar, retangular). As opções incluem: hamming, blackman, blackman-harris, hann-poisson, bartlett e youssef.

-c <percentagem de corte>

O corte define quanto da largura de banda deve ser descartada. 0% não descarta nada, 100% descarta tudo. As bordas do espectro são de qualidade inferior à do meio. Há menos sensibilidade, ganho de roll-off e aliasing fora da banda. Valores mais altos produzirão um espectro melhor, mas é mais lento. Os valores podem ser um decimal (-c 0,1) ou uma porcentagem (-c 10%). O corte padrão é 0%, o corte sugerido está entre 20% e 50%. Eu costumo usar 20%

Essa configuração não tem efeito em blocos maiores que 1 MHz.

-F <0~9>

Configura o filtro de baixa resolução. A redução da amostragem é usada apenas quando a faixa total de largura de banda está abaixo de 1 MHz. A omissão da opção -F usa o downsampler padrão, retangular. Esse downsampler é muito rápido, mas apresenta vazamento espectral ruim.

Os filtros com vazamento mínimo são -F 0 e -F 9. 0 é um filtro simples, mas apresenta uma inclinação ruim nas bordas do espectro. 9 usa o mesmo filtro que 0, mas possui um filtro FIR de 9 pontos para corrigir a queda. Sugere-se usar 0 com -c 50%.

-P

Ativa a retenção de pico. O comportamento padrão é calcular a média ao longo do tempo. A retenção de pico usa o valor máximo ao longo do tempo. Observe que a média melhora o SNR e a retenção de pico tenderá a fazer um espectro parecer muito pior.

-D

Ativa amostragem direta. Requer que você tenha modificado o dongle primeiro para amostragem direta.

-O

Ativa o ajuste de offset. Aplica-se apenas a sintonizadores E4000.

Formato de saída

Rtl_power produz um arquivo CSV compacto com redundância mínima. As colunas são: data, hora, Hz baixo, Hz alto, Hz passo, amostras, dB, dB, dB, …

A data e a hora se aplicam em toda a linha. A frequência exata de um valor de dB pode ser encontrada por (hz_baixo+N*hz_passo). A coluna de amostras indica quantos pontos foram inseridos em cada média.

Exemplos:

$ rtl_power -f 88M:108M:125k fm_stations.csv

       cria 160 (20M/125K) blocos ao longo da banda de FM

$ rtl_power -f 100M:1G:1M -i 5m -1 survey.csv

      cinco minutos de varredura em baixa resolução

$ rtl_power -f ... -i 15m -1 log.csv

      integra por 15 minutos e encerra

$ rtl_power -f ... -e 1h | gzip > log.csv.gz

      coleta datos durante uma hora e comprime o arquivo .csv)

Um uso prático para o rtl_power é o comando:

$ rtl_power -f 85M:110M:50k -g 20  fm_band.csv

Isso fará uma medida periódica da potência na banda de 85MHz a 110MHz em passos de 43.4kHz. Significa uma varredura de 25MHz/2.777MHz=9 segmentos espectrais. Cada segmento possui 2.777MHz/43.4kHz=64 blocos (bins). O total de blocos (bins) é então 576 (64×9).

Note que o tamanho do bloco no comando (50k) é um bloco máximo, um tamanho menor e mais conveniente (FFT bin size: 43402.77Hz) foi usado.

Na prática, aplica-se o seguinte:

    – Um pequeno comprimento de bloco resulta em rápidas repetições de medição com uma resolução de frequência grosseira.

    – Um grande comprimento de bloco resulta em repetições de medição mais lentas e com melhor resolução de frequência.

Renderização

Rtl_power registra dados em um arquivo de texto CSV simples. Isso não é fácil para os olhos. Existem alguns scripts, utilitários e interfaces para converter a saída em gráficos.

heatmap.py – Com um script python, um “mapa de calor” pode ser gerado a partir dos dados do excel. Pode ser baixado em https://github.com/keenerd/rtl-sdr-misc/

Essa ferramenta de linha de comando é um pouco semelhante ao plug-in Scanner Metrics SDRSharp, que permite que grandes áreas do espectro de freqüência sejam monitoradas no SDRSharp. Não baixe agora, veja a nota sobre o RTL_SpectrumSweeper abaixo.

flatten.py – Outro script em python para “achatar” dados do .csv gerado pelo rtl_power em uma única coluna. Ao baixar o heatmap.py no endereço indicado acima ele vem junto. Útil para gerar gráficos de ruído. Não baixe agora, veja a nota sobre o RTL_SpectrumSweeper abaixo..

ViewRF – Analisador de espectro para o Beaglebone Black.

RTL_SDR_Wide_Spectrum_Analyzer – Um front-end escrito em Gambas. Gosto muito desse, falarei dele adiante.

GUI for rtl_power – apenas Windows.

RTL-SDR Panoramic Spectrum Analyzer – somente Windows.

Script

Com uma pequena quantidade de Awk/Perl/Python/outras_coisas, pode-se montar rapidamente ferramentas personalizadas. Por exemplo, se você deseja fazer um medidor de potência com banda de 500 MHz:

rtl_power -f 950M:1450M:3.2M -g 30 -i 1 | awk 'BEGIN {t=0} {if (t==0) {t=$2; n=0; s=0}; if (t==$2) {s+=$7; n++} else {print s/n; t=0}}'

A cada dois segundos, ele produzirá a média, em dB, de toda a faixa. Aqui, o pós-processamento é um pouco mais simples, porque está operando no modo de “bloco amplo” e cada linha possui apenas um único valor de dB.

RTL_SpectrumSweeper

Uma GUI do rtl_power para automatizar a varredura de espectro.

Os requisitos são:

Python >= 3.3

rtl_power

heatmap.py (veja a nota abaixo)

flatten.py (veja a nota abaixo)

NOTA: As versões corretas do heatmap.py e flatten.py que funcionam com este aplicativo podem ser encontradas aqui. No entanto, quando o RTL_SpectrumSweeper é executado pela primeira vez, ele verifica a existência desses arquivos. Se não conseguir encontrá-los, ele os baixará do local indicado acima.

Não precisa instalação, é só baixar e executar

$ git clone https://github.com/davesmotleyprojects/RTL_SpectrumSweeper.git
$ cd RTL_SpectrumSweeper

Agora é só rodar:

$ python RTL_SpectrumSweeper.py  -i 3s -g 28 -f 88M:108M:10k test.csv

A sintaxe é:

python RTL_SpectrumSweeper.py [opt1] [opt2] [FILENAME]

[opt1] inclui todas (ou nenhuma) opções do RTL_SpectrumSweeper, que são:

-a [0,1,N]

Define as proporções da imagem da cascata. Valores válidos são [0,1,N] (inteiros). Padrão=1.

Um valor 0 permitirá que a cascata se adapte para preencher o espaço da imagem.

Um valor 1 forçará a cascata se ajustar proporcionalmente do espaço da imagem.

Um valor de N forçará o espaço da imagem da cascata a uma altura de N pixels.

-s [0,1,N]

ajusta o valor de parada) valores válidos são [0,1,N] (inteiro) (padrão=1)

Um valor 0 desativará a parada automática.

Um valor 1 interromperá automaticamente a varredura de espectro quando o espaço da imagem em cascata for preenchido.

Um valor de N interromperá automaticamente a varredura do espectro quando o número de varreduras realizadas=N.

-o

Define o valor do deslocamento de frequência (frequency offset) os valores válidos são inteiros em Hz. (padrão=0). Isso é útil ao usar um upconverter. Por exemplo, ao usar um “Ham It Up”, o valor correto seria ‘-o -125000000’.

–ratio [total_rows:spectrum_rows]

Define total de linhas (spectrum_rows). Os valores válidos são inteiros separados por dois pontos. (padrão = ‘3: 1’)

O primeiro valor (total_rows) define o número total de linhas na janela de plotagem.

O segundo valor (spectrum_rows) define o número de linhas alocadas ao gráfico de espectro.

As linhas alocadas à cascata serão total_rows-spectrum_rows.

O total_rows deve ser > spectrum_rows

–palette

Define a paleta de cores. Os valores válidos são “default, extended, charolastra, twente, custom”. Para usar as configurações –rgbxy, a paleta deve ser definida como “custom”

–rgbxy [R:G:B:X:Y]

Todos os valores são [0-255] separados por dois pontos.

Os valores R G B correspondem aos códigos de cores RGB. (por exemplo, “0 255 255” = CIANO(Azul Claro), “0 255 127” = VERDE PRIMAVERA)

X define o contraste (índice de início da cor).

Y define o brilho (índice de parada de cores).

O valor X deve ser menor que o valor Y. ‘)

[opt2] [FILENAME] são as opções necessárias para rtl_power. Digite os valores exatamente como faria ao usar rtl_power na linha de comandos.

Em https://github.com/davesmotleyprojects/RTL_SpectrumSweeper tem também o procedimento para inatalação no Windows

EXEMPLOS:

$ python3 RTL_SpectrumSweeper.py -a 101 -s 101 --palette twente -P -i 3s -e 60m -g 28 -f 88M:108M:10k -c 20% fm_band.csv

Salve no icone da barra inferior e e depois abra com o seu aplicativo de imagem preferido

Para observar o ruido gerado pelo seu notebook, desconecte a antena e faça uma varredura em toda a banda do rtl-sdr:

$ python3 RTL_SpectrumSweeper.py -f 24M:1700M:50k -c 20% -1 noise-full_band.csv

Também é possível usar o heatmap.py para gerar uma imagem da cascata a partir de arquivo fm_band.csv

$ python3 heatmap.py fm_band.csv fm_band.png
Use o eog (Eye of GNOME

Ou carregar o fm_band.csv no matlab

Para visualizar a cascata no matlab, faça o download deste script HM.m e carregue o fm_band.csv no Matlab com   

>> d = HM('/caminho_qualquer/fm_band.csv');
>> mv = min(min(d));
>> imshow(d,[mv,0]); 

Os valores estão em dBm e são todos negativos. Geralmente eles variam de -40 a 0. A função imshow () está na caixa de ferramentas de processamento de imagem. Ainda vou melhorar o script HM.m

Calma! Matlab fica para um próximo post!!!

RTL_SDR_Wide_Spectrum_Analyzer

Basicamente, é uma interface gráfica para, usando o rtl_power, visualizar e controlar o espectro.

Pré-requisitos:

      – rtl_sdr

      – gqrx

      – gnuradio

      – gambas3

O software é escrito na linguagem “Gambas”

Nesta página existem pacotes para o Ubuntu e para outras versões do Linux.

Antes de testar este programa, sugiro:

  1. Instalar o Gambas
$ sudo apt install gambas3
  • Verificar se Gnuradio, rtl-sdr e gqrx estão instalados
$ gnuradio-companion
$ rtl_test
$ gqrx

PARA DOWNLOAD DO PACOTE para Ubuntu, CLIQUE AQUI

Um ícone será criado. undefined

Ou você pode iniciar com o segunte comando:

$ RTL_wide_Spectrum_analyzer2

Obs: usei, neste post, a antena nativa do RTL-SDR; por isso me limitei a explorar a banda de FM comercial 88MHz a 108MHz.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google

Você está comentando utilizando sua conta Google. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s