Comment se faire des amis PLUTO et HDSDR



Il n'y a pas si longtemps, j'ai acheté impulsivement un émetteur-récepteur SDR mignon pour les enfants et les jeunes - ADALM PLUTO. À mon regret, il fonctionne avec un tas de logiciels pour LINUX, mais mon HDSDR préféré ne le prend pas en charge. Sans y réfléchir à deux fois, j'ai commencé à traiter ce problème et voici ce qui en est sorti:

Analog Devices adresse son PLUTO aux étudiants. Tous les logiciels pour PLUTO sont ouverts et disponibles gratuitement. Le site Web de la société comporte une page où vous pouvez trouver presque toutes les informations nécessaires sur le fonctionnement de PLUTO. La plupart des logiciels sont écrits sous Linux et les étudiants sont invités à utiliser GNU Radio, MATLAB, etc.

J'ai un intérêt radio purement amateur pour PLUTO. Un SDR avec une plage de 70 MHz à 6 GHz (après divulgation ) pour seulement 150 dollars américains est un miracle. Combien d'expériences peuvent être faites! Voyez combien tout y est intégré:



Apparemment, AD estime que les jambons eux-mêmes devraient écrire des pilotes pour les programmes populaires, donc jusqu'à récemment, même SDR # n'était pas pris en charge. Mais SDR # ne me convient pas, car j'ai besoin d'un bon support CAT dans un programme pour synchroniser la fréquence avec un émetteur-récepteur. Je voudrais essayer d'utiliser HDSDR comme récepteur panoramique en le connectant à la première fréquence intermédiaire de l'émetteur-récepteur. Il n'y a donc qu'une seule issue: intégrer HDSDR et PLUTO vous-même.

En utilisant Google, j'ai rapidement découvert que pour résoudre mon problème, je dois créer une bibliothèque spéciale ExtIO_.dll au format Winrad . Cette bibliothèque sert de pont logiciel entre le HDSDR et le récepteur SDR souhaité. Heureusement, l'interface de la bibliothèque est bien documentée . De plus, il existe un certain nombre d'implémentations de bibliothèque prêtes à l'emploi pour divers récepteurs sur github: RTL_SDR, LimeSDR , etc. Il y avait un endroit pour voir comment écrire du code. La bibliothèque elle-même est assez ancienne, pas de nouvelles technologies, du pur C89, comme ils l'écrivaient il y a 20 ans. Au moins, vous n'avez pas besoin d'apprendre un nouveau langage de programmation, qui a déjà inspiré l'espoir de réussir.

Essentiellement, ExtIO_.dll doit être implémenté avec des dizaines de fonctions qui vous permettent d'initialiser l'équipement SDR, de démarrer et d'arrêter la réception du signal, d'enregistrer et de restaurer les paramètres spécifiés. Pour moi, le moment le plus incompréhensible a été le format de l'échange de données en streaming entre le récepteur et le HDSDR, mais plus à ce sujet ci-dessous.

Maintenant, la question s'est posée de savoir comment contrôler PLUTO par programmation. Il existe en fait plusieurs options de contrôle. J'en ai trouvé au moins deux: soit directement avec la puce via la bibliothèque libad9361.dll , soit via la bibliothèque IIO . Cette dernière option me semblait plus simple et mieux décrite, alors je me suis installée. Dans cette bibliothèque, tous les paramètres d'équipement sont disponibles sous la forme d'une sorte de structure XML, un élément individuel est accessible par le nom textuel de la propriété, ce qui est assez pratique. Une description plus détaillée de la bibliothèque peut être trouvée ici . L'énorme avantage de la bibliothèque est qu'elle est livrée avec des utilitaires de ligne de commande, avec lesquels vous pouvez toujours modifier rapidement les paramètres de récepteur souhaités. Ainsi, vous n'avez pas besoin d'implémenter tous les paramètres SDR dans l'interface HDSDR, vous pouvez vous en tirer avec le minimum nécessaire. Et le chargement d'un filtre FIR exotique peut être effectué à partir de la ligne de commande, si jamais un tel besoin se pose. Flux de données dans IIO:



Par programme, apprendre à contrôler PLUTO à partir de HDSDR a été assez rapide et facile. Il était un peu plus difficile d'obtenir un résultat satisfaisant en streaming de données, d'autant plus que je n'avais aucune expérience préalable avec SDR. Ici, vous devez comprendre que les données proviennent du récepteur SDR sous la forme d'un flux d'échantillons I / Q / I / Q ... I / Q. Chaque échantillon est un entier de 16 bits non signé, dont seuls 12 bits de poids faible comptent. Dans le même temps, HDSDR dispose d'une douzaine d'options pour recevoir des flux de données. Laquelle est la plus pratique et la meilleure n'est pas entièrement claire pour moi. En conséquence, j'ai opté pour l'option, qui dans ExtIO s'appelle exthwUSBdata16, c'est-à-dire en fait, un à un, comment la bibliothèque IIO fournit des données.
Le problème suivant était le transfert de données entre les tampons de réception IIO et HDSDR. Ce dernier reçoit des données dans des blocs qui sont des multiples de 512 octets, et IIO ne peut pas sortir de données dans ce format. J'ai dû faire un tampon intermédiaire et transférer le flux à travers lui. Le code de transmission est indiqué ci-dessous.

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; } 

En utilisant le cycle indiqué, il a été possible d'obtenir un transfert de flux de 4 MS / s, au-dessus de cette valeur, les données n'ont pas le temps d'être transmises et le signal est reçu avec un bégaiement, bien que le fer semble pouvoir envoyer 20 MS / s et même plus. Augmentation de la priorité du thread dans lequel la boucle tourne à THREAD_PRIORITY_TIME_CRITICAL, augmentation de la taille des tampons. Aucun résultat. De plus, lorsque la mémoire tampon a été augmentée à 1 Mo, la réception normale était impossible au débit minimum. Plus ici ne signifie pas mieux. Si vous avez des idées sur la façon d'augmenter la vitesse, partagez-les dans les commentaires.

Je dois dire que 4 MS / s est assez suffisant pour mes besoins, le groupe couvre plus que n'importe quel groupe amateur HF. Oui, et sur les bandes VHF et micro-ondes suffisamment pour la plupart des tâches. Par conséquent, la bibliothèque est écrite, la fenêtre HDSDR avec PLUTO activé pour la réception ressemble à ceci:



Tout le code de la bibliothèque est disponible sur github ici . N'hésitez pas à l'utiliser pour vos expériences avec ADALM PLUTO.

73 de R2AJP

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


All Articles