Acquisition et traitement du signal Issu d'un vélocimètre Laser

La page est créée Benjamin Berger
 
CONTINUER À LIRE
Acquisition et traitement du signal Issu d'un vélocimètre Laser
Rapport de stage année 2009

         2ème année Ingénieur ENSEEIHT Electronique

Acquisition et traitement du signal

     Issu d’un vélocimètre Laser

                 Pierre-Adrien Lefebvre

              Maître de stage : Francis Bony
            Tuteur Technique : Julien Perchoux

Laboratoire d'Optoélectronique pour les Systèmes Embarqués
                     INP - ENSEEIHT
Acquisition et traitement du signal Issu d'un vélocimètre Laser
Acquisition et traitement du signal Issu d'un vélocimètre Laser
Sommaire

1.        Remerciements ............................................................................................................................... 4

2.        Présentation du laboratoire et du projet dans son ensemble........................................................ 4

3.        Objectifs du stage ........................................................................................................................... 5

4.        Environnement de développement ................................................................................................ 6

5.        Obtention et analyse des données ................................................................................................. 7

6.        Méthode de comptage des impulsions .......................................................................................... 9

     a.      Présentation de la méthode........................................................................................................ 9

     b. Simulation sous Matlab ............................................................................................................... 9

     c.      Implémentation dans le FPGA - tests ........................................................................................ 11

     d. Avantages et inconvénients de la méthode – perspectives et commentaires ......................... 16

7.        Méthode de détection du pic de FFT ............................................................................................ 17

     a.      Présentation de la méthode...................................................................................................... 17

     b. Simulation sous Simulink........................................................................................................... 19

     c.      Avantages et inconvénients de la méthode – perspectives et commentaires ......................... 23

8.        Conclusion du stage ...................................................................................................................... 24

9.        Annexes ......................................................................................................................................... 25

                                                                               3
Acquisition et traitement du signal Issu d'un vélocimètre Laser
1. Remerciements

  Je voudrais tout d’abord remercier Francis Bony et Julien Perchoux pour m’avoir éclairé tout au long
  de ce projet et pour m’avoir fait part de leur bonne humeur. Je ne veux pas oublier non plus de
  remercier les autres membres du laboratoire ainsi que le personnel technique pour m’avoir
  présenté l’ensemble du dispositif expérimental et avoir répondu à mes questions durant ce stage.

2. Présentation du laboratoire et du projet dans son ensemble

  Le laboratoire

  Les activités de recherche du LOSE ont pour objectif premier la conception de systèmes embarqués
  (SE) de mesure optoélectroniques innovants actifs (basés sur des lasers) ou passifs (basés sur des
  caméras). Pour cela, une bonne maîtrise de l’ensemble de la chaîne de mesure est nécessaire, de la
  conception du capteur (couche physique) à son traitement numérique des données (couche basse).

  Parmi les thèmes principaux de recherche du laboratoire, on trouve en particulier les systèmes de
  mesure actifs (télémétrie LASER, mesures interférométriques pour les systèmes embarqués) et les
  applications de traitement de l’image et de télécommunication (réseaux de neurones pour la
  télémétrie spatiale, vision temps réel…).

  M. Thierry Bosch dirige actuellement le laboratoire.

  Le projet

  Il consiste à trouver un moyen efficace et faible coût pour mesurer la vitesse à l’aide d’un LASER.
  L’éventail des perspectives envisagées est extrêmement large puisqu’elles peuvent s’étendre à des
  applications liées à l’industrie automobile (équipements de sécurité principalement) jusqu’aux
  applications biomédicales (évaluation de la vitesse d’un flux sanguin). Ce procédé pourrait être à
  terme largement répandu du fait des coûts de fabrication qui restent très raisonnables.

  Le projet s’appuie déjà sur des recherches approfondies sur la mesure de déplacement et de vitesse
  grâce à la rétro-injection optique. Comme le montre la figure ci-dessous, le LASER émet une onde
  lumineuse en direction d’un disque en rotation (cible mouvante). Une très faible partie de la
  lumière émise est rétrodiffusée vers le LASER. Les ondes émise et reçue interagissent dans la cavité
  LASER comme le décrit la théorie du self-mixing. En amplifiant les petites variations de tension aux
  bornes de la cavité, il est possible de remonter jusqu’à l’information fréquentielle. En s’appuyant
  ensuite sur la théorie de l’effet Doppler, on sait que le pic de fréquence reçu est proportionnel à la
  vitesse de rotation de la cible multiplié par le cosinus de l’angle du faisceau avec la cible.

                                                    4
