Bibliothèque MUSTIG
CommunicationS NumériqueS
Version 1.0
GRESILOG S.A
LE FORUM de Pré-Milliet - F-38330 MONTBONNOT
Tél. : +33 0 4 76 52 29 40 - Fax : +33 0 4 76 52 29 43
Email : courrier@gresilog.com - Infos et nouveautés : http://www.gresilog.com
.
Introduction 5
1.1 Généralités 55
1.3 Contenu de la livraison 5
2 Structure générale 5
2.1 Signal binaire 5
2.2 Formation des symboles 5
2.3 Modulation 5
2.4 Canal de transmission 6
2.5 Démodulation 6
2.6 Egalisation 6
2.7 Décision sur les symboles 6
2.8 Générateurs de fréquence 6
2.9 Visualisation et mesure 6
2.10 Remarques 6
3 Exemples de mise en œuvre 6
3.1 Codage 6
3.2 Principales méthodes de modulation (amplitude, phase) 8
3.2.1 Mise en forme par impulsions rectangulaires 8
3.2.2 Mise en forme par impulsions "racine de Nyquist" 9
3.2.3 Modulation-Démodulation non cohérente 10
3.2.4 Modulation-Démodulation cohérente 10
3.3 De la modulation PSK à la modulation GMSK 11
3.3.1 Modulation QPSK4 11
3.3.2 Modulation GMSK 13
3.4 Egaliseur de lignes de transmission 14
3.4.1 Egaliseur transversal 14
3.4.2 Egaliseur de Viterbi 15
3.5 Modulation multifréquence (DMT ou OFDM) 16
3.5.1 Etalement de spectre (CDMA) 16
3.5.2 Modulation multifréquence 17
3.6 Synchronisation 19
4 Descriptions détaillées 20
4.1 Signal binaire 20
4.2 Formation des symboles 20
4.3 Modulation 21
4.4 Canal de transmission 22
4.5 Démodulation 23
4.6 Egalisation 23
4.7 Décision sur les symboles 24
4.8 Générateurs de fréquence 24
4.9 Visualisation et mesure 24
5 Annexe : Description interne de macros Viterbi. 25
5.1 Le module Viterbi 25
5.2 Les générateurs de métriques 27
5.2.1 Les métriques euclidiennes 27
5.2.2 Les métriques de Hamming 28
Cette bibliothèque est destinée à faciliter la simulation avec MUSTIG d’une chaîne de transmission numérique de données. Ceci dans un but pédagogique ou d’étude de nouvelle structure. Toutes les fonctions de cette bibliothèque sont des macros écrites en MUSTIG, donc ouvertes et modifiables. La structure très modulaire de l’ensemble facilite la création de variantes des macros fournies.
La plupart des macros fournies ont été conçues uniquement pour la simulation. Elles nécessitent le mise en mémoire du signal complet. Elles ne sont donc pas adaptées à la simulation de signaux très longs et ni à un fonctionnement en temps réel.
Certaines fonctions de cette bibliothèque nécessitent la version 4.5 de MUSTIG
Le fichier bib_com.MTG contient la bibliothèque proprement dite. Il contient toutes les macros de base.
A coté de cette bibliothèque, plusieurs fichiers présentent des exemples de simulation, à caractère didactique. Ils sont commentés dans ce document en 3.
La bibliothèque est divisée en chapitres. Chacun d’entre eux correspond à une étape de la chaîne de transmission de l’information.
Contient des générateurs de signaux binaires. Un signal binaire est un signal dont les échantillons ne peuvent prendre que les valeurs "1" ou "0". En d’autres termes, c’est une suite de bits.
Bien qu’un seul bit puisse suffire à représenter ces valeurs, un signal binaire est de type "entier".
Ces macros transforment le signal binaire en une suite de symboles. Un symbole est une valeur associée à une suite de N bits.
C‘est donc encore un signal discret. Pour conserver un débit d’information constant tout le long de la chaîne, la fréquence d’échantillonnage du signal composé des symboles est N fois plus faible que celle du signal binaire.
Ces macros sont toutes décomposées en deux parties : une première qui associe N bits pour former un nombre appelé "symbole numérique". Une deuxième qui fournit une valeur correspondant à ce nombre pour le codage choisi. Cette valeur, qui représente par exemple une tension électrique, est représentée par un nombre flottant, réel ou complexe.
Ces macros transforment la suite de symboles en un signal continu. En fait, la simulation est faite entièrement en temps discret : le continu est simulé par une augmentation importante du taux d’échantillons. A chaque symbole correspond normalement un signal continu de durée T. Il lui correspondra en fait un signal discret de M points, qui est l’échantillonné de ce signal continu.
Le signal "continu" possède donc une fréquence d’échantillonnage M fois plus grande que le signal composé des symboles.
Pour obtenir une simulation précise, on souhaitera
utiliser une grande valeur de ce facteur de sur-échantillonnage. Mais cela sera
au détriment de la vitesse de simulation. Pour pouvoir modifier cette valeur
sans ajouter systématiquement une entrée à chacune des macros, toutes ces
macros utilisent un report. Il est donc indispensable de définir la valeur du
report
dans tous les
fichiers qui font appel à ces macros.
Il est important de noter que dans les équipements de télécommunication, la part du numérique (et donc du discret) est de plus en plus grande. La technique de simulation utilisée ici correspondra donc souvent à ce qui est réellement fait. Il ne manquera alors que le dernier filtrage analogique.
On trouvera dans ce chapitre des générateurs d’impulsion, des filtres, et des opérations combinées (filtres multicadences) plus rapides. Ils permettent d’effectuer une modulation en bande de base (autour de la fréquence "0"). On trouvera de plus des opérateurs pour effectuer une transposition de fréquence.
On trouvera ici la simulation des transformations effectuées sur le signal par le canal de transmission.
Ces transformations consistent en des filtrages, des retards et l’addition de bruits.
Ces macros transforment le signal continu en un signal à temps discret échantillonné au rythme symbole.
Elles consistent en des opérations de changement de fréquence, de filtrage et d’échantillonnage. Les opérations de filtrage et d’échantillonnage peuvent être combinées pour une meilleure efficacité.
On trouvera ici les fonctions inverses des celles du chapitre "modulation".
Ces macros sont destinées à compenser les déformations (qui entraînent souvent de l’interférence inter-symbole) du signal crée par le filtrage du canal.
En sortie des macros de démodulation, le signal est à temps discret, mais ses valeurs sont continues (en faisant abstraction de la quantification de la représentation numérique) puisque entachées de bruit.
Ces macros transforment les valeurs continues en symboles, par une opération de seuillage ou de quantification.
On trouve ici des outils pour simuler l’asservissement de la fréquence d’échantillonnage (VCO)
On trouve ici des fonctions de visualisation spécialisées : diagramme de l’œil, tracé de constellation. Un analyseur de spectre adapté aux besoins. Des macros de comptage des erreurs de transmission.
Fichier SYMBOLES.MTG
Principe de la transmission numérique :
codage en amplitude, en quadrature, en phase ou quelconque
visualisation des constellations
addition de bruit : comptage des erreurs de transmission
La Macro “BitsAléatoires” engendre une suite de valeurs entières de valeurs 0 ou 1. La Macro “Forme symboles” associe ces bits deux par deux et les transforme en des valeurs qui peuvent être égales à –0.75, -0.25, 0.25 ou 0.75. “Visu/t” permet d’observer le signal discret formé :
La macro “Bruit additif2” ajoute 20 réalisation de bruit (réel) à ce signal. Le signal est alors une fonction de deux variables, le temps “t” et l’indice des réalisations “e”. Sa visualisation par “Visu/t”, prévue pour un signal fonction seulement de “t”, donne une superposition des différentes réalisations de signal bruité. Chaque point du signal est remplacé par une tache :
Si l’amplitude du bruit est inférieure à la moitié de l’écart entre les niveaux des symboles (ici 0.25), il est possible de reconstituer les symboles initiaux et les bits par seuillage. Cela est réalisé par la macro “Décode Symboles”. On vérifie à l’aide de la macro “ERREUR2(%)" que cela est fait sans erreur. On pourra observer que cela n’est plus le cas si on augmente la puissance de bruit ou si on resserre les niveaux en augmentant le nombre de bits par symboles.
Si on choisit pour la macro “Forme symboles” un codage de type "complexe", on obtient un codage en amplitude complexe (QAM : quadrature amplitude modulation). Plutôt que de visualiser le signal temporel, on utilise alors souvent la visualisation de la "constellation". Si on choisit 4 bits par symbole et en ajoutant un bruit complexe, on obtient la figure suivante :
Pour effectuer des codages avec des constellations de forme différente de celles permises par “Forme symboles”, il faut utiliser “Forme symboles qque” :
La liste des valeurs possibles des symboles est donnée sous forme d’une fonction de la variable “sb”.
La liste utilisée ci-dessus donne la constellation ci-dessous :
Fichier MUSTIG MODULAT.MTG
Mise en forme par impulsions rectangulaire ou par impulsions de Nyquist.
Démodulation cohérente ou non.
Diagramme de l’œil.
La macro "Bloqueur" associe une impulsion rectangulaire à chaque symbole ; l’amplitude de l’impulsion est la même que celle du symbole. Elle simule la fonction réalisée par les convertisseurs numériques-analogiques traditionnels.
Comme il est expliqué au paragraphe 2.3, le signal formé devrait être un signal continu : il est simulé par un signal suréchantilloné. Le nombre d’échantillons par impulsion est fixé ici à 16 par le report "Fact_surech". On montre que, à la réception, il faut effectuer un filtrage adapté à l’impulsion émise avant échantillonnage. Ici, ce filtre est un intégrateur glissant sur la durée d’un symbole. Pour apprécier la qualité du signal reçu, on observe souvent le "diagramme de l'œil". Il s’agit de la forme temporelle du signal, replié par tranches de deux durées symbole. Il permet de juger de la bonne position d’instant d’échantillonnage (marqué par l ‘abscisse "0"), et de la bonne séparation des symboles à cet instant.
Notons que le filtre glissant, causal, entraine un retard d’un symbole. Il faut donc le compenser avant de comparer le signal reçu à celui émis : dans la macro “ERREUR(%)”, on fixe le retard au nombre de bits par symbole.
Pour des raisons d’efficacité de calcul, on a intérêt à remplacer le filtre, l'intégrateur glissant, et l’échantillonneur par une fonction combinée, la macro "Echantillonneur-moyenneur" qui ne calcule la moyenne qu’à l’instant d’échantillonnage.
On peut observer le spectre du signal : on constate les lobes importants de ce type de modulation.
Pour diminuer l’encombrement spectral, on utilise une mise en forme par des impulsions dont l’étendue spectrale est plus faible. La durée de ces impulsions est alors nécessairement supérieure à celle d’un symbole et elles vont se chevaucher. Des formes particulières, comme l’impulsion "racine de Nyquist", évitent néanmoins l’interférence inter-symboles aux instants d’échantillonnage.
La mise en forme du signal peut se faire de façon "théorique" en remplaçant le bloqueur par un générateur d’impulsions de Dirac suivi par un filtre continu dont la réponse impulsionelle est la forme d’impulsion souhaitée.
La macro "Nyquist12" calcule les coefficients du filtre "racine de Nyquist". Pour des raisons d’efficacité, il est préférable de remplacer cette structure par un filtre multicadence qui économise les nombreux calculs sur les valeurs nulles introduites entre les impulsions de Dirac. La macro "Forme impulsion" est basée sur ce principe.
A la réception, le filtrage adapté peut être réalisé par un filtre RIF de réponse impulsionnelle racine de Nyquist. Cela simule une réalisation analogique de ce filtre et permet d’observer le digramme de l’œil.
On pourra insérer un retard d’une fraction de temps symbole dans le trajet du signal "continu". On simule ainsi une erreur de synchronisation.
Pour des raisons d’efficacité de calcul, on aura intérêt à utiliser la macro "Filtre_échantillonneur" qui ne calcule que les points pris en compte par l’échantillonnage. Cela correspond à une réalisation numérique du filtrage. Il n’est plus possible alors de visualiser le diagramme de l’œil.
On peut vérifier que l’étendue spectrale du signal est bien plus faible qu’avec les impulsions rectangulaires :
Les signaux créés par les mises en formes précédentes étaient en "bande de base" : leur spectre était centré autour de zéro. Pour translater leur spectre autour d’une fréquence plus haute, il suffit de les multiplier par une sinusoïde à cette fréquence, que l’on appelle "fréquence porteuse". C'est cette opération qui est souvent appelée "modulation". Elle est réalisée par la macro "Modulation Sinus". On peut le vérifier en observant le spectre résultant :
Il convient ici de veiller à avoir un facteur de sur-échantillonnage suffisant, sous peine de créer du repliement de spectre.
Pour remettre le signal en bande de base à la réception, il faut le multiplier à nouveau par une sinusoïde de fréquence égale à la fréquence centrale, puis le filtrer passe bas pour éliminer les hautes fréquences. En fait, pour être insensible à la phase, on multiplie par une exponentielle complexe (ce qui revient à multiplier séparément par une sinusoïde et par une cosinusoïde ), et on prend le module en sortie. La fonction de filtrage passe-bas est réalisée par le filtrage en racine de Nyquist L’insensibilité à la phase procure même une faible sensibilité aux erreurs de fréquence : la fréquence de démodulation peut être différente de la fréquence de modulation. Notons que l’utilisation du module du signal ne permet pas de transmettre un signe, le codage des symboles est de type "positif".
Si on peut connaître en réception la fréquence et la phase de la porteuse d'émission, il est possible d'utiliser un codage en des symboles en amplitude et phase. On pourra utiliser les type de codage "Complexe" ou "Phase" de la macro "Forme symboles".
Les symboles étant complexes, la modulation est faite par la macro "Modulation complexe". Le signal résultant est toujours réel. La démodulation est encore faite par "Modulation expi", mais sans calcul du module. Notons la présence de l'opérateur "conjug", qui peut se remplacer par un signe moins devant la fréquence de démodulation.
On peut vérifier qu'une très faible erreur de fréquence (150.01 au lieu de 150) brouille complètement la constellation :
Et qu'une erreur de phase la fait tourner :
Notons que pour visualiser ces constellations, on a supprimé les premiers points qui sont faussés par les transitoires des filtres.
Ces filtres introduisent un retard qui est compensé lors de la comparaison dans la macro "ERREUR(%)".
Fichier MUSTIG GMSK.MTG
Modulation QPSK à 4 états.
Modulation OQPSK.
Modulation MSK vue comme variante de OQPSK.
Modulation MSK vue comme cas particulier de modulation de fréquence.
Modulation GMSK (utilisée par le GSM).
La modulation de phase en quadrature à quatre états (Quadrature Phase Shift Keying 4) est un cas particulier de ce qui a été vu en 3.2. On utilise la macro "Forme symboles cplx", plus simple que "Forme symbole", et une mise en forme par une impulsion rectangulaire.
La démodulation se fait par :
Ce signal présente l'inconvénient de présenter des transitions brutales de phase de –PI à +PI. Cela est mis en évidence par le tracé du chemin du signal dans le plan complexe, fait par la macro "Transition/t".
Un solution pour atténuer cela est de retarder les transitions de la partie imaginaire d'un demi temps symbole. On obtient alors la modulation OQPSK4(Offset Quadrature Phase Shift Keying 4)
Il suffit de compenser ce retard à la réception ; (Un retard supplémentaire a été ajouté pour que le retard global soit de un symbole complet).
Le diagramme de transition montre que les discontinuités de phase sont plus faibles :
L'occupation spectrale de ce signal reste encore très grande en raison des discontinuités de phase. Pour la diminuer, on peut adoucir ces transitions. On peut obtenir la modulation MSK (Minimum Shift Keying) en remplaçant dans la modulation OQPSK l'impulsion rectangulaire formée par le bloqueur en une arche de sinusoïde.
Le signal se déplace alors dans le plan complexe sur un cercle.
Le filtrage adapté en réception revient à un produit scalaire :
Observons le signal temporel (partie réelle superposée au signal complexe) :
On voit que le signal ne présente pas de discontinuités. Il possède néanmoins des points de rebroussement : son spectre présentera des lobes moins prononcés que l'OQPSK, mais encore importants. On peut les réduire par la modulation GMSK.
Pour introduire la modulation GMSK, il faut revenir à la modulation MSK, et la considérer comme une modulation de fréquence à phase continue ou CPFSK(Continuous Phase Frequency Keying).
On prend les bits un par un pour commander la fréquence par la macro "Modulation de fréquence" Pour que deux bits successifs correspondent au même nombre d'échantillons après suréchantillonage par le bloqueur, le facteur de suréchantillonnage est divisé par deux.
Pour que cette modulation de fréquence donne le même résultat que la modulation de phase du paragraphe précédent, il faut dériver le train binaire. Cela est fait par la macro "dérivée logique". Pour s'affranchir de l'état initial, on compare les dérivées des signaux reçus et émis.
(En pratique, on utilisera des codes différentiels.)
La modulation GMSK s'obtient alors en lissant les changements de fréquence par un filtre de réponse impulsionelle Gaussienne. Cela est réalisé par la macro GMSK0 de l'exemple :
Notons le remplacement de la macro "Forme_symboles" par une forme plus simple.
En fait, on peut remplacer la juxtaposition "Bloqueur" et "FiltreGauss" par la juxtaposition "Impulsion" et "FiltreGauss". (Dans le cas général, le filtre serait différent, il est identique dans le cas du filtre de réponse impulsionelle gaussienne.) Cela est fait dans "GMSK1". Il est alors possible d'utiliser la structure plus rapide de la macro "Forme impulsion", dans la macro "Impulsion de Gauss". Cela est fait dans "GMSK" :
On peut voir que le spectre de ce signal est sensiblement amélioré. Mais la forme temporelle est très proche :
Les rebroussements ont seulement été arrondis. Il est donc possible, pour la démodulation, d'assimiler la modulation GMSK à une modulation OQPSK.
Fichiers MUSTIG EGALIS.MTG,
Egaliseur par filtre adaptatif (LMS), aveugle ou avec séquence d'apprentissage.
Egaliseur de Viterbi.
Intéressons-nous à une transmission en codage QAM :
La macro "Canal" comprend un filtre et une addition de bruit. Cette simulation ne fait pas apparaître le processus de modulation proprement dit, avec la transmission d'un signal continu. Elle est entièrement discrète. Il faut considérer que la macro "Canal" représente l'ensemble du canal, y compris les modulateurs et démodulateurs.
Si on observe la constellation en sortie du canal, on voit des taches étendues qui se recouvrent partiellement : cela provoque des erreurs de transmissions.
Pour améliorer la qualité de transmission, on ajoute un égaliseur.
Une des structures les plus utilisées consiste en un filtre placé sur le chemin des données, tel que sa mise en cascade avec le filtre du canal soit équivalente à un filtre unité (A un retard près pour respecter la causalité). Il faut donc réaliser le filtre inverse de filtre du canal. Dans le cas général, ce filtre n'est pas connu et peut même évoluer au cours du temps. On utilise alors un filtre auto adaptatif.
La macro "LMS" réalise un filtre adaptatif en mettant en œuvre l'algorithme du gradient :
Elle comprend un filtre à réponse impulsionelle finie de "N" coefficients entre E1 et S. L'algorithme du gradient fait converger les coefficients de ce filtre de façon à minimiser la différence entre S et E2.
Si on applique le signal reçu en E1 et le signal émis en E2, le filtre converge vers le filtre inverse du filtre du canal.
On ne dispose normalement pas du signal émis en réception, puisque c'est précisément ce que l'on cherche. Une solution est d'utiliser le signal reconstitué en sortie de l'organe de prise de décision.
La macro "Décode symboles" fournit sur sa borne inférieure les symboles reconstitués qu'il suffit de reboucler sur la borne E2 de la macro "LMS". Il est préférable d'initialiser le filtre comme un filtre unitaire (dont la réponse du filtre est un "dirac"). La macro LMS permet de choisir le retard de ce filtre initial.
Cette technique, appelée égalisation aveugle, ne fonctionne que si le canal n'est pas trop perturbé et que le taux d'erreur est faible sans égaliseur. Sinon, il est nécessaire de faire précéder le signal utile par un signal connu à la réception : une séquence d'apprentissage. La convergence est alors possible, puisque la référence est exacte. Ensuite, on peut commuter en mode aveugle pour pouvoir suivre des non stationnarités du canal.
On utilise dans l'exemple une séquence binaire pseudo-aléatoire comme séquence d'apprentissage, qui est insérée par la macro "Concaténer". Un signal identique est reproduit en réception. La macro "Commute" applique tout d'abord ce signal à l'entrée référence de la macro LMS, puis la sortie des symboles reconstitués.
Le graphe ci-dessous montre un cas des plus simples de mise en œuvre de la macro "Egalis.Viterbi".
Le train de bits est transformé en symboles par la macro "Forme Symbole qque", qui permettrait un codage avec alphabet quelconque. En fait le codage est ici simplement QPSK à 4 états. La macro canal comporte un bruit additif et un filtre à réponse impulsionnelle finie de coefficients 0.9, 0.3, 0.1. La macro Viterbi fournit en sortie les symboles reconstitués. Ils sont transformés en bits par "Décode symboles qque". On suppose ici connaître le filtre du canal : sa réponse impulsionnelle est communiquée à la macro Viterbi. La visualisation "Visu Treillis" permet d'observer le fonctionnement de l'algorithme de Viterbi. On voit la convergence vers un chemin unique.
Si on ne connaît pas la réponse impulsionnelle du canal, il faut l'identifier, en faisant précéder le signal par une séquence d'apprentissage.
L'identification peut se faire par la macro " LMS" comme ci-dessous.
La macro "Bits+app" génère le signal binaire précédé de la séquence d'apprentissage. La macro "app" génère une copie de cette séquence. Notons que le branchement de la macro "LMS" est différent de son branchement en égaliseur. Dans le cas de l'égaliseur, on cherche à identifier un filtre inverse, alors qu'ici, on cherche à identifier le filtre lui-même. La macro "Ajuste var" prolonge cette séquence à la longueur du signal. La macro "Memo" mémorise la réponse identifiée par le LMS à la fin de la séquence d'apprentissage.
Exemple MUSTIG OFDM.MTG
Etalement de spectre par codage (CDMA)
Modulation multi-fréquences
Cas particulier multifréquence (calculée par DFT)
DMT réel
DMT complexe
Note : Compte tenu des nombreuses variantes possibles, il n'y a pas de macro complète dans la bibliothèque concernant ces modulations, mais seulement des macros très élémentaires. Il faudra partir des exemples ci-dessous pour construire la chaîne de traitement désirée.
La macro "C_ETAL" ressemble à la macro "Forme Symbole qque". Elle commence également par associer plusieurs bits successifs pour former un nombre ("symbole numérique"), mais ensuite, au lieu de choisir une valeur dans un alphabet, elle choisit un signal composé de plusieurs valeurs successives:
L'alphabet et alors une liste de signaux. Elle est fournie par la macro "Codes/t/nc". C'est donc un ensemble de signal fonction de la variable 't' et indicé par la variable 'nc'. Ici, nous avons choisi des codes binaires pseudo-orthogonaux. Nous obtenons dons un codage de type "CDMA". Nous pourrions mettre un ensemble de sinusoïdes. Nous obtiendrions alors une simple modulation de fréquence ( à phase discontinue).
Pour faire le décodage, on pourrait construire l'ensemble des filtres adaptés à chacun des signaux de l'alphabet, d'échantillonner leur sortie à la fin d'un symbole, et de choisir la sortie la plus forte. C'est ce qui est fait dans la macro "Décode C_ETAL(principe)" de l'exemple. La macro " Décode C_ETAL" utilise un simple produit scalaire, plus rapide.
Dans l'exemple ci-dessus, on transmet l'un ou l'autre des signaux de l'alphabet. On peut transmettre une combinaison linéaire de ceux-ci.
La macro "C_PROJ" de l'exemple réalise cela :
.
La macro "Forme symboles" génère une suite de symboles scalaires. Ces symboles sont ensuite groupés en paquets par "Découpe". La taille de ces paquets est égale au nombre de signaux de l'alphabet. On pondère chacun des signaux de l'alphabet par le scalaire correspondant. Cela revient à réaliser une projection sur une base, qui pourrait se formaliser par un produit de matrice. Cela est fait par la macro "Projette" qui associe à chaque paquet un nouveau paquet de taille égale à la taille des signaux de l'alphabet. On appellera ces paquets des "trames". "Recolle" forme un signal en raboutant ces trames.
La macro Décode C_PROJ effectue le décodage.
"Découpe" reforme les paquets de taille égale à la taille des signaux de l'alphabet. La macro "Produit scalaire" effectue l'opération inverse de la projection, en supposant les signaux de l'alphabet orthogonaux entre eux.
L'exemple "MCODE(projection)" met cela en œuvre avec un alphabet de code binaire. Dans les exemples "DMT", on utilise les mêmes macros, avec une base de signaux sinusoïdaux. On peut montrer que si on respecte une condition particulière d'espacement des fréquences de l'alphabet de signaux (qui est précisément la condition d'orthogonalité), la projection sur la base est équivalente à une transformée de Fourier discrète (DFT). En utilisant la transformée de Fourier rapide (qui est mise en œuvre dans le module "TF" de MUSTIG), on augmente considérablement la vitesse de simulation. Cela est réalisé dans la macro "OFDMcplx" :
On a remplacé la macro "Projette" par les macros "Met en fréquence" et "DFTI".
"Met en fréquence" comprend principalement un changement de variable : les paquets formés par "Découpe" sont alors considérés comme des valeurs en fréquence. Ces valeurs sont complétées à la taille de la TFD par des valeurs nulles. Cette taille, que nous appellerons taille de trame brute, est paramétrable sur le devant de "Met en fréquence". La macro "DFTI" réalise la DTF à l'aide du module élémentaire "TFI", complétée par une normalisation. Une macro "Préfixe…" a été ajoutée pour effectuer diverses manipulations sur les trames. On peut prolonger celle-ci par des valeurs nulles (intervalle de garde). On peut ajouter un préfixe cyclique, et on peut effectuer une pondération. Le nombre d'échantillons ajoutés par ces opérations est compté et affiché. Il devra être identique à celui donné à la macro "Met en fréquence". (Celle-ci utilise ce paramètre pour affecter le pas de la variable fréquence, ce qui permet de visualiser le signal fréquentiel avec des échelles correctes.) On affiche la taille des trames résultantes. Cette valeur devra être reportée dans la macro de décodage pour découper à nouveau le signal en trames de même longueurs.
Le décodage est effectue par la macro "Décode OFDMcplx" avec les opérations inverses :
La taille du découpage en trame doit être fournie en paramètre. On utilisera la valeur retournée par la macro "OFDMcplx". Dans la macro "remet en temps", on affiche le nombre de symboles utiles en sortie de DTF. C'est la taille du découpage à l'entrée de OFDMcplx"
La mise en œuvre la plus simple de ces macros est la suivante :
Si le nombre de fréquences utilisées (c'est à dire la taille de la TFD) n'est pas trop grand, on peut observer simultanément les constellations de toutes les fréquences. On dispose pour cela de la macro "constellations DMT".
Si on fait passer le signal dans un canal qui modifie l'amplitude et la phase du signal, on peut observer les modifications :
Pour décoder correctement un tel signal, il est nécessaire d'effectuer une égalisation. Celle-ci peut avantageusement s'effectuer dans le domaine des fréquences. Elle consiste alors à appliquer un gain complexe sur chaque composante.
Dans la "macro "Décode OFDMcplx+egal" a été ajouté un tel égaliseur :
La macro "Commute" applique tout d'abord la séquence d'apprentissage comme signal de référence du "LMS". Ensuite, ce sont les symboles estimés par "Décode symbole" qui en tiennent lieu (fonctionnement en "aveugle"). Notons que la macro "Décode symbole" a été déplacée devant la macro "remet en temps". Cela nécessite d'afficher en paramètre de celle-ci le nombre de symboles utiles en fréquence multiplié par le nombre de bits par symboles.
Cette égalisation est mise en œuvre de la façon suivante :
On utilise comme séquence d'apprentissage le début du signal. Ce signal, dans le domaine des fréquences, est pris sur une borne de la macro OFDM. Pour rendre la simulation plus réaliste, il conviendrait de dupliquer ce codage du coté de la réception. Pour visualiser les constellations, on supprime les premières trames qui correspondent à la phase d'apprentissage.
Les macro précédentes "OFDMcplx" et "DécodeOFDcplx" simulent la transmission d'un signal de type complexe, constitué de deux composantes, qui servira en pratique à moduler une porteuse.
Les macros "OFDMreel" et "DécodeOFDMréel" du sous exemple DMT(OFDM) réel simulent la transmission d'un signal réel. Les symboles fréquentiels sont considérés comme une fonction d'une variable de type "demi", dont la transformée Fourier inverse est un signal réel.
Les fonctions de récupération de porteuse et de synchronisation symboles ne sont pas intégrées à la version 1 de cette bibliothèque. On trouvera seulement quelques exemples non commentés.
On trouvera dans ce chapitre les descriptions des macros de la bibliothèque. Ces descriptions sont disponibles sous MUSTIG par la commande "Lire les informations" (Ctrl H)
|
Générateur de séquence binaire de longueur maximale. La longueur est donnée en puissance de 2. La longueur exacte est affichée. |
|
Générateur d'un signal binaire aléatoire. La sortie est formée de '0' et de '1' équiprobables. La séquence obtenue est modifiée après chaque réinitialisation de la macro.
|
|
Générateur d'un signal binaire pseudo-aléatoire. La sortie est formée de '0' et de '1' équiprobables. La séquence obtenue dépend du nombre entier "Ini" |
|
Entrée : signal binaire (composé de 0 ou de 1) Sortie : valeurs formées par codage de "Nbits" successifs de l'entrée. Les valeurs peuvent être d'un des types suivants : Positifs : compris entre 0 et +1 Signes : compris entre -1 et +1 Complexe : de module < 1 Phase : nombre complexe de module = 1
|
|
Entrée : signal binaire (composé de 0 ou de 1) Sortie : valeurs formées par codage de "Nbits" successifs de l'entrée. Les valeurs peuvent être d'un des types suivants : Positifs : compris entre 0 et +1 Signes : compris entre -1 et +1 Complexe : de module < 1 Phase : nombre complexe de module = 1
|
|
Bits : signal binaire (composé d'entiers de valeur 0 ou 1 ) Symboles : suite valeurs formées par codage de "Nbits" successifs de l'entrée.
V : valeurs utilisées pour le codage, fonction de la variable 'sb'
|
|
Le signal d'entrée doit être de type entier. Le signal de sortie est un "ou exclusif" (XOR) entre le signal d'entrée et le signal d'entrée retardé d'un échantillon.
|
|
Calcule la réponse impulsionnelle d'un filtre "racine de Nyquist".
|
|
Remplace chaque échantillon du signal d'entrée par N échantillons identiques. Simule le bloqueur d'un convertisseur numérique analogique. Le facteur N est déterminé par le report :
|
|
Simule un convertisseur Numérique-Analogique théorique sans bloqueur : Chaque échantillon du signal d'entrée est suivi de N-1 valeurs nulles La valeur de N est donnée par un report :
|
|
Fonction équivalente à : mais utilisant une structure de filtre multi-cadence, donc plus rapide.
|
|
Multiplie le signal par une sinusoïde. |
|
Module le signal complexe par une sinusoïde. Le signal de sortie est réel. |
|
Crée un signal sinusoïdal dont la fréquence est une fonction linéaire de la valeur du signal d'entrée. - Le signal peut être sinusoïdal (réel) ou exponentiel complexe. - On peut régler la fréquence centrale 'fo' la déviation 'd' Pour une valeur 'e' du signal d'entrée, la fréquence est alors : fo (1+d.e) en mode "relatif" d.e en mode "absolu" fs.d.e en mode "relatif/symboles" (fs = fréquence des symboles, utilise alors le report "Fact_surech")
|
|
Retarde le signal de la durée d'un symbole. Le nombre d'échantillons de la période symbole est donné
par le report :
|
|
Retarde le signal de la moitié de la durée d'un symbole. |
|
Fait précéder le signal de ses N derniers points. Le signal de sortie possède donc N points de plus que le signal d'entrée. N doit être inférieur à la longueur du signal d'entrée. |
|
Prolonge le signal avec ses N premiers points. Le signal de sortie possède donc N points de plus que le signal d'entrée. N doit être inférieur à la longueur du signal d'entrée
|
|
Multiplie le signal par une fonction de pondération de forme "cosinus surélevé" : Multiplie les N premiers points par une fonction qui passe progressivement de 0 à 1. Multiplie les N derniers points par une fonction qui passe progressivement de 1à 0.
|
|
Associe une impulsion gaussienne à chaque symbole. |
|
Filtre à réponse impulsionelle finie dont la réponse est de forme gaussienne.
|
|
Génère une sinusoïde de période égale à deux périodes symbole.
|
|
Si N>0 ; Ajoute N valeurs nulles en fin du signal. si N<0 Supprime les N dernières valeurs.
|
|
|
|
Ajoute au signal d'entrée un bruit gaussien réel ou complexe, d'écart type réglable. Permet également de mesurer le rapport signal à bruit résultant.
|
|
Ajoute au signal d'entrée un ensemble de réalisations d'un bruit gaussien réel ou complexe, d'écart type réglable. Permet également de mesurer le rapport signal à bruit résultant. Le signal de sortie est un signal à deux dimensions : 't' le support du signal d'entrée 'e' l'indice des réalisations
|
|
Retarde le signal d'entrée. La gamme "G" du retard est fixée sur la face avant. Elle peut être exprimée : - en échantillons du signal d'entrée - en "Symboles". Le nombre d'échantillons par
symbole est déterminé par le report - en temps (utilise le pas d'échantillonage du signal d'entrée) Le retard est RxG. L'entrée R peut varier pendant la durée du signal.
On peut choisir d'utiliser une interpolation pour obtenir des valeurs de retard non multiples de la période d'échantillonnage. Cette interpolation est effectuée par filtrage polyphase. On peut alors choisir : - le nombre de filtres élémentaires - le nombre de coefficients par filtres. |
|
|
|
Multiplie le signal par une exponentielle complexe. Le signal de sortie est donc complexe ! |
|
Filtre intégrateur à durée finie N. La valeur de N est donnée par un report :
|
|
Simule le fonctionnement d'une partie d'un convertisseur Analogique-Numérique. Réalise un sous-échantillonnage du signal d'entrée d'un
facteur déterminé par le report : |
|
Equivalent à : mais plus rapide.
|
|
Equivalent à : mais en utilisant un filtre multi-cadence, donc plus rapide.
|
|
Saute les N premiers points du signal d'entrée. |
|
Supprime les N derniers points du signal d'entrée. |
|
Saute les N premier points du signal d'entrée, et les ajoute aux N derniers points. Si l'entrée est la sortie de la suite des 2 macros : "préfixe cyclique/t" et "Xcos surélevé/t", on retrouve le signal initial.
|
|
Filtre adaptatif utilisant l'algorithme du gradient (L.M.S)
Il identifie un filtre transversal de N coefficients. 'Sortie' est la filtrée de 'Entrée1' par ce filtre. Il cherche à minimiser l'erreur quadratique entre "Entrée2" et "Sortie".
Pas : valeur du pas d'adaptation N: nombre de coefficients du filtre P Ini : Indice du coefficient égal à '1' à l'initialisation, tous les autres étant nuls. (mettre -1 pour obtenir tous les coefficients nuls)
|
|
Coefficient auto adaptatif utilisant l'algorithme du gradient. (Même fonction que "LMS", mais avec un seul coefficient.) |
|
Algorithme de VITERBI Entrée gauche : information provenant du calcul de métrique (Métrique d'Euclide ou Métrique de Hamming) Entrée supérieure : de la valeur maximum du retard de l'estimation ("profondeur") Sortie droite : symboles estimés. Sortie inférieure : pour visualisation de l'état du treillis (voir macro "Visu Treillis")
|
|
Calcul des métriques d'Euclide pour réaliser un égaliseur de Viterbi avec la macro "Viterbi"
Entrée gauche : signal (fonction de 't') Entrée supérieure : valeurs possibles des symboles (alphabet ) (fonction de 'sb') Entrée inférieure : réponse impulsionnelle du canal.(fonction de 'r') Sortie droite : Informations pour la macro "Viterbi" |
|
Egaliseur de Viterbi. Formé des deux macros précédentes. La profondeur de Viterbi est réglable. |
|
Calcule le symbole le plus proche de la valeur d'entrée, et forme la suite des bits correspondants (codage identique à celui de "Forme symbole"). |
|
Calcule le symbole le plus proche de la valeur d'entrée, et forme la suite des bits correspondants (codage complexe).
|
|
Calcule le symbole le plus proche de la valeur d'entrée, et forme la suite des bits correspondants (codage identique à celui de "Forme symbole qque"). |
|
Trace la répartition de la puissance du signal en fonction de la fréquence.
|
|
Trace la répartition de la puissance du signal en fonction de la fréquence. Le signal doit être fonction de la variable 'e', indice des réalisations de bruit. (voir macro "Bruit additif2"). Un moyennage est effectue selon cette variable. |
|
Trace le signal en superposant des blocs de durée égale à la durée de deux symboles successifs |
|
Dessine dans le plan complexe le trajet entre les symboles successifs.
|
|
Compare deux signaux et affiche le nombre de valeurs différentes et le taux d'erreur. Si les signaux sont de longueurs inégales, la comparaison est faite sur la partie commune. Si le signal de la borne inférieure est en retard par rapport au signal de la borne supérieure, on peut compenser ce retard. On peut ignorer pour la comparaison les premiers points des signaux. |
|
Compare deux signaux et affiche le nombre de valeurs différentes et le taux d'erreur. L'un des signaux doit être fonction de la variable 'e', indice des réalisations de bruit (voir macro "Bruit additif2") Si les signaux sont de longueurs inégales, la comparaison est faite sur la partie commune.
Si le signal de la borne inférieure est en retard par rapport au signal de la borne supérieure, on peut compenser ce retard. On peut ignorer pour la comparaison les premiers points des signaux. |
|
Supprime les N premiers points du signal. Utile pour masquer les transitoires des filtres. |
|
Visualisation spéciale pour Viterbi. Se connecte à la borne inférieure de la macro "Viterbi" |
En haut arrive un scalaire donnant la ‘profondeur’ du Viterbi, encore appelée ‘longueur de décision’. A gauche arrive un faisceau sortant d’une boîte ‘Métrique’ : la borne du haut de ce faisceau donne l’alphabet, ordonné selon la variable 4 sur la façade de la macro (ici, la variable /sb), la borne du milieu donne la longueur du canal moins un, et la borne du bas donne les vecteurs de métriques (ordonnés selon la variable 2 sur la façade de la macro (ici, la variable /i)), pour chaque élément du vecteur ordonné selon la variable 1 sur la façade de la macro (ici, la variable /t), c’est-à-dire à chaque itération du processus.
A droite sort le vecteur des symboles estimés, ordonné selon la variable 1 sur la façade de la macro (ici, la variable /t). En bas sort un faisceau destiné aux macros spéciales de visualisation du treillis (fixe ou animée), dont les composant sont : N la taille de l’alphabet, L la longueur max du canal moins un , le treillis ordonné selon /i et /co, et le vecteur du meilleur état de chaque itération (ce dernier vecteur sert à tracer le chemin survivant au-dessus des autres).
Deux informations doivent être actualisées à chaque itération du processus : le vecteur Mn des métriques cumulées, et le treillis Cn, qui, pour chaque état possible, contient le meilleur état antécédent, et ce sur une longueur égale à V temps-symbole, V étant le retard à l’estimation (la ‘profondeur’ du Viterbi). Les états sont stockés sous forme d’indices (voir la construction des métriques).
Soit N la taille de l’alphabet, L la longueur du canal moins un. On a N^(L+1) états possibles, correspondant aux N^(L+1) séquences pouvant être émises. Or, chaque état peut être obtenu à partir de N états de l’étape précédente : en effet, à partir des N états de l’étape précédente qui ne différent que par le symbole le plus ancien, on peut arriver à l’état auquel on s’intéresse en ajoutant aux N états précédents le même symbole.
Donc, on a juste besoin de stocker les chemins menant aux N^L meilleurs états à chaque itération, ce qui explique la taille de Cn : V colonnes, N^L lignes. Pour la même raison, le vecteur des métriques cumulées ne comporte que N^L lignes.
A chaque itération, on reçoit un vecteur de N^(L+1) métriques. On suréchantillonne Mn d’un facteur N, car les N premières métriques correspondent toutes au premier état de Mn (ces N états sont déduits du même meilleur état précédent). On ajoute les métriques reçues à Mn. Intervient alors la macro ‘Chemin Min’ :
Chemin Min /z/i
De ces N^(L+1) états, on ne va garder que les N^L meilleurs. Les N séquences qui aboutissent au même état ont les indices suivants :
0, N^L, 2(N^L), 3(N^L), ..., (N-1)*(N^L)
1, N^L+1, 2(N^L)+1, 3(N^L)+1, ..., (N-1)*(N^L)+1
...............
N^L-1, N^L+N^L-1, 2(N^L)+N^L-1, ..., (N-1)*(N^L)+N^L-1 = N^(L+1)-1
On construit donc la matrice ci-dessus avec les deux macros ‘Indices /i’ et ‘/q’, et on remplace les indices par les métriques correspondantes (macro ‘Coupe /z’). La macro ‘Pos global min /q’ nous donne sur sa borne du haut les valeurs des métriques minimum pour chaque nouvel état, et sur sa borne en haut à droite les indices de ces métriques minimum. On ‘Coupe’ la matrice obtenue selon la variable /q pour avoir, pour chaque état, le meilleur de ses N antécédents.
Donc, à droite en haut de la macro ‘Chemin min /z/i’ sort, à chaque itération du processus, les métriques (selon /i) des meilleurs antécédents de chaque état et à droite en bas, les états correspondants, selon /i aussi.
Le vecteur des métriques cumulées Mn est mis à jour avec les métriques minimum, pour la prochaine itération. Le treillis est lui aussi mis à jour : on le décale en injectant pour la dernière itération les meilleurs antécédents des N^L meilleurs états.
Il est alors temps de chercher l’état de métrique minimum (parmi les N^L meilleurs états) et de remonter le treillis pour obtenir son V-ème antécédent, qui sera le symbole ayant la plus forte probabilité d’avoir été émis il y a V temps-symbole, d’après l’algorithme de Viterbi.
C’est le rôle de la macro ‘Remonte Chemin /i/co’ :
Remonte Chemin /i/co
En haut arrive l’indice de la métrique minimum, à gauche le treillis suivant les variables /i et /co. Le principe est le suivant :
On regarde le treillis à la première colonne et à la ligne correspondant à la métrique minimum. On obtient l’indice du meilleur état précédent l’état courant.
On regarde alors le treillis à la deuxième colonne et à la ligne correspondant à l’indice obtenu à l’itération précédente, et on remonte ainsi tout le treillis.
Pour ce faire, on construit un vecteur d’indices de 0 à V-1, pour couper la matrice dans le sens des colonnes croissantes (des états les plus récents aux plus anciens), et à chaque coupe de ligne, on coupe la colonne correspondante avec l’indice du meilleur état de la colonne précédente (pour l’initialisation du processus, on prend comme indice de coupe l’indice de la métrique minimum (borne du haut)).
A droite sort donc le chemin le plus probable ayant été suivi pour arriver à l’état dont l’indice est communiqué sur la borne du haut, ordonné selon la variable /z, et en bas sort le dernier état de cette suite d’état. Pour obtenir le symbole estimé, on extrait de l’indice d’état le dernier indice de symbole, qu’on convertit en symbole avec la macro ‘Coupe /sb’.
Elles sont calculée par la macro "Métriques Euclide" :
En haut arrive l’alphabet : la liste des symboles pouvant être émis (et donc décodés), un vecteur selon la première variable sur la façade de la macro (ici, la variable /sb).
A gauche arrivent les symboles auxquels on va comparer la sortie théorique du canal pour toutes les séquences pouvant être émises.
En bas arrive la réponse impulsionnelle du canal dont on veut calculer la sortie théorique, un vecteur selon la deuxième variable sur la façade de la macro (ici, la variable /r) .
A droite sort un faisceau dont les deux premières bornes ne posent pas de problème particulier. La borne du bas du faisceau reçoit un vecteur selon la troisième variable sur la façade de la macro (ici, la variable /i) . Les éléments de ce vecteur sont les métriques cherchées.
Soit N la taille de l’alphabet (le nombre de symboles différents), et L la longueur du canal moins 1. Il faut donc calculer la sortie du canal pour les N^(L+1) séquences différentes.
Pour ce faire, on construit un vecteur avec les indices de 0 à N^(L+1)-1, vecteur que l’on décompose en base N sur L+1 chiffres, avec le ‘bit’ de poids fort à droite. Ensuite, on ‘Coupe’ l’alphabet avec le vecteur des indices décomposés. On a alors un vecteur représentant toutes les séquences pouvant être émises par le canal spécifié dans la borne du bas. On ‘Découpe’ ce vecteur en séquences de longueur L+1, on effectue le produit scalaire de ces séquences par la réponse impulsionnelle du canal, et on obtient nos N^(L+1) sorties théoriques.
Pour calculer les métriques de branche proprement dites, on calcule le module carré de la différence entre la sortie du canal (borne de gauche) et chacune des sorties théoriques.
Sn /sb/r/i
Exemple :
N = 2, L = 2 (8 séquences possibles)
On construit le vecteur 0, 1, 2, 3, 4, 5, 6, 7, que l’on décompose en
0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1.
Prenons par exemple (0.9, 0,3, 0.1) comme réponse impulsionnelle et (-1, 1) comme alphabet.
Notre vecteur, une fois transformé en suite de symboles, devient :
-1, -1, -1, 1, -1, -1, -1, 1, -1, ... , -1, 1, 1, 1, 1, 1.
On effectue le produit scalaire de chaque séquence de 3 symboles par la réponse impulsionnelle et on obtient les sorties théoriques :
-1.3, 0.5, -0.7, 1.1, -1.1, 0.7, -0.5, 1.3.
A chaque élément arrivant sur la borne de gauche va correspondre un vecteur de métriques (selon la variable 3), qui sera composé du module carré de la différence entre l’élément en question et chacune des sorties théoriques.
Elles sont calculées par la macro " Métriques Hamming /t/co/li/i/sb" :
En haut arrive le faisceau issu de "Code /co/li", la macro définissant le code convolutif. La borne du haut du faisceau donne la taille des symboles en entrée du codeur, la borne du bas la matrice servant au codage proprement dit, ordonnée selon les variables 2 et 3 (ici , les variables /co et /li).
A gauche arrive le train de bits que l’on veut comparer à la sortie du codeur pour toutes les séquences pouvant être émises. Ce vecteur est ordonné selon la variable 1 (ici, la variable /t).
A droite sort le même faisceau que pour la macro ‘Métriques Euclide’.
La première borne du faisceau de sortie donne l’alphabet, c’est-à-dire les indices allant de 0 à 2^(le numérateur du rendement)-1. L’alphabet est ordonné selon la variable 5 sur la façade de la macro (ici, la variable /sb).
La borne du bas du faisceau de sortie donne les métriques de Hamming, c’est-à-dire le nombre de bits qui diffèrent entre la dernière séquence reçue sur la borne de gauche et chacune des sorties théoriques du codeur. Ce vecteur est orienté sur la variable 4 sur la façade de la macro (ici, la variable /i).
Prenons l’exemple du code convolutif suivant :
Rendement ½.
On remplace chaque bit par deux bits, le premier étant la somme modulo 2 du dernier bit (le bit remplacé) et de l’avant avant dernier bit, le deuxième étant la somme modulo 2 du dernier bit, de l’avant-dernier bit, et de l’avant avant dernier bit.
Ce code est représenté comme suit dans la macro "Code/co/li":
La macro ‘Codeur’ procède comme suit : à chaque case de la matrice définissant le code, on fait correspondre une copie du signal d’entrée, identique pour la première colonne, retardée d’un échantillon pour la deuxième colonne, et ainsi de suite. De chacune de ces copies (c’est-à-dire pour chaque case de la matrice), on extrait le bit indiqué dans la matrice de départ (0 = on ne prend pas de bit en compte, 1 = on prend le bit de poids faible en compte, ...). Ensuite, on fait la somme modulo 2 (ou exclusif, ‘XOR’) des colonnes entre elles. Alors, on a autant de signaux que de bits dans le symbole en sortie du codeur. Il suffit de rassembler ces copies en prenant les bits tour à tour dans chacune d’elles, et on obtient notre signal codé.
Génère Séquences /i/r/co
La macro ‘Métriques Hamming’, tout comme la macro ‘Métriques Euclide’, doit tester toutes les séquences possibles. De la même manière, on construit un vecteur d’indices, que l’on décompose en base ‘le nombre de symboles’ (c’est-à-dire 2^(le numérateur du rendement)) sur un nombre de chiffres égal à la longueur de contrainte du code. On passe ces séquences dans le codeur, on prend la suite de bits correspondant au dernier symbole de sortie, et ce pour toutes les séquences calculées. On a alors toutes les sorties possibles du codeur.
On découpe le train de bits reçu en séquences de longueur égale au dénominateur du rendement (la taille d’un symbole en sortie du codeur), et on compte le nombre de bits de différence par rapport à chacune des sorties calculées : les métriques de branche sont égales à ce nombre de bits.