Réalisation d'une chambre anéchoïque

De Wiki d'activités IMA
Révision datée du 20 juin 2019 à 10:20 par Skhinach (discussion | contributions) (Configuration du HackRF)


Présentation générale

  • Nom du projet : Réalisation d'une chambre anéchoïque de mesure
  • Stagiaire : Souheib KHINACHE

Projet

Le sujet

L'objectif de ce projet est de concevoir une mini-chambre anéchoïque qui nous permettra la mesure de l'empreinte électromagnétique d'un objet connecté. En effet, l'atout d'une chambre anéchoïque est de proposer une certaine isolation vis à vis des perturbations et du bruit ambiant, que ce soit de l'extérieur (signaux étrangers parasites etc...), comme de l'intérieur (reflexion électromagnétique). Ainsi, les signaux d'un objet connecté peuvent être étudiés et analysés de manière optimale, et ainsi nous pouvons proposer par la suite la mise en place d'une "fiche caractéristique" d'un objet connecté liée à son empreinte électromagnétique.

Il est donc nécessaire d'avoir un recul sur la partie physique (la structure de la chambre anéchoïque, la dimension du matériau absorbant...), mais aussi et surtout sur la partie analyse électromagnétique (réalisation d'une sonde).

Cahier des charges

Contexte :

Le marché des objets connecté est un marché récent et en plein essor. La communication entre les différents objets s'établit de différents moyens, tissant une toile d'informations dans notre environnement. La technologie sans-fil s'impose dans le quotidien et il est difficilement possible de s'imaginer un avenir sans qu'ils y aient une influence. Ils ont le point commun de créer un nuage électromagnétique environnant, support de l'information. Néanmoins, hormis pour la phase de modulation/démodulation du signal, la couche physique n'est pas réellement utilisée comme source d'information. En outre, les objets connectés sont vus par les utilisateurs comme des boîtes noires : le fonctionnement se fait sans en connaître les composants matériels et logiciels. Néanmoins, ces objets, de par leurs propriétés électroniques, influence le schéma électromagnétique, et peuvent influencer l'information certes, mais aussi le support de transmission.

C'est donc cette influence sur ce support de transmission (ici le champ électromagnétique) qui sera étudiée.


Objectif :

L'objectif est de concevoir une chambre anéchoïque qui permette l'analyse et l'étude d'un objet connecté. Il y aura donc un travail d'un point de physique (conception de la structure en fonction du signal, matériau etc...) et un travail de traitement de signal.

Ces études pourront être suivies directement sur un navigateur et les empreintes électromagnétiques enregistrées dans une base de données, afin de pouvoir approximer si possible la possibilité de la reconnaissance matériel par étude du champ électromagnétique.

Besoins fonctionnels :

Afin de pouvoir mener à bien le projet, le matériel nécessaire à l'étude :

- une antenne et un module Radio Logicielle (ou SDR) afin de traiter le signal reçu : ce qui sera utilisé est un HackRF. En effet, c'est l'une des SDR les plus disponibles sur le marché, assez documentée et compatible avec de nombreux utilitaires,

- de protection ou absorbeur électromagnétique,

- de matériau pour la structure de chambre anéchoïque,

- d'objets connectés à utiliser pour les tests,

- d'un ordinateur.


Une éventualité est d'intégrer un module Raspberry avec une distribution Linux compatible mais tout dépend de l'avancement du projet.


Contraintes :

L'une des contraintes principales à étudier est la limitation matérielle pour la chambre anéchoïque. En effet, la forme et la structure des absorbeurs dépendent des ondes émises par l'objet test. Il est donc nécessaire de trouver et choisir correctement les matériaux et de dimensionner correctement la chambre anéchoïque pour prévenir au mieux des signaux parasites.

