Aller au contenu

Introduction aux radios logicielles avec GNU Radio/Prise en main

Un livre de Wikilivres.

Les notions de traitement du signal du chapitre précédent ne vous ont, apparemment, pas effrayé. Nous allons ici intervenir sur les commandes essentielles de GNU Radio, vitales pour la suite ; il s'agit donc d'une partie exclusivement « technique ». Après une présentation de l'interface du Companion, nous nous intéresserons à la manipulation des blocs, qui sera illustré sur un premier exemple.

GNU Radio a été conçu pour profiter des outils des systèmes d'exploitation à base GNU/Linux ; le projet n'entretient d'ailleurs pas de façon officielle les versions pour Windows et Mac[1]. Bien qu'il soit possible de compiler directement les sources[2],[3], nous suggérons aux utilisateurs de ces deux systèmes d'employer le CD autonome qui leur est dédié afin de profiter des dernières mises à jour. C'est cette solution que nous allons présenter.

Un CD autonome (ou Live CD) permet de démarrer un ordinateur sur un système d'exploitation différent de celui installé, présent sur le CD, sans toucher au disque dur. Lorsque le CD autonome est retiré, l'ordinateur reprend sa configuration initiale. L'image ISO qui servira à la génération du CD peut être téléchargée via un client torrent ou depuis un site miroir[4].

Pour les utilisateurs de versions Ubuntu, la méthode la plus simple est d'utiliser le gestionnaire de paquets et d'installer gqrx, gnuradio et gr-osmosdr depuis le PPA grqx/releases :

Terminal en superutilisateur

Logo

sudo add-apt-repository ppa:gqrx/releases
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install gqrx gnuradio gr-osmosdr


Les autres utilisateurs de systèmes GNU/Linux sont invités à se référer au manuel de compilation[5].

Premier démarrage

[modifier | modifier le wikicode]

L'installation de GNU Radio achevée, lancez le gnuradio-companion (GRC). Au premier démarrage s'ouvre une fenêtre blanche divisée en trois espaces principaux : le logigramme (flowchart), le terminal et la zone de sélection des blocs.

Cliquez sur l'image pour l’agrandir
Cliquez sur l'image pour l’agrandir

Les blocs sont groupés par catégories à droite de la fenêtre ; nous aurons l'occasion d'y revenir plus en détails. Pour en insérer un dans le logigramme, déroulez sa catégorie en cliquant sur le triangle gris , sélectionnez-le et cliquez sur le bouton « Ajouter »[6].

Le terminal, en bas, affiche les messages de sortie (erreurs, informations, etc). Nous ne nous en servirons presque pas, le companion étant capable de signaler les problèmes de différentes façons.

Barre de menus

[modifier | modifier le wikicode]

La barre de menus vous permet d'accéder :

  • au menu File (fichier), d'où vous pouvez très classiquement enregistrer le projet (Save), en ouvrir un (Open), en commencer un nouveau (New) mais également effectuer une copie d'écran du logigramme (Screen Capture) ;
  • au menu Edit (édition), pour couper/copier/coller la sélection (cut/copy/paste), annuler/refaire (undo/redo), tourner un bloc (Rotate) ou accéder à ses propriétés (Properties) à condition qu'un bloc du logigramme soit sélectionné ;
  • au menu View pour accéder aux messages d'erreur (Errors) ;
  • au menu Build pour compiler (Build), exécuter (Execute) ou stopper (Kill) le processus ;
  • enfin, au menu Help pour l'accès à l'aide.

Barre d'outils

[modifier | modifier le wikicode]

La barre d'outils, située juste au-dessus du logigramme, reprend des fonctions présentes dans les menus afin de faciliter leur accès. De gauche à droite, nous avons ainsi : nouveau projet ; ouvrir ; enregistrer ; fermer ; capture d'écran ; couper la sélection ; copier la sélection ; coller ; annuler/refaire ; afficher les messages d'erreur ; compiler ; exécuter ; stopper ; puis des fonctions de manipulation de blocs que nous décrirons plus tard.

Des raccourcis clavier existent et sont très utiles pour aller plus rapidement.

Deux blocs déjà présents

[modifier | modifier le wikicode]
Détail de la fenêtre Properties pour le bloc Options.

Dès le démarrage, deux blocs sont déjà présents, par défaut, dans le logigramme : Options et Variable. En double-cliquant sur l'un deux, on accède à ses propriétés (Properties).

On donne ci-contre l'exemple sur le bloc Options. Ce bloc particulier sert à renseigner les paramètres généraux du document, que l'on peut donner dans la fenêtre des propriétés. Les paramètres d'un bloc sont ses attributs ; ils correspondent à une valeur, choisie par défaut ou par l'utilisateur, stockée dans une variable.