Figure 1 - Schéma de principe du banc d'essai

  Une publication IEEE a déjà été publiée concernant le principe de la rétroinjection optique et le
  phénomène de self-mixing dans la cavité LASER (Photodiode-free Doppler velocimeter based onself-
  mixing effect in commercial VCSELs). Le principal avantage de cette méthode de mesure
  vélocimétrie est de s’appuyer sur des diodes LASER VCSEL qui comportent une photodiode interne
  intégrée. Ces composants ont un coût de production très faible et donnent donc un avenir
  prometteur au projet.

3. Objectifs du stage

  Il a été démontré grâce à la théorie et l’expérience que l’information fréquence à la sortie de la
  photodiode du LASER VCSEL permettait de remonter (à un cosinus près) à la vitesse d’une cible. Il
  reste donc à mesurer cette fréquence de manière relativement précise. La principale difficulté
  consiste à récupérer cette information sur un signal qui reste assez bruité.

  Il m’a été confié dans un premier temps de m’intéresser à une mesure reposant sur un principe de
  comptage et de filtrage. Le signal à la sortie de l’amplificateur d’instrumentation passe dans un
  comparateur à hystérésis afin de s’affranchir de DAC (Digital to Analog Converter) coûteux et
  gourmands en énergie lorsqu’ils sont rapides. Le signal est ensuite traité dans un FPGA lors de la
  phase de développement logicielle.

  Le stage doit se dérouler par une première phase d’analyse des données obtenues en sortie de
  l’amplificateur avec MATLAB et SIMULINK afin de mettre au point une méthode de comptage
  efficace et d’afficher la valeur du pic de fréquence.

                                                     5
4. Environnement de développement

  Voici le matériel et les logiciels utilisés dans ce projet :

          Xiling ISE v10.1– IP Cores FFT, FIFO.

          Matlab 2008a – Simulink

          Xilinx System Generator assure la passerelle entre ces deux logiciels afin de traduire en vhdl
          et IP-Cores le code modélisé sous Simulink et vice-versa.

          Carte Spartan-3 du Development Kit de Digilent (voir photographie ci-dessous).

                                  Figure 2 - Digilent Spartan 3 develoment kit board

  La carte Digilent utilisée est équipée du XC3S200 dont les caractéristiques principales sont
  énumérées dans le tableau ci-dessous :

                                       Figure 3 – La famille Spartan 3 de Xilinx

                                                          6
5. Obtention et analyse des données

  Dans un premier temps, il a fallu procéder à l’acquisition des données en sortie de l’amplificateur de
  courant photo-détecté. On utilise pour cela un oscilloscope, dont la fréquence d’échantillonnage est
  réglée sur 2.5 MHz. La condition de Shannon est en pratique très largement respectée : fe > 10
  fmax. On procède alors à l’acquisition de 100 000 points à différentes vitesses de rotation. On
  obtient alors plusieurs fichiers de données au format .CSV qu’il nous faut ensuite traiter avec
  Matlab.

  Afin de faciliter l’analyse et la visualisation des données expérimentales obtenues (signal temporel,
  FFT), il a fallu créer une interface graphique à l’aide de l’outil GUIDE (Graphic User Interface
  Development Environment) sous Matlab. L’interface graphique permet de sélectionner le fichier CSV
  à afficher et de tracer la réponse fréquentielle du signal échantillonné. La figure suivante présente
  un aperçu de ladite interface graphique :

                               Figure 4 - Interface graphique analyse des données

  La réponse temporelle est représentée en bas à gauche et la réponse fréquentielle en haut à droite.
  Le reste fera l’objet d’explications ultérieures.

  Les figures suivantes montrent l’évolution de la position du pic de fréquence fondamentale en
  fonction de la vitesse du moteur, donnée en Volts. La vitesse du moteur est sensiblement
  proportionnelle à la DDP appliquée entre ses bornes. La FFT est réalisée sur 16384 points, dont
  8192 points de donnée. L’abscisse représente la densité spectrale d’énergie normalisée par rapport
  au nombre de points.

                                                       7
U=0V

U = 0.7 V

U=2V

U=3V

U=4V

U=5V

            8
On observe bien le glissement du pic fréquentiel vers les fréquences croissantes lors de
  l’augmentation de la vitesse comme le prévoit la théorie de Doppler.

  L’amplificateur du courant photo-détecté utilisé coupant aux alentours de 150 kHz, les mesures aux
  delà de cette fréquence ne pas exploitables.

