Modex FPGA : réalisation d`un égaliseur graphique
Transcription
Modex FPGA : réalisation d`un égaliseur graphique
Modex FPGA : réalisation d'un égaliseur graphique Fabrice Bernhard et Florent Cadoux 26 juin 2004 1 Table des matières 1 Les outils 1.1 1.2 1.3 Les FPGA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . La réalisation de circuits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Matlab et les ltres numériques . . . . . . . . . . . . . . . . . . . . . . . . . . 2 2 2 4 2 Restitution à distance de l'image achée par un écran par captage et traitement des ondes magnétiques émises par celui-ci 6 2.1 2.2 2.3 2.4 Le système Tempest . Etude préliminaire . . Réalisations . . . . . . Dicultés rencontrées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 8 9 11 3 Traitement du signal de sortie d'une guitare électrique pour reconnaître les notes jouées 11 3.1 3.2 Objectifs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Mise en oeuvre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 12 4 Partie théorique : degré du ltre passe-bande sélectionnant les notes de guitare dans le cadre du second projet 14 4.1 4.2 Hypothèses . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Réglage des contraintes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 16 5 Egaliseur graphique 18 6 Traitement du signal et FPGA : avantages et inconvénients 20 5.1 5.2 6.1 6.2 6.3 Schémas de principe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Réalisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Un processeur dédié au traitement . . . . . . . . . . . . . . . . . . . . . . . . Limites . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ranements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 18 20 20 21 Dans le cadre du module expérimental d'électronique, nous avons eu la chance de découvrir les composants programmables FPGA. Ce module très dense et intense nous a permis de découvrir toutes les étapes depuis la recherche d'une idée de projet de traitement du signal utilisant des composants programmables jusqu'à sa mise en oeuvre électronique, en passant par la très longue phase de debugging, ou correction d'erreur. Ce module dicile nous a aussi appris que l'approche "ingénieur" et la réalisation d'un projet concret ne sont pas aussi faciles que l'on pourrait s'imaginer, et que même dans le modeste cadre de notre modex les impasses, les frustrations et les échecs étaient possibles. Nous allons présenter les trois projets que nous avons cherché à réaliser, les aspects théoriques de ceux-ci, les raisons pour lesquelles les deux premiers n'ont pas aboutis et les résultats du dernier projet. 1 Les outils 1.1 Les FPGA Le FPGA, ou Field-Programmable Gate Array est un processeur dont les circuits internes peuvent être programmés autant de fois qu'on le souhaite : après une phase de conguration, le FPGA se comporte comme le circuit décrit par sa programmation. L'originalité des FPGA Xilinx est de stocker la conguration dans une mémoire vive statique (SRAM), permettant ainsi de reprogrammer ces circuits à volonté. Cette reprogrammabilité ne faisait pas partie des objectifs de Xilinx, mais elle a permis d'ouvrir les FPGA à un nouveau champ d'applications. En regroupant des FPGA sur une carte, on peut fabriquer un coprocesseur, physiquement gé. Ce coprocesseur modiable à volonté, a été nommé Mémoire Active Programmable (ou PAM pour Programmable Active Memory) en 1987 par Jean Vuillemin. Il combine les avantages du coprocesseur (un circuit dédié à la tâche qu'il doit eectuer) mais ne nécessite pas de développement matériel. De plus, la possibilité de compiler une conguration, et de l'essayer trois minutes plus tard, permet d'avoir assez rapidement les résultats attendus. La facilité de développement sur PAM s'apparente donc largement à celle du développement des logiciels, même si cela reste plus lent et qu'il manque la facilité de debug. Les Mémoires Actives Programmables représentent donc une solution intermédiaire entre la solution logicielle et le processeur dédié. Dans le cadre de notre modex, nous avons eu aaire à une carte PCI PAMette, munie de quatre processeurs FPGA Xilinx. 1.2 La réalisation de circuits Dessin de circuits Une interface est fournie par Xilinx pour programmer le FPGA. Elle permet entre autres de dessiner le circuit avec une interface graphique assez intuitive : on pose les blocs et on les relie à la souris. Cela permet d'avoir un aperçu global du circuit, mais la complexité des circuits que l'on cherche à réaliser sur de tels FPGAs va nous obliger à coder la plupart des fonctions en VHDL, et d'avoir ainsi des gros blocs qui correspondront à des sortes de processeurs internes réalisant certaines tâches, que l'on reliera ensuite entre eux. 2 VHDL Le VHDL, ou Very High Speed Integrated Circuit Hardware Description Language, est un langage de haut niveau permettant de décrire un circuit électronique. Un compilateur se charge de traduire le langage ensuite en circuits logiques élémentaires reliés entre eux. Ce langage est nécessaire dès que le circuit devient trop complexe pour être décrit qu'à l'aide d'un schéma électronique, c'est à dire dans le cadre du FPGA, quasiment tout le temps. Le VHDL n'est pas un langage comme les autres, car il permet de choisir entre une programmation synchrone ou asynchrone. En eet il ne faut pas oublier que le VHDL est un langage de description de circuits électroniques et qu'en électronique à priori tout a lieu en temps réel à mesure que les signaux parcourent le circuit. Ce mode "naturel" est appelé mode asynchrone, car les composants du circuit fonctionnent chacun à leur vitesse propre sans coordination avec leurs voisins. En électronique asynchrone les temps de propagation dans les circuits font que l'on ne sait pas trop après quel délai un circuit donnera la réponse aux signaux qu'on impose en entrée, alors qu'en logique synchrone on utilise un signal en créneau, l'horloge ("clock" en anglais) qui sert à se débarrasser de ces problèmes. Le mode synchrone nécessite de subordonner l'exécution des tâches à une horloge interne, qui est soit celle du processeur, soit un signal périodique plus ou moins basé sur l'horloge interne du processeur (un Clock divider par exemple). Cette horloge permet d'avoir une base de temps commune dans tout le circuit et éviter d'avoir des informations qui arrivent dans une partie du circuit avant que celle-ci ne soit prête à la recevoir, grâce à l'idée essentielle représentée sur le schéma suivant : Fig. 1 Electronique synchrone Comme on le voit sur ce schéma, il y a deux "verrous" à l'entrée et à la sortie de tout circuit élémentaire synchrone : sur les fronts montants d'horloge, les entrées sont xées et sur les fronts descendants, ce sont les sorties qui sont xées. De cette manière on ne modie jamais une entrée pendant que la sortie qui l'alimente est en train de changer, et tant que le temps de propagation dans le circuit asynchrone qui se trouve entre les deux verrous est inférieur à la demi-période de l'horloge, on maîtrise parfaitement les temps de propagation (l'information met exactement un nombre entier de "clocks" pour traverser le circuit). Par exemple pour le multiplieur 12x12 que nous avons utilisé dans nos ltres, on obtient le résul3 tat d'une multiplication en cinq coups d'horloge. Un exemple de VHDL est disponible en annexe. 1.3 Matlab et les ltres numériques La boîte à outils "Filter design" de Matlab est un outil extrêmement convivial pour la réalisation de ltres numériques. Il regroupe toutes les fonctions de conception de ltres disponibles en ligne de commande dans une interface graphique simple et intuitive qui permet de spécier rapidement les qualités requises pour le ltre, et fournit en retour les coecients du ltre dans diérents formats (adaptés à Matlab, ou exportés dans un format externe comme le .txt ou le .coe spécialement pour les FPGA Xilinx). Fig. 2 La boîte à outils "Filter Design" de Matlab La première étape consiste à choisir le type de ltre : soit FIR (Finite Impulse Response), soit IIR (Innite Impulse Response). Le nom de ces ltres vient du fait que la réponse impulsionelle d'un ltre IIR (c'est à dire, la réponse à un signal numérique composé d'un unique "1" suivi de zéros) est constituée d'une suite théoriquement innie de nombres non nuls, ce qui n'est pas le cas des ltres FIR. Au premier abord, les ltres IIR nous semblaient plus avantageux car à contraintes identiques (les contraintes sont la ou les fréquence(s) de coupure, l'atténuations en dB dans une certaine bande de fréquence...), Matlab propose des ltres IIR de degré bien moindre que pour les 4 ltres FIR. A titre d'exemple, pour une ltre passe-bas avec une fréquence d'échantillonage Fs = 48000, une bande de coupure entre Fpass = 9600 et Fstop = 12000 dans laquelle l'atténuation doit passer de maximum 1dB à minimum 80dB , le ltre d'ordre minimum proposé par Matlab est d'ordre 50 en FIR (voir sa courbe de réponse sur la gure suivante), alors qu'il n'est que de degré 31 en IIR. Fig. 3 Courbe de réponse d'un ltre FIR d'ordre 50 Mais en contrepartie, les ltres IIR présentent de nombreux inconvénients. Leur courbe de réponse est beaucoup moins "propre" que pour un ltre FIR, comme on peut le constater sur les gures suivante pour un ltre passe-bande : Fig. Fig. 4 Un ltre passe-bande de type FIR 5 Un ltre passe-bande de type IIR avec les mêmes contraintes Ceci fut conrmé par des essais avec des extraits sonores (traités directement sous Matlab) : alors que le ltre passe-bande FIR appliqué à l'extrait avait exactement le comportement 5 attendu, il ne sortait du ltre passe-bande IIR q'un soue inaudible. Sachant que les ltres IIR sont de plus réputés plus sensibles aux erreurs d'arrondis (ce qui génère du bruit) et plus diciles à programmer, nous avons donc opté pour des ltres de type FIR. Enn, il faut savoir que la quantication (l'opération qui code les coecients du ltre sur n bits pour le FPGA, donc diminue leur précision par rapport à leur représentation en Matlab) modie l'allure du ltre, comme on peut le voir sur le schéma suivant où les deux courbes de réponse (originale et quantiée) sont superposées : Fig. 6 Les eets de la quantication 2 Restitution à distance de l'image achée par un écran par captage et traitement des ondes magnétiques émises par celui-ci 6 2.1 Le système Tempest Il s'agit d'un système d'espionnage qui vise à reconstituer à distance l'image achée sur un écran d'ordinateur uniquement à partir du signal récupéré par une antenne pointée vers cette écran. C'est l'armée américaine qui développa cette technologie dans le plus grand secret, et la nomma TEMPEST, nom de code devenu générique pour décrire ce procédé. On ne sait pas encore aujourd'hui jusqu'à quel point leur système est ecace. Mais on en sait maintenant un peu plus grâce, d'une part à la déclassication de certains documents militaires américains, et surtout grâce à la récente publication (en Mars 2004) sur Internet de la thèse de Markus Kuhn, de l'université de Cambridge, intitulée "Compromising emanations : eavesdropping risks of computer displays". Dans ce document, l'auteur explique comment, avec du matériel extrêmement perfectionné et en trois ans de recherches, il est parvenu, en espionnant un écran monochrome à 3 mètres de distance, à reconstituer un texte dont une partie est présentée sur la gure suivante. Fig. 7 Une partie de l'écran reconstitué par M. Kuhn La première ligne achée est "The quick brown fox jumps over the lazy dog" et les deux dernières énumèrent les lettres de l'alphabet de 'A' à 'N' et de 'a' à 'n'. L'image reconstituée est assez diérente de l'original, mais susamment proche pour pouvoir reconstituer un texte cohérent. Le système Tempest est donc viable. Remarque sur l'origine du rayonnement : un écran classique est constitué d'un canon à électron qui projette les électrons sur l'écran pour acher l'image. Or l'émission d'électrons dans le vide va émettre du rayonnement électromagnétique que nous pourrons capter pour retrouver ensuite l'image achée sur l'écran espionné. Cette méthode qui peut paraître extrêmement complexe est en fait grandement facilité par le fait que les écrans d'ordinateur reçoivent des signaux caractéristiques à chaque début d'écran et début de ligne, qui sont eux aussi émis très fortement (le faisceau d'électrons est ramené à gauche de l'écran par un champ créé par des bobines, que l'on détecte) et facilitent grandement l'interprétation ensuite du rayonnement. Il y a donc (au moins) deux sources distinctes de rayonnement. 7 De plus, ce procédé d'espionnage par captage d'onde électromagnétique est particulièrement intéressant, parce que dans le contexte actuel, quasiment toutes les informations sensibles transitent par des ordinateurs. Or conscient de cela, la plupart des administrations à risques ont protégé leur réseau pour éviter les intrusions par ce biais, mais beaucoup ne connaissent même pas le risque que représente le procédé Tempest et n'ont donc rien prévu contre. La dé classication de certains dossiers américains sur le sujet ont montré que ce procédé avait par exemple été utilisé par des services secrets des pays de l'est, aux Etats-Unis, mais aussi utilisé par les Etats-Unis comme "cheval de Troie" dans un programme livré à des puissances étrangères : ce programme qui devait gérer des bases de données, utilisait les ondes magnétiques émises par l'écran pour émettre les informations sensibles, informations qui, couplées à des codages correcteurs d'erreurs pouvaient être apparemment réceptionnées à distance. Il convient tout de même d'être prudent sur ce sujet, les informations étant diciles à vérier. De plus, les normes qui limitent aujourd'hui fortement les émissions électromagnétiques des appareils grand-public tels que les écrans (sans même parler de l'apparirion des écrans LCD !) risquent de compromettre la viabilité de la technologie Tempest. 2.2 Etude préliminaire Comme nous avions bien conscience de disposer de beaucoup moins de temps, de moyens et de compétences que Markus Kuhn, notre objectif initial se bornait à distinguer par exemple un gros carré d'un gros triangle monochrome sur l'écran espionné à l'aide d'une antenne collée à cette écran. Avant de nous lancer dans la réalisation de ce projet, nous avons eectué plusieurs tests grossiers (c'est à dire, sans faire de mesure précise) pour évaluer sa faisabilité. Nous avons fait acher à l'écran une ou plusieur bandes blanches de largeur variable verticales sur fond noir. Fig. 8 Ecran de test pour le système Tempest Ainsi nous attendions un signal périodique de période le temps de balayage d'une ligne, avec un signal supplémentaire toutes les 640 lignes pour le retour en haut de l'écran. A l'aide d'un oscilloscope numérique, avons pu observer plusieurs phénomènes. 8 L'amplitude, mais aussi dans une certaine mesure la forme du signal dépendent fortement du placement de l'antenne. C'est en la plaçant sous l'écran et bien orientée que l'on obtient le signal le plus fort. C'est donc la solution que nous avons adoptée. Le début d'une ligne se traduit par une forte impulsion (plusieurs millivolts avec notre antenne) sous forme d'une série de quelques oscillations électriques à une fréquence de l'ordre de 15 à 25 MHz. Une transition de noir à blanc ou de blanc à noir se traduit sur l'oscillogramme par un pic de tension d'amplitude quelques millivolts, deux ou trois fois inférieure à l'amplitude du pic qui signale le retour de ligne. Si l'on n'ache qu'une seule bande blanche et qu'on diminue sa largeur, les deux pics (noir-blanc et blanc-noir) se rapprochent jusqu'à ne former q'un seul pic. Les retours en haut de l'écran ne produisaient pas de signal observable. A l'époque, ces résultats nous paraissaient très encourageants car nous pensions pouvoir détecter dans un premier temps les pics (c'est à dire faire une simple étude du niveau du signal délivré par l'antenne) avec un comparateur à deux niveaux (un pour le retours de ligne et un pour les transitions de couleur) qui nous aurait permis de reconstruire une image monochrome pour peu qu'elle ne contienne pas de ne bande de couleur : en raison du recouvrement des pics mentionné ci-dessus, une telle transition double (par exemple noirblanc-noir) aurait été prise pour une transition simple (noir-blanc). Quant au problème de l'absence de "top synchro vertical" pour le retour en haut, on peut le contourner si on fait l'hypothèse que le nombre de lignes de l'écran est connu : il sut de prendre un premier top synchro arbitraire, cela translate juste l'image verticalement (le signal qui déborde par exemple en bas se retrouvant en haut de l'écran). Ceci peut être ajusté manuellement par la suite. Dans un deuxième temps, si cette détection de niveau s'était avérée ecace, nous aurions même pu faire une étude plus précise, par exemple en essayant de détecter non pas le niveau mais la fréquence du signal à l'aide d'un ltre (la fréquence des oscillations qui correspondent au retour de ligne n'est pas la même, par exemple, que celle qui correspond aux changements de couleur). 2.3 Réalisations Pour notre projet il fallait tout d'abord nous familiariser avec le fonctionnement d'un écran d'ordinateur. De plus, il nous fallait aussi restituer l'image " espionnée " sur un deuxième écran. Nous avons donc décidé de programmer un "pilote VGA", c'est-à-dire un composant VHDL qui permet l'achage sur un écran. Il prend en entrée un signal Clock qui lui permettra de bien synchroniser les signaux à envoyer à l'écran, et trois composants RGB. En sortie, on a les diérents ls du câble qui va être connecté à l'écran, plus deux sorties " colonne " et " ligne " qui vont permettre à un autre composant de savoir à quel endroit dans l'achage le pilote se trouve à tout moment. Cet autre composant codera lui le contenu de l'image, et donnera à 9 l'entrée RGB du pilote la couleur du pixel correspondant aux sorties " ligne " et " colonne " de celui-ci. Le pilote VGA semble à première vue assez complexe. On se place donc dans un cas simple : un écran basse résolution, avec 40ns par pixel. Finalement la programmation se découpe en deux grandes phases : les phases de synchronisation verticale, qui permettent de délimiter le début d'un écran entier et les phases de synchronisation horizontale qui délimitent les débuts de lignes. Un écran entier correspond à une période de longueur environ 450 lignes, avec un signal Fig. 9 Chronogramme de synchronisation verticale d'un écran VGA de synchronisation verticale ON pendant un intervalle de temps qui dure deux lignes et où rien n'est aché : c'est le blanking. Puis chaque ligne correspond à une période de longueur environ 680 pixels. Les 40 premiers on met le signal de synchronisation horizontale à o, et on ache rien : c'est aussi le blanking. Puis on commence à acher le contenu de la ligne, avec deux légères pauses en début et n de ligne. Ce signal cadencé permet au canon électron de bien acher les pixels et lui laisse le temps Fig. 10 Chronogramme de synchronisation horizontale d'un écran VGA 10 de revenir en début de ligne puis en début d'écran. Les périodes de blanking lui permettent aussi de mesurer l'intensité du signal qui correspond à " noir " et donc de régler l'intensité du faisceau émis en fonction de cela. La programmation de ce pilote nous a permis de comprendre en détail le fonctionnement des tops de synchronisation, signaux qui étaient au coeur de notre projet, puisqu'ils sont très clairement émis par le canon à électron et auraient donc permis à leur tour de synchroniser le signal reçu par notre antenne. 2.4 Dicultés rencontrées Malheureusement, après plusieurs séances infructueuses, nous avons été contraints d'abandonner ce projet qui s'est avéré trop ambitieux. Le premier problème qui nous est apparus dès la séance qui suivait nos tests préliminaires, est que le signal délivré par l'antenne changeait (en fréquence et en amplitude) signicativement d'une séance à l'autre (l'ensemble du dispositif expérimental étant le même). Ce phénomène étrange vient peut-être des émanations électromagnétiques émises par les laboratoires environnants, mais nous ne l'expliquons pas avec certitude. Il rendait en tout cas l'étude dicile puisque le phénomène que nous devions détecter n'était pas le même d'une séance à l'autre. Un second problème est venu du comparateur : en raison de la fréquence élevée des signaux à détecter (autour de 20 MHz pour le top de synchro horizontal) il n'était pas possible de faire entrer le signal directement de l'antenne dans le FPGA par un convertisseur analogique numérique. D'abord il aurait fallu l'amplier, et surtout avec notre carte cadencée au mieux à 40 MHz nous n'aurions pas pu échantillonner avec assez de points. Nous avons donc essayé de réaliser un petit circuit en "vrais" composants électronique qui aurait pu réaliser rapidement cette comparaison à deux niveaux. Mais les comparateurs (amplicateurs opérationnels en comparateurs ou comparateurs dédiés) que nous avons testés ne pouvaient pas travailler à une fréquence aussi élevée. Ce problème de fréquence aurait été encore pire avec la méthode de détection "par fréquence" au lieu de "par niveau" puisque dans ce cas, nous aurions dû échantilloner susamment rapidement pour avoir le temps de faire les calculs de ltrage entre deux échantillons. Nous avons donc renoncé à ce projet, mais cet échec fut tout de même formateur puisqu'il nous a donné l'occasion de chercher par nous-même les moyens de réaliser notre objectif, étudier leur faisabilité à l'aide de matériel de pointe et comprendre les limites du traitement numérique de l'information. 3 Traitement du signal de sortie d'une guitare électrique pour reconnaître les notes jouées 3.1 Objectifs Ce projet consiste à reproduire un appareil utilisé par les guitaristes pour convertir les notes jouées par leur instrument au format Midi. Ceci permet par exemple d'obtenir automatiquement la partition jouée par l'instrumentiste ou, en passant par un synthétiseur, de faire jouer à la guitare une autre voix que la sienne (ce qui revient à changer le timbre de 11 l'instrument). La norme Midi (Musical Instrument Digital Interface) est un protocole pour la transmission d'informations entre plusieurs machines (synthétiseur, expandeur, échantillonneur, séquenceur, carte-son d'ordinateur, clavier et autres instruments) qui sera décrite plus en détails en annexe. Le but est donc de détecter la ou les notes jouées par la guitare (ou plutôt, de détecter quand les notes commencent et quand elles s'arrêtent) pour ensuite les traiter (les coder en Midi pour jouer sur un synthétiseur, acher les notes sur un écran...). Pour cela nous avons besoin de séparer les diérentes fréquences du signal qui sort de l'instrument. Si l'on utilise des ltres passe-bande (on pourrait penser aussi à des outils tels que la transformation de Fourier), ceci nécessite de synthétiser des ltres très "raides" pour séparer chaque note de la suivante. Sur une guitare électrique, les notes s'échelonnent sur au moins quatre octaves, soit 48 notes ( !) minimum, en partant du Mi2 à 164,8. . . Herz. La fréquence de chaque note est 1 déduite de la fréquence de la note précédente en la multipliant par 2 12 et la note de référence est le La3 à 440 Herz. 3.2 Mise en oeuvre Le traitement "naïf" utilisant uniquement des ltres passe-bande que nous envisagions était le suivant : Fig. 11 Diagramme fonctionnel du convertisseur audio-Midi (L'intérêt du ltrage passe-bas et de la décimation est expliquée ci-après). Comme nous le verrons dans la partie théorique, il est absolument nécessaire de trouver des astuces pour utiliser moins de ltres (sinon on manque de place sur les FPGA). Une idée pourrait être de ne réaliser qu'un petit nombre de ltres (disons 12 pour avoir une octave), tout en ayant susament peu de coecients (ou de coecients non-nuls, si on les calcule intelligemment comme cela est expliqué au 6.3) pour avoir le temps de passer plusieurs signaux dans le ltre entre deux échantillons. Si le ltre passe-bande détecte une certaine note, alors : 12 en passant le signal "normal" dans le ltre on détectera cette note en passant le signal obtenu en décimant un échantillon sur deux dans le signal initial, on détectera la même note à l'octave inférieure (car elle est de fréquence moitié). (On peut aussi eectuer ce calcul avec d'autres valeurs, par exemple en ne prenant que 6 ltres au lieu de 12, mais la décimation d'un échantillon sur deux est la plus facile à réaliser). De manière quantitative, le problème est donc le suivant : pour restituer un son correct pour l'oreille humaine, les sons sont souvent échantillonnés à environ 40 kHz (soit le double de la plus haute fréquence audible). La norme du CDaudio par exemple est 44.1 kHz. Mais ceci n'est utile que pour restituer correctement les harmoniques de chaque note, qui font la spécicité du timbre de l'instrument. Pour notre application, il sut de détecter les fondamentales, dont la fréquence n'excède pas (pour quatre octaves en partant de Mi2 à 164.8. . . ) 2.6 kHz. On peut donc espérer faire fonctionner le système en échantillonnant aux alentours de 5 kHz seulement, tout en sachant que le repliement spectral (phénomène qui fait apparaître des basses fréquences parasites dans le signal reconstitué lorsqu'on a sous-échantillonné le signal initial) des harmoniques risque de faire apparaître des signaux non-voulus. On peut cependant supposer que l'amplitude des harmoniques est faible devant celle de la fondamentale, mais ceci dépend en réalité de la guitare particulière que l'on utilise : chacune a son timbre propre. Pour résoudre ce problème on peut faire passer le signal original dans un ltre passe-bas en échantillonnant d'abord à fréquence élevée, puis on procède à une décimation du signal (on fait baisser la fréquence d'échantillonnage) pour se ramener aux 5 kHz voulus. Fig. 12 Le spectre d'une guitare particulière sachant que le FPGA peut être cadencé à 40 MHz au maximum et que l'on échantillonne à 5 kHz, cela nous laisse 8000 coups d'horloges entre deux échantillons pour faire les calculs du ltre. Si on traite les quatre octaves en quatre passes comme cela 13 est expliqué ci-dessus, on peut encore se permettre 2000 coecients (non-nuls) par ltre. il reste à faire rentrer tout ça sur le FPGA ! L'étude de la place occupée n'est pas facile à faire a priori : il faut réaliser le circuit sur l'ordinateur, et c'est seulement après la compilation que l'on sait quelle proportion du FPGA est utilisée. L'étude suivante, qui constitue note question théorique, permet de connaître le nombre de coecients nécessaires par ltre pour bien séparer les notes. Il sera ensuite possible d'évaluer la place nécessaire et de savoir si le projet est réalisable sur nos FPGA. 4 Partie théorique : degré du ltre passe-bande sélectionnant les notes de guitare dans le cadre du second projet 4.1 Hypothèses On suppose que lorsqu'elle joue un son, la guitare ne dépasse pas une certaine amplitude Amax . De plus, pour que le système de détection ne réagisse pas à n'importe quelle composante du signal de faible amplitude (causée par exemple par un choc sur la guitare ou autre perturbation susceptible de faire vibrer les cordes) il faut limiter sa sensibilité en décidant qu'une note est considérée jouée lorsque l'amplitude de la fréquence correspondante dépasse une certaine amplitude limite A0 . Le but étant de détecter uniquement les notes de la gamme, il faut prendre comme hypothèse que seules celles-ci sont jouées - ce qui exclut pas exemple le cas d'un guitariste eectuant un "tiré", c'est à dire qui passe continument d'une note à la suivante en modiant la tension de la corde avec sa main gauche : dans cette situation, on ne peut pas décider quelle note il joue. Cependant, il n'est pas non plus possible de considérer que la fréquence jouée par la guitare est exactement la fréquence théorique (440 Hz pour le La de référence, par exemple) : un instrument se désaccorde toujours, il est sensible entre autres à la température, et le guitariste eectue toujours avec sa main gauche de petites modications de tension involontaires qui font varier la fréquence de la note jouée. Il faut donc décider d'une largeur de tolérance autour de la fréquence théorique, dans laquelle on considère que c'est bien une note de la gamme qui est jouée. Comme la progression des fréquences est exponentielle (on passe de l'une à la suivante en multipliant par une constante (2)(1/12) ), il faut prendre cette zone de la forme [ βf , f ∗ β] avec β ≤ (2)(1/24) (pour ne pas que les zones de deux ltres successifs se recouvrent). An d'avoir une marge, mieux vaut prendre β strictement plus petit que (2)(1/24) pour être sûr qu'une note de fréquence "limite" ne soit pas détectée comme deux notes à la fois. Dans la suite on prendra β = 2(1/36) , ce qui revient à découper l'intervalle de fréquence entre deux notes en trois parties (logarithmiquement) égales : Bien sûr, avec un choix de β plus grand on ane la "zone de ou", et avec un β plus petit on l'élargit. Le réglage de β dépendra en pratique de la précision voulue pour détecter les fréquences. 14 Fig. 13 Les diérentes zones de fréquences Ensuite, on va réaliser des ltres passe-bande qui devront laisser passer la fréquence qui leur est attribuée et couper les autres. L'outils de design de ltres de Matlab se présente de la manière suivante pour les ltres passe-bande : Fig. 14 Réglage des contraintes pour un ltre avec Matlab Pour notre application, nous avons donc besoin de régler pour chaque fréquence centrale fi , les bornes d'acceptation Fpass1 et Fpass2 , et les bornes de réjection Fstop1 et Fstop2 . Ceci est fait au moment du réglage du paramètre β . Il faut ensuite régler les contraintes Dpass et Dstop de la manière la plus judicieuse possible. (Ces deux variables sont dénies sur le schéma ci-dessus). Enn il faut régler l'amplitude Aseuil de sortie du ltre à partir de laquelle on considère que la note correspondant au ltre en question est jouée. 15 4.2 Réglage des contraintes Nos équations sont donc : ½ ∀A ∈ [A0 , Amax ], (1 − Dpass )A ≥ Aseuil ADstop ≤ αAseuil ... où α est encore un coecient de sécurité visant à ce que les notes soient clairement distinguées. Ainsi, avec ces contraintes et nos hypothèses, on peut armer que le signal à la sortie d'un ltre dépasse en amplitude Aseuil si et seulement si la note est jouée (c'est à dire dépasse A0 avec nos conventions). Le système est équivalent à : ½ Aseuil ≤ (1 − Dpass )A0 Aseuil ≥ Amax Dstop soit en saturant les contraintes (inutile de demander des ltres plus raides que nécessaire !) : ½ Aseuil = (1 − Dpass )A0 Aseuil = Amax Dstop On voit donc qu'il reste un degré de liberté dans le choix des contraintes : c'est l'équation (1 − Dpass )A0 = Amax Dstop qui xe Dpass par rapport à Dstop . C'est normal car si on demande au ltre de modier très peu la fréquence qu'il est censé laisser passer (c'est à dire, Dpass petit), on peut se permettre de xer le seuil Aseuil plus haut et donc de rejeter un peu moins sévérement les autres fréquences. Inversement, si on laisse Dpass assez grand, il faut rejeter les fréquences non voulues plus sévérement (Dstop très petit) pour être sûr qu'elles ne dépasseront pas le seuil qui, du coup, est plus bas. Mais toutes les possibilités laissées par ce degré de liberté sont-elles équivalentes ? Intuitivement, on sent bien que non. si par exemple on choisit le premier cas ci-dessus (Dpass petit, pas trop de contraintes sur Dstop ) il est clair qu'en demandant vraiment au ltre d'être très horizontal dans la bande de fréquence qu'on laisse passer, on va faire monter très vite le nombre de coecients et la liberté laissée à Dstop ne sura pas à compenser. Dans le second cas, le même phénomène se produit. Il est donc probable qu'il existe un choix optimal des contraintes, qui minimise le degré du ltre. Comme on n'a pas de formule qui donne le degré du ltre en fonction des contraintes, il faut faire des essais numériques à diérentes fréquences. Le résultat de ce que l'on trouve pour le La de référence à 440 Hz est visible sur max = 10. la gure ci-après. On a pris pour les constantes : α = 2 et AA 0 Conformément à l'intuition, il existe bien un optimum pour lequel le degré du ltre est minimal, ici 328. On peut recommencer ces essais pour diérentes fréquences ; par exemple, 16 560 520 480 440 400 360 320 5e−3 Fig. 9e−3 13e−3 17e−3 21e−3 25e−3 29e−3 33e−3 37e−3 41e−3 45e−3 15 Degré du ltre en fonction de Dstop pour le La à 440 Hz pour tous les La de la guitare (de 220 Hz à 1760 Hz) on trouve que le degré optimal du ltre est : 360 320 280 240 200 160 120 80 40 0 200 Fig. 400 600 800 1000 1200 1400 1600 1800 16 Degré du ltre optimal en fonction de la fréquence pour la note La 17 Avec ce graphique, on peut donc déterminer rapidement la faisabilité du projet. Sachant que nous avons réussi à faire tenir sur un FPGA au maximum trois ltres à 256 coecients (même s'il est possible d'optimiser avec diérentes ruses qui seront exposées dans la partie "ranements"), on voit tout de suite que (surtout à cause des basses fréquences qui consomment beaucoup de coecients) la réalisation brutale des 48 ltres nécessaires pour traiter les quatre octaves de la guitare est complétement irréalisable. Nous avons donc diminué le nombre de ltres de manière drastique (trois, actuellement !), dirigé la sortie des ltres vers un circuit qui calcule l'amplitude et l'ache sur un écran VGA, et rebaptisé notre projet "un égaliseur graphique". 5 Egaliseur graphique 5.1 Schémas de principe Le principe de ce projet repose toujours sur l'utilisation de ltres en parallèle pour séparer les fréquences. Le nouveau schéma de fonctionnement est : Fig. 17 Schéma fonctionnel de l'égaliseur 5.2 Réalisation La partie achage ne nous a pas posé de problème car nous avions déjà appris à gérer un écran VGA dans le cadre du projet "Tempest". La partie détection de maximum cherche simplement le maximum en valeur absolue du signal sur un nombre de coups d'horloge calculé tel que le temps correspondant soit un quart de seconde (grand devant la période de tout signal audible). Le point le plus dicile est la réalisation des ltres. Nous avons implémenté des ltres FIR avec les coecients donnés par Matlab, en utilisant le schéma suivant : 18 Fig. 18 Schéma fonctionnel d'un ltre Dans ce schéma, le circuit écrit en VHDL joue un rôle central car c'est lui qui écrit dans la RAM les échantillons lus sur le convertisseur analogique-numérique (données d'entrée), ajuste l'adresse des coecients à multiplier dans la RAM et la ROM, et donne l'ordre au multiplieur d'eectuer une opération. En pratique, le ltre ressemble plutôt à ça : Fig. 19 Notre ltre représenté dans l'éditeur de schémas 19 Bien sûr, quand on met plusieurs ltres en parallèle, il n'est pas nécessaire de synthétiser ces éléments pour chaque ltre : la ROM, le multiplieur et l'accumulateur dépendent du ltre, mais la RAM et le "pilote" en VHDL sont communs à tous les ltres. Nous avons réalisé un égaliseur à trois bandes car cela sut à remplir un FPGA à 86%. A quatre bandes, le FPGA est rempli à 100% et le comportement du circuit est erratique. Au-delà de cinq bandes, le compilateur abandonne. Une solution a priori simple (mais nous avons appris à nous méer grandement de ce genre d'a priori au cours de ce modex ! ! !) serait de synthétiser plus de ltres en les mettant sur d'autres FPGA de la carte (il existe un bus qui les relie). Malheureusement, nous avons perdu énormément de temps en bonne partie à cause d'un problème de hardware (le convertisseur numérique-analogique était défectueux) qui ne s'est débloqué qu'à la dernière séance, et nous n'avons pas eu le temps de mettre en oeuvre cette solution. On pourrait aussi diminuer le nombre de coecients (ici 256, ce qui nous a semblé minimal pour avoir des ltres assez raides) mais le ltre devient moins précis, surtout dans les basses fréquences. 6 Traitement du signal et FPGA : avantages et inconvénients 6.1 Un processeur dédié au traitement Pendant le déroulement de ce Modex nous avons été amenés à nous poser la question suivante : pourquoi utiliser un FPGA dans le cas du traitement du signal au lieu d'une solution informatique ? En plus de l'intérêt pédagogique de cette démarche, nous nous sommes rendus compte que si le circuit est bien conçu, il est possible d'eectuer très ecacement des opérations lourdes et rapides, sur le FPGA qui sera dédié à cela. Bien que sur un PC les processeurs atteignent des vitesses bien plus rapides, il n'est pas du tout sûr que nous obtiendrions des résultats meilleurs, surtout si l'on utilise une interface nécessitant un système d'exploitation du type de Linux ou Windows, qui vont eux aussi utiliser une partie des ressources disponibles, et qui pourront de temps en temps ralentir de façon aléatoire le processus. 6.2 Limites Le FPGA présente cependant quelques limites par rapport à une solution purement informatique : Limite de mémoire pour des ltres d'ordres élevés Lorsque nous avons cherché à réaliser des ltres élevés, nous avons été confrontés à un problème de place : la carte pamette dispose de 4 FPGAs, de 1600 CLBs chacun, et un ltre de 256 coecients occupe facilement 300 CLBs (estimation rapide). Limite de temps pour les signaux haute fréquence Le processeur est limité en fréquence, ce qui nous a posé des problèmes au niveau de l'échantillonage des signaux, surtout 20 quand il est nécessaire de faire beaucoup de calculs entre chaque échantillonage. Pour décaler les fréquences, nous avons pensé sans pouvoir le réaliser à un circuit super-hétérodyne. 6.3 Ranements Cette partie présente quelques idées pour aller plus loin, en contournant les dicultés mentionnées ci-dessus qui limitent la conception de ltres sur FPGA. On l'a vu, les mémoires RAM et ROM synthétisables en CLB sont limitées à 256 coecients. Comment faire pour réaliser un ltre d'ordre supérieur ? Bien sûr, il est toujours possible (au prix de quelques complications à la programmation) d'utiliser plusieurs mémoires de ce type (sachant tout de même que la place occupée sur un FPGA par une mémoire est importante). Mais en regardant un par un les coecients du ltre quantié tels que les donne Matlab, on observe deux phénomènes. D'abord, beaucoup de coecients sont nuls : les coecients très petits sont souvent "arrondis" à zéro tandis que d'autres sont gonés par la quantication pour compenser. Ceci peut être mis à prot pour stocker les coecients du ltre non pas "à la le" dans une mémoire, mais en ne stockant que les coecients non-nuls. On peut par exemple utiliser des couples (numroducoef f icient, valeurducoef f icient). Le deuxième phénomène remarquable est que, au moins pour les ltres à peu de coecients, toutes les valeurs des coecients (sur 12 bits dans nos ltres) ne sont pas utilisées, loin de là : dans certains cas extrêmes on ne trouve que des 0, des 1 et des -1. Voici en exemple le début d'un chier de coecients pour un ltre : Quantized Direct form FIR filter ------- Section 1 ------Numerator QuantizedCoefficients{1}{1} ReferenceCoefficients{1}{1} ( 1) 0.000030517578125 0.000017308477238175 0 ( 2) 0.000000000000000 -0.000001087316342545 ( 3) -0.000061035156250 -0.000046642427348849 ( 4) -0.000030517578125 -0.000035746154719920 On voit que le second coecient a été ramené à zéro et que les coecients quantiés 1 et 4 sont égaux alors que leurs valeurs avant quantication étaient diérentes. On peut encore exploiter ce phénomène en utilisant un tableau de correspondance : si par exemple il n'y a que cinq valeurs de coecients distinctes, on peut stocker dans une mémoire sur 3 bits (au lieu de 12) les références de ces coecients et aller chercher la valeur qui correspond à chaque référence. On peut aussi chercher à gagner de la vitesse : en eet, la fréquence d'échantillonnage d'un F (où Fhorloge signal que l'on veut traiter avec un ltre d'ordre n est a priori au plus de horloge n est la fréquence d'horloge du FPGA). En eet, il faut eectuer n multiplications et additions entre deux échantillons. On peut cependant gagner du temps (en sacriant de la place pour les multiplieurs) en parallélisant le calcul : si on stocke les coecients du ltre dans deux 21 mémoires distinctes et que deux multiplieurs eectuent les multiplications en même temps, on gagne un facteur 2 sur la fréquence d'échantillonnage maximum accessible ! Enn, puisqu'il n'est pas possible d'accumuler un grand nombre de ltres sur la carte à cause des limitations de place, on peut envisager d'autres solutions pour séparer les notes jouées par la guitare. L'implémentation d'une tranformation de Fourier discrète (dicile dans le temps imparti) ou l'utilisation d'un seul ltre passe-bande très étroit que l'on appliquerait au signal tout en dilatant ce dernier dans le temps d'une valeur arbitraire. *** A posteriori, ce modex ne nous a pas seulement appris des aspects scientiques et techniques du traitement du signal. Il nous a surtout montré que lorsqu'on veut passer à la phase pratique, de très nombreuses dicultés surviennent qui peuvent être d'origines variées et qu'il faut parfois être très imaginatif pour les détecter. Il faut aussi beaucoup de méthode et de rigueur pour trouver l'origine des problèmes, et beaucoup, beaucoup de temps pour en venir à bout : le nombre d'erreurs possibles (et le temps de compilation, aussi...) augmente exponentiellement avec la complexité du circuit que l'on veut réaliser et il est vraiment dicile de savoir combien de temps on va mettre à corriger son projet ! C'était donc une expérience très intéressante et une bonne introduction à l'électronique numérique et nous ne regrettons pas notre investissement élevé dans ce modex. 22 Table des gures 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 Electronique synchrone . . . . . . . . . . . . . . . . . . . . . . . . . La boîte à outils "Filter Design" de Matlab . . . . . . . . . . . . . Courbe de réponse d'un ltre FIR d'ordre 50 . . . . . . . . . . . . Un ltre passe-bande de type FIR . . . . . . . . . . . . . . . . . . Un ltre passe-bande de type IIR avec les mêmes contraintes . . . Les eets de la quantication . . . . . . . . . . . . . . . . . . . . . Une partie de l'écran reconstitué par M. Kuhn . . . . . . . . . . . Ecran de test pour le système Tempest . . . . . . . . . . . . . . . . Chronogramme de synchronisation verticale d'un écran VGA . . . Chronogramme de synchronisation horizontale d'un écran VGA . . Diagramme fonctionnel du convertisseur audio-Midi . . . . . . . . Le spectre d'une guitare particulière . . . . . . . . . . . . . . . . . Les diérentes zones de fréquences . . . . . . . . . . . . . . . . . . Réglage des contraintes pour un ltre avec Matlab . . . . . . . . . Degré du ltre en fonction de Dstop pour le La à 440 Hz . . . . . . Degré du ltre optimal en fonction de la fréquence pour la note La Schéma fonctionnel de l'égaliseur . . . . . . . . . . . . . . . . . . . Schéma fonctionnel d'un ltre . . . . . . . . . . . . . . . . . . . . . Notre ltre représenté dans l'éditeur de schémas . . . . . . . . . . 23 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 4 5 5 5 6 7 8 10 10 12 13 15 15 17 17 18 19 19