Como fazer amigos PLUTO e HDSDR



Há pouco tempo, impulsivamente, comprou um transceptor SDR atraente para crianças e jovens - ADALM PLUTO. Para meu pesar, ele funciona com um monte de software para o LINUX, mas meu HDSDR favorito não é compatível. Sem pensar duas vezes, comecei a lidar com esse problema e aqui está o que aconteceu:

A Analog Devices dirige seu PLUTO aos alunos. Todo o software para PLUTO está aberto e está disponível gratuitamente. O site da empresa possui uma página onde você pode encontrar quase todas as informações necessárias sobre a operação do PLUTO. A maior parte do software é escrita em Linux e os alunos são aconselhados a usar o GNU Radio, MATLAB, etc.

Eu tenho um interesse de rádio puramente amador em PLUTO. Um SDR com faixa de 70 MHz a 6 GHz (após divulgação ) por apenas 150 dólares americanos é um milagre. Quantas experiências podem ser feitas! Veja quanto tudo está integrado lá:



Aparentemente, o AD acredita que os próprios hams devem escrever drivers para programas populares; portanto, até recentemente, nem o SDR # era suportado. Mas o SDR # não combina comigo, porque preciso de um bom suporte CAT em um programa para sincronizar a frequência com um transceptor. Eu gostaria de tentar usar o HDSDR como um receptor panorâmico conectando-o à primeira frequência intermediária do transceptor. Portanto, há apenas uma saída: integrar você mesmo o HDSDR e o PLUTO.

Usando o Google, descobri rapidamente que, para resolver meu problema, preciso criar uma biblioteca ExtIO_.dll especial no formato Winrad . Essa biblioteca serve como uma ponte de software entre o HDSDR e o receptor SDR desejado. Felizmente, a interface da biblioteca está bem documentada . Além disso, existem algumas implementações de bibliotecas prontas para vários receptores no github: RTL_SDR, LimeSDR , etc. Havia um lugar para ver como escrever código. A biblioteca em si é bastante antiga, sem novas tecnologias, pura C89, como escreveram há 20 anos. Pelo menos você não precisa aprender uma nova linguagem de programação, que já inspirou esperança de sucesso.

Essencialmente, o ExtIO_.dll precisa ser implementado com dezenas de funções que permitem inicializar o equipamento SDR, iniciar e parar a recepção do sinal, salvar e restaurar as configurações especificadas. Para mim, o momento mais incompreensível foi o formato da troca de dados de streaming entre o receptor e o HDSDR, mas mais sobre isso abaixo.

Agora surgiu a questão de como controlar PLUTO programaticamente. Na verdade, existem várias opções de controle. Encontrei pelo menos dois: diretamente com o chip pela biblioteca libad9361.dll ou pela biblioteca IIO . A última opção parecia mais simples e mais bem descrita para mim, então decidi. Nesta biblioteca, todas as configurações de equipamento estão disponíveis na forma de algum tipo de estrutura XML; um elemento individual é acessado pelo nome textual da propriedade, o que é bastante conveniente. Uma descrição mais detalhada da biblioteca pode ser encontrada aqui . A enorme vantagem da biblioteca é que ela vem com utilitários de linha de comando, com os quais você sempre pode alterar rapidamente as configurações desejadas do receptor. Portanto, você não precisa implementar todas as configurações de SDR na interface HDSDR; pode se dar bem com o mínimo necessário. E carregar um filtro FIR exótico pode ser feito a partir da linha de comando, se é que existe alguma necessidade. Fluxos de dados no IIO:



Programaticamente, aprender como controlar o PLUTO a partir do HDSDR foi bastante rápido e fácil. Foi um pouco mais difícil obter um resultado satisfatório no fluxo de dados, principalmente porque eu não tinha experiência anterior com SDR. Aqui você precisa entender que os dados vêm do receptor SDR na forma de um fluxo de amostras I / Q / I / Q ... I / Q. Cada amostra é um número inteiro de 16 bits sem sinal, dos quais apenas 12 bits de ordem inferior são importantes. Ao mesmo tempo, o HDSDR tem uma dúzia de opções para receber fluxos de dados. Qual é o mais conveniente e melhor não está totalmente claro para mim. Como resultado, decidi pela opção, que no ExtIO é chamada exthwUSBdata16, ou seja, na verdade, um a um, como a biblioteca IIO fornece dados.
O próximo problema foi a transferência de dados entre os buffers de recebimento do IIO e o HDSDR. O último recebe dados em blocos que são múltiplos de 512 bytes e o IIO não pode gerar dados nesse formato. Eu tive que fazer um buffer intermediário e transferir o fluxo através dele. O código de transmissão é mostrado abaixo.

DWORD WINAPI GeneratorThreadProc( __in LPVOID lpParameter ) { int16_t iqbuf[EXT_BLOCKLEN * 2]; ssize_t nbytes_rx; char *p_dat, *p_end; ptrdiff_t p_inc; int iqcnt = 0; // pointer to sample in iqbuf while ( !gbExitThread ) { nbytes_rx = iio_buffer_refill(rxbuf); p_inc = iio_buffer_step(rxbuf); p_end = (char *)iio_buffer_end(rxbuf); for (p_dat = (char *)iio_buffer_first(rxbuf, rx0_i); p_dat < p_end; p_dat += p_inc) { iqbuf[iqcnt++] = ((int16_t*)p_dat)[0]; iqbuf[iqcnt++] = ((int16_t*)p_dat)[1]; if (iqcnt == EXT_BLOCKLEN * 2) { // buffer full iqcnt = 0; pfnCallback(EXT_BLOCKLEN, 0, 0.0F, &iqbuf[0]); } } } gbExitThread = false; gbThreadRunning = false; return 0; } 

Utilizando o ciclo indicado, foi possível obter uma transferência de fluxo de 4 MS / s, acima desse valor, os dados não têm tempo para serem transmitidos e o sinal é recebido com gagueira, embora o ferro pareça ser capaz de enviar 20 MS / se ainda mais. Aumentou a prioridade do encadeamento no qual o loop gira para THREAD_PRIORITY_TIME_CRITICAL, aumentou o tamanho dos buffers. Nenhum resultado. Além disso, quando o buffer foi aumentado para 1 MB, a recepção normal era impossível na vazão mínima. Mais aqui não significa melhor. Se você tem idéias sobre como aumentar a velocidade, compartilhe nos comentários.

Devo dizer que 4 MS / s são suficientes para meus propósitos, a banda mais do que cobre qualquer banda HF amadora. Sim, e nas faixas VHF e microondas o suficiente para a maioria das tarefas. Como resultado, a biblioteca é gravada, a janela HDSDR com o PLUTO ativado para recepção é mais ou menos assim:



Todo o código da biblioteca está disponível no github aqui . Sinta-se à vontade para usá-lo em seus experimentos com o ADALM PLUTO.

73 de R2AJP

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


All Articles