6. Méthode de comptage des impulsions

    a. Présentation de la méthode

  Le signal issu de la cavité LASER passe après amplification dans un comparateur à hystérésis afin
  d’être traité de manière binaire. La méthode repose sur la détection et le comptage des fronts
  montants présents sur une entrée du FPGA.

    b. Simulation sous Matlab

  La simulation passe par la création d’un fichier .m. Le code concernant la simulation (fichier
  Comptage_Doppler.m) est donné en annexe. Les valeurs contenues dans le fichier .CSV choisies
  sont stockées dans un tableau et traitées par un comparateur à hystérésis dont le seuil est réglable
  (Deadband comparateur dans la précédente fenêtre de simulation). La valeur du seuil est réglée par
  défaut à 0.02.

  On mesure ensuite la fréquence sur un nombre N d’échantillons (Nb de points de calcul). N est
  réglable est égal à 1000 par défaut. On filtre également les fronts montants parasites en
  considérant comme un front montant le passage de 0 à 1 pendant au moins une durée égale à 2
  échantillons.

  Le signal de sortie est ensuite filtré par un filtre numérique passe bas (ordre 80), fc = 200 kHz. Les
  coefficients du filtre ont été calculés avec FDA Tool et la réponse du filtre est donnée par la figure
  suivante. Le filtre permet de « lisser » la valeur du pic de fréquence mesuré. Le filtre est du type FIR
  equiripple.

                                    Figure 5 - Réponse fréquentielle du FIR

                                                      9
Les figures suivantes présentent les résultats obtenus par comptage par tranche de 1000
échantillons. On remarque qu’après un certain temps de montée, la fréquence mesurée tend à
converger (sauf à vitesse nulle). L’axe des ordonnées correspond à la fréquence en Hertz.

U=0V

U = 0.7 V

U=2V

U=3V

U=4V

U=5V

                                           10
c. Implémentation dans le FPGA - tests

Simulation du flot de données incident

Les tests ont été effectués en dehors du banc d’essai : le flot de données incident à donc été simulé
en plaçant les données expérimentales à la sortie du comparateur à hystérésis en ROM.

Les données sont placées dans une ROM capable de contenir les 100 000 bits du signal
échantillonné à l’oscilloscope. Pour créer cette ROM, on utilise dans Xilinx ISE l’IP-CORE « Bloc
Memory Generator ». Les valeurs d’initialisation de la ROM sont transférées grâce à un fichier .COE
à la syntaxe particulière. Ce fichier est créé par le code gérant l’interface graphique précédemment
développée, en appuyant sur le bouton « Générer fichier .COE pour ROM Xilinx ».

La ROM est créée grâce à l’utilisation des Block RAM internes au FPGA. La figure suivante décrit
l’emplacement de ces blocks.

                                   Figure 6 - Placement des Blocks RAM

Le composant créé s’appelle ici ROM_x (x correspond au numéro de l’échantillon étudié à charger
dans le FPGA). On utilise un compteur 0-99999 afin d’adresser la ROM de manière circulaire.

Du fait du nombre limité de Block RAM dans le FPGA, on ne peut pas contenir plus d’un fichier de
mesure à la fois.

La figure de la page suivante décrit de manière complète l’architecture utilisée.

                                                   11
Figure 7 - Schéma général de la méthode de comptage embarquée sur FPGA

                                 12
Description des composants utilisés

      Architecture du projet Xilinx ISE

                             Figure 8 - Architecture du projet Xilinx Comptage

      Clk_rom

              Clk_50M : horloge de 50 MHz propre à la carte.

              Rst : reset propre à la carte

              H_rom : sortie de l’horloge 2.5 MHz correspondant à la fréquence d’échantillonnage
                   réelle i.e. la fréquence à laquelle on doit lire les données enregistrées en ROM.

      Compteur_100000

              Compteur circulaire de 0 à 99 999. Le compteur est synchronisé avec l’horloge
              générée par H_rom.

      Rom_3

              Il s’agit une mémoire ROM contenant les 100 000 points de mesure correspondant
              aux données d’un fichier .CSV obtenue avec l’oscilloscope. Addra(16:0) correspond
              au bus d’adresse et douta correspond au bit lu en ROM.

      Rising_edge_detector

              Il s’agit d’un détecteur de front montant classique avec synchronisation sur l’horloge
              d’échantillonnage H_rom.

                                                    13
Compteur_HF

         Compte le nombre de fronts montant durant une durée égale à N fois la période
         d’échantillonnage de 2.5 MHz. Le résultat est ensuite transféré sur la sortie
         o_Resultat_HF(15:0).

Filter

         Il s’agit d’un filtre passe-bas généré avec l’IP-CORE « FIR-Compiler ». La fréquence de
         coupure est d’environ 150 kHz avec une pente très raide pour éliminer les fréquences
         inutiles au-delà de la bande passante du circuit d’amplification du photo-détecteur
         intégré au LASER. La réponse fréquentielle du filtre est donnée par la figure suivante.

                       Figure 9 - Réponse du FIR passe-bas (Fe = 2.5 MHz)

