4 Software de deteção do sinal do beacon
4.2 Implementação do software no GNURadio
Como foi referido o GNURadio é uma plataforma de desenvolvimento de software que dispo-nibiliza blocos totalmente funcionais já programados para construção do diagrama de blocos, de ma-neira a efetuar toda a análise de sinal proveniente de sistemas SDR ou do gerador da plataforma.
Assim, é possível desenvolver um sistema rádio maioritariamente ou totalmente em software.
O GNURadio Companion (GRC) é constituído pela interface gráfica apresentada na seguinte Figura 15.
Figura 15: Interface gráfica do GNURadio Companion (GRC).
A partir dessa interface é possível elaborar o diagrama de blocos, essencial ao desenvolvi-mento do software [29]. Na figura anterior, a zona da interface gráfica assinalada a azul é onde se interligam e se desenvolve o diagrama de blocos. A zona assinalada a verde é onde se encontra o terminal do GNURadio e o espaço marcado a laranja mostra todas as variáveis utilizadas no diagrama de blocos.
No espaço lateral assinalado a cinzento está representada a lista de blocos necessários para o desenvolvimento do diagrama na zona assinalada a azul. Por último, na área assinalada a encarnado, está presente a barra de ferramentas.
Frequentemente é necessário recorrer ao desenvolvimento dos próprios blocos, de maneira a satisfazer as necessidades particulares de um projeto, visto que o GNURadio não apresenta todos os blocos necessários para a execução de determinadas funcionalidades. O trabalho desenvolvido nesta dissertação precisou de desenvolver/adaptar vários blocos.
É possível desenvolver o código para esses blocos em linguagem C ou em linguagem Python, no entanto optou-se pela linguagem Python versão 3.x, tendo sido escolhida esta última pelo seu nível de simplicidade e eficácia neste tipo de aplicações. Esta nova versão Python 3.x apresenta significati-vos melhoramentos a nível de organização, de simplicidade e de performance em relação à anterior versão 2.x [30], tendo sido este o principal fator pela seleção desta última versão.
O objetivo principal do software desenvolvido consiste no processamento do sinal que chega ao computador, oriundo do USRP via USB em forma de stream. Para esse fim, recorre-se à FFT de maneira a que os dados sejam tratados no domínio da frequência, possibilitando o cálculo das gran-dezas referidas anteriormente: Co, Cx, CNR, NSD, fase e frequência do sinal. Estas grangran-dezas são ob-tidas com uma taxa de 1 S/s e 8 S/s e são guardadas em ficheiros binários distintos. Pretendeu-se também visualizar simultaneamente, em tempo real e numa interface gráfica, todas as grandezas des-critas anteriormente e obtidas a uma taxa de 1 S/s. Isto permite monitorizar os resultados experimen-tais de uma forma qualitativa.
A organização e as funcionalidades dos blocos mais importantes utilizados ou desenvolvidos usando a plataforma GNURadio no âmbito desta dissertação estão representados no esquema da Fi-gura 16.
Figura 16: Diagrama de funcionamento geral do software desenvolvido no GNURadio.
A nível prático o diagrama representado na figura anterior corresponde aos diagramas de blo-cos GNURadio representados na Figura 17 e na Figura 18.
Figura 17: Diagrama de blocos GNURadio utilizado para processamento de sinal com resolução de 1 S/s.
Na Figura 17 foi utilizada uma fa (“Samp Rate (Sps)” no bloco “UHD: USRP Source”) relativa-mente elevada de 524.288 kHz, de forma a obter uma maior LB na FFT do sinal, de maneira a calcular a NSD com uma menor variância.
Figura 18: Diagrama de blocos GNURadio utilizado para processamento de sinal com resolução de 8S/s.
Comparando a Figura 17 e a Figura 18 verifica-se que os blocos utilizados para o funciona-mento do diagrama orientado para produzir amostras de 1S/s e do diagrama para produzir amostras de 8 S/s diferem apenas do bloco “Grafico”. Este bloco é utilizado para representar graficamente e em tempo-real os dados das variáveis guardadas no ficheiro binário de resolução 1S/s. De resto, foram utilizados os mesmos blocos para ambos os diagramas diferindo apenas o valor da resolução utilizada nos cálculos.
É importante salientar que os dois diagramas compõem um diagrama geral que efetua o pro-cessamento existindo apenas um bloco “UHD: USRP Source” conectado a ambos os dois diagramas, como representado no diagrama da Figura 16. Tendo sido apenas separadas as partes do diagrama responsável pela obtenção dos dados a 1S/s e a parte do diagrama responsável pela obtenção dos dados a 8 S/s, representados na Figura 17 e na Figura 18, devido à impossibilidade de o representar numa única imagem devido às grandes dimensões da interface gráfica GRC.
Resumidamente, o primeiro bloco do diagrama corresponde ao bloco “UHD:USRP Source” do GNURadio [31]. Este bloco, representado na Figura 19 executa a receção do sinal digital (stream de dados) proveniente do USRP, apresentando como principais parâmetros de entrada os exibidos na Tabela 3.
Figura 19: Bloco UHD: USRP Source.
Tabela 3: Principais parâmetros do bloco UHD: USRP Source.
Parâmetro Função
Num Mboards Definir o número de dispositivos SDR conecta-dos.
Parâmetro Função
Num Channels Definir o número de entradas ativas no disposi-tivo SDR.
Samp rate (S/s) Definir a fa do sinal do SDR.
Center freq (Hz) Definir frequência do sinal processado pelo SDR.
Gain Value (dB) Definir o ganho interno do SDR.
Bandwidth (Hz) Definir largura de banda.
Na tabela anterior o parâmetro “Num Channels” referente ao número de entradas do SDR que, para a presente tese são duas, sendo uma delas para medir a amplitude do Co e a segunda para medir a amplitude do Cx.
A frequência de sampling utilizada, fa, foi de 524.288 kHz, a frequência do sinal foi de 600 MHz (escolhida por ser igual à do recetor que pretende substituir) e o ganho interno do SDR nos testes executados foi respetivamente de 0 dB, 20 dB e 30 dB. Relativamente à largura de banda utilizada para visualizar o espectro do sinal esta foi de 524.288 kHz.
Seguidamente o bloco “Stream to Vector” é responsável pela conversão do fluxo de itens ori-undos da saída do bloco “UHD:USRP Source” em um fluxo de vetores [32].
Figura 20: Bloco Stream to Vector
O bloco “Stream to Vector” tem como parâmetros de entrada os apresentados na seguinte tabela.
Tabela 4: Principais parâmetros do bloco Stream to Vector.
Parâmetro Função
Num Itens Número de samples de entrada consecutivos para concatenar em um vetor de sa-ída.
Vec Length Comprimento do vetor de entrada.
Desta forma o parâmetro “Num Items” para uma resolução de 1S/s (res_1Hz) e com um sinal amostrado a fa de 524.288 kHz, apresenta o valor de fa/res_1Hz = 524288.
Já para o caso de uma resolução de 8S/s (res_8Hz) apresenta o valor de 65536, sendo enviado para a entrada do bloco “FFT” um vector com um “Vec Length” de valor 1 para ambas as duas resolu-ções, contendo esse vetor 65536 samples para o caso de res_8Hz e 524288 samples para o caso de uma res_1Hz.
Relativamente à FFT esta é calculada recorrendo ao bloco do GNURadio “FFT” representado na Figura 21, contendo este os parâmetros presentes na Tabela 5 [33].
Figura 21: Bloco FFT para 1 Hz de resolução.
Tabela 5: Principais parâmetros do bloco FFT.
Parâmetro Função
FFT Size Definir o número de amostras da FFT.
Input Type Definir se o vetor de entrada apresenta itens complexos ou reais.
Window Definir tipo de janela aplicada na FFT.
Forward/Reverse Escolher uma FFT ou uma IFFT.
Num. Threads Definir número de threads a atribuir à FFT.
Relativamente ao parâmetro “FFT Size” utilizado para posterior cálculo das propriedades do sinal a res_1Hz e a res_8Hz, caso a fa seja de 524.288 kHz a FFT para 1S/s será constituída por 524288 riscas (bins) e a 8S/s será constituída por 65536 riscas. Esta última resolução dá origem a um sinal detetado com uma maior variância devido a ser integrado num período de tempo mais curto.
Em relação ao parâmetro “Window” é definido o tipo de janela a utilizar na FFT, podendo esta ser de Blackman Harris, de Hamming ou Hanning entre outras.
No que diz respeito ao parâmetro “Forward/Reverse”, Forward significa que é feita uma FFT e, caso seja escolhido Reverse, é feita uma IFFT.
À saída do bloco “FFT” é necessário converter o vetor numa stream de dados, visto que os blocos responsáveis pelo cálculo das propriedades do sinal (“Propriedades a 1 Hz” e “Propriedades a 8 Hz”) bem como os blocos responsáveis pela escrita dos dados em ficheiro binário (“Escrita_valo-res_1Hz” e ”Escrita_valores_8Hz”) e pela representação gráfica (“Grafico”) apenas suportam dados oriundos de streams.
Desta forma é necessário recorrer ao bloco “Vector to Stream” representado na seguinte fi-gura [34].
Figura 22: Bloco de conversão de vetor para stream.
O bloco presente na Figura 23 [35] converte para magnitude os valores complexos do vetor proveniente da FFT, antes de se executar a conversão do vetor de dados em stream de dados, de maneira a possibilitar o cálculo da amplitude do Co, do Cx e do NSD do sinal por parte dos blocos
“Propriedades a 1 Hz” e “Propriedades a 8 Hz”, com recurso ao bloco “Complex to Mag”.
Figura 23:Bloco de conversão de complexo para magnitude.
O bloco representado na Figura 24, bem como os blocos responsáveis pela escrita de dados em ficheiro binário e o bloco responsável pela interface gráfica, foram programados de raiz em Python, disponibilizando o GNURadio o bloco “Embedded Python Block” para esse fim.
Figura 24: Bloco python programado para cálculo das grandezas do sinal a 1 Hz de resolução.
O “Embedded Python Block” disponibiliza o pseudo-código representado na Figura 25 [36].
Figura 25: Pseudo-código fornecido pelo Embedded Python Block.
Observando o trecho de código da figura anterior, verifica-se que o pseudo-código é constitu-ído por uma “class”, apresentando essa “class” duas rotinas, sendo a 1ª rotina designada de
“__init__”, funcionando esta como construtor, definindo-se e inicializando-se no construtor as stre-ams de entrada e de saída do bloco (in_sig=[np.complex64], out_sig=[np.complex64]). Por último, na 2ª rotina designada de “work”, é onde são feitos todos os cálculos necessários, para o caso presente, das propriedades do sinal proveniente do bloco “FFT”, sendo estes posteriormente enviados para a saída do bloco com recurso ao comando “return len(output_items[0])”.
Relativamente às duas linhas de código iniciais presentes no trecho de código descrito anteri-ormente e representadas na Figura 26, estas representam a importação das bibliotecas Python neces-sárias para o funcionamento de algumas funcionalidades do código.
Figura 26: Importação de bibliotecas Python.
A biblioteca “numpy” descrita na figura anterior, permite o cálculo de arrays multidimensio-nais. Relativamente à biblioteca “gr”, esta permite importar módulos do GNURadio.
Resumidamente, na seguinte tabela são apresentadas algumas das principais bibliotecas uti-lizadas nos blocos do diagrama desenvolvido em GNURadio.
Tabela 6: Exemplos de bibliotecas Python.
Biblioteca Função
numpy Para cálculo de arrays multidimensionais.
Matplotlib Permite a criação de gráficos, visualizações estáticas, animadas e iterativas.
gr Permite incorporar módulos do GNURadio.
datetime Fornece classes para manipulação de datas e horas.
os.path Contem funções úteis para aceder a ficheiros.
math Fornece acesso a funções matemáticas.
As bibliotecas referidas anteriormente contêm módulos embutidos (escritos em C) que forne-cem acesso às funcionalidades do sistema. Muitos desses blocos são projetados para melhorar a por-tabilidade dos programas Python, resultando numa maior abstração do código [37], minimizando desta forma o uso de linhas de código.
Modificando e adaptando o código disponibilizado pelo “Embedded Python Block”, é possível criar o código responsável pelo cálculo das propriedades do sinal, como por exemplo o Cx e a NSD, presente no bloco “Propriedades a 1Hz”.
Obteve-se o construtor representado na Figura 27 designado de “__init__”, onde estão inici-alizadas todas as variáveis necessárias para o cálculo das propriedades do sinal, como a variável
“samp_rate”, a variável “f_Low1”, entre outras.
Também são inicializadas as 4 entradas do bloco “Propriedades a 1Hz” e a respetiva saída, sendo duas das entradas em valores complexos e as restantes duas entradas e a saída do bloco em valores do tipo float.
Figura 27: Construtor do bloco “Propriedades a 1Hz”.
Na rotina “work” são selecionadas as duas entradas do tipo float do bloco, determinando-se posteriormente o valor de maior amplitude do bin presente na stream do Co, como se pode visualizar na variável “maximo_Co” presente no trecho de código da Figura 28.
Após a seleção do bin de amplitude máxima de cada uma das streams anteriormente descri-tas, foi calculada a amplitude do Co, a NSD e a frequência do sinal.
Figura 28: Parte inicial da função work do bloco “Propriedades a 1Hz”.
Seguidamente, selecionaram-se as duas entradas complexas do bloco em questão como re-presentado na Figura 29, de maneira a ser calculada a amplitude Cx e a fase do sinal.
Figura 29: Parte do código do bloco “Propriedades a 1Hz”.
Finaliza-se a programação do bloco com a obtenção do tempo em segundos em que foi calcu-lado cada um dos valores dos sinais, bem como a obtenção do ano, do mês e do dia e posterior inser-ção de cada valor calculado/obtido em cada uma das nove posições do vetor de saída do bloco, para posterior envio desse vetor para os blocos “Escrita_valores_1Hz” e “Grafico”, como apresentado na seguinte Figura 30.
Figura 30: Últimas linhas de código do bloco “Propriedades a 1Hz”.
Assim, de 1 em 1 segundo, são calculadas as variáveis do sinal e posteriormente envidas para os seguintes blocos do diagrama do GNURadio.
Para o caso da resolução da FFT a 8 S/s o cálculo das variáveis foi efetuado de 1/8 de segundo em 1/8 de segundo. No entanto o envio dos valores foi executado de 1 em 1 segundo para os blocos subsequentes, guardando-se os dados calculados num vetor auxiliar os quais são posteriormente en-viados ao fim de 1 segundo. Evita-se desta maneira erros de temporização durante a circulação de dados no fluxograma. Esta necessidade deve-se ao facto de se ter verificado em testes de desempenho
do sistema de aquisição, que quando os dados obtidos eram guardados em dois ficheiros binários distintos com temporizações de escrita nos respetivos ficheiros diferentes, o fluxo de dados ao longo do diagrama era interrompido e o sistema de aquisição desenvolvido no GNURadio deixava de funci-onar.
De forma a configurar os intervalos espectrais de interesse utilizados no cálculo da NSD e da PS e outros parâmetros, como foi explicado com recurso à Figura 14 presente na secção 4.1.1 da FFT já descrito anteriormente, optou-se pela criação de um ficheiro de configuração (*.txt) representado na seguinte figura.
Figura 31: Ficheiro texto utilizado para configurar dados.
O ficheiro representado na figura anterior tem como parâmetros os descritos na seguinte ta-bela.
Tabela 7: Variáveis utilizados para configurar dados do ficheiro texto no GNURadio.
Parâmetro Descrição
[Main] Definição da secção do ficheiro.
Res_1 Definir resolução de 1Hz.
Res_8 Definir resolução de 8Hz.
Interval_min Definir índice mínimo da risca para cálculo da PS.
Interval_max Definir índice máximo da risca para cálculo da PS.
Freq_central Definir frequência do SDR
F_Low1 Definir índice de frequência mínimo para intervalo do ruído à esquerda de inter-valo para a PS.
F_Low2 Definir índice de frequência máximo para intervalo do ruído à esquerda de inter-valo para a PS.
F_High1 Definir índice de frequência mínimo para intervalo do ruído à direita de intervalo para a PS.
F_High2 Definir índice de frequência máximo para intervalo do ruído à direita de intervalo para a PS.
Samp_rate Definir frequência de amostragem do sinal.
SDR_Gain Definir ganho no SDR.
Nas variáveis descritas na tabela anterior, são utilizados para o cálculo da NSD os parâmetros F_Low1, F_Low2, F_High1 e F_High2.
O cálculo da NSD deve excluir pelo menos os efeitos dos filtros do SDR e eventual potência residual do beacon devido a ruído de fase. É assim excluído o espectro entre F_Low2 e F_High1 cujos valores são calculados recorrendo ao intervalo a Interval_min e entre Interval_max como se pode
Desta forma, só entram para os cálculos da NSD as frequências da zona a magenta entre F_Low1 e F_Low2 e entre F_High1 e F_High2.
Relativamente a F_Low1 e a F_High2, estes limites permitem selecionar a zona da FFT com o espectro mais plano. Assim se F_Low1 e F_High2 apresentarem um valor de 1000 no ficheiro de texto, o intervalo da NSD à esquerda da risca de maior amplitude (e consequentemente do intervalo para o cálculo da PS) terá início na risca correspondente a 1000 Hz. Por outro lado, para f_High2 serão des-contadas as 1000 últimas riscas mais à direita do intervalo para o cálculo da PS, assim se a taxa de amostragem for 312.500 kS/s a risca representada em F_High2 terá o valor correspondente a 311.500 kHz. Quanto mais largo for o espectro usado para estimar o ruído mais estável este será (menor vari-ância).
Figura 32: Limites para o cálculo da NSD da FFT.
As restantes variáveis presentes na Tabela 7 são utilizadas por todos os blocos presentes no diagrama do GNURadio, sendo importadas do ficheiro de configuração através dos blocos represen-tados na seguinte figura.
Figura 33: Blocos do GNURadio utilizados para os parâmetros provenientes do ficheiro.
Na Figura 33 é possível ver que o bloco responsável por selecionar e integrar uma determinada variável no diagrama do GNURadio tem a designação de “Variable Config”: assim para cada parâmetro existente no ficheiro é necessário um bloco “Variable Config” [38].
Este bloco, já disponibilizado pelo GNURadio, apresenta como principais variáveis as apresen-tadas na seguinte tabela.
Tabela 8: Principais parâmetros do bloco Variable Config.
Parâmetro Função
ID Usado para fazer referência à variável em outros blocos.
Default Value Valor usado caso não seja lido do ficheiro.
Type Tipo de variável presente no ficheiro.
Config File Caminho do ficheiro onde a variável está guardada.
Section Secção do ficheiro referente à variável em questão.
Option Nome da variável no ficheiro.
Na Tabela 8 o parâmetro “Section” representa a secção do ficheiro onde está representada uma determinada variável, assim é possível ter um vasto número de variáveis numa mesma secção.
No ficheiro texto utilizado nesta dissertação e referido na anterior Figura 31, foi utilizada uma única secção designada de “Main”.
Na Figura 24 já descrita anteriormente, referente ao bloco responsável pelo cálculo das vari-áveis de interesse dos sinais, verifica-se que este é constituído por quatro entradas e uma saída: a 1ª entrada e a 4ª entrada recebem a stream de dados proveniente do bloco “FFT” já com a magnitude das amostras complexas da FFT calculadas.
Assim a 1ª entrada corresponde à stream de dados da entrada Co do SDR e a 4ª entrada cor-responde à stream de dados proveniente da entrada Cx do SDR.
Contrariamente, a 2ª e 3ª entrada recebem as amostras complexas da FFT do sinal Co e do sinal Cx respetivamente. Estas duas últimas entradas são exclusivamente utilizadas no cálculo da am-plitude do Cx recorrendo à equação ( 15 ), secção 4.1.5.
Todos os valores de entrada e de saída referentes ao bloco em questão estão representados
Tabela 9: Entradas e saídas dos blocos “Propriedades a 1Hz” e “Propriedades a 8Hz”, utilizados para o cálculo dos parâmetros dos sinais.
Vetor Informação
Input_items[0][:] Stream de dados com a magnitude das amostras complexas do sinal Co.
Input_items[1][:] Stream de dados com as amostras complexas da FFT do sinal Co.
Input_items[2][:] Stream de dados com as amostras complexas da FFT do sinal Cx.
Input_items[3][:] Stream de dados com a magnitude das amostras complexas do sinal Cx.
Output_items[0][0] Amplitude da NSD.
Output_items[0][1] Amplitude do Co.
Output_items[0][2] Amplitude do Cx.
Output_items[0][3] Frequência do sinal.
Output_items[0][4] Fase do sinal.
Output_items[0][5] Amplitude da CNR do sinal.
Output_items[0][6] Ano em que foram calculadas as propriedades.
Output_items[0][7] Mês em que foram calculadas as propriedades.
Output_items[0][8] Dia em que foram calculadas as propriedades.
Output_items[0][9] Número total de segundos em que foram retiradas as propriedades do sinal.
Os vetores de dados que circulam no diagrama de blocos da interface gráfica do GNURadio têm um tamanho igual ao número de riscas presentes na FFT, circulando em todo o diagrama para uma res_1Hz vetores de tamanho igual a fa/res_1Hz = 524288 e para o diagrama com uma res_8Hz vetores de tamanho igual a fa/res_8Hz = 65536. Não é possível definir tamanhos arbitrários aos “Out-put_items[][]”, visto que o vetor de saída do bloco tem de ter o mesmo número de elementos da stream de dados presente à entrada do bloco.
Assim os valores das propriedades calculadas foram guardadas em posições específicas do
Assim os valores das propriedades calculadas foram guardadas em posições específicas do