Ce qui nous mène à une seconde contrainte : les perturbations électromagnétiques. Bien que l'objectif est de prévenir ces perturbations, la partie analyse et traitement de signal se fera avant l'élaboration de la chambre, et donc dans un environnement portentiellement sujet au bruit (reflexion électromagnétique de l'objet, perturbations parasites...).


Résultats attendus :

L'objectif final serait d'obtenir une structure fonctionnelle, que ce soit d'un point de physique comme analyse, le plus autonome possible et intuitif quant à son utilisation.

Etudes

Petite Chambre Anéchoique

Aspect matériel : caractéristiques physiques de la chambre anéchoique

La chambre anéchoique doit pouvoir mesurer l’empreinte électromagnétique d’un objet connecté et ainsi l’inscrire dans une base de données.

Mesure dans la bande ISM: 868 MHz et 2.4 - 2.5GHz

La réalisation d’une chambre anéchoïque nécessite l’utilisation d’un matériau absorbant de forme pyramidale. La forme de la structure pyramidale dépend de la longueur d’onde de l’onde à absorber afin de minimiser le bruit de reflexion.

La hauteur de la structure pyramidale doit être plus élevée que la moitié de la longueur d’onde du signal à recevoir, soit :

H \ge \lambda/2

D’un point de vue matériau, la conductivité est équivalent à :

\sigma = L/RS

tel que L est la longueur du recouvrement, R la résistivité du matériau et S l’épaisseur du recouvrement.


La performance d’absorption est ainsi définie par :

 A (dB) = P_{TX(dBm)} - P_{RX(dBm)}

A désigne le taux d'absorption de la chambre anéchoïque Le matériau utilisé pour la chambre anéchoique a aussi un impact sur la performance d’absorption. En effet, l’expérience effectuée à la figure 4 du document [1] montre qu’un absorbeur sans carbon est moins performant qu’un absorbeur avec carbone. Néanmoins, l’absorbeur chargé d’un complexe à base de carbone a un coût plus élevé.

L’épaisseur de l’absorbeur a un rôle déterminant quant à la performance d’absorption.


Dans notre cas, il s’agit de l’absorption dans les bandes ISM 868MHz et 2.4-2.5GHz. Soit des longueurs d’ondes respectives de 34.5cm et 12.5cm

Les pyramides doivent donc avoir une hauteur de 18cm minimum pour prendre en compte les deux bandes de frequences.


Les différents critères d’identifications électromagnétiques


Les objets connectés peuvent être caractérisés par :

- la fréquence de la porteuse, permettant de savoir quel type d’antenne transmet l’information - la bande passante autour de la porteuse qui caractérise l’information à transmettre et le type de modulation par exemple - la taille du message (aspect temporel), qui caractérise le type de paquet à transmettre - le rapport signal-bruit, qui défini la puissance de transmission de l’antenne, et permet ainsi d’avoir un aperçu sur l’antenne

Ces caractéristiques permettent d’avoir une idée de quelle est l’antenne qui transmet l’information. Néanmoins, comment peut on avoir une idée l’aspect matériel antérieur à l’antenne ? Plusieurs possibilités, cependant à l’état expérimentales peuvent apporter une idée potentielle du matériel qu’il y a derrière l’antenne : - l’aspect CEM : les fuites électromagnétiques du matériel peuvent être un réel indice sur l’aspect informatique et electronique du module à étudier - le temps de calcul du FCS : à la suite du projet IMA4, il a été vu que le temps entre les fragments de paquets peuvent apporter des informations sur le matériel.


La démodulation est elle une piste intéressante à exploiter ?

Dans notre cas, la démodulation n'est pas une nécéssité quand à l'étude à faire mais peut être une piste. En effet, la démodulation se rapporte à l'information, et si l'objet n'est pas connu (on ne le suppose pas connu), le démoduler serait compliqué. Néanmoins la piste n'est pas à écarter.


Les utilitaires à utiliser

L’utilisation du langage Python ne permet d’avoir un système de capture optimal d’un point de vue performance.

Néanmoins GNURadio embarque directement un block module permettant d’étudier et d’interpréter les signaux.

D’autre part, il peut être intéressant d’utiliser la librairie SoapySDR qui permet d’interfacer les modules SDR (HackRF One dans notre cas).

Il s’agirait au cours de ce projet de constituer une chambre anéchoique qui puisse étudier l’empreinte d’un materiel connecté, de pouvoir le comparer à un ensemble d’empreintes installé dans une base de données, et obtenir un taux de similitude et ainsi permettre une possible reconnaissance matérielle.

Cette comparaison permettra de définir si l’objet fait partie de la base de données, le cas non-écheant, la chambre anéchoique enregistrera ses caractéristiques dans la base de données.



Elaboration du projet

Réalisation sur GNURadio

Structure en bloc du programme de balayage de fréquences
Signal détécté à la fréquence 2.48GHz à 2.52GHz pour une bande passante de capture de 10MHz

Le premier objectif que je vais me fixer est de balayer à l’aide du hackrf une large bande de fréquence afin de détecter les potentiels signaux.

Il est nécessaire d’imposer un treshhold qui n’est pas choisi aléatoire, qui plus est dans le cas d’une chambre anechoique.

Pour celà, je vais utiliser GNURadio, langage de blocs, auquel je combinerai mon analyse via python.

En effet, GNURadio propose un bloc utilitaire permettant d’implémenter un code python afin d’interpréter en quasi temps réel les signaux, le temps réel étant fondamental pour ce projet sachant que la chambre anéchoique doit analyser assez rapidement les signaux.


Pour celà, on établit une structure en blocs permettant et le balayage fréquentiel et la detection de signaux. Pour celà, le bloc Fonction Probe nous permet de capturer un signal et le stocker dans une variable. Ce signal étant un nombre flottant, il représente la fréquence à étudier.

On construit le bloc Variable Frequency à partir du code python suivant :


"""
Fonction bloc permettant de translater la fréquence de capture
"""

import numpy as np
from gnuradio import gr


class blk(gr.sync_block): 

    def __init__(self, frequency_start=0.800e9, frequency_end=2.6e9, frequency_step=0.01e9):  # Arguments par défaut
        """arguments to this function show up as parameters in GRC"""
        gr.sync_block.__init__(
            self,
            name='Variable Frequency',   # Intitulé du bloc
            in_sig=None,                 # Pas d'entrée
            out_sig=[np.float32]         # Sort un signal flottant qui est la fréquence
        )

        assert (frequency_end > frequency_start), "Frequency End doit être supérieure à Frequency Start"

        # if an attribute with the same name as a parameter is found,
        # a callback is registered (properties work, too).
        self.frequency_start = frequency_start
        self.frequency_end = frequency_end
        self.frequency_step = frequency_step
        self.current_frequency = 0

    def get_current_frequency(self):
        return self.current_frequency

    def work(self, input_items, output_items):
        self.current_frequency = (self.current_frequency + self.frequency_step)%(self.frequency_end - self.frequency_start)
        output_items[0][:] = self.frequency_start + self.current_frequency
        return len(output_items[0])



A chaque appel du bloc, la fréquence est incrémentée du pas choisi en paramètre.


Le bloc Signal Detector quant à lui permet d'étudier et d'afficher les fréquences sur lesquelles un signal est reçu. Les paramètres à prendre sont un threshold à imposer afin de considérer qu'un signal est bien reçu :



import numpy as np
from gnuradio import gr


class blk(gr.sync_block):  # other base classes are basic_block, decim_block, interp_block
    """Embedded Python Block example - a simple multiply const"""

    def __init__(self, threshold=0.02, frequency=2.5e9):  # only default arguments here
        """arguments to this function show up as parameters in GRC"""
        gr.sync_block.__init__(
            self,
            name='Signal Detector',   # will show up in GRC
            in_sig=[np.float32],
            out_sig=[np.float32]
        )
        # if an attribute with the same name as a parameter is found,
        # a callback is registered (properties work, too).

        self.threshold=threshold
        self.frequency=frequency

    def work(self, input_items, output_items):
        """example: multiply with constant"""
        
        tmp_freq=self.frequency
        mag_center_freq=input_items[0][0]
        if(mag_center_freq > self.threshold):
        	print("Signal détécté à la fréquence : "+ str(tmp_freq) + " d'amplitude : " + str(mag_center_freq) )
        
        return len(output_items[0])



L'algorithme est simple, et peut être amélioré. C'est ce que nous avons décidé de faire en mettant en place une FFT du signal.

Néanmoins, comme prévu, Python et GNURadio ne nous permettent pas d'avoir un signal temps réel et il y a un réel décalage entre ce qui reçu et l'étude. La FFT du signal en temps réel nécessite grandement l'appel du CPU qui plus est en schéma blocs associé à du Python.

Nous avions donc opté pour une seconde solution, celle de la capture, de l'enregistrement dans un fichier et de l'analyse post-capture.

Mais dans le contexte de la chambre anéchoïque, il n'était pas assez judicieux de faire du post-capture, surtout si ça prend plusieurs minutes.


Nous avons donc choisi d'utiliser la librairie SoapySDR, qui elle permet une réelle modulation au niveau langage, nous permettant ainsi d'implementer notre structure d'analyse en C et de gérer la mémoire et les flux d'informations de manière plus optimale.


Introduction à la librairie SoapySDR

La limitation imposée par GNURadio m’a conduit à changer de modèle et de travailler avec SoapySDR, librairie multi-langages et compatible avec plusieurs modules SDR, dont le HackRF. Ainsi, la structure d’analyse peut-être implémentée en C, ce qui est un réel plus-value dans notre cas. En effet, Python en plus de la couche logiciel offerte par GNURadio peuvent potentiellement rendre l’execution plus longue dû à la consommation du CPU. En outre, je suis plus familier avec le langage C, je saurai donc au mieux gérer les différentes problématiques. Il m’a fallut pas mal de temps (et de lecture de documentations) pour saisir les différentes subtilités de la librairie. En effet, contrairement à GNURadio, je n’avais pas l’habitude d’utiliser la librairie SoapySDR qui est assez complexe. J’ai donc réimplémenté le code de balayage fréquentiel et detection de signaux en C par le biais de la librairie SoapySDR. Après test, j’ai pu observé l’efficacité de la librairie via la vitesse d’execution.

Git de la librairie SoapySDR :

https://github.com/pothosware/SoapySDR/wiki

J’ai par ailleurs utilisé la librairie FFTW3, librairie permettant une approche efficace de la transformée de Fourier d’un signal :

http://www.fftw.org/

Avant de poursuivre la partie traitement du signal, j'ai décidé de continuer l'étude de la chambre anéchoïque afin de la réaliser au plus vite

Etude de la chambre anéchoïque

Comme dit dans le cahier des charges, la chambre anéchoïque doit permettre d’effectuer la mesure sur un signal pouvant s’étaler sur un intervalle de fréquences de 850 MHz à 2.5GHz. En outre, elle doit isoler au mieux la capture des signaux extérieurs ainsi que des reflexions intérieures provoquées par les murs. En effet, nous devons tenir compte de nombreux critères vis à vis de la réalisation de la chambre. Bien qu’elle ne peut être parfaite, on essaiera de l’optimiser au mieux afin d’isoler au maximum le DUT (ou Device Under Test) des perturbations exérieures et intérieures.

Différents critères ont été étudiés, et je me suis basé sur des documents de recherches pour la définition de ces critères.


Le matériau de l’absobant

L’absorbant est la matière qui est contenue dans l’enceinte des chambres anéchoïques ou accoustiques que l’on trouve dans des lieux d’études, d’expérimentations ou scientifiques. Je devais définir le type d’absorbant à utiliser (le matériau), mais aussi la dimension. C’est en effet l’absorbant qui permet d’éviter la réflexion du signal sur les parois internes du mur. Après étude, j’ai opté pour un absorbant en polyurethane avec imprégnations de carbone, de forme pyramidale avec les dimensions suivantes :


  • Dimension de l'absorbant
  • Absorbant trouvable dans les chambres expérimentales


Distance entre antenne émettrice et réceptrice

Afin d’optimiser la réception du signal, l’antenne réceptrice devrait se retrouver à la même hauteur que l’antenne émettrice sur le plan d’emission. Selon les documents étudiés, de nombreuses contraintes sont à prendre en compte, dépendant de la dimension de l’antenne et la longueur d’onde par exemple. En me basant sur les documents de recherches et les critères de Rayleigh et Fraunhoffer, j’en ai conclu que dans le cas d’un intervalle de fréquence dont la borne inférieure est égale à 868MHz, il faudrait une distance minimale de 172cm. La dimension de la structure devra prendre en compte cette distance.


La structure

La structure qui emboîte le tout devra elle absorber les ondes extérieures (ainsi que les potentielles ondes parasites restantes provenant de la reflexion intérieure) : il s’agit d’une structure disposant des mêmes caractéristiques qu’une cage de Faraday. De même que pour l’absorbant, le matériau et l’epaisseur définissent l’efficacité d’absorption de la cage. Ici, on prendra une structure en fer de 1mm d’épaisseur ou une structure en contreplaqué avec un tissu métallisé (0.1mm à 0.2mm). L’utilisation des joints au niveau des ouvertures permet d’éviter des pertes et des phénomènes de diffraction.

Ces caractéristiques définies, la boîte/chambre anéchoïque peut être maintenant réalisée.


Plan concept de la chambre anéchoïque


Implémentation du processus de capture des signaux

Durant les semaines ayant suivies la conceptualisation de la boîte anéchoïque, je me suis focalisé sur l'élaboration et l'implémentation des scripts permettant la capture des signaux. Il ne s'agit pas là de capturer tout ce que l'antenne capte. Pour optimiser par la suite la reconnaissance de signaux, il est nécessaire de trier les données en amont. Pour celà, la capture se déroulera en trois étapes :

- on configure le module de capture

- on effectue balayage fréquentiel sur des intervalles fixés par l'utilisateur pour détecter un signal ou des signaux potentiels et on enregistre les fréquences pour lesquelles un signal est capté

- et on effectue un enregistrement plus long en se fixant sur les fréquences où un signal a été détecté.

Bien que sur le papier ces étapes peuvent paraître triviales, ça n'est pas le cas. En effet, en fonction de la fréquence d'échantillonage du signal, la capture de signaux peut conduire à des problématiques systèmes sur la gestion de certaines ressources (CPU, écriture sur le disque...), et il est nécessaire d'optimiser au mieux cette phase de balayage, sinon l'abandon de l'utilitaire GNURadio au profit de la librairie Soapy perd de son sens.


Configuration du HackRF

La librairie SoapySDR permet de configurer le HackRF afin qu'il puisse répondre aux contraintes imposé par le cahier des charges.

Avant de démarrer la configuration du module SDR, la librairie doit pouvoir le reconnaître. Soapy est une librairie open-source, et il est libre à tout utilisateur ou producteur de rendre compatible son antenne SDR avec elle. Il est nécessaire de disposer d'un plugin propre à l'antenne SDR si il est existant, ce qui est le cas pour le HackRF. Le plugin est accessible via le repertoire Git suivant :

https://github.com/pothosware/SoapyHackRF

git clone https://github.com/pothosware/SoapyHackRF.git

cd SoapyHackRF

mkdir build

cd build

cmake ..

make

sudo make install


L'installation des utilitaires faîte, il est temps de passer à la configuration du module. SoapySDR permet de lister les différents modules SDR connecté au système. On vérifie tout d'abord que notre HackRF One est bien visible par la librairie en listant l'ensemble des Devices via la fonction SoapySDRDevice_enumerate Ceci étant fait,

Analyse de signaux via Machine Learning