Moyenne

         Ce bloc effectue la moyenne arithmétique sur un certain nombre d’échantillons (128
         ici) afin de rendre la sortie du filtre moins sensible aux variations parasites de la
         position du pic dans le spectre fréquentiel. Le moyenneur somme 128 échantillons en
         entrée et effectue ensuite un décalage binaire vers la droite de 7 bits pour obtenir le
         résultat de la moyenne :

                                              14
E_RST               Moy_out
Figure 12 - Test de la lecture de la ROM

Le moyenneur a été rajouté après avoir constaté des fluctuations de la fréquence affichée.

La figure suivante montre le test du dispositif pour U = 3 V. La fréquence affichée est sensiblement
la même que celle du pic de FFT du spectre donné pour U = 3 V.

                                Figure 13 - Test de la méthode de comptage

  d. Avantages et inconvénients de la méthode – perspectives et commentaires

Inconvénients

   • La fréquence mesurée à la sortie peut sembler parfois très instable, en particulier pour les
     fréquences Doppler basses (inférieures à 50 kHz). La méthode semble assez imprécise.

Avantages

   • Synthèse très peu coûteuse en nombre de portes, le coût de mise en œuvre sera donc
     réduit tout comme la consommation électrique.

                                                    16
• Rapidité de traitement. Il faut 0.4 ms pour acquérir 1000 échantillons à 2.5 MHz donc on
       pourrait prendre 10000 échantillons (4 ms) et rester proche d'un système temps réel afin de
       gagner en précision au niveau de la mesure.

     • On peut essayer d’améliorer la stabilité de la sortie fréquence en effectuant une moyenne
       glissante.

  Perspectives - Conclusions

      Il semble que cette méthode soit plus adaptée pour fournir une information grossière d’un
  mouvement (si le problème des oscillations parasites à vitesse nulle est résolu) qu’une mesure
  précise de la vitesse du mobile.

      En effet, l'efficacité du traitement des données semble varier en fonction de la table de
  données choisies. Il faudrait tester le code dans des conditions de mesure réelles (sans la ROM)
  pour éliminer les artefacts de mesure pouvant résulter du parcours en boucle de la ROM. Ici, au
  mieux, on obtient une variation maximale de 5 kHz autour du pic (pour les données correspondant
  au pic à 80 kHz)

      Les opérations de filtrage numérique et moyenne mériteraient d'être optimisées afin
  d’augmenter la fiabilité de la mesure.

7. Méthode de détection du pic de FFT

    a. Présentation de la méthode

  Il s’agit d’étudier ici une alternative à la méthode de comptage précédente.

  Cette méthode repose sur une mesure directe de la fréquence de plus forte densité spectrale en
  s’appuyant sur une FFT. On procède à l’acquisition de N échantillons et on effectue une FFT sur 2N
  échantillons (zéro-padding). Les N échantillons sont stockés dans une mémoire FIFO (First In First
  Out) qui joue le rôle de tampon lors de l’opération de zéro-padding.

  On envisage alors d’implémenter cette méthode sur un FPGA optimisé pour les calculs de type DSP
  comme le Spartan 3A DSP – 3400. Cette catégorie de FPGA contient des slices DSP spécialement
  désignées pour les opérations propres au traitement du signal afin d’accélérer les opérations MAC
  (Multiply and ACcumulate) successives. La figure suivante présente l’architecture interne d’un slice
  DSP du Spartan 3A DSP – 3400. Le nombre de ces slices est limité et varie selon la taille du FPGA :

                                                   17
Figure 14 - Structure d'un Slice DSP48A

Pour plus de renseignements concernant l’utilisation de ces slices, il convient de se référer au
manuel de l’utilisateur « XtremeDSP DSP48A for Spartan-3A DSP FPGAs ».

Toute la phase de développement et de simulation s’est effectuée sous Simulink and utilisant l’outil
Xilinx System Generator afin d’acquérir des blocs VHDL dans Simulink et d’exporter le projet
Simulink en projet Xilinx ISE.

Pour tester le projet, il faut :

      1) Lancer le fichier "Load_Data_FFT.m" pour choisir le fichier à charger en mémoire.
      2) Lancer le modèle .mdl et exécuter la simulation (bouton run) pour différents fichiers de
         mesure.

Le paragraphe suivant présente de manière générale les composants Xilinx utilisés dans Simulink
ainsi que le fonctionnement détaillé du système. Pour plus de renseignements concernant le
fonctionnement propre à chaque bloc IP, il conviendra de se référer aux documentations Xilinx
correspondantes.

                                                     18
b. Simulation sous Simulink

La simulation du filtre est séparée en deux blocs distincts : Acquisition et Traitement.

                                     Figure 15 - Structure du projet FFT

Acquisition

                                 Figure 16 - Acquisition du signal pour FFT

