Introduction aux radios logicielles avec GNU Radio/Lire et écrire dans un fichier

Plusieurs outils ont été présentés afin de mener l'analyse spectrale d'un signal, par exemple le spectrogramme. Comment enregistrer de tels résultats afin d'en effectuer un traitement ultérieur ? C'est l'objet du chapitre.

Enregistrer dans un fichier les données brutesModifier

GNU Radio offre la possibilité d'enregistrer dans un fichier binaires les données brutes. Ces données pourront être ouvertes par la suite avec MATLAB, GNU Octave ou bien encore les librairies scientifiques du langage Python. C'est cette dernière option qui est retenue.

Utilisation du bloc File SinkModifier

Le bloc File Sink (de la catégorie File Operators) permet d'enregistrer les données sous forme brute dans un fichier binaire.

Documentation du bloc File Sink 

Implémente un comparateur à hystérésis paramétrable. La sortie vaut 1 lorsque l'entrée est au-dessus de la valeur supérieure et 0 lorsque l'entrée est en-dessous de la valeur inférieure.

  • File : nom et emplacement du fichier (choisi avec le bouton ...).
  • Input Type : type de l'entrée.
  • Vec Length : longueur du vecteur dans le cas d'un traitement vectoriel. Par défaut : 1.
  • Unbuffered : active l'utilisation d'une mémoire-tampon afin d'accélérer l'exécution du programme. Par défaut : Off (la mémoire-tampon est donc active).
  • Append file : mode d'écriture. Overwrite écrase les données déjà présentes dans le fichier, tandis que Append rajoute les nouvelles données à la fin.


Un exemple basique d'utilisation du fichier est donné ci-dessous. On y trouve un générateur sinusoïdal, un Throttle et enfin le File Sink.

 

Ouverture avec PythonModifier

La librairie gr-utils contient des fonctions permettant d'accéder aux fichiers bruts générés par GNU Radio. Toutefois, dans un premier temps, nous nous proposons de les écrire nous-même.

L'accès aux données du fichier se fera avec les librairies scientifiques NumPy et SciPy :

import numpy as np
from scipy import fromfile

Le chargement en mémoire des données brutes se fait avec la fonction scipy.fromfile :

donnees = fromfile(open("fichier"), dtype = np.float32)

cette commande étant à adapter :

  • avec le nom du fichier à ouvrir ;
  • avec le type des données stockées[1]. Ce type doit être cohérent avec le type indiqué dans le bloc File Sink, à savoir float32, complex64, int16, int32, etc.

Exemple de tracéModifier

On donne à titre d'exemple un tracé temporel élémentaire réalisé avec la librairie Matplotlib, les données étant stockées dans donnees (voir ci-dessus).

import matplotlib.pyplot as plt

# Génération des pas de temps
T = 1./(32e3)
n = len(f)
t = linspace(0, T*n, num = n)

# Tracé
plt.plot(t, f)
plt.show()

NotesModifier

  1. Un problème sur les données peut venir d'une erreur sur le type.