Nous rencontrerons dans l'ouvrage un grand nombre de blocs différents. Tous seront décrits de la même manière, grâce à un encart similaire à celui ci-dessous.

Documentation du bloc Optionslink={{{link}}}

Spécifie des valeurs particulières pour le logigramme. Un seul bloc options est autorisé par document.

  • ID : nom du fichier Python généré. Par défaut : top_block (générera top_block.py).
  • Title : titre du document.
  • Author : auteur du document.
  • Description : description du document.
  • Window Size : dimension de l'éditeur, donnée sous la forme (largeur, hauteur), entre (300, 300) et (4096, 4096).
  • Generate Options : nature du code généré.
  • Run : détermine la méthode de lancement du processus. Peut être automatique (Autostart) ou commandée par une variable booléenne à spécifier.
  • max_nouts : nombre maximum de sorties (outputs) autorisées. La valeur par défaut 0 en autorise une infinité.


Pour la plupart des projets, il ne sera pas nécessaire de compléter les attributs de ce bloc. Les valeurs par défaut seront en effet satisfaisantes.

Un utile code couleurs

[modifier | modifier le wikicode]

Il ne vous a sans doute pas échappé la coloration plutôt kitsch des champs de la fenêtre de réglage des attributs. Chaque champ est coloré d'après la nature de la valeur attendue, d'après un code couleurs que nous reproduisons partiellement ici[7]. Nous respecterons ce code dans les documentations des blocs.

Code couleurs de GRC
Couleur Nature de la valeur
Bleu Nombre complexe
Orange Flottant (Float)
Fuchsia Chaîne de caractères (String)
Vert Entier (integer)

Notez également que certains paramètres sont soulignés. Ils correspondent à des paramètres pouvant être modifiés pendant l'exécution du logigramme.

Manipuler et relier des blocs

[modifier | modifier le wikicode]

Un bloc tout seul n'ayant qu'un intérêt très limité, nous devons maintenant apprendre à les arranger à notre guise.

La manœuvre permettant de relier deux blocs est très simple. Après s'être assuré que les deux blocs étaient bien compatibles (c'est-à-dire que l'un comporte une sortie OUT et l'autre une entrée IN, représentées dans un rectangle bleu), sélectionner à l'aide d'un clic successivement les deux « jacks » bleus. Le lien apparaîtra, dirigé automatiquement de la sortie vers l'entrée. La supression est elle aussi très intuitive : après avoir cliqué sur un lien, supprimez-le grâce à l'outil Delete de la barre d'outils ou la touche Suppr du clavier.

Pour déplacer un bloc, sélectionnez-le à la souris et déplacez-le en maintenant enfoncé, puis relâchez à l'endroit voulu.

En cliquant une fois sur un bloc, celui-ci apparaît en surbrillance (contour bleu clair) : il est alors possible d'utiliser les outils du menu Edit. En premier lieu, vous pouvez le faire tourner dans le sens antihoraire ou horaire grâce aux fonctions Rotate Counterclockwise/Rotate Clockwise ou le supprimer avec Delete.

Votre premier logigramme

[modifier | modifier le wikicode]

Nous proposons de mettre en application les enseignements de ce chapitre afin de réaliser un premier logigramme élémentaire. Nous souhaitons ici générer un signal sinusoïdal de fréquence réglable, et afficher sa représentation graphique à la manière d'un oscilloscope numérique. Pour cela, il nous faut utiliser les blocs :

  • de génération de signaux : Signal Source (de la catégorie Waveform Generators) ;
  • de visualisation : WX GUI Scope Sink (de Instrumentation >> WX).

D'autre part, afin de pouvoir modifier la fréquence pendant l'exécution, nous stockerons sa valeur dans une variable à l'aide d'un bloc WX GUI Slider (de GUI Widgets >> WX). Ce bloc affichera un curseur réglable au moment de l'exécution.

Commençons par placer sur le logigramme le bloc Signal Source. Dans les paramètres, on indique que l'on souhaite une sortie sous forme de flottant (Float) et on donne pour valeur de la fréquence la variable f. Le logiciel indique que la variable f est inconnue[8], il faut donc la préciser.

Documentation du bloc Signal Sourcelink={{{link}}}

Génère un signal selon les paramètres demandés.

  • ID : nom du bloc.
  • sampling_freq : fréquence d'échantillonnage du signal.
  • waveform : forme du signal désirée (sinus, cosinus, dents de scie, triangle, constante...).
  • wave_freq : fréquence du signal.
  • ampl : amplitude du signal.
  • offset : offset du signal.


On insère donc, n'importe où dans le logigramme[9], un bloc WX GUI Slider dont l'ID sera f. À titre d'exercice, on propose de donner comme valeur par défaut 200 Hz, comme minimum 150 et maximum 400.

Documentation du bloc WX GUI Sliderlink={{{link}}}

Affiche un curseur de réglage d'une variable.

  • ID : nom du bloc, et de la variable associée lorsque Label est laissé vide.
  • Label : label de la variable.
  • Default Value : valeur par défaut.
  • Minimum : valeur minimale autorisée par le curseur.
  • Maximum : valeur maximale autorisée par le curseur.
  • Num Steps : nombre d'échelons sur le curseur.
  • Style horizontal ou vertical.
  • Converter : type de sortie (float ou integer).


Puis, on insère le visualiseur WX GUI Scope Sink, en précisant dans ses attributs que l'entrée est un flottant (attribut Type). Il ne reste alors qu'à relier les blocs Signal Source et Scope Sink. Le bloc Slider n'a pas besoin d'être relié : la variable f qu'il renseigne est en effet définie pour tout le logigramme.

Voici une première proposition, consistant en la simple mise en application de ce que nous venons d'énoncer. Ne l'exécutez pas ! Lors de la compilation, il apparaît un message d'avertissement (Warning) dans le terminal[10] : en effet, le logigramme va être exécuté en boucle par l'ordinateur, à la vitesse maximale autorisée par le processeur (c'est-à-dire à la fréquence d'horloge), ce qui pourrait entraîner un plantage de la machine. Afin de limiter la vitesse d'exécution, il faut insérer entre les deux blocs un bloc de commande (Throttle).

Exemple sans throttle.
Exemple sans throttle.

Une fois ce bloc inséré, vous pouvez compiler puis lancer l'exécution du programme. Apparaît alors une interface graphique correspondant au rendu demandé. On y trouve l'oscilloscope, mais également le slider de réglage de que l'on déplace à la souris (ou au clavier). Une modification de la valeur de est répercutée sur le visualiseur.

Exemple avec throttle.

Pour l'instant, nous nous contentons de présenter la fonction de réglage des axes (Axes Options) de l'oscilloscope. Il est possible d'augmenter la base de temps (boutons + et -) afin de mieux observer le signal. Pour modifier l'offset ou l'échelle verticale, décochez l'option Autorange (qui correspond à un choix automatique).

Passons à l'écoute

[modifier | modifier le wikicode]

La première vocation de la radio était de transmettre des bits (avec le fameux code Morse) mais a rapidement évolué vers la transmission de la voix. Comment, avec GNU Radio, utiliser les hauts-parleurs de l'ordinateur ? Il faut utiliser un objet sink[11] — les objets de cette catégorie correspondent à des sorties vers le matériel.

Reprenons l'exemple précédent en nous plaçant aux alentours des fréquences du domaine audible, c'est-à-dire entre 20 et 20000 Hz (paramètres à modifier dans les attributs du bloc Signal Source). On remplace ensuite le visualiseur par un bloc Audio Sink (catégorie Audio). Après avoir baissé le son ou retiré vos écouteurs, vous pourrez profiter de la douce mélodie d'un signal sinusoïdal.

En toute rigueur, il n'est dans cet exemple plus nécessaire de placer un Throttle ; en effet, l'horloge interne de la carte son en jouera le rôle. Les Throttle ne devraient être utilisés que pour des simulations exclusivement numériques, sans périphériques.

  1. (en) Martin Braun, « Installing GR », (consulté le 2 mai 2015)
  2. (en) Matt Ettus, « Windows Install », (consulté le 2 mai 2015)
  3. (en) Michael Dickens, « Mac Install », (consulté le 2 mai 2015)
  4. (en) « GNU Radio Live DVD » (consulté le 2 mai 2015)
  5. (en) « Build Guide » (consulté le 2 mai 2015)
  6. Pour aller plus rapidement, il est également possible de double-cliquer sur le bloc ou encore de le transporter sur le logigramme en maintenant la souris enfoncée.
  7. Le code complet peut être obtenu dans le menu Help >> Types.
  8. L'attribut Frequency apparaît en rouge.
  9. Une bonne pratique est toutefois de le placer à proximité du bloc qui exploitera la variable.
  10. Warning: This flow graph may not have flow control: no audio or usrp blocks found. Add a Misc->Throttle block to your flow graph to avoid CPU congestion.
  11. En anglais, sink signifie « évier ».