Le bloc principal de la partie acquisition est une mémoire FIFO à double accès : chaque accès
pouvant avoir son propre débit de données. L’écriture et la lecture non pas a être forcément
synchrones. La partie « écriture » de la FIFO est représenté par le bloc To_FIFO. Les donnés de
simulation chargées en mémoire parle fichier .m préalablement lancé sont récupérées grâce au
composant From Workspace. Ces points de mesures sont ensuite convertis en flux de données
binaires grâce au comparateur à hystérésis Relay_0.02. Carré entrée permet de visualiser le flux
incident sur Gateway In qui représente le pin d’entrée du FPGA (le numéro de patte est
paramétrable).

                                                    19
Cast permet de convertir les données incidentes en données à virgule fixe (13 bits dont 12 pour la
partie décimale). Ce format constituera notre standard tout au long de la chaîne d’acquisition et de
traitement.

La profondeur de la mémoire FIFO a été fixée à 1024, mais cette valeur peut être modifiée selon
que l’on souhaite un maximum de fiabilité (flux de données incident ininterrompu lors du
traitement), ou un taux d’occupation minimum du FPGA. On affiche également, à titre informatif
lors de la simulation, l’occupation mémoire de la FIFO afin de s’assurer qu’un débordement n’a pas
lieu (ce qui couperait le flux d’entrée ici grâce la boucle entre la sortie full et WE (Write Enable)).

Traitement

                                                  20
On retrouve ici la partie « lecture » de la FIFO, From_FIFO. Pulse Generator 1 et Step servent
ici à émuler le signal de reset global du circuit.
       Après reset, on met en marche un compteur circulaire de 0 à 2047 (Counter) et on active un
signal à l’état haut lorsque le compteur est entre 1024 et 2047 (bloc Relational). Ce signal
commande la lecture de la FIFO ainsi que la commande select d’un multiplexeur 2-> 1 : Mux. Ce
système, associé à la lecture de la FIFO, permet de réaliser de manière très efficace l’opération de
zéro-padding : on enregistre N points de données (N = 1024 ici) dans la FIFO et on lit simultanément
la FIFO deux fois plus vite qu’on ne l’écrit. On rajoute N zéros à la fin.

On effectue ensuite une FFT sur 2N points (soit 2048 ici).

                Figure 17 - Compteur circulaire et commande du multiplexeur pour zero-padding

               Figure 18 - Flux de données arrivant sur le bloc FFT (on remarque le zéro-padding)

      Le zéro-padding impose la création de zones de vitesses d’horloge différentes puisque la
lecture doit être deux fois plus rapide que l’écriture. Cela est rendu possible par la décomposition
du système global en sous-blocs (Acquisition et Traitement) et par la création d’un objet System
Generator pour chacun d’eux. La vitesse des flux de données est paramétrée par ces blocs. Il est à
noter que Simulink utilise des fréquences normalisées par rapport à la fréquence de l’horloge
principale (50 MHz ici).

                                                      21
On trace ensuite la FFT avec l’IP Core de Xilinx « Fast Fourier Transform 6.0 ». L’utilisation de
ce bloc permet de bénéficier d’une architecture optimisée, facile d’utilisation et entièrement
paramétrable. On utilise ici le « pipelined mode » qui permet de calculer la FFT et de procéder à
l’acquisition des points de données en même temps. Cet aspect est essentiel pour l’impératif
temps-réel de notre application. En revanche, cela se traduit par un alourdissement de
l’architecture et donc de la consommation électrique. Le bloc calcule ici le FFT sur 2048 points (dont
1024 de signal).

                                        Figure 19 - Calcul de la FFT

      Le multiplieur permet d’élever au carré la sortie de la FFT avant passage par le détecteur de
maximum (Black Box). Le composant Black Box permet d’importer de créer des blocs Simulink
définis par l’utilisateur grâce à un fichier VHDL. Certains impératifs de syntaxe (noms de signaux
d’horloge et de reset en particulier) sont à respecter dans le fichier VHDL, il convient donc de se
référer à la documentation de ce bloc dans l’aide de XIlinx System Generator.
Le composant est capable alors de chercher le maximum ainsi que sa position au sein d’un flux de
donné. Le composant est réinitialisé à la fin de chaque calcul de FFT, signalé par un passage à 1 du
signal « early done » (edone). Ce signal est à l’état haut un coup d’horloge avant la fin du calcul de la
FFT.

                                  Figure 20 – FFT après élévation au carré

                                                    22
La figure précédente représente la distribution de la puissance en fonction de la fréquence. Les pics
primaires représentent les pics de continu et les pics secondaires correspondent aux pics de
fréquence Doppler. On remarque que le spectre est symétrique par rapport à Fe/2.

La figure suivante donne la position du maximum de FFT (en bas) et son amplitude (en haut)
détectée (hors pic DC et en tenant compte de la symétrisation du spectre) :

                           Figure 21 - FFT : Position et amplitude des maximums

On note tout d’abord que la position des pics est relativement régulière alors que leur puissance ne
l’est pas (ce qui peut engendrer certaines imprécisions au niveau de la mesure).

     Un registre permet ensuite de mémoriser la position entre deux mesures afin de l’afficher.
La position du pic sur la FFT est directement proportionnelle à la fréquence du signal mesuré,
connaissant la fréquence d’échantillonnage.

  c. Avantages et inconvénients de la méthode – perspectives et commentaires

Inconvénients

   • Méthode plus complexe donc forcément plus coûteuse qui a terme devra faire appel à des
     ASICs performants dans le calcul de la FFT.

   • Besoin d’une mémoire de stockage des échantillons incidents.

Avantages

   • Méthode qui semble être en simulation beaucoup plus précise. Il faudrait cependant la
     tester en conditions réelles.

   • Calcul de la fréquence en continu grâce au mode « pipelined » du composant FFT. Le calcul
     de la FFT est rapide grâce à l’utilisation des DSP slices. Cette vitesse de calcul varie en
     fonction de la fréquence de fonctionnement du bloc de calcul mais restera aux alentours de
     50 µs (pour une évaluation plus précise, se référer aux tables données dans la
     documentation du bloc FFT, fournie avec le dossier du projet).

                                                   23
Perspectives – Conclusions

  Il s’agit là d’une méthode efficace certes, mais beaucoup plus lourde que la méthode de comptage.
  Elle est donc à réserver aux applications où une mesure précise de la vitesse est requise.

8. Conclusion du stage

  Ce stage au sein du laboratoire LOSE de l’ENSEEIHT m’a permis tout d’abord de découvrir le monde
  la recherche. Même si le cahier des charges au départ n’est pas très précis (il s’agissait au départ de
  traiter le signal obtenu par rétro-injection optique dans une cavité LASER afin de retrouver
  l’information fréquence afin de remonter à la vitesse), il a fallu faire preuve d’imagination et de
  rigueur afin de chercher des méthodes de mesure, de les évaluer et de trouver les outils nécessaires
  à leur mise en œuvre. C’est dans ce cadre que ce stage m’a permit de découvrir l’outil Xilinx System
  Generator permettant d’assurer le lien de manière très efficace entre un développement hardware
  de bas niveau (Xilinx ISE) et un environnement de développement et de simulation de plus haut
  niveau (Simulink).

  Il a donc fallu que je me familiarise avec ces outils de développement ainsi qu’avec l’utilisation des
  différents IP Cores, sortes de boîtes noires sous le couvert de la propriété intellectuelle.
  La première méthode – dite de comptage – m’a aussi permit d’être plus familier avec la
  programmation Matlab (gestion de fichiers de données) et l’outil GUIDE permettant de réaliser des
  interfaces graphiques. La méthode reposant sur la FFT est plus orientée simulation sous Simulink.

  Il est cependant regrettable de n’avoir pas eu le temps de tester ces méthodes dans des conditions
  réelles qui seules permettront de les valider.

  Il en reste néanmoins que ce stage a été pour moi l’occasion de me rapprocher du monde de la
  recherche, de ses avantages (flexibilité dans le travail et les horaires) ainsi que de ses inconvénients
  (mise à l’épreuve de l’imagination, nécessité de résultats, constante recherche d’informations et de
  données qui prennent beaucoup de temps à trier…). Ce stage fut très enrichissant au vu des
  compétences acquises en matière d’utilisation de la suite Xilinx. Il m’a également fortement
  sensibilisé aux contraintes liées aux systèmes embarqués.

                                                    24
9. Annexes

Comptage_Doppler.m

    % --- Executes during object creation, after setting all properties.
    function Files_ListBox_CreateFcn(hObject, eventdata, handles)
    % hObject    handle to Files_ListBox (see GCBO)
    % eventdata reserved - to be defined in a future version of MATLAB
    % handles    empty - handles not created until after all CreateFcns called

    % Hint: listbox controls usually have a white background on Windows.
    %       See ISPC and COMPUTER.
    if ispc && isequal(get(hObject,'BackgroundColor'),
    get(0,'defaultUicontrolBackgroundColor'))
        set(hObject,'BackgroundColor','white');
    end

    clc;
    curr_dir_filtered = strcat(pwd, '/*.csv')   % pwd : récupère le répertoire courant
    liste_fichier = dir(curr_dir_filtered);     % Liste des fichiers à l'adresse indiqué dont
    l'extension est .csv
    nb_fichier = size(liste_fichier);           % Renvoi le nombre de fichiers trouvés
    liste_menu = '';

    for i=1:nb_fichier;                                     % Boucle comptant de 1 à
    nb_fichier
      liste_menu = strvcat(liste_menu, liste_fichier(i).name)     % Concaténation des noms de
    fichiers récupérés avec liste_menu
    end

    set(hObject,'String',liste_menu);

    % --- Executes on button press in SelectFile_Btn.
    function SelectFile_Btn_Callback(hObject, eventdata, handles)
    % hObject    handle to SelectFile_Btn (see GCBO)
    % eventdata reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)

     % 1) Récupération des données du fichier CSV sélectionné

        list_entries = get(handles.Files_ListBox,'String')
        index_selected = get(handles.Files_ListBox,'Value')
        csv_filename = list_entries(index_selected, :)

        % Importation du fichier csv

        selected_file = strcat(pwd, '\', csv_filename)
        DELIMITER = ',';
        HEADERLINES = 14;
        newData1 = importdata(selected_file, DELIMITER, HEADERLINES);

        % Création des variables d'environnement à partir des champs
        % [temps, amplitude]

        vars = fieldnames(newData1)
        t_A = newData1.(vars{1});
        t_A(:,1) = t_A(:,1) + 0.02;
        A = t_A(:,2);
        assignin('base', 't', t_A(:,1));   % On déssymétrise le temps par rapport à 0
        assignin('base', 'A', t_A(:,2));

      % 2) Affichage des données sur le graphique

                                                 25
plot(handles.axes1, t_A(:,1),t_A(:,2));
         NFFT = 2^nextpow2(8192);                % Next power of 2 from length of y
         Y = fft(t_A(:,2), NFFT)/8192;
         f = 2.5e6/2*linspace(0,1,NFFT/2);
         plot(handles.axes2, f,2*abs(Y(1:NFFT/2)))

        set(handles.axes2,       'XLimMode','manual');
        set(handles.axes2,       'XLim', [0 3e5]);
        set(handles.axes2,       'YLimMode','manual');
        set(handles.axes2,       'YLim', [0 0.15]);

    % 3) Calcul de la fréquence en utilisant une méthode de comptage

        S = size(t_A); % On récupère le nombre de points
        Nb_pts = S(1); % 100 000 points en général
        count = 0;
        index_result = 1;
        front_montant = 0;
        front_descendant = 0;
        fe = 2500000;
        N_F = str2num(get(handles.Edit_NF, 'string'));
        str = 'Mesure de la fréquence par comptage tous les -';
        str = strcat(str, num2str(N_F), '- échantillons');
        set(handles.Legende_Comptage, 'string', str);
        T = (0:1/fe:(Nb_pts-1)/fe)';
        Deadband = str2num(get(handles.Edit_Deadband, 'string'));

          for i=3:Nb_pts

                % remplissage du tableau des fréquences mesurées

    %                 if (mod(T(i), N_F/fe)==0) % On mesure la fréquence tous les N_F points
                      if (mod(i, N_F)==0) % On mesure la fréquence tous les N_F points
                       val_count(index_result,1) = count;
                       val_count(index_result,2) = T(i);

                       %val_count(index_result, 2) = T(i);
                       index_result = index_result + 1;
                       count = 0;
                    end;

                % détection des fronts montants et descendants
                % (deadband : [-0.02, +0.02])

            if ((A(i-2)< Deadband && A(i-1) > Deadband && A(i) > Deadband) &&
front_montant == 0)

                           % détection front montant sur double 1
                           front_montant = 1;
                           front_descendant = 0;
                           % Incrémentation de la variable de comptage des fronts
                           count = count + 1;

            elseif ((A(i-2)> -Deadband && A(i-1) < -Deadband && A(i) < -Deadband) &&
front_montant == 1)

                           % détection front montant sur double 0
                           front_montant = 0;
                           front_descendant = 1;
                    end;

          end

        % on convertit le comptage de fronts montants en fréquence :

         val_count = val_count * fe / N_F;
         plot(handles.axes3, val_count);
%           set(handles.axes3, 'YLimMode','manual');
%           set(handles.axes3, 'YLim', [0 100]);

                                                         26
coeff_num = [0.028 0.053 0.071 0.053 0.028];
         coeff_det = [1.000 -2.026 2.148 -1.159 0.279];
         Y = filter(coeff_num, coeff_det, val_count);
         plot(handles.axes3, Y);

Load_Data_FFT.m

  % --- Executes during object creation, after setting all properties.
  function Files_ListBox_CreateFcn(hObject, eventdata, handles)
       % hObject    handle to Files_ListBox (see GCBO)
       % eventdata reserved - to be defined in a future version of MATLAB
       % handles    empty - handles not created until after all CreateFcns called

       % Hint: listbox controls usually have a white background on Windows.
       %       See ISPC and COMPUTER.
       if ispc && isequal(get(hObject,'BackgroundColor'),
       get(0,'defaultUicontrolBackgroundColor'))
           set(hObject,'BackgroundColor','white');
       end

       clc;
       curr_dir_filtered = strcat(pwd, '/*.csv')    % pwd : récupère le répertoire courant
       liste_fichier = dir(curr_dir_filtered);      % Liste des fichiers à l'adresse indiqué
       dont l'extension est .csv
       nb_fichier = size(liste_fichier);            % Renvoi le nombre de fichiers trouvés
       liste_menu = '';

       for i=1:nb_fichier;                                     % Boucle comptant de 1 à
       nb_fichier
         liste_menu = strvcat(liste_menu, liste_fichier(i).name)     % Concaténation des noms
       de fichiers récupérés avec liste_menu
       end

       set(hObject,'String',liste_menu);

  % --- Executes on button press in SelectFile_Btn.
  function SelectFile_Btn_Callback(hObject, eventdata, handles)
       % hObject    handle to SelectFile_Btn (see GCBO)
       % eventdata reserved - to be defined in a future version of MATLAB
       % handles    structure with handles and user data (see GUIDATA)

        % 1) Récupération des données du fichier CSV sélectionné

           list_entries = get(handles.Files_ListBox,'String')
           index_selected = get(handles.Files_ListBox,'Value')
           csv_filename = list_entries(index_selected, :)

           % Importation du fichier csv

           selected_file = strcat(pwd, '\', csv_filename)
           DELIMITER = ',';
           HEADERLINES = 14;
           newData1 = importdata(selected_file, DELIMITER, HEADERLINES);

           % Création des variables d'environnement à partir des champs
           % [temps, amplitude]

           vars = fieldnames(newData1)
           t_A = newData1.(vars{1});
           t_A(:,1) = t_A(:,1) + 0.02;
           % on sous-échantillonne 10 fois pour que fmax = 250 kHz (suffisant ici)
           A_se = t_A(:,2);

                                                   27
A_se = A_se(1:10:length(A_se));
             t_se = t_A(:,1);
             t_se = t_se(1:10:length(t_se));
             assignin('base', 't', t_se); % On déssymétrise le temps par rapport à 0
             assignin('base', 'A', A_se);

          % 2) Affichage des données sur le graphique

             plot(handles.axes1, t_A(:,1),t_A(:,2));
             NFFT = 2^nextpow2(8192);                % Next power of 2 from length of y
             Y = fft(t_A(:,2), NFFT)/8192;
             f = 2.5e6/2*linspace(0,1,NFFT/2);
             plot(handles.axes2, f,2*abs(Y(1:NFFT/2)))

            set(handles.axes2,   'XLimMode','manual');
            set(handles.axes2,   'XLim', [0 3e5]);
            set(handles.axes2,   'YLimMode','manual');
            set(handles.axes2,   'YLim', [0 0.15]);

Max.vhd
    ---------------------------------------------------------------------------
    -- Recherche du maximum
    ---------------------------------------------------------------------------

    library IEEE;
    use IEEE.STD_LOGIC_1164.ALL;
    use IEEE.STD_LOGIC_ARITH.ALL;
    use IEEE.STD_LOGIC_UNSIGNED.ALL;

    entity Max is
        Port ( rst : in STD_LOGIC;
               clk_box : in STD_LOGIC;
               ce_box : in STD_LOGIC;
               A : in STD_LOGIC_VECTOR (15 downto 0);
               S : out STD_LOGIC_VECTOR (15 downto 0);
               fin : out STD_LOGIC;
               i_out : out STD_LOGIC_VECTOR (15 downto 0);
               o_tmp : out STD_LOGIC_VECTOR (15 downto 0);
               S_pos : out STD_LOGIC_VECTOR (15 downto 0));
    end Max;

    architecture Behavioral of Max is

      signal tmp : STD_LOGIC_VECTOR (15 downto 0);
      signal tmp_pos : STD_LOGIC_VECTOR (15 downto 0);
      signal i : STD_LOGIC_VECTOR (15 downto 0);

    begin

          process(rst, A, i, tmp, clk_box, ce_box, tmp_pos)
          begin

              if rst = '1' then

                  i  '0');
                  fin
elsif rising_edge(clk_box) and ce_box = '1' then

       if A > tmp and A > 1000 and i > 100 and i < 1024 then
       -- on ne tient pas compte des 100 premières valeurs (=> pic DC), et de la symétrie
       du spectre

                  tmp
Vous pouvez